Pascal Diff, Version 0.2 (alt)

Hinweis: dies ist nicht die neueste Version!

Zurück zur Übersicht

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.
Flocke's Garage
Valid HTML 4.01 Transitional Valid CSS!
(C) 2005-2018 Volker Siebert.
Creative Commons-LizenzvertragDer gesamte Inhalt dieser Webseite steht unter einer Creative Commons-Lizenz (sofern nicht anders angegeben).