unit DWizTracking; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, ManagerMonInfo, Vcl.ComCtrls, Vcl.Buttons, VirtualTrees; type PMonResult = ^TMonResult; TMonResult = record MonInfo: TMonInfo; sHitReuslts: String; nHitCnt, nHitWordCnt, nTotalWordCnt: Integer; wHitPerc, wFndWordPerc: WORD; end; PWinResult = ^TWinResult; TWinResult = record dtLog: TDateTime; WinInfo: PWinInfo; sHitReuslts: String; nHitCnt, nHitWordCnt, nTotalWordCnt: Integer; wHitPerc, wFndWordPerc: WORD; end; PDocResult = ^TDocResult; TDocResult = record sPath, sHitReuslts: String; nHitCnt, nHitWordCnt, nTotalWordCnt: Integer; wHitPerc, wFndWordPerc: WORD; end; TDlgWizTracking = class(TForm) OpenDialog: TOpenDialog; pnBottom: TPanel; pcMain: TPageControl; tabInit: TTabSheet; tabSetText: TTabSheet; Label1: TLabel; edImgPath: TEdit; btnOpenImgFile: TSpeedButton; chInputSeachInfo: TCheckBox; btnPrev: TButton; btnNext: TButton; Label2: TLabel; mmTracText: TMemo; chTracDate: TCheckBox; dpBegin: TDateTimePicker; Label3: TLabel; dpUntil: TDateTimePicker; Label4: TLabel; Label5: TLabel; edPgNames: TEdit; Label6: TLabel; edWndTitles: TEdit; tabResult: TTabSheet; pcResult: TPageControl; tabMonInfo: TTabSheet; tabWinInfo: TTabSheet; vtMon: TVirtualStringTree; lbSchTxtInfo: TLabel; vtWin: TVirtualStringTree; tabDocInfo: TTabSheet; vtDoc: TVirtualStringTree; procedure btnOpenImgFileClick(Sender: TObject); procedure chInputSeachInfoClick(Sender: TObject); procedure btnNextClick(Sender: TObject); procedure chTracDateClick(Sender: TObject); procedure vtMonGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure vtMonFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtMonGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure vtMonGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: string); procedure vtMonHeaderClick(Sender: TVTHeader; HitInfo: TVTHeaderHitInfo); procedure vtMonCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); procedure btnPrevClick(Sender: TObject); procedure vtMonDblClick(Sender: TObject); procedure vtWinGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure vtWinFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtWinGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure vtWinCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); procedure vtWinDblClick(Sender: TObject); procedure vtDocGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure vtDocFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtDocGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure vtDocCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); private { Private declarations } MgMonInfo_: TManagerMonInfo; nFndCnt_, nFndWordCnt_: Integer; public { Public declarations } Constructor Create(aOwner: TComponent; aMgMonInfo: TManagerMonInfo); procedure TrackingText; end; var DlgWizTracking: TDlgWizTracking; implementation uses Tocsg.Process, Tocsg.Path, Tocsg.Safe, Vcl.Imaging.pngimage, Tocsg.Strings, Tocsg.Shell, VirtualTrees.Types, System.Math, System.DateUtils, Tocsg.VTUtil, Tocsg.Convert; {$R *.dfm} function ExtrTextFromImageFile(sPath: String): String; var sTemp: String; StrList: TStringList; i, n: Integer; begin Result := ''; sTemp := GetRunExePathDir + 'Temp\'; ASSERT(ForceDirectories(sTemp)); sTemp := sTemp + ExtractFileName(sPath); ExecuteAppWaitUntilTerminate(GetRunExePathDir + EXE_OCR, Format('"%s" "%s"', [sPath, sTemp]), SW_HIDE, 60000); if FileExists(sTemp) then begin Guard(StrList, TStringList.Create); StrList.LoadFromFile(sTemp, TEncoding.UTF8); Result := StrList.Text; DeleteFile(PChar(sTemp)); end; end; Constructor TDlgWizTracking.Create(aOwner: TComponent; aMgMonInfo: TManagerMonInfo); procedure InitCtrls; var i: Integer; begin for i := 0 to pcMain.PageCount - 1 do pcMain.Pages[i].TabVisible := false; pcMain.ActivePage := tabInit; dpBegin.DateTime := Now; dpUntil.DateTime := Now; end; begin Inherited Create(aOwner); MgMonInfo_ := aMgMonInfo; nFndCnt_ := 0; nFndWordCnt_ := 0; InitCtrls; end; procedure TDlgWizTracking.btnNextClick(Sender: TObject); begin case pcMain.ActivePageIndex of 0 : // tabInit begin if not chInputSeachInfo.Checked then begin edImgPath.Text := Trim(edImgPath.Text); if edImgPath.Text = '' then begin MessageBox(Handle, PChar('À̹ÌÁö ÆÄÀÏ °æ·Î¸¦ ÀÔ·ÂÇØÁֽʽÿÀ.'), PChar(Caption), MB_ICONWARNING or MB_OK); edImgPath.SetFocus; exit; end; if not FileExists(edImgPath.Text) then begin MessageBox(Handle, PChar('Á¸ÀçÇÏÁö ¾Ê´Â ÆÄÀÏÀÔ´Ï´Ù.'), PChar(Caption), MB_ICONWARNING or MB_OK); edImgPath.SetFocus; exit; end; mmTracText.Text := ExtrTextFromImageFile(edImgPath.Text); {$IFDEF DEBUG} if DebugHook = 0 then {$ENDIF} ExecutePath(edImgPath.Text); end; pcMain.ActivePage := tabSetText; btnPrev.Enabled := true; end; 1 : // tabSetText begin mmTracText.Text := Trim(mmTracText.Text); edPgNames.Text := Trim(edPgNames.Text); edWndTitles.Text := Trim(edWndTitles.Text); if mmTracText.Text = '' then begin MessageBox(Handle, PChar('ÃßÀûÇÒ ÅØ½ºÆ® Á¤º¸°¡ ¾ø½À´Ï´Ù.'), PChar(Caption), MB_ICONWARNING or MB_OK); mmTracText.SetFocus; exit; end; TrackingText; pcMain.ActivePage := tabResult; end; end; end; procedure TDlgWizTracking.btnOpenImgFileClick(Sender: TObject); begin if OpenDialog.Execute(Handle) then edImgPath.Text := OpenDialog.FileName; end; procedure TDlgWizTracking.btnPrevClick(Sender: TObject); begin case pcMain.ActivePageIndex of 0 : ASSERT(false); else begin pcMain.ActivePageIndex := pcMain.ActivePageIndex - 1; if pcMain.ActivePageIndex = 0 then btnPrev.Enabled := false; end; end; end; procedure TDlgWizTracking.chInputSeachInfoClick(Sender: TObject); begin edImgPath.Enabled := not chInputSeachInfo.Checked; btnOpenImgFile.Enabled := edImgPath.Enabled; end; procedure TDlgWizTracking.chTracDateClick(Sender: TObject); begin dpBegin.Enabled := chTracDate.Checked; Label3.Enabled := dpBegin.Enabled; dpUntil.Enabled := dpBegin.Enabled; Label4.Enabled := dpBegin.Enabled; end; procedure TDlgWizTracking.TrackingText; var sPName, sSearchTxt: String; StrList: TStringList; i, c: Integer; pData: PMonResult; pDataW: PWinResult; pDataD: PDocResult; begin vtMon.BeginUpdate; vtWin.BeginUpdate; vtDoc.BeginUpdate; try VT_Clear(vtMon); VT_Clear(vtWin); VT_Clear(vtDoc); Guard(StrList, TStringList.Create); sSearchTxt := RefineSearchText(mmTracText.Text); nFndCnt_ := SplitString(sSearchTxt, ' ', StrList, false, false); SplitString(sSearchTxt, ' ', StrList, false, true); nFndWordCnt_ := 0; for i := 0 to StrList.Count - 1 do if StrList[i].Length > 1 then begin SumString(sSearchTxt, StrList[i], '|'); Inc(nFndWordCnt_); end; lbSchTxtInfo.Caption := Format('°Ë»ö ´Ü¾î ¼ö : %d, °Ë»ö¾î ¼ö : %d', [nFndWordCnt_, nFndCnt_]); for i := 0 to MgMonInfo_.MonInfoList.Count - 1 do begin pData := VT_AddChildData(vtMon); with pData^ do begin MonInfo := MgMonInfo_.MonInfoList[i]; SearchMonText(MonInfo.MonText, sSearchTxt, nHitWordCnt, nHitCnt, nTotalWordCnt, sHitReuslts); if nFndWordCnt_ > 0 then wFndWordPerc := (nHitWordCnt * 100) div nFndWordCnt_; if nTotalWordCnt > 0 then wHitPerc := (nHitCnt * 100) div nTotalWordCnt; end; with MgMonInfo_.MonInfoList[i] do begin for c := 0 to WinInfoList.Count - 1 do begin sPName := ExtractFileName(WinInfoList[c].sPPath); if WinInfoList[c].bActive or ( (edPgNames.Text <> '') and (Pos(sPName.ToUpper, UpperCase(edPgNames.Text)) > 0) ) or ( (edWndTitles.Text <> '') and (Pos(WinInfoList[c].sTitle.ToUpper, UpperCase(edWndTitles.Text)) > 0) ) then begin pDataW := VT_AddChildData(vtWin); ZeroMemory(pDataW, SizeOf(TWinResult)); with pDataW^ do begin dtLog := LogDT; WinInfo := WinInfoList[c]; if WinInfoList[c].bActive then begin SearchMonText(WinInfo.sTitle + ' ' + WinInfo.sImgTxt, sSearchTxt, nHitWordCnt, nHitCnt, nTotalWordCnt, sHitReuslts); if nFndWordCnt_ > 0 then wFndWordPerc := (nHitWordCnt * 100) div nFndWordCnt_; if nTotalWordCnt > 0 then wHitPerc := (nHitCnt * 100) div nTotalWordCnt; end; end; end; end; end; end; for i := 0 to MgMonInfo_.RecentDocList.Count - 1 do begin if FileExists(MgMonInfo_.RecentDocList[i]) then begin pDataD := VT_AddChildData(vtDoc); pDataD.sPath := MgMonInfo_.RecentDocList[i]; StrList.LoadFromFile(pDataD.sPath, TEncoding.UTF8); with pDataD^ do begin SearchMonText(StrList.Text, sSearchTxt, nHitWordCnt, nHitCnt, nTotalWordCnt, sHitReuslts); if nFndWordCnt_ > 0 then wFndWordPerc := (nHitWordCnt * 100) div nFndWordCnt_; if nTotalWordCnt > 0 then wHitPerc := (nHitCnt * 100) div nTotalWordCnt; end; end; end; vtMon.Sort(nil, 1, sdAscending); vtWin.Sort(nil, 1, sdAscending); vtDoc.Sort(nil, 1, sdAscending); finally vtDoc.EndUpdate; vtWin.EndUpdate; vtMon.EndUpdate; end; pcResult.ActivePage := tabMonInfo; Application.ProcessMessages; end; procedure TDlgWizTracking.vtDocCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); var pData1, pData2: PDocResult; begin pData1 := Sender.GetNodeData(Node1); pData2 := Sender.GetNodeData(Node2); case Column of 2 : Result := CompareValue(pData1.wFndWordPerc, pData2.wFndWordPerc); 3 : Result := CompareValue(pData1.wHitPerc, pData2.wHitPerc); 4 : Result := CompareValue(pData1.nHitWordCnt, pData2.nHitWordCnt); 5 : Result := CompareValue(pData1.nHitCnt, pData2.nHitCnt); 6 : Result := CompareValue(pData1.nTotalWordCnt, pData2.nTotalWordCnt); else Result := CompareText(vtMon.Text[Node1, Column], vtMon.Text[Node2, Column]); end; end; procedure TDlgWizTracking.vtDocFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PDocResult; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgWizTracking.vtDocGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TDocResult); end; procedure TDlgWizTracking.vtDocGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PDocResult; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := CutFileExt(CutFileExt(ExtractFileName(pData.sPath))); 2 : CellText := IntToStr(pData.wFndWordPerc) + '%'; 3 : CellText := IntToStr(pData.wHitPerc) + '%'; 4 : CellText := IntToStr(pData.nHitWordCnt); 5 : CellText := IntToStr(pData.nHitCnt); 6 : CellText := IntToStr(pData.nTotalWordCnt); 7 : CellText := pData.sHitReuslts end; end; procedure TDlgWizTracking.vtMonCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); var pData1, pData2: PMonResult; begin pData1 := Sender.GetNodeData(Node1); pData2 := Sender.GetNodeData(Node2); case Column of 1 : Result := CompareDateTime(pData1.MonInfo.LogDT, pData2.MonInfo.LogDT); 2 : Result := CompareValue(pData1.wFndWordPerc, pData2.wFndWordPerc); 3 : Result := CompareValue(pData1.wHitPerc, pData2.wHitPerc); 4 : Result := CompareValue(pData1.nHitWordCnt, pData2.nHitWordCnt); 5 : Result := CompareValue(pData1.nHitCnt, pData2.nHitCnt); 6 : Result := CompareValue(pData1.nTotalWordCnt, pData2.nTotalWordCnt); else Result := CompareText(vtMon.Text[Node1, Column], vtMon.Text[Node2, Column]); end; end; procedure TDlgWizTracking.vtMonDblClick(Sender: TObject); var pNode: PVirtualNode; pData: PMonResult; sPath: String; begin pNode := vtMon.GetFirstSelected; if pNode = nil then exit; pData := vtMon.GetNodeData(pNode); sPath := GetRunExePathDir + 'Data\Img\' + pData.MonInfo.ImageFileName; if FileExists(sPath) then ExecutePath(sPath); end; procedure TDlgWizTracking.vtMonFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PMonResult; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgWizTracking.vtMonGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: string); begin HintText := TVirtualStringTree(Sender).Text[Node, Column]; end; procedure TDlgWizTracking.vtMonGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TMonResult); end; procedure TDlgWizTracking.vtMonGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PMonResult; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := DateTimeToStr(pData.MonInfo.LogDT); 2 : CellText := IntToStr(pData.wFndWordPerc) + '%'; 3 : CellText := IntToStr(pData.wHitPerc) + '%'; 4 : CellText := IntToStr(pData.nHitWordCnt); 5 : CellText := IntToStr(pData.nHitCnt); 6 : CellText := IntToStr(pData.nTotalWordCnt); 7 : CellText := pData.sHitReuslts end; end; procedure TDlgWizTracking.vtMonHeaderClick(Sender: TVTHeader; HitInfo: TVTHeaderHitInfo); begin if HitInfo.Button = mbLeft then begin with Sender, Treeview, HitInfo do begin if HitInfo.Column < 0 then exit; if SortColumn > NoColumn then Columns[SortColumn].Options := Columns[SortColumn].Options + [coParentColor]; if HitInfo.Column = 0 then SortColumn := NoColumn else begin if (SortColumn = NoColumn) or (SortColumn <> Column) then begin SortColumn := Column; SortDirection := sdAscending; end else if SortDirection = sdAscending then SortDirection := sdDescending else SortDirection := sdAscending; Columns[SortColumn].Color := $00F0FFFF;// TVirtualStringTree(Treeview).Colors.BackGroundColor - 500; TVirtualStringTree(Treeview).BeginUpdate; try TVirtualStringTree(Treeview).SortTree(SortColumn, SortDirection, False); finally TVirtualStringTree(Treeview).EndUpdate; end; end; end; end; end; procedure TDlgWizTracking.vtWinCompareNodes(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex; var Result: Integer); var pData1, pData2: PWinResult; begin pData1 := Sender.GetNodeData(Node1); pData2 := Sender.GetNodeData(Node2); case Column of 1 : Result := CompareDateTime(pData1.dtLog, pData2.dtLog); 5 : Result := CompareValue(pData1.wFndWordPerc, pData2.wFndWordPerc); 6 : Result := CompareValue(pData1.wHitPerc, pData2.wHitPerc); 7 : Result := CompareValue(pData1.nHitWordCnt, pData2.nHitWordCnt); 8 : Result := CompareValue(pData1.nHitCnt, pData2.nHitCnt); 9 : Result := CompareValue(pData1.nTotalWordCnt, pData2.nTotalWordCnt); else Result := CompareText(vtWin.Text[Node1, Column], vtWin.Text[Node2, Column]); end; end; procedure TDlgWizTracking.vtWinDblClick(Sender: TObject); var pNode: PVirtualNode; pData: PWinResult; sPath: String; begin pNode := vtWin.GetFirstSelected; if pNode = nil then exit; pData := vtWin.GetNodeData(pNode); sPath := GetRunExePathDir + 'Data\Img\' + pData.WinInfo.sImgFName; if FileExists(sPath) then ExecutePath(sPath) else MessageBox(Handle, PChar('À̹ÌÁö ÆÄÀÏÀÌ Á¸ÀçÇÏÁö ¾Ê½À´Ï´Ù.'), PChar(Caption), MB_ICONWARNING or MB_OK); end; procedure TDlgWizTracking.vtWinFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PWinResult; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgWizTracking.vtWinGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TWinResult); end; procedure TDlgWizTracking.vtWinGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PWinResult; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := DateTimeToStr(pData.dtLog); 2 : CellText := ExtractFileName(pData.WinInfo.sPPath); 3 : CellText := BooleanToStr(pData.WinInfo.bActive, 'O', 'X'); 4 : CellText := pData.WinInfo.sTitle; 5 : CellText := IntToStr(pData.wFndWordPerc) + '%'; 6 : CellText := IntToStr(pData.wHitPerc) + '%'; 7 : CellText := IntToStr(pData.nHitWordCnt); 8 : CellText := IntToStr(pData.nHitCnt); 9 : CellText := IntToStr(pData.nTotalWordCnt); 10 : CellText := pData.sHitReuslts; end; end; end.