Pascal Diff, Version 0.2 (alt)
Hinweis: dies ist nicht die neueste Version!
Datei: main.pas
unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Memo1: TMemo; OpenDialog1: TOpenDialog; Memo2: TMemo; Panel1: TPanel; Edit1: TEdit; Button1: TButton; Edit2: TEdit; Button2: TButton; Button3: TButton; CheckBox1: TCheckBox; CheckBox2: TCheckBox; CheckBox3: TCheckBox; procedure FormResize(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} uses diff; procedure TForm1.Button1Click(Sender: TObject); begin OpenDialog1.FileName := Edit1.Text; if OpenDialog1.Execute then Edit1.Text := OpenDialog1.FileName; end; procedure TForm1.Button2Click(Sender: TObject); begin OpenDialog1.FileName := Edit2.Text; if OpenDialog1.Execute then Edit2.Text := OpenDialog1.FileName; end; procedure TForm1.Button3Click(Sender: TObject); var File1, File2: TStringList; Differ: TStandardTextComparer; idx: integer; Diff: TDifference; Line1, Line2: integer; Fmt: string; Time1, Time2: Int64; begin try File1 := TStringList.Create; File2 := TStringList.Create; try File1.LoadFromFile(Edit1.Text); File2.LoadFromFile(Edit2.Text); Differ := TStandardTextComparer.Create; try Differ.IgnoreCase := CheckBox1.Checked; Differ.IgnoreSpaces := CheckBox2.Checked; Differ.SpacesAsOne := CheckBox3.Checked; QueryPerformanceCounter(Time1); for idx := 0 to 99 do begin Differ.Clear; Differ.Compare(File1, File2); end; QueryPerformanceCounter(Time2); Time1 := Time2 - Time1; QueryPerformanceFrequency(Time2); Time1 := (Time1 * 1000) div Time2; Memo1.Lines.BeginUpdate; Memo2.Lines.BeginUpdate; try Memo1.Lines.Clear; Memo2.Lines.Clear; Memo1.Lines.Add('100 Durchläufe'); Memo1.Lines.Add(Format('%d Unterschiede', [Differ.Count])); Memo1.Lines.Add(''); Memo2.Lines.Add(Format('%d Millisekunden', [Time1])); Memo2.Lines.Add(Format('%d Durchläufe/Sekunde', [100000 div Time1])); Memo2.Lines.Add(''); Line1 := File1.Count; Line2 := File2.Count; idx := 1; while (Line1 > 9) or (Line2 > 9) do begin inc(idx); Line1 := Line1 div 10; Line2 := Line2 div 10; end; Fmt := Format('%%%d.%dd| ', [idx, idx]); Line1 := 0; Line2 := 0; for idx := 0 to Differ.Count - 1 do begin Diff := Differ.Diff[idx]; while Line1 < Diff.Left.Start do begin Memo1.Lines.Add(Format(Fmt, [Line1 + 1]) + File1[Line1]); inc(Line1); end; while Line2 < Diff.Right.Start do begin Memo2.Lines.Add(Format(Fmt, [Line2 + 1]) + File2[Line2]); inc(Line2); end; while Line1 < Diff.Left.Stop do begin Memo1.Lines.Add(Format(Fmt, [Line1 + 1]) + File1[Line1]); Memo2.Lines.Add(''); inc(Line1); end; while Line2 < Diff.Right.Stop do begin Memo1.Lines.Add(''); Memo2.Lines.Add(Format(Fmt, [Line2 + 1]) + File2[Line2]); inc(Line2); end; end; while Line1 < File1.Count do begin Memo1.Lines.Add(Format(Fmt, [Line1 + 1]) + File1[Line1]); inc(Line1); end; while Line2 < File2.Count do begin Memo2.Lines.Add(Format(Fmt, [Line2 + 1]) + File2[Line2]); inc(Line2); end; finally Memo2.Lines.EndUpdate; Memo1.Lines.EndUpdate; end; finally Differ.Free; end; finally File2.Free; File1.Free; end; except on E: Exception do MessageDlg(E.Message, mtError, [mbOk], 0) else raise; end; end; procedure TForm1.FormResize(Sender: TObject); var d, w, h: integer; begin Panel1.Width := ClientWidth; d := Memo1.Left; w := (ClientWidth - 3 * d) div 2; h := ClientHeight - Memo1.Top - Edit1.Top; Memo1.Width := w; Memo2.Left := d + w + d; Memo2.Width := w; Memo1.Height := h; Memo2.Height := h; end; end. |