BSOne.SFC/Tocsg.Module/MonSecu/DWizTracking.pas

615 lines
18 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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('<27>̹<EFBFBD><CCB9><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>θ<EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>ֽʽÿ<CABD>.'), PChar(Caption), MB_ICONWARNING or MB_OK);
edImgPath.SetFocus;
exit;
end;
if not FileExists(edImgPath.Text) then
begin
MessageBox(Handle, PChar('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Դϴ<D4B4>.'), 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('<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>.'), 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('<27>˻<EFBFBD> <20>ܾ<EFBFBD> <20><> : %d, <20>˻<EFBFBD><CBBB><EFBFBD> <20><> : %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('<27>̹<EFBFBD><CCB9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʽ<EFBFBD><CABD>ϴ<EFBFBD>.'), 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.