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

Annotation of /dao/DelphiScanner/Components/tpsystools_4.04/examples/Delphi/TxtSortU.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: 6795 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 TxtSortU;
27    
28     interface
29    
30     uses
31     Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
32     StdCtrls, Buttons,
33    
34     StConst, StBase, StColl, StSort;
35    
36     const
37     MaxStrLen = 1024;
38    
39     type
40     SortException = class(Exception);
41     LineBuf = array[0..MaxStrLen-1] of char;
42    
43     TSTDlg = class(TForm)
44     GroupBox1: TGroupBox;
45     Label1: TLabel;
46     Label2: TLabel;
47     InFile: TEdit;
48     OutFile: TEdit;
49     GroupBox2: TGroupBox;
50     RevOrder: TCheckBox;
51     IgnoreCase: TCheckBox;
52     GroupBox3: TGroupBox;
53     Label3: TLabel;
54     Label4: TLabel;
55     StartPos: TEdit;
56     KeyLen: TEdit;
57     OkBtn: TBitBtn;
58     CloseBtn: TBitBtn;
59     GroupBox4: TGroupBox;
60     Status: TLabel;
61     AbortBtn: TBitBtn;
62     OpenDialog1: TOpenDialog;
63     SaveDialog1: TSaveDialog;
64     InputBtn: TSpeedButton;
65     OutputBtn: TSpeedButton;
66     procedure OkBtnClick(Sender: TObject);
67     procedure FormClose(Sender: TObject; var Action: TCloseAction);
68     procedure CloseBtnClick(Sender: TObject);
69     procedure FormActivate(Sender: TObject);
70     procedure AbortBtnClick(Sender: TObject);
71     procedure InputBtnClick(Sender: TObject);
72     procedure OutputBtnClick(Sender: TObject);
73     private
74     { Private declarations }
75     public
76     { Public declarations }
77     DoAbort,
78     InSort,
79     DoRev,
80     Ignore : Boolean;
81    
82     SPos,
83     KeyL : Integer;
84    
85     LC : LongInt;
86    
87     InF,
88     OutF : TextFile;
89    
90     MySort : TStSorter;
91    
92     function ValidateEntryFields : Boolean;
93     procedure CleanUp;
94     end;
95    
96    
97     var
98     STDlg: TSTDlg;
99    
100     implementation
101    
102     {$R *.DFM}
103    
104     procedure DelNodeData(Data : pointer); far;
105     {-procedure to delete data pointer in each node}
106     begin
107     Dispose(Data);
108     end;
109    
110    
111     function TFSorter(const S1, S2) : Integer; far;
112     var
113     PX, PY : LineBuf;
114     begin
115     if STDlg.DoRev then begin
116     StrCopy(PX, LineBuf(S2));
117     StrCopy(PY, LineBuf(S1));
118     end else begin
119     StrCopy(PX, LineBuf(S1));
120     StrCopy(PY, LineBuf(S2));
121     end;
122    
123    
124    
125     if STDlg.Ignore then begin
126     if (StrLIComp(@PX[STDlg.SPos-1], @PY[STDlg.SPos-1], STDlg.KeyL) < 0) then
127     Result := -1
128     else
129     Result := 0;
130     end else begin
131     if (StrLComp(@PX[STDlg.SPos-1], @PY[STDlg.SPos-1], STDlg.KeyL) < 0) then
132     Result := -1
133     else
134     Result := 0;
135     end;
136     end;
137    
138     procedure TSTDlg.FormClose(Sender: TObject; var Action: TCloseAction);
139     begin
140     if MySort <> nil then
141     MySort.Free;
142     end;
143    
144     procedure TSTDlg.CloseBtnClick(Sender: TObject);
145     begin
146     if InSort then Exit;
147     Close;
148     end;
149    
150     function TSTDlg.ValidateEntryFields : Boolean;
151     var
152     Code : Integer;
153    
154     begin
155     Result := False;
156    
157     if NOT FileExists(InFile.Text) then
158     begin
159     ShowMessage('Input file does not exist');
160     Exit;
161     end;
162    
163     if FileExists(OutFile.Text) then
164     begin
165     if MessageDlg('Output file exists' + #13 + 'Continue?',
166     mtConfirmation,[mbYes,mbNo],0) = mrNo then
167     Exit;
168     end;
169    
170     if (CompareText(InFile.Text,OutFile.Text) = 0) then
171     begin
172     ShowMessage('Input and Output file can not be the same');
173     Exit;
174     end;
175    
176     val(StartPos.Text,SPos,Code);
177     if (Code <> 0) then
178     begin
179     ShowMessage('Invalid Start entry');
180     Exit;
181     end;
182     if (SPos < 1) OR (SPos >= MaxStrLen) then
183     begin
184     ShowMessage('Start out of range');
185     Exit;
186     end;
187    
188     val(KeyLen.Text,KeyL,Code);
189     if (Code <> 0) then
190     begin
191     ShowMessage('Invalid Length entry');
192     Exit;
193     end;
194     if (KeyL < 1) OR (KeyL > MaxStrLen-SPos) then
195     begin
196     ShowMessage('Key Length out of range');
197     Exit;
198     end;
199    
200     DoRev := RevOrder.Checked;
201     Ignore := IgnoreCase.Checked;
202    
203     Result := True;
204     end;
205    
206    
207     procedure TSTDlg.CleanUp;
208     begin
209     CloseFile(InF);
210     CloseFile(OutF);
211     InSort := False;
212     DoAbort := True;
213    
214     MySort.Free;
215     MySort := nil;
216     end;
217    
218     procedure TSTDlg.OkBtnClick(Sender: TObject);
219     var
220     PS : LineBuf;
221     begin
222     if NOT ValidateEntryFields then
223     Exit;
224    
225     AssignFile(InF,InFile.Text);
226     Reset(InF);
227     AssignFile(OutF,OutFile.Text);
228     ReWrite(OutF);
229    
230     if MySort <> nil then begin
231     MySort.Free;
232     MySort := nil;
233     end;
234    
235     MySort := TStSorter.Create(500000, SizeOf(LineBuf));
236     MySort.Compare := TFSorter;
237    
238     DoAbort := False;
239     InSort := True;
240     LC := 0;
241    
242     while NOT EOF(InF) do begin
243     FillChar(PS, SizeOf(PS), #0);
244     Readln(InF, PS);
245     Inc(LC);
246     Status.Caption := 'Reading/Sorting line: ' + IntToStr(LC);
247     MySort.Put(PS);
248    
249     if (LC mod 100) = 0 then begin
250     Application.ProcessMessages;
251     if DoAbort then begin
252     CleanUp;
253     Status.Caption := 'Sort Aborted';
254     Exit;
255     end;
256     end;
257     end;
258    
259     Status.Caption := 'Processing';
260     Status.Update;
261     Application.ProcessMessages;
262    
263     if NOT DoAbort then begin
264     LC := 0;
265     while MySort.Get(PS) do begin
266     Inc(LC);
267     Status.Caption := 'Writing line: ' + IntToStr(LC);
268     Writeln(OutF, PS);
269    
270     if (LC mod 100) = 0 then begin
271     Application.ProcessMessages;
272     if DoAbort then begin
273     CleanUp;
274     Status.Caption := 'Sort Aborted';
275     Exit;
276     end;
277     end;
278     end;
279     end;
280    
281     if NOT DoAbort then begin
282     CleanUp;
283     Status.Caption := 'Done';
284     end;
285     end;
286    
287    
288     procedure TSTDlg.FormActivate(Sender: TObject);
289     begin
290     IgnoreCase.Checked := True;
291     RevOrder.Checked := False;
292     InFile.Text := '';
293     OutFile.Text := '';
294     StartPos.Text := '1';
295     KeyLen.Text := '20';
296     Status.Caption := 'Idle';
297     end;
298    
299     procedure TSTDlg.AbortBtnClick(Sender: TObject);
300     begin
301     DoAbort := True;
302     end;
303    
304     procedure TSTDlg.InputBtnClick(Sender: TObject);
305     begin
306     if OpenDialog1.Execute then
307     InFile.Text := OpenDialog1.FileName;
308     end;
309    
310     procedure TSTDlg.OutputBtnClick(Sender: TObject);
311     begin
312     if SaveDialog1.Execute then
313     OutFile.Text := SaveDialog1.FileName;
314     end;
315    
316     end.

  ViewVC Help
Powered by ViewVC 1.1.20