我有一个TUpDown控件,其Associate设置为TEdit子类的实例。编辑类在其重写的DoEnter方法中调用RecreateWnd。不幸的是,这会杀死API级别的伙伴连接,从而导致奇怪的行为,例如单击上下箭头时。

我的问题是,edit实例不知道它是应该重新连接到的某些updown的伙伴,并且updown并未通知其伙伴丢失。有什么想法可以重新连接两者吗?

最佳答案

您发现了一些不幸的事情。您在应用程序级别在两个控件之间建立了关联,因此您应该能够继续在应用程序级代码中管理该关联,但是VCL并没有提供维护该框架所必需的框架。理想情况下,将有一个通用的关联框架,因此关联的控件可以相互通知它们应该更新自己。

VCL从Notification方法开始,但是仅通知被销毁的组件。

我认为您提出的解决方案过于具体。编辑控件不必一定知道它是附属于上下控件的,即使这样做,也不必要求它们共享父控件。另一方面,为这个问题编写一个完整的通用观察者框架将是过大的。我提出一个折衷方案。

从edit控件上的新事件属性开始:

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;

关于delphi - 重新创建关联时保持UpDown-Associate连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1361954/

10-16 05:11