Вы обнаружили что-то довольно неудачное. Вы устанавливаете связь между двумя элементами управления на уровне приложения, так что вы должны иметь возможность продолжать управлять этой связью в коде уровня приложения, но 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;