📄 compare.pas
字号:
{**********************************************************}
{ }
{ 功能:实现数据比较. }
{ }
{**********************************************************}
unit Compare;
interface
uses
Windows, Messages, SysUtils, Classes,
Controls, Forms, Dialogs, HexChFrm;
type
TCompareKind = (ckCompareDiff, ckCompareSame);
TCompareFrom = (cfFromHead, cfFromCur);
TComparePara = record
Form1, Form2: THexChForm;
CompKind: TCompareKind;
CompFrom: TCompareFrom;
end;
TCompareMgr = class
private
FPara: TComparePara;
FResultOffset1: Integer;
FResultOffset2: Integer;
function Compare(CompKind: TCompareKind; CompFrom: TCompareFrom; CompNext: Boolean): Boolean;
public
property Para: TComparePara read FPara write FPara;
property ResultOffset1: Integer read FResultOffset1;
property ResultOffset2: Integer read FResultOffset2;
function CompareFirst: Boolean;
function CompareNext: Boolean;
function FormExists: Boolean;
end;
implementation
uses
MainFrm;
function TCompareMgr.Compare(CompKind: TCompareKind; CompFrom: TCompareFrom; CompNext: Boolean): Boolean;
var
i, Count: Integer;
FromOffset1, ToOffset1: Integer;
FromOffset2, ToOffset2: Integer;
Offset1, Offset2: Integer;
Find: Boolean;
begin
if CompFrom = cfFromCur then
begin
FromOffset1 := FPara.Form1.Offset;
FromOffset2 := FPara.Form2.Offset;
end else
begin
FromOffset1 := 0;
FromOffset2 := 0;
end;
ToOffset1 := FPara.Form1.BufSize - 1;
ToOffset2 := FPara.Form2.BufSize - 1;
if CompNext then
begin
Inc(FromOffset1);
Inc(FromOffset2);
end;
Count := ToOffset1 - FromOffset1;
if Count > (ToOffset2 - FromOffset2) then
Count := ToOffset2 - FromOffset2;
for i := 0 to Count - 1 do
begin
Offset1 := i + FromOffset1;
Offset2 := i + FromOffset2;
if CompKind = ckCompareSame then
begin
Find := (FPara.Form1.BufPointer[Offset1] = FPara.Form2.BufPointer[Offset2]);
end else
begin
Find := (FPara.Form1.BufPointer[Offset1] <> FPara.Form2.BufPointer[Offset2]);
end;
if Find then
begin
Result := True;
FResultOffset1 := Offset1;
FResultOffset2 := Offset2;
Exit;
end;
end;
Result := False;
FResultOffset1 := -1;
FResultOffset2 := -1;
end;
function TCompareMgr.CompareFirst: Boolean;
begin
Result := Compare(FPara.CompKind, FPara.CompFrom, False);
if Result then
begin
FPara.Form1.BringToFront;
FPara.Form1.Offset := FResultOffset1;
FPara.Form2.Offset := FResultOffset2;
end else
begin
MessageBox(Application.Handle, '比较完毕。', '提示', 48);
end;
end;
function TCompareMgr.CompareNext: Boolean;
begin
Result := Compare(FPara.CompKind, cfFromCur, True);
if Result then
begin
FPara.Form1.BringToFront;
FPara.Form1.Offset := FResultOffset1;
FPara.Form2.Offset := FResultOffset2;
end else
begin
MessageBox(Application.Handle, '比较完毕。', '提示', 48);
end;
end;
function TCompareMgr.FormExists: Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to MHMainForm.MDIChildCount - 1 do
begin
if MHMainForm.MDIChildren[i] = FPara.Form1 then
begin
Result := True;
Break;
end;
end;
if not Result then Exit;
Result := False;
for i := 0 to MHMainForm.MDIChildCount - 1 do
begin
if MHMainForm.MDIChildren[i] = FPara.Form2 then
begin
Result := True;
Break;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -