自己写控件,才知道做控件有一个麻烦.DELPHI好象没有C#那样可以新增加一个控件事件.例如:我的一个自定义控件要在父窗体的OnClose时做一些处理,根据某些条件使父窗体不给关闭.这样,控件中可以这样做:procedure TMyControl.Create(Aowner:TComponent)
begin  OldParentFormClose:=Aowner.Onclose;
  Aowner.Onclose:=SelfHandle;
end;procedure SelfHandle(Sender: TObject;var Action: TCloseAction);
begin
   ....  //自己的代码
  if assigned(OldParentFormClose) then
    OldParentFormClose(sender,action);
end;
看看上面的代码:
1.如果我这个控件要用到很多处父窗体的事件时,类似上面的代码都要写一大堆.
2.我做的自定义控件,如果放一个在窗体上,没有问题.但放多个这样的控件在窗体上时,父窗体发生OnClose时,应该如何使每个控件都能正常执行到它自身的SelfHandle??C#在事件处理方面得很简单呀,它用事件的+=就OK了.DELPHI能不能做到这个呢???

解决方案 »

  1.   

    先将父窗体的OnCloseQuery保存。定义自己的
    procedute TMyVCL.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
    检查,看是否允许退出在执行父窗体的OnCloseQueryend;用自己的 父窗体.OnCloseQuery:=Self.FormCloseQuery;
      

  2.   

    你这样的设计并不好。尽量避免在一个对象中直接去操作另一个对象。应在窗体的FormCloseQuery中检查子控件的属性看是否可以退出。
      

  3.   

    对,我现在也发现到问题了.自定义控件操作父窗体的OnClose是不对的.如果父窗体的OnClose在运行时动态指向另一过程,那自定义控件做的事就变了错事了.呵呵.