かなり残念なことを発見しました。アプリケーション レベルで 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;