unit DictMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Compress: TButton; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Uncompress: TButton; procedure CompressClick(Sender: TObject); procedure UncompressClick(Sender: TObject); private public end; var Form1: TForm1; implementation uses Math; {$R *.dfm} procedure TForm1.CompressClick(Sender: TObject); var I: Integer; J: Integer; S1: string; S2: string; List1: TStringList; List2: TStringList; Digit: Integer; Ch: Char; Stream: TFileStream; begin if OpenDialog1.Execute then begin List1 := TStringList.Create; List2 := TStringList.Create; List1.LoadFromFile(OpenDialog1.FileName); List1.Sorted := True; List2.Add('0' + List1[0]); for I := 1 to List1.Count-1 do begin S1 := List1[I-1]; S2 := List1[I]; if S2 <> '' then begin Digit := 0; for J := 1 to Min(9, Min(Length(S1), Length(S2)))+1 do begin if S1[J] <> S2[J] then begin Digit := J - 1; Break; end; if J = 10 then Digit := 9; end; List2.Add(Char(Ord('0') + Digit) + Copy(S2, Digit+1, Length(S2))); end; end; if SaveDialog1.Execute then begin Ch := #10; Stream := TFileStream.Create(SaveDialog1.FileName, fmCreate); for I := 0 to List2.Count-1 do begin Stream.Write(PChar(List2[I])^, Length(List2[I])); Stream.Write(Ch, 1); end; Stream.Free; end; // List2.SaveToFile(SaveDialog1.FileName); List1.Free; List2.Free; end; end; procedure TForm1.UncompressClick(Sender: TObject); var AFile: TextFile; Value: string; LastValue: string; N: Integer; List: TStringList; begin List := TStringList.Create; if OpenDialog1.Execute then begin System.AssignFile(AFile, OpenDialog1.FileName); System.Reset(AFile); try repeat Readln(AFile, Value); if Value <> '' then begin // (rom) simple compession for dictionary N := Ord(Value[1]) - Ord('0'); Value := Copy(Value, 2, Length(Value) - 1); if N > 0 then Value := Copy(LastValue, 1, N) + Value; LastValue := Value; List.Add(Value); end; until Eof(AFile); finally System.Close(AFile); end; if SaveDialog1.Execute then List.SaveToFile(SaveDialog1.FileName); end; List.Free; end; end.