あなたは何か不幸なことを発見しました。アプリケーションレベルで2つのコントロール間の関連付けを設定すると、はアプリケーションレベルのコードでその関連付けを引き続き管理できますが、VCLはそれを維持するために必要なフレームワークを提供しません。理想的には、一般的な関連付けフレームワークが存在するため、関連付けられたコントロールは、自分自身で更新する必要があることを互いに通知することができます。
VCLの最初の部分は、Notification
メソッドですが、破棄されるコンポーネントのみに通知されます。
あなたの提案する解決策は、タスクにはあまりにも具体的だと思います。エディットコントロールは、アップダウンコントロールにアタッチされていることを必ずしも知らなくてはならず、そうであっても、親を共有する必要はありません。一方、この問題のための全体的なオブザーバーフレームワーク全体を書くことは、過度のことです。私は妥協を提案する。エディットコントロールに新しいイベントプロパティと
スタート:
property OnRecreateWnd: TNotifyEvent read FOnRecreateWnd write FOnRecreateWnd;
あなたは上記したよう次にRecreateWnd
をオーバーライドし、代わりにすべてのアップダウンコントロール固有のコードの、単にイベントをトリガ:
procedure TAlignedEdit.RecreateWnd;
begin
inherited;
if Assigned(OnRecreateWnd) then
OnRecreateWnd(Self);
end;
ここで、アプリケーションコード内で、どのコントロールが関連付けられているかを正確に知っているイベントを処理して、何も検索する必要がなく、子供関係:
procedure TUlrichForm.AlignedEdit1RecreateWnd(Sender: TObject);
begin
Assert(Sender = AlignedEdit1);
UpDown1.Associate := nil;
UpDown1.Associate := AlignedEdit1;
end;
親を共有する必要があるという事実は既にVCLによって課されているので、これは問題ではありません。しかし、あなたのソリューションはちょうどきれいに感じるので、明日それを試してみましょう。 –