Delphi Assign使い方
Suns & Moon Laboratory
Delphi memo
Delphi FireMonkey memo
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継承のサンプル
2024-08-14 11:00:24 32400