Delphi:公開されたプロパティを削除する方法

入門





PostgresDACの作業中に、私たちのチームはこの問題に2回遭遇しました。 そして、どちらの場合も、最も集中的な変更として、 TPSQLDumpコンポーネントに変更が影響しました 。 これは理解できることであり、 PostgreSQLサーバーのメジャーリリースごとにpg_dumpパラメーターが大幅に変更されることがあります。 そして、私たちの仕事は、TPSQLDumpとpg_dumpの完全な互換性です。







実際、公開されたプロパティに関する情報はDFMファイルに保存されます。 そして、プロパティを削除(または変更)するだけで、コンポーネントを読み込むときにエラーメッセージが表示されます。 そのようなコンポーネントが多数ある場合、このプロセスは面倒なものになるでしょう。



挑戦する





TPSQLDump.TableName: string



プロパティをTPSQLDump.TableNames: TStrings



置き換えTPSQLDump.TableNames: TStrings



。 本質的に、1つではなく複数の指定されたテーブルをダンプする機能を実装する必要があります。



解決策





コードはそれ自体を物語っています:



TPSQLDump = class (TComponent)

private

...

procedure ReadTableName (Reader : TReader) ;

protected

procedure DefineProperties (Filer : TFiler) ; override ;

...

published

...

//property TableName: string ...

property TableNames : TStrings read FTableNames

write SetTableNames ;

...

end ; //TPSQLDump



implementation



...



procedure TPSQLDump . DefineProperties (Filer : TFiler) ;

begin

inherited ;

Filer . DefineProperty( 'TableName' , ReadTableName , nil , False ) ;

end ;



procedure TPSQLDump . ReadTableName (Reader : TReader) ;

var S : string ;

begin

S := Reader . ReadString ;

if S > '' then FTableNames . Append(S) ;

end ;









説明





DefineProperties



オーバーライドメソッドでTableName



の( Filer.DefineProperty



)プロパティを定義します。 ReadTableName



メソッドは、 TableName



値を読み取りTableName



。 書き込み用のメソッドを割り当てなかったため(2番目のパラメーターnil



を渡しnil



)、このプロパティは今後保存されません。 問題は解決しました。



ところで、 VCL開発者はこのトリックをよく使用します。



PS

アレクセイ・ヴコロフ(別名vuk)のアイデアに感謝します。



All Articles