title: Delphi - Compare and Mark String Differences
body: <p>What I need to do is compare two strings and mark the differences with begining/ending marks for changes.  Example:</p>
  
  <pre>this is string number one.</pre>
  
  <pre>this string is string number two.</pre>
  
  <p>output would be <pre>this [is|string is] string number [one|two].  </pre></p>
  
  <p>I've been trying to figure this out for some time now.  And I found something I blieved would help me do this, but I am unable to make this happen.<br>
   <a href="http://www.angusj.com/delphi/textdiff.html" rel="nofollow noreferrer">http://www.angusj.com/delphi/textdiff.html</a></p>
  
  <p>I have it about 80% working here, but I've got no idea how to get it to do exactly what I want it to do.  Any help would be appreciated.</p>
  
  <pre><code>
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, Diff, StdCtrls;
  
  type
    TForm2 = class(TForm)
      Edit1: TEdit;
      Edit2: TEdit;
      Button1: TButton;
      Memo1: TMemo;
      Diff: TDiff;
      procedure Button1Click(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    Form2: TForm2;
    s1,s2:string;
  
  implementation
  
  {$R *.dfm}
  
  procedure TForm2.Button1Click(Sender: TObject);
  var
    i: Integer;
    lastKind: TChangeKind;
  
    procedure AddCharToStr(var s: string; c: char; kind, lastkind: TChangeKind);
    begin
      if (kind  lastkind) AND (lastkind = ckNone) and (kind  ckNone) then s:=s+'[';
      if (kind  lastkind) AND (lastkind  ckNone) and (kind = ckNone) then s:=s+']';
      case kind of         
        ckNone: s := s  + c;
        ckAdd: s := s + c;         
        ckDelete: s := s  + c;
        ckModify: s := s + '|' + c;
      end;
    end;
  
  begin
    Diff.Execute(pchar(edit1.text), pchar(edit2.text), length(edit1.text), length(edit2.text));
  
    //now, display the diffs ...
    lastKind := ckNone;
    s1 := ''; s2 := '';
    form2.caption:= inttostr(diff.Count);
    for i := 0 to Diff.count-1 do
    begin
  
      with Diff.Compares[i] do
      begin
        //show changes to first string (with spaces for adds to align with second string)
        if Kind = ckAdd then 
        begin 
          AddCharToStr(s1,' ',Kind, lastKind); 
        end
        else 
        AddCharToStr(s1,chr1,Kind,lastKind);
        if Kind = ckDelete then 
        begin 
          AddCharToStr(s2,' ',Kind, lastKind)
        end
        else AddCharToStr(s2,chr2,Kind,lastKind);
  
        lastKind := Kind;
      end;
    end;
      memo1.Lines.Add(s1);
      memo1.Lines.Add(s2);
  end;
  
  end.
  </code></pre>
  
  <p>I took the basicdemo1 from angusj.com and modified it to get this far.</p>