我是想在用户切换到我的程序的时候刷新我的某些窗体等,当然切换的方式可以为任何切换方式,比如Alt+Tab等

解决方案 »

  1.   

    procedure TForm1.FormActivate(Sender: TObject);
    begin
      //在这里写你的刷新代码
    end;
      

  2.   

    var
      b : boolean = false;
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if GetForegroundWindow() = self.Handle then
      begin
        if not b then
        begin
          b := true;
          Edit1.Text('Hello');
        end;
      end
      else
         b := false;
    end;
      

  3.   

    如果有控件如Tform的话,可以使用onactive 事件或focused来判断.
    另外你看一看从application对象中有没有可以使用的属性...
      

  4.   

    我本来是想在我的应用程序连接登陆数据库的时候,当登陆的过程中,我切换到了其他程序或窗体,当我又切换回我的应用程序,我想清清楚楚的看清我的登陆界面,而不是看起来一大片白板,当然如果是将登陆过程写为一个子线程的话,就没有这种现象了。onactive,只是在窗体刚显示时触发。
      

  5.   

    DELPHI的标准控件中有一个ApplicationEvents可以拦截所有发向本进程的所有消息,并最先处理。在那时的onactive事件中可以处理当程序获得焦点时的处理过程
      

  6.   

    好像有个 GetActivateWindow 还是 FindActivateWindow 的api函数可以用用
      

  7.   

    FormActivate  在窗体的确良Activate 事件里就可以处理了
      

  8.   

    请大家帮我填上问号处的代码,并且帮我测一测,我相信大家会得到跟我一样的结果,那就是
    当开始做那一个超大循环(登录数据库)的时候,在此期间切换到其它应用程序,然后再切换回我们的程序,我们看见的将是一片空白,而所有刷新窗体代码将不会执行。另外,我还试着用用钩子(Hook)来实现我的愿望,可是不行。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, AppEvnts;type
      TForm1 = class(TForm)
        Button1: TButton;
        ApplicationEvents1: TApplicationEvents;
        Edit1: TEdit;
        Memo1: TMemo;
        procedure ApplicationEvents1Message(var Msg: tagMSG;
          var Handled: Boolean);
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormActivate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      protected
        procedure WndProc(var Message: TMessage); override;
      end;var
      Form1: TForm1;
      g_iText: Integer;implementation{$R *.dfm}procedure TForm1.WndProc(var Message: TMessage);
    begin
      if Message.Msg = ? then
      begin
        Refresh;    //如果这句代码执行,将会报异常
      end;  inherited WndProc(Message); {其他消息交父辈wndproc处理}
    end;procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
    begin
      if (Msg.message = ?) or (Msg.wParam = ?) or (Msg.lParam = ?) then
      begin
        g_iText := g_iText + 1;
        Memo1.Lines.Add(IntToStr(g_iText));
        Refresh;
      end;
    end;{-----------------------------------------------------------------------------
      过程名: TForm1.Button1Click
      作者:   黄仁光
      日期:   2004年01月20日
      参数:   Sender: TObject
      结果:   None
      目的:   大家就将这儿认为是登录数据库的代码,
              当然下面的循环将会执行几分钟没问题。
    -----------------------------------------------------------------------------}procedure TForm1.Button1Click(Sender: TObject);
    var
      iLoop: Integer;
    begin
      try
        Screen.Cursor := crHourGlass;
        for iLoop := 0 to 20000000 do
        begin
          Edit1.Text := IntToStr(i);
          Edit1.Refresh;
        end;
      finally
        Screen.Cursor := crDefault;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      g_iText := 0;
      Memo1.Clear;
    end;procedure TForm1.FormActivate(Sender: TObject);
    begin
      Refresh;
    end;end.
      

  9.   

    在循環裡面加一句Application.ProcessMessages就可以了
      

  10.   

    顶!我也多一句嘴,OnActivate的确是不行的,只在第一次显示时有效.
      

  11.   

    你可以用一个timer控件不断用getactivewindow函数所获得的句柄与自身的与自身的句柄进行对比,如果不是,就表示被切换了。但我试过以后,发现除自身窗口,其它的getactivewindow返回值都是0。
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    if getactivewindow=0 then
    showmessage('Not Active');
    end;
      

  12.   

    循环的时候没有办法处理消息,你再循环里面多加几条
    Application.ProcessMessages
    就可以了。
      

  13.   

    Application.OnActivate 程序激活
    Application.OnDeactivate 程序去活