/[projects]/dao/DelphiScanner/Components/tpsystools_4.04/examples/Delphi/ExTreeU.pas
ViewVC logotype

Annotation of /dao/DelphiScanner/Components/tpsystools_4.04/examples/Delphi/ExTreeU.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2671 - (hide annotations) (download)
Tue Aug 25 18:15:15 2015 UTC (8 years, 10 months ago) by torben
File size: 9842 byte(s)
Added tpsystools component
1 torben 2671 (* ***** BEGIN LICENSE BLOCK *****
2     * Version: MPL 1.1
3     *
4     * The contents of this file are subject to the Mozilla Public License Version
5     * 1.1 (the "License"); you may not use this file except in compliance with
6     * the License. You may obtain a copy of the License at
7     * http://www.mozilla.org/MPL/
8     *
9     * Software distributed under the License is distributed on an "AS IS" basis,
10     * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11     * for the specific language governing rights and limitations under the
12     * License.
13     *
14     * The Original Code is TurboPower SysTools
15     *
16     * The Initial Developer of the Original Code is
17     * TurboPower Software
18     *
19     * Portions created by the Initial Developer are Copyright (C) 1996-2002
20     * the Initial Developer. All Rights Reserved.
21     *
22     * Contributor(s):
23     *
24     * ***** END LICENSE BLOCK ***** *)
25    
26     unit ExTreeU;
27    
28     interface
29    
30     uses
31     Windows, Messages, SysUtils, Classes, Graphics, Controls,
32     Forms, Dialogs, StdCtrls,
33    
34     StConst, StBase, StTree;
35    
36     type
37     S10 = String[10];
38     S15 = String[15];
39    
40     PersonRecord = record
41     First : S10;
42     Last : S15;
43     Age : Integer;
44     end;
45     PPersonRecord = ^PersonRecord;
46    
47     TSTDlg = class(TForm)
48     CreateBtn: TButton;
49     ClearBtn: TButton;
50     LB1: TListBox;
51     Label1: TLabel;
52     Label2: TLabel;
53     Label3: TLabel;
54     Edit1: TEdit;
55     Edit2: TEdit;
56     Edit3: TEdit;
57     InsertBtn: TButton;
58     DeleteBtn: TButton;
59     FindBtn: TButton;
60     SearchBtn: TButton;
61     LoadBtn: TButton;
62     SaveBtn: TButton;
63     OD1: TOpenDialog;
64     SD1: TSaveDialog;
65     procedure FormActivate(Sender: TObject);
66     procedure FormClose(Sender: TObject; var Action: TCloseAction);
67     procedure CreateBtnClick(Sender: TObject);
68     procedure ClearBtnClick(Sender: TObject);
69     procedure InsertBtnClick(Sender: TObject);
70     procedure DeleteBtnClick(Sender: TObject);
71     procedure FindBtnClick(Sender: TObject);
72     procedure SearchBtnClick(Sender: TObject);
73     procedure LB1DblClick(Sender: TObject);
74     procedure SaveBtnClick(Sender: TObject);
75     procedure LoadBtnClick(Sender: TObject);
76     procedure FormCreate(Sender: TObject);
77     private
78     { Private declarations }
79     public
80     { Public declarations }
81     procedure SetBusy(B : Boolean);
82     procedure FillListBox;
83     procedure FillControls(PR : PersonRecord);
84     function GetControls(var PR : PersonRecord) : Boolean;
85     procedure UpdateButtons(TOK : Boolean);
86     end;
87    
88     const
89     MaxElem = 3000;
90    
91     var
92     STDlg: TSTDlg;
93     FirstA : array[0..7] of S10;
94     LastA : array[0..7] of S15;
95     MyTree : TStTree;
96    
97    
98     implementation
99    
100     {$R *.DFM}
101    
102     function MyLoadData(Reader : TReader) : Pointer; far;
103     begin
104     GetMem(Result,SizeOf(PersonRecord));
105     with PersonRecord(Result^), Reader do
106     begin
107     First := ReadString;
108     Last := ReadString;
109     Age := ReadInteger;
110     end;
111     end;
112    
113     procedure MyStoreData(Writer : TWriter; Data : Pointer); far;
114     var
115     PR : PersonRecord;
116     begin
117     PR := PersonRecord(Data^);
118     with Writer do
119     begin
120     WriteString(PR.First);
121     WriteString(PR.Last);
122     WriteInteger(PR.Age);
123     end;
124     end;
125    
126    
127     procedure MyDisposeData(Data : Pointer); far;
128     begin
129     FreeMem(Data, SizeOf(PersonRecord));
130     end;
131    
132     function MySortTree(Data1, Data2 : Pointer) : Integer; far;
133     var
134     R1 : PPersonRecord absolute Data1;
135     R2 : PPersonRecord absolute Data2;
136     begin
137     Result := CompareText(R1^.Last, R2^.Last);
138     if Result = 0 then
139     CompareText(R1^.First, R2^.First);
140     if Result = 0 then
141     Result := (R1^.Age - R2^.Age);
142     end;
143    
144     function MyTreeWalker(Contariner : TStContainer;
145     Node : TStNode;
146     OtherData : Pointer) : Boolean; far;
147     var
148     R : PersonRecord;
149     S : String;
150     begin
151     R := PersonRecord(Node.Data^);
152     S := R.Last + ', ' + R.First + ', ' + IntToStr(R.Age);
153     STDlg.LB1.Items.Add(S);
154     Result := True;
155     end;
156    
157     function MyTreeSearcher(Contariner : TStContainer;
158     Node : TStNode;
159     OtherData : Pointer) : Boolean; far;
160    
161     var
162     S : string;
163     R1 : PersonRecord;
164     R2 : PPersonRecord absolute OtherData;
165     begin
166     R1 := PersonRecord(Node.Data^);
167     if (CompareText(R1.Last, R2^.Last) = 0) then
168     begin
169     S := 'Match: ' + R1.First + ' ' + R1.Last + ', ' + IntToStr(R1.Age);
170     if MessageDlg(S,mtInformation,[mbOK,mbCancel],0) = mrCancel then
171     Result := False
172     else
173     Result := True;
174     end else
175     Result := True;
176     end;
177    
178     procedure TSTDlg.SetBusy(B : Boolean);
179     begin
180     if B then
181     Screen.Cursor := crHourGlass
182     else
183     Screen.Cursor := crDefault;
184     end;
185    
186     procedure TSTDlg.FillListBox;
187     begin
188     LB1.Clear;
189     LB1.Perform(WM_SETREDRAW,0,0);
190     SetBusy(True);
191    
192     MyTree.Iterate(MyTreeWalker,True,nil);
193    
194     LB1.Perform(WM_SETREDRAW,1,0);
195     LB1.Update;
196     SetBusy(False);
197     end;
198    
199     procedure TSTDlg.FillControls(PR : PersonRecord);
200     begin
201     Edit1.Text := PR.First;
202     Edit2.Text := PR.Last;
203     Edit3.Text := IntToStr(PR.Age);
204     end;
205    
206     function TSTDlg.GetControls(var PR : PersonRecord) : Boolean;
207     var
208     I,
209     Code : Integer;
210     begin
211     Result := False;
212     if (Edit1.Text = '') OR
213     (Edit2.Text = '') OR
214     (Edit3.Text = '') then
215     Exit;
216    
217     PR.First := Edit1.Text;
218     PR.Last := Edit2.Text;
219    
220     Val(Edit3.Text,I,Code);
221     if (Code <> 0) then
222     Exit
223     else
224     PR.Age := I;
225     Result := True;
226     end;
227    
228    
229     procedure TSTDlg.UpdateButtons(TOK : Boolean);
230     begin
231     ClearBtn.Enabled := TOK;
232     InsertBtn.Enabled := TOK;
233     DeleteBtn.Enabled := TOK;
234     FindBtn.Enabled := TOK;
235     SearchBtn.Enabled := TOK;
236     SaveBtn.Enabled := TOK;
237     end;
238    
239    
240     procedure TSTDlg.FormCreate(Sender: TObject);
241     begin
242     RegisterClasses([TStTree,TStTreeNode]);
243     UpdateButtons(False);
244     end;
245    
246    
247     procedure TSTDlg.FormActivate(Sender: TObject);
248     begin
249     FirstA[0] := 'Fred';
250     FirstA[1] := 'Mike';
251     FirstA[2] := 'Barney';
252     FirstA[3] := 'Horatio';
253     FirstA[4] := 'Mickey';
254     FirstA[5] := 'Arthur';
255     FirstA[6] := 'Santa';
256     FirstA[7] := 'John Q. ';
257    
258     LastA[0] := 'Flintstone';
259     LastA[1] := 'Hammer';
260     LastA[2] := 'Rubble';
261     LastA[3] := 'Hornblower';
262     LastA[4] := 'Spilane';
263     LastA[5] := 'Miller';
264     LastA[6] := 'Claus';
265     LastA[7] := 'Public';
266     end;
267    
268     procedure TSTDlg.FormClose(Sender: TObject; var Action: TCloseAction);
269     begin
270     MyTree.Free;
271     end;
272    
273     procedure TSTDlg.CreateBtnClick(Sender: TObject);
274     var
275     I : Integer;
276     PR : PPersonRecord;
277     TN : TStTreeNode;
278     begin
279     if Assigned(MyTree) then
280     MyTree.Free;
281    
282     UpdateButtons(False);
283     MyTree:= TStTree.Create(TStTreeNode);
284    
285     MyTree.Compare := MySortTree;
286     MyTree.DisposeData := MyDisposeData;
287     MyTree.LoadData := MyLoadData;
288     MyTree.StoreData := MyStoreData;
289    
290     SetBusy(True);
291     for I := 0 to MaxElem-1 do
292     begin
293     if (I mod 250 = 0) then Randomize;
294     GetMem(PR, SizeOf(PersonRecord));
295     with PR^ do
296     repeat
297     First := FirstA[Random(8)];
298     Last := LastA[Random(8)];
299     Age := Random(10000);
300    
301     {search for duplicate entry, if found - don't try to add}
302     TN := MyTree.Find(PR);
303     if TN = nil then
304     MyTree.Insert(PR);
305     until TN = nil;
306     end;
307     FillListBox;
308     SetBusy(False);
309     UpdateButtons(True);
310     end;
311    
312     procedure TSTDlg.ClearBtnClick(Sender: TObject);
313     begin
314     MyTree.Clear;
315     LB1.Clear;
316     Edit1.Text := '';
317     Edit2.Text := '';
318     Edit3.Text := '';
319     end;
320    
321     procedure TSTDlg.InsertBtnClick(Sender: TObject);
322     var
323     PR : PPersonRecord;
324     begin
325     GetMem(PR, SizeOf(PersonRecord));
326     if NOT (GetControls(PR^)) then
327     begin
328     FreeMem(PR, SizeOf(PersonRecord));
329     ShowMessage('One or more fields invalid');
330     Exit;
331     end else
332     begin
333     MyTree.Insert(PR);
334     FillListBox;
335     end;
336     end;
337    
338     procedure TSTDlg.DeleteBtnClick(Sender: TObject);
339     var
340     PR : PersonRecord;
341     TN : TStTreeNode;
342     begin
343     if NOT (GetControls(PR)) then
344     begin
345     ShowMessage('One or more invalid entry fields');
346     Exit;
347     end;
348     TN := MyTree.Find(@PR);
349     if (TN <> nil) then
350     begin
351     MyTree.Delete(@PR);
352     FillListBox;
353     end else
354     ShowMessage('Record not found');
355     end;
356    
357     procedure TSTDlg.FindBtnClick(Sender: TObject);
358     var
359     PR : PersonRecord;
360     TN : TStTreeNode;
361     begin
362     if NOT (GetControls(PR)) then
363     begin
364     ShowMessage('One or more invalid entry fields');
365     Exit;
366     end;
367    
368     TN := MyTree.Find(@PR);
369     if (TN <> nil) then
370     ShowMessage('Record was found');
371     end;
372    
373     procedure TSTDlg.SearchBtnClick(Sender: TObject);
374     var
375     PR : PersonRecord;
376     begin
377     PR.Last := Edit2.Text;
378     MyTree.Iterate(MyTreeSearcher, True, @PR);
379     end;
380    
381     procedure TSTDlg.LB1DblClick(Sender: TObject);
382     var
383     I,
384     L : Integer;
385     PR : PersonRecord;
386     S : string;
387     TN : TStTreeNode;
388    
389     begin
390     S := LB1.Items[LB1.ItemIndex];
391     L := Length(S);
392     I := pos(',', S);
393    
394     PR.Last := S;
395     Delete(PR.Last, I, L-I+1);
396     Delete(S, 1, I+1);
397    
398     PR.First := S;
399     L := Length(PR.First);
400     I := pos(',', PR.First);
401    
402     Delete(PR.First, I, L-I+1);
403     Delete(S, 1, I+1);
404     PR.Age := StrToInt(S);
405    
406     TN := MyTree.Find(@PR);
407     if TN <> nil then
408     begin
409     MyTree.Delete(@PR);
410     FillListBox;
411     end;
412     end;
413    
414     procedure TSTDlg.LoadBtnClick(Sender: TObject);
415     begin
416     if OD1.Execute then
417     begin
418     if (NOT Assigned(MyTree)) then
419     begin
420     UpdateButtons(False);
421     MyTree:= TStTree.Create(TStTreeNode);
422     MyTree.Compare := MySortTree;
423     MyTree.DisposeData := MyDisposeData;
424     MyTree.LoadData := MyLoadData;
425     MyTree.StoreData := MyStoreData;
426     end;
427    
428     MyTree.Clear;
429     MyTree.LoadFromFile(OD1.FileName);
430     FillListBox;
431     UpdateButtons(True);
432     end;
433     end;
434    
435     procedure TSTDlg.SaveBtnClick(Sender: TObject);
436     begin
437     if SD1.Execute then
438     MyTree.StoreToFile(SD1.FileName);
439     end;
440    
441     end.

  ViewVC Help
Powered by ViewVC 1.1.20