2013-04-21 53 views
2

我想知道爲什麼命令「showmessage」在應用程序窗體出現之前執行,我的意思是,每當我運行程序時,首先出現消息,然後是應用程序窗體:Delphi7,Showmessage命令在應用程序窗體出現之前執行

procedure TForm1.FormCreate(Sender: TObject); 
begin 
button1.hide; 
button2.hide; 
image3.picture.loadfromfile('c:\EAS\std.bmp'); 
showmessage ('Hi'); 
end; 

end. 

delphi做的第一件事,它顯示消息「嗨」。然後它完成剩下的工作(窗體出現,隱藏按鈕,加載圖像等)。即使showmessage是最後一個,它也會先執行。在窗體出現後,如何讓消息出現,按鈕是隱藏的,圖像是否加載?

由於

回答

6

的原因是所創建的表格(因此,OnCreate燒製),示出了之前它。

溶液1

一種解決方案是在創建時形式來發布窗口消息的形式。試試這個:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

const 
    WM_GREETING = WM_USER + 1; 

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    protected 
    procedure WMGreeting(var Message: TMessage); message WM_GREETING; 
    public 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    PostMessage(Self.Handle, WM_GREETING, 0, 0); 
end; 

procedure TForm1.WMGreeting(var Message: TMessage); 
begin 
    ShowMessage('Created and shown!'); 
end; 

end. 

解決方案2

不同的解決方案是利用OnActivate事件,這就是所謂的每形式獲得鍵盤焦點時間:私有字段FMessageShown: boolean添加到窗體類。然後,在OnActivate,如果標誌是假的(因爲它是在默認情況下,作爲一個類的字段),然後顯示您的信息並設置標誌設置爲true:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

type 
    TForm1 = class(TForm) 
    procedure FormActivate(Sender: TObject); 
    private 
    { Private declarations } 
    FMessageShown: boolean; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormActivate(Sender: TObject); 
begin 
    if not FMessageShown then 
    begin 
    ShowMessage('Created and shown.'); 
    FMessageShown := true; 
    end; 
end; 

end. 

在實踐中,這兩種方法很好地工作。第一種解決方案的不足之處在於它可能在某種程度上依賴於「實現細節」,而後者的缺點非常明顯:每次表單重新獲得鍵盤焦點時檢查一個標誌,甚至在表單最初創建幾周後該消息被顯示。

解決方案3

有沒有缺點,但假定你將不再需要在OnActivate事件其他一些purpouse一個解決方案,是簡單地「取消分配」後的第一個(因此,只有事件)執行:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs; 

type 
    TForm1 = class(TForm) 
    procedure FormActivate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormActivate(Sender: TObject); 
begin 
    ShowMessage('Created and shown.'); 
    OnActivate := nil; 
end; 

end. 

(但是這種方法,可以擴展到情況下,你需要其他的效果影響不大的情況下也是如此,如果你通過OnActivate := MySecondEventHandler更換OnActivate := nil

+1

我寧願從「OnShow」事件發佈消息給自己。 – TLama 2013-04-21 13:42:38

+0

@TLama:但是如果表單被隱藏然後再次顯示,該消息將再次出現。但是可能你可以在'OnCreate'上發佈消息。作出回答! – 2013-04-21 13:43:09

+0

@TLama:我只是試了一下,它完美的工作! – 2013-04-21 13:51:45

相關問題