我有一个继承自TPanel的已知组件A,一个(直接或间接)继承自TControl的未知组件B。
B放置与A之上,我需要在A中实现点击B时首先激发A中的某些操作然后响应B中原先定义的操作,我该如何做呢?

解决方案 »

  1.   

    定义两个过程a/b,点击B时首先执行过程a,然后执行过程b.
    不知道理解了你的意思没有。如果在组件A中实现,可以先判断它的包含的组件中是否有
    自TControl的未知组件B,有,再判断是否存在事件属性。....
      

  2.   

    问题是如何在A中给B组件的WM_LButtonDown消息处理赋值,要知道TControl的OnClick事件是非公开的。
      

  3.   

    在B组件中,重载wndproc过程,在WM_LBUTTONDOWN消息的处理部分判断B组件的owner是否是A,如果是,执行A中的过程,再执行B的过程。
      

  4.   

    我不可能在B组件中重载任何过程啊,因为B组件对我来说是不可知的,只知道他继承自TControl类。
      

  5.   

    下面是我的代码,主要的地方就是在B中使用了消息拦截进行了处理,因为为了显示的需要,所以B继承自TEdit,换成TControl也是可以的,你看是否合乎你的意思
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, ExtCtrls;type
      TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer) of object;  TForm1 = class(TForm)
        Button1: TButton;
        A: TPanel;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }  public
        { Public declarations }
      end;  TB = class(TEdit)
      private
        procedure dd(var msg: TMessage); message wm_lbuttondown;
      public
      end;var
      Form1: TForm1;
      b: TB;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      b := TB.Create(Self);
      B.Parent := a;
      b.Left := 1;
      b.Width := 100;
      b.Top := 1;
      b.Height := 100;
      b.Visible := True;
    end;{ TB }procedure TB.dd(var msg: TMessage);
    begin
      Form1.A.Caption := Form1.A.Caption + Form1.A.Name;
      b.Text := b.Text + 'haha  ';
    end;end.