以下代码是我编写的,请各位高人帮忙解决以下,修改后在发上来,如果正确分都给。
代码:(两个文字对比,当RICHEDIT1删除文字的时候,在Richeidt2中显示出来,并且带删除线,如果在Richedit1中添加或修改过的文字,在Richedit2中改变颜色显示出来 )
procedure TForm1.Button1Click(Sender: TObject);
begin
rc2.Text := rc1.Text;
end;procedure TForm1.Button2Click(Sender: TObject);
var
s1,s2: string;
l1,l2: integer;
i1,i2: integer;
last1,next1: integer;
last2,next2: integer;
diflist: Tlist;
dif: pdiff;
i: integer;
sub1,sub2,stemp: string;
begin
diflist := Tlist.Create;
s1 := rc1.Text;
s2 := rc2.Text;
l1 := length(s1);
l2 := length(s2);
i1 := 1;
i2 := 1;
while true do
begin
if (i1 >= l1) or (i2 >= l2) then
break;
sub1 := copy(s1,i1,2);
sub2 := copy(s2,i2,2);
if sub1 = sub2 then
begin
i1 := i1 + 2;
i2 := i2 + 2;
end else
begin
last1 := i1;
last2 := i2;
getNextPos(s1,s2,last1,last2,next1,next2);
dif := new(pdiff);
dif.star := last2 - 1;
dif.leng := next1 - last1;
dif.diftype := true;
diflist.Add(dif);
stemp := copy(s1,last1,next1 - last1);
insert(copy(s1,last1,next1 - last1),s2,last2);
if next2 - last2 > 0 then
begin
dif := new(pdiff);
dif.star := last2 + next1 - last1 - 1;
dif.leng := next2 - last2;
dif.diftype := false;
diflist.Add(dif);
end;
i1 := next1;
i2 := next1 - last1 + next2;
l2 := length(s2);
end;
end;
rc2.Text := s2;
for i := 0 to diflist.Count - 1 do
begin
rc2.SelStart := pdiff(diflist.Items[i]).star;
// rc2.SelStart := 3;
rc2.SelLength := pdiff(diflist.Items[i]).leng;
if pdiff(diflist.Items[i]).diftype then
begin
rc2.SelAttributes.Color := clred;
rc2.SelAttributes.Style := [fsStrikeOut];
end
else
rc2.SelAttributes.Color := clblue;
end;
end;procedure TForm1.getNextPos(s1, s2: string; last1, last2: integer;
var next1, next2: integer);
var
parray: array[1..20] of TPoint;
i,j,k,mix: integer;
l1,l2: integer;
sub2,subtemp: string;
begin
l1 := last1 + 2;
//l2 := last2 + 2;
sub2 := copy(s2,last2,length(s2));
for i := 1 to 20 do
begin
if l1 >= length(s1) then
begin
parray[i].X := l1;
parray[i].Y := length(s2);
break;
end;
subtemp := copy(s1,l1,2);
k := pos(subtemp,sub2);
if k > 0 then
begin
parray[i].X := l1;
parray[i].Y := last2 + k - 1;
end else
begin
parray[i].X := l1;
parray[i].Y := length(s2);
end;
l1 := l1 + 2;
end;
k := abs(parray[1].y - last2);
mix := 1;
if i > 20 then
i := i - 1;
for j := 1 to i do
begin
if abs(parray[j].y - last2) < k then
begin
k := abs(parray[j].y - last2);
mix := j;
end;
end;
next1 := parray[mix].X;
next2 := parray[mix].Y;
end;end.
代码:(两个文字对比,当RICHEDIT1删除文字的时候,在Richeidt2中显示出来,并且带删除线,如果在Richedit1中添加或修改过的文字,在Richedit2中改变颜色显示出来 )
procedure TForm1.Button1Click(Sender: TObject);
begin
rc2.Text := rc1.Text;
end;procedure TForm1.Button2Click(Sender: TObject);
var
s1,s2: string;
l1,l2: integer;
i1,i2: integer;
last1,next1: integer;
last2,next2: integer;
diflist: Tlist;
dif: pdiff;
i: integer;
sub1,sub2,stemp: string;
begin
diflist := Tlist.Create;
s1 := rc1.Text;
s2 := rc2.Text;
l1 := length(s1);
l2 := length(s2);
i1 := 1;
i2 := 1;
while true do
begin
if (i1 >= l1) or (i2 >= l2) then
break;
sub1 := copy(s1,i1,2);
sub2 := copy(s2,i2,2);
if sub1 = sub2 then
begin
i1 := i1 + 2;
i2 := i2 + 2;
end else
begin
last1 := i1;
last2 := i2;
getNextPos(s1,s2,last1,last2,next1,next2);
dif := new(pdiff);
dif.star := last2 - 1;
dif.leng := next1 - last1;
dif.diftype := true;
diflist.Add(dif);
stemp := copy(s1,last1,next1 - last1);
insert(copy(s1,last1,next1 - last1),s2,last2);
if next2 - last2 > 0 then
begin
dif := new(pdiff);
dif.star := last2 + next1 - last1 - 1;
dif.leng := next2 - last2;
dif.diftype := false;
diflist.Add(dif);
end;
i1 := next1;
i2 := next1 - last1 + next2;
l2 := length(s2);
end;
end;
rc2.Text := s2;
for i := 0 to diflist.Count - 1 do
begin
rc2.SelStart := pdiff(diflist.Items[i]).star;
// rc2.SelStart := 3;
rc2.SelLength := pdiff(diflist.Items[i]).leng;
if pdiff(diflist.Items[i]).diftype then
begin
rc2.SelAttributes.Color := clred;
rc2.SelAttributes.Style := [fsStrikeOut];
end
else
rc2.SelAttributes.Color := clblue;
end;
end;procedure TForm1.getNextPos(s1, s2: string; last1, last2: integer;
var next1, next2: integer);
var
parray: array[1..20] of TPoint;
i,j,k,mix: integer;
l1,l2: integer;
sub2,subtemp: string;
begin
l1 := last1 + 2;
//l2 := last2 + 2;
sub2 := copy(s2,last2,length(s2));
for i := 1 to 20 do
begin
if l1 >= length(s1) then
begin
parray[i].X := l1;
parray[i].Y := length(s2);
break;
end;
subtemp := copy(s1,l1,2);
k := pos(subtemp,sub2);
if k > 0 then
begin
parray[i].X := l1;
parray[i].Y := last2 + k - 1;
end else
begin
parray[i].X := l1;
parray[i].Y := length(s2);
end;
l1 := l1 + 2;
end;
k := abs(parray[1].y - last2);
mix := 1;
if i > 20 then
i := i - 1;
for j := 1 to i do
begin
if abs(parray[j].y - last2) < k then
begin
k := abs(parray[j].y - last2);
mix := j;
end;
end;
next1 := parray[mix].X;
next2 := parray[mix].Y;
end;end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货