delphi_assign
*Delphi Assign使い方 [[index]] [[dev/delphi]] [[firemonkey]] #contents **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継承のサンプル>http://delfusa.main.jp/delfusafloor/archive/www.nifty.ne.jp_forum_fdelphi/samples/00749.html]]
2025-04-01 00:12:39 32400