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