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)のアイデアに感謝します。

Source: https://habr.com/ru/post/J75932/


All Articles