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

解决方案 »

  1.   

    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;
      

  2.   

    你可以在窗体的active 事件中写点代码呀。
      

  3.   

    上面的兄弟姐妹可能误会我的意思了。
    hch_45(HCH ~ahong.net~),我想问,当我的应用程序一直在顶层,哟岂不是要不停的刷新我的窗体。
    cooling(cooling) ,你说的active 事件,其实只在窗体刚显示时执行一次。
    我要的是在用户切换动我的应用程序的一瞬间的处理。
      

  4.   

    onActivate事件中写入代码,该事件在用户切换时将重新执行
      

  5.   

    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;
      

  6.   

    在OnPaint事件写就可以了,有一点点不足,就是在窗口最大化操作也会触发该事件,但应该可以满足你的要求了
      

  7.   

    切换的时候会重画窗体,会收到WM_PAINT消息,所以在onpaint中书写
      

  8.   

    主窗体难到没有OnEnty与OnExit这俩个事件么?我记不太清了,如果有的话就写这俩个事件就行了
      

  9.   

    在DELPHI的标准控件中有一个TApplicationEvents,在它的OnActivate事件中重画就可以,了,不过小心,在开始时可能也会执行一次,这个控件在程序运行后,首先得到所有发向本进程和消息并第一时间处理
      

  10.   

    onActivate不能达到我的要求!!!!!
      

  11.   

    OnPaint事件或者TApplicationEvents的OnActivate事件怎么不行了?有哪些地方不能满足你的要求?你把不能满足的地方说出来啊,说不定有别的方法可以解决
      

  12.   

    请大家帮我填上问号处的代码,并且帮我测一测,我相信大家会得到跟我一样的结果,那就是
    当开始做那一个超大循环(登录数据库)的时候,在此期间切换到其它应用程序,然后再切换回我们的程序,我们看见的将是一片空白,而所有刷新窗体代码将不会执行。另外,我还试着用用钩子(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.