-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathDataGrabber.Utils.pas
135 lines (115 loc) · 3.07 KB
/
DataGrabber.Utils.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
{
Copyright (C) 2013-2025 Tim Sinaeve [email protected]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
}
{$I DataGrabber.inc}
unit DataGrabber.Utils;
interface
uses
Winapi.Windows,
System.Classes,
Vcl.Controls, Vcl.Graphics,
VirtualTrees, VirtualTrees.BaseTree;
function FindNode(
AVT : TVirtualStringTree;
AIdx : Integer;
AParentNode : PVirtualNode
): PVirtualNode;
procedure SelectNode(
AVT : TVirtualStringTree;
AIdx : Integer;
AParentNode : PVirtualNode = nil
); overload;
procedure SelectNode(
AVT : TVirtualStringTree;
ANode : PVirtualNode
); overload;
implementation
uses
Winapi.ShellAPI, Winapi.Messages,
System.SysUtils,
Vcl.Forms,
DDuce.Utils, DDuce.Utils.Winapi;
{$REGION 'interfaced routines'}
function RunFormatterProcess(const AExeName: string; const AParams: string;
const AString: string; const ATempFile: string): string;
var
SL : TStringList;
S : string;
T : string;
begin
S := ExtractFilePath(Application.ExeName) + AExeName;
T := ExtractFilePath(Application.ExeName) + ATempFile;
if FileExists(S) then
begin
SL := TStringList.Create;
try
SL.Text := AString;
SL.SaveToFile(T);
RunApplication(Format(AParams, [T]), S);
SL.LoadFromFile(T);
Result := SL.Text;
finally
FreeAndNil(SL);
end;
if FileExists(T) then
DeleteFile(T);
end
else
raise Exception.CreateFmt('%s not found!', [S]);
end;
function FormatSQL(const AString: string): string;
begin
Result := RunFormatterProcess(
'SQLFormatter.exe',
'%s /is:" " /st:2 /mw:80 /tc /uk- /ae',
AString,
'Formatter.sql'
);
end;
function FindNode(AVT: TVirtualStringTree; AIdx: Integer; AParentNode: PVirtualNode): PVirtualNode;
var
Node: PVirtualNode;
begin
// Helper to find a node by its index
Result := nil;
if Assigned(AParentNode) then
Node := AVT.GetFirstChild(AParentNode)
else
Node := AVT.GetFirst;
while Assigned(Node) do
begin
if Node.Index = Cardinal(AIdx) then
begin
Result := Node;
Break;
end;
Node := AVT.GetNextSibling(Node);
end;
end;
procedure SelectNode(AVT: TVirtualStringTree; AIdx: Integer; AParentNode: PVirtualNode);
var
Node: PVirtualNode;
begin
// Helper to focus and highlight a node by its index
Node := FindNode(AVT, AIdx, AParentNode);
if Assigned(Node) then
SelectNode(AVT, Node);
end;
procedure SelectNode(AVT: TVirtualStringTree; ANode: PVirtualNode);
begin
AVT.ClearSelection;
AVT.FocusedNode := ANode;
AVT.Selected[ANode] := True;
AVT.ScrollIntoView(ANode, False);
end;
{$ENDREGION}
end.