我的应用程序要实现如下功能:每个窗体内所有可获得焦点控件的得到焦点时,都需要执行一些统一的动作。
我用procedure OnGetFocus(var Message: TMessage); message WM_SETFOCUS; 没有作用。存在非钩子的解决办法吗?

解决方案 »

  1.   

    接管Screen的OnActiveControlChange事件,然后根据Screen.ActiveControl得到当前拥有焦点的控件,接着unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
        procedure CrnActiveCtrlChange(Sender: TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CrnActiveCtrlChange(Sender: TObject);
    begin
        // 这里替换成你需要的代码
        Caption := Screen.ActiveControl.Name;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        Screen.OnActiveControlChange := CrnActiveCtrlChange;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
        Screen.OnActiveControlChange := nil;
    end;end.
      

  2.   

    所用控件用公用的OnEnter事件
      

  3.   

    谢谢妖哥!
    to maozefa: 控件的OnEnter事件有时可能得用于一些初始化事件,所以不能占用,而且我所有程序的全部窗体中的所有控件都要设此事件,那就太麻烦了!!那我还不如用钩子!结贴!