А на это что скажете?
| Код | type TMyRec = record FInt: Integer; FName: String[255]; end;
procedure TForm1.Button1Click(Sender: TObject); var Rec1, Rec2: TMyRec; begin FillChar(Rec1, SizeOf(TMyRec), 0); FillChar(Rec2, SizeOf(TMyRec), 0); Rec1.FInt := 1; Rec1.FName := 'A'; Rec2.FInt := 1; Rec2.FName := 'A'; { Где-то в процессе работы меняем строку } Rec1.FName := 'AB'; { А далее где-нибудь она снова изменилась, причем длина уменьшилась } Rec1.FName := 'A'; Self.Caption := BoolToStr(CompareMem(@Rec1, @Rec2, SizeOf(TMyRec)), True); end;
|
И еще, у ТС в записи одно поле long-string, как его сравнивать?
После дискуссий в IRC пришли к выводу, что кто как хочет, тот пусть так и сравнивает. Либо напрямую, либо через функцию, либо через перегрузку (если есть возможность - самое красивое решение)
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
TMyRec = record FInt: Integer; FName: String; class operator Equal(A, B: TMyRec): Boolean; end;
var Form1: TForm1;
implementation
{$R *.dfm}
{ TMyRec }
class operator TMyRec.Equal(A, B: TMyRec): Boolean; begin Result := (A.FInt = B.FInt) and (A.FName = B.FName); end;
procedure TForm1.Button1Click(Sender: TObject); var A, B: TMyRec; begin A.FInt := 1; A.FName := 'Name'; B.FInt := 1; B.FName := 'Name'; ShowMessage(BoolToStr(A = B, True)); end;
end.
|
|