Home New Help Edit

Delphi Assign使い方


Suns & Moon Laboratory
Delphi memo
Delphi FireMonkey


Assginを実装するには


TPersistentを継承したクラスを作成する

AssignToを実装する
こんな感じで、Sourceをコピー先にする。
これはTPersistent.Assignの実装みるとわかるが、コピー先がAssignと入れ替わっている。
procedure TIxRecordOption.AssignTo(Source: TPersistent); begin TIxRecordOption(Source).FModified := FModified; TIxRecordOption(Source).FTimeStampInterval := FTimeStampInterval; end;

検討


Delphi2010のAssign実装をソースコードから追ってみる。


Delphi2010 classes.pasから引用
TPersistent = class(TObject) private procedure AssignError(Source: TPersistent); protected procedure AssignTo(Dest: TPersistent); virtual; public procedure Assign(Source: TPersistent); virtual; end;
nilかどうかのチェック
procedure TPersistent.Assign(Source: TPersistent); begin if Source <> nil then Source.AssignTo(Self) else AssignError(nil); end;
実際のコピーを行うところ。
これをオーバーライドしてコピーを実装する。
これをオーバーライドしないと例外発生する。
procedure TPersistent.AssignTo(Dest: TPersistent); begin Dest.AssignError(Self); end;
エラー表示
procedure TPersistent.AssignError(Source: TPersistent); var SourceName: string; begin if Source <> nil then SourceName := Source.ClassName else SourceName := 'nil'; raise EConvertError.CreateResFmt(@SAssignError, [SourceName, ClassName]); end;

Assignを直接オーバーライドで良いんじゃないか?

直接オーバーライドした場合、nilチェックとエラー表示を自分で実装する必要がある
AssignTo実装の方が簡単。

参考


FDelphi TPersistent継承のサンプル

Home New Help Edit
2023-03-24 09:22:17 32400