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

Contents of /dao/DelphiScanner/Components/tpsystools_4.04/examples/Delphi/ExCollU.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2671 - (show annotations) (download)
Tue Aug 25 18:15:15 2015 UTC (8 years, 9 months ago) by torben
File size: 11964 byte(s)
Added tpsystools component
1 (* ***** 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 ExCollU;
27
28 interface
29
30 uses
31 Windows, Messages, SysUtils, Classes, Graphics, Controls,
32 Forms, Dialogs, StdCtrls, Buttons, ExtCtrls,
33
34 StConst, StBase, StColl;
35
36 type
37 S10 = string[10];
38 S15 = string[15];
39
40 ARecord = record
41 First : S10;
42 Last : S15;
43 Age : Integer;
44 end;
45
46 TSTDlg = class(TForm)
47 CreateBtn: TButton;
48 LB1: TListBox;
49 ClearBtn: TButton;
50 PackBtn: TButton;
51 EffBtn: TButton;
52 Edit1: TEdit;
53 Edit3: TEdit;
54 Label8: TLabel;
55 Edit2: TEdit;
56 AtBtn: TButton;
57 AtInsBtn: TButton;
58 AtPutBtn: TButton;
59 DelBtn: TButton;
60 AtDelBtn: TButton;
61 InsBtn: TButton;
62 Label1: TLabel;
63 Label2: TLabel;
64 Label3: TLabel;
65 Edit4: TEdit;
66 Edit5: TEdit;
67 LoadBtn: TButton;
68 SaveBtn: TButton;
69 OD1: TOpenDialog;
70 SD1: TSaveDialog;
71
72 procedure FormClose(Sender: TObject; var Action: TCloseAction);
73
74 procedure CreateBtnClick(Sender: TObject);
75 procedure ClearBtnClick(Sender: TObject);
76 procedure PackBtnClick(Sender: TObject);
77 procedure EffBtnClick(Sender: TObject);
78 procedure AtBtnClick(Sender: TObject);
79 procedure AtInsBtnClick(Sender: TObject);
80 procedure AtPutBtnClick(Sender: TObject);
81 procedure DelBtnClick(Sender: TObject);
82 procedure AtDelBtnClick(Sender: TObject);
83 procedure InsBtnClick(Sender: TObject);
84 procedure LB1DblClick(Sender: TObject);
85 procedure LB1Click(Sender: TObject);
86 procedure SaveBtnClick(Sender: TObject);
87 procedure LoadBtnClick(Sender: TObject);
88 procedure FormCreate(Sender: TObject);
89
90 private
91 { Private declarations }
92 public
93 { Public declarations }
94 procedure SetBusy(B : Boolean);
95 procedure FillControls(AR : ARecord);
96 function CheckControls(var AR : ARecord) : Boolean;
97 procedure FillListBox;
98 procedure UpdateButtons(COK : Boolean);
99 end;
100
101 var
102 STDlg: TSTDlg;
103
104 implementation
105
106 {$R *.DFM}
107
108
109 const
110 MaxElem = 20000;
111
112 var
113 FirstA : array[0..7] of S10;
114 LastA : array[0..7] of S15;
115 MyCollection : TStCollection;
116
117
118 procedure MyDelNodeData(Data : pointer); far;
119 {-procedure to delete data pointer in each node}
120 begin
121 FreeMem(Data,SizeOf(ARecord));
122 end;
123
124 function MatchCollString(Container : TStContainer;
125 Data : Pointer;
126 OtherData : Pointer) : Boolean; far;
127 begin
128 Result := (ARecord(Data^).First <> ARecord(OtherData^).First) OR
129 (ARecord(Data^).Last <> ARecord(OtherData^).Last);
130 end;
131
132 function CollWalker(Container : TStContainer;
133 Data : Pointer;
134 OtherData : Pointer) : Boolean; far;
135 {this function makes no comparison and always returns True}
136 {so it will visit all nodes in the collection}
137 begin
138 with ARecord(Data^) do
139 STDlg.LB1.Items.Add(First + ' ' + Last + ', ' + IntToStr(Age));
140 Result := True;
141 end;
142
143 procedure MyStoreData(Writer : TWriter; Data : Pointer); far;
144 begin
145 with ARecord(Data^), Writer do
146 begin
147 WriteString(First);
148 WriteString(Last);
149 WriteInteger(Age);
150 end;
151 end;
152
153 function MyLoadData(Reader : TReader) : Pointer; far;
154 begin
155 GetMem(Result,SizeOf(ARecord));
156 with ARecord(Result^), Reader do
157 begin
158 First := ReadString;
159 Last := ReadString;
160 Age := ReadInteger;
161 end;
162 end;
163
164
165 procedure TSTDlg.UpdateButtons(COK : Boolean);
166 begin
167 ClearBtn.Enabled := COK;
168 PackBtn.Enabled := COK;
169 AtBtn.Enabled := COK;
170 AtInsBtn.Enabled := COK;
171 AtPutBtn.Enabled := COK;
172 DelBtn.Enabled := COK;
173 AtDelBtn.Enabled := COK;
174 InsBtn.Enabled := COK;
175 EffBtn.Enabled := COK;
176 SaveBtn.Enabled := COK;
177 end;
178
179 procedure TSTDlg.FormCreate(Sender: TObject);
180 begin
181 RegisterClass(TStCollection);
182 UpdateButtons(False);
183
184 FirstA[0] := 'Fred';
185 FirstA[1] := 'Robert';
186 FirstA[2] := 'Barney';
187 FirstA[3] := 'Horatio';
188 FirstA[4] := 'Kent';
189 FirstA[5] := 'Arthur';
190 FirstA[6] := 'Lee';
191 FirstA[7] := 'John Q. ';
192
193 LastA[0] := 'Flintstone';
194 LastA[1] := 'Java';
195 LastA[2] := 'Rubble';
196 LastA[3] := 'Hornblower';
197 LastA[4] := 'C++Builder';
198 LastA[5] := 'Miller';
199 LastA[6] := 'Delphi';
200 LastA[7] := 'Public';
201 end;
202
203 procedure TSTDlg.FormClose(Sender: TObject;
204 var Action: TCloseAction);
205 begin
206 MyCollection.Free;
207 end;
208
209 procedure TSTDlg.SetBusy(B : Boolean);
210 begin
211 if B then
212 Screen.Cursor := crHourGlass
213 else
214 Screen.Cursor := crDefault;
215 end;
216
217 function TSTDlg.CheckControls(var AR : ARecord) : Boolean;
218 var
219 C,
220 IV : Integer;
221 begin
222 Result := False;
223
224 if (Edit3.Text = '') OR
225 (Edit4.Text = '') OR
226 (Edit5.Text = '') then
227 Exit;
228
229 AR.First := Edit3.Text;
230 AR.Last := Edit4.Text;
231
232 Val(Edit5.Text,IV,C);
233 if (C<>0) then
234 Exit
235 else
236 AR.Age := IV;
237 Result := True;
238 end;
239
240 procedure TSTDlg.FillControls(AR : ARecord);
241 begin
242 with AR do
243 begin
244 Edit3.Text := First;
245 Edit4.Text := Last;
246 Edit5.Text := IntToStr(Age);
247 end;
248 end;
249
250 procedure TSTDlg.FillListBox;
251 begin
252 LB1.Clear;
253 LB1.Perform(WM_SETREDRAW,0,0);
254
255 SetBusy(True);
256
257 MyCollection.Iterate(CollWalker,True,nil);
258
259 LB1.Perform(WM_SETREDRAW,1,0);
260 LB1.Update;
261 LB1.ItemIndex := 0;
262 Edit2.Text := '0';
263
264 SetBusy(False);
265 end;
266
267 procedure TSTDlg.CreateBtnClick(Sender: TObject);
268 var
269 I : Integer;
270 AR : ^ARecord;
271 begin
272 if Assigned(MyCollection) then
273 MyCollection.Free;
274
275 UpdateButtons(False);
276 MyCollection := TStCollection.Create(100);
277
278 MyCollection.DisposeData := MyDelNodeData;
279 MyCollection.LoadData := MyLoadData;
280 MyCollection.StoreData := MyStoreData;
281
282 Randomize;
283 LB1.Clear;
284 LB1.Perform(WM_SETREDRAW,0,0);
285 SetBusy(True);
286
287 for I := 0 to MaxElem-1 do
288 begin
289 GetMem(AR,SizeOf(ARecord));
290 with AR^ do
291 begin
292 First := FirstA[Random(8)];
293 Last := LastA[Random(8)];
294 Age := Random(100);
295
296 MyCollection.Insert(AR);
297 LB1.Items.Add(First + ' ' + Last + ', ' + IntToStr(Age));
298 end;
299 end;
300 LB1.Perform(WM_SETREDRAW,1,0);
301 LB1.Update;
302
303 MyCollection.Pack;
304 Edit1.Text := IntToStr(MyCollection.Efficiency);
305 UpdateButtons(True);
306 SetBusy(False);
307 end;
308
309 procedure TSTDlg.ClearBtnClick(Sender: TObject);
310 begin
311 MyCollection.Clear;
312 LB1.Clear;
313 Edit1.Text := IntToStr(MyCollection.Efficiency);
314 end;
315
316 procedure TSTDlg.PackBtnClick(Sender: TObject);
317 begin
318 if (MessageDlg('Current Efficiency: ' + IntToStr(MyCollection.Efficiency) +
319 #13 + 'Pack Collection?',
320 mtConfirmation,[mbYes,mbNo],0) = mrNo) then Exit;
321
322 MyCollection.Pack;
323 Edit1.Text := IntToStr(MyCollection.Efficiency);
324 end;
325
326 procedure TSTDlg.EffBtnClick(Sender: TObject);
327 begin
328 Edit1.Text := IntToStr(MyCollection.Efficiency);
329 end;
330
331 procedure TSTDlg.AtBtnClick(Sender: TObject);
332 var
333 Data : Pointer;
334 E : LongInt;
335 begin
336 if (Edit2.Text = '') then
337 Edit2.Text := '0';
338 E := StrToInt(Edit2.Text);
339 if (E > MyCollection.Count-1) OR (E < 0) then
340 begin
341 ShowMessage('Element value out of range (0..' + IntToStr(MyCollection.Count) + ')');
342 Edit2.Text := '0';
343 Exit;
344 end;
345
346 Data := MyCollection.At(E);
347 FillControls(ARecord(Data^));;
348 end;
349
350 procedure TSTDlg.AtInsBtnClick(Sender: TObject);
351 var
352 E : LongInt;
353 PAR : ^ARecord;
354 begin
355 GetMem(PAR,SizeOf(ARecord));
356 if (NOT CheckControls(PAR^)) then
357 begin
358 ShowMessage('One or more data controls invalid');
359 FreeMem(PAR,SizeOf(ARecord));
360 Exit;
361 end;
362
363 if (Edit2.Text = '') then
364 Edit2.Text := '0';
365 E := StrToInt(Edit2.Text);
366 if (E > MyCollection.Count-1) OR (E < 0) then
367 begin
368 ShowMessage('Element value out of range (0..' + IntToStr(MyCollection.Count) + ')');
369 Edit2.Text := '0';
370 Exit;
371 end;
372
373 MyCollection.AtInsert(E,PAR);
374 FillListBox;
375 end;
376
377 procedure TSTDlg.AtPutBtnClick(Sender: TObject);
378 var
379 E : LongInt;
380 Data : Pointer;
381 AR : ARecord;
382 begin
383 if (NOT CheckControls(AR)) then
384 begin
385 ShowMessage('One or more data controls invalid');
386 Exit;
387 end;
388
389 if (Edit2.Text = '') then
390 Edit2.Text := '0';
391 E := StrToInt(Edit2.Text);
392 if (E > MyCollection.Count-1) OR (E < 0) then
393 begin
394 ShowMessage('Element value out of range (0..' + IntToStr(MyCollection.Count) + ')');
395 Edit2.Text := '0';
396 Exit;
397 end;
398
399 Data := MyCollection.At(E);
400 if Data <> nil then
401 begin
402 ARecord(Data^) := AR;
403 MyCollection.AtPut(E, Data);
404 FillListBox;
405 end;
406 end;
407
408 procedure TSTDlg.DelBtnClick(Sender: TObject);
409 var
410 AR : ARecord;
411 PN : Pointer;
412 begin
413 if (NOT CheckControls(AR)) then
414 begin
415 ShowMessage('One or more data entry fields invalid');
416 Exit;
417 end;
418 PN := MyCollection.Iterate(MatchCollString,True,@AR);
419 if (PN <> nil) then
420 begin
421 MyCollection.Delete(PN);
422 FillListBox;
423 end else
424 ShowMessage('Data not found');
425 end;
426
427 procedure TSTDlg.AtDelBtnClick(Sender: TObject);
428 var
429 E : LongInt;
430 begin
431 if (Edit2.Text = '') then
432 E := 0
433 else
434 E := StrToInt(Edit2.Text);
435 if (E > MyCollection.Count-1) OR (E < 0) then
436 begin
437 ShowMessage('Element value out of range (0..' + IntToStr(MyCollection.Count) + ')');
438 Edit2.Text := '0';
439 Exit;
440 end;
441 MyCollection.AtDelete(E);
442 FillListBox;
443 end;
444
445 procedure TSTDlg.InsBtnClick(Sender: TObject);
446 var
447 E : Integer;
448 AR : ^ARecord;
449 begin
450 if (Edit2.Text = '') then
451 E := 0
452 else
453 E := StrToInt(Edit2.Text);
454 if (E > MyCollection.Count-1) OR (E < 0) then
455 begin
456 ShowMessage('Element value out of range (0..' + IntToStr(MyCollection.Count) + ')');
457 Edit2.Text := '0';
458 Exit;
459 end;
460
461 GetMem(AR,SizeOf(ARecord));
462 if (NOT CheckControls(AR^)) then
463 begin
464 ShowMessage('One or more data entry fields invalid');
465 FreeMem(AR,SizeOf(ARecord));
466 Exit;
467 end;
468
469 MyCollection.Insert(AR);
470 FillListBox;
471 end;
472
473 procedure TSTDlg.LB1DblClick(Sender: TObject);
474 begin
475 MyCollection.AtDelete(LB1.ItemIndex);
476 FillListBox;
477 Edit2.Text := '0';
478 end;
479
480 procedure TSTDlg.LB1Click(Sender: TObject);
481 begin
482 Edit2.Text := IntToStr(LB1.ItemIndex);
483 end;
484
485 procedure TSTDlg.LoadBtnClick(Sender: TObject);
486 begin
487 if (OD1.Execute) then
488 begin
489 if (NOT Assigned(MyCollection)) then
490 begin
491 UpdateButtons(False);
492 MyCollection := TStCollection.Create(100);
493 MyCollection.DisposeData := MyDelNodeData;
494 MyCollection.LoadData := MyLoadData;
495 MyCollection.StoreData := MyStoreData;
496 end;
497
498 LB1.Clear;
499 MyCollection.Clear;
500
501 SetBusy(True);
502 MyCollection.LoadFromFile(OD1.FileName);
503 MyCollection.Pack;
504 SetBusy(False);
505
506 FillListBox;
507 UpdateButtons(True);
508 end;
509 end;
510
511
512 procedure TSTDlg.SaveBtnClick(Sender: TObject);
513 begin
514 if (SD1.Execute) then
515 begin
516 SetBusy(True);
517 MyCollection.StoreToFile(SD1.FileName);
518 SetBusy(False);
519 end;
520 end;
521
522
523
524 end.

  ViewVC Help
Powered by ViewVC 1.1.20