lazarus/components/lazutils/examples/LookupStringList/main.pas

155 lines
3.1 KiB
ObjectPascal

unit Main;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Math, Forms, Controls, Dialogs, StdCtrls, Spin,
LookupStringList;
type
{ TForm1 }
TForm1 = class(TForm)
btnDedupeMemo: TButton;
btnDedupeFile: TButton;
btnGenerate: TButton;
Label1 :TLabel;
lblLines: TLabel;
lblTime: TLabel;
Memo: TMemo;
SpinEdit1: TSpinEdit;
procedure btnDedupeFileClick(Sender: TObject);
procedure btnGenerateClick(Sender: TObject);
procedure btnDedupeMemoClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
private
inList :TStringList;
procedure UpdateDuplicates(aDuplicateCount: string);
procedure UpdateTime(aTime: TDateTime);
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.UpdateDuplicates(aDuplicateCount: string);
begin
lblLines.Caption := 'Duplicated Lines: ' + aDuplicateCount;
end;
procedure TForm1.UpdateTime(aTime: TDateTime);
begin
lblTime.Caption := 'Time: ' + TimeToStr(aTime);
end;
procedure TForm1.btnGenerateClick(Sender: TObject);
var
i, j: Integer;
s :string;
begin
UpdateDuplicates('?');
UpdateTime(0);
Memo.Clear;
Application.ProcessMessages;
Screen.Cursor := crHourGlass;
try
InList.Clear;
for i := 0 to SpinEdit1.Value - 1 do
begin
s := '';
for j := 0 to 5 do
s := s + chr(randomrange(97, 123));
InList.Add(s);
end;
Memo.Lines.Assign(inList);
finally
Screen.Cursor := crDefault;
end;
end;
procedure TForm1.btnDedupeMemoClick(Sender: TObject);
var
DSL :TLookupStringList;
T :TDateTime;
begin
Screen.Cursor := crHourGlass;
try
T := Now;
DSL := TLookupStringList.Create;
try
DSL.Assign(Memo.Lines);
UpdateDuplicates(IntToStr(Memo.Lines.Count - DSL.Count));
Memo.Lines.Assign(DSL);
finally
DSL.Free;
end;
UpdateTime(Now - T);
finally
Screen.Cursor := crDefault;
end;
end;
procedure TForm1.btnDedupeFileClick(Sender: TObject);
var
T :TDateTime;
N :integer;
DSL :TLookupStringList;
begin
lblTime.Caption := 'Time:';
lblLines.Caption := 'Duplicated lines:';
Application.ProcessMessages;
if Trim(Memo.Text) = '' then
begin
ShowMessage('Generating data. Please wait.');
btnGenerateClick(nil);
end;
ShowMessage('Saving memo to a file. Please wait.');
Memo.Lines.SaveToFile('temp.txt');
ShowMessage('Dedupping the file.');
T := Now;
N := Memo.Lines.Count;
DSL := TLookupStringList.Create;
try
DSL.LoadFromFile('temp.txt');
lblLines.Caption := 'Duplicated Lines: ' + IntToStr(N - DSL.Count);
DSL.SaveToFile('temp.txt');
lblTime.Caption := 'Time: ' + TimeToStr(Now - T);
ShowMessage('Deleting the file.');
DeleteFile('temp.txt');
finally
DSL.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
inList := TStringList.Create;
Randomize;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
inList.Free;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
spinedit1.Value := 100000;
end;
end.