Delphi7使用控制元件CoolTrayIcon時如何做到程式啟動就最小化到托盤
學習Delphi時,使用了第3方控制元件CoolTrayIcon。CoolTrayIcon的功能很強大,能夠將程式新增進托盤,省去了我們再編寫程式碼來實現托盤。但是在看搜CoolTrayIcon的時候,發現好多朋友在求如何讓程式在啟動就最小化多托盤的方法。但是貌似都不曾成功過。筆者摸索了一下,成功實現了。
找原因
首先我們來看一下CoolTrayIcon的功能函式:根據CoolTrayIcon的使用例項來看,CoolTrayIcon提供了函式HideMainForm()。好吧我們如果在FromCreat裡面如果呼叫該函式會發現沒有任何反應。為什麼呢?我們接著跟蹤這個函式看一下它的宣告:
procedure TCoolTrayIcon.HideMainForm; begin if Owner is TWinControl then // Owner might be of type TService if Application.MainForm <> nil then begin // Hide the form itself (and thus any child windows) Application.MainForm.Visible := False; { Hide application's TASKBAR icon (not the tray icon). Do this AFTER the main form is hidden, or any child windows will redisplay the taskbar icon if they are visible. } HideTaskbarIcon; end; end;
好吧,我們看到這裡應該知道了吧。如果你還不知道,可以對它設定斷點除錯,你就會發現函式宣告的語句根本就沒有進去。也就是說Application.MainForm根本沒有建立。這就意味著你要在建立了窗體的情況下才能呼叫該函式。如果你知道了應該在哪些改程式碼就可以去試試了,不知道那我來說,首先你在Delphi7的編譯器裡面開啟你的工程檔案,具體的步驟最簡單的就是Ctrl+F12,或者說在選單欄裡面選擇View→Units選擇你的工程檔案(字尾名為*.dpr的檔案)。但是應該加的程式碼是什麼呢?
解決方法
還是這個HideMainForm?不是的,你試了就應該知道了。沒有用,為什麼,這個同樣就可以用上面斷點跟蹤的方法來看為什麼沒有用。我就跳過去來。要實現該功能,你就跟蹤程式碼Application.Run
關鍵程式碼就是 SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;這是對Windows訊息機制的處理。只是對窗體最小化的處理。相應的我們的程式碼(在工程檔案*.dpr)中可以改成procedure TApplication.Run; begin FRunning := True; try AddExitProc(DoneApplication); if FMainForm <> nil then begin case CmdShow of SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized; SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized; end; if FShowMainForm then if FMainForm.FWindowState = wsMinimized then Minimize else FMainForm.Visible := True; repeat try HandleMessage; except HandleException(Self); end; until Terminated; end; finally FRunning := False; end; end;
begin
Application.Initialize;
Application.CreateForm(TTaskReminder, TaskReminder);
Application.MainForm.WindowState := wsMinimized ;
//TaskReminder.CoolTrayIcon1.HideMainForm;
Application.Run;
end.
系統程式碼首先在這裡執行: Application.CreateForm(TTaskReminder, TaskReminder);//它會呼叫TaskReminder的Creat函式,然後是往下走
當然使用上面的程式碼會造成主窗體(包括你新生成的窗體)不會輕易的顯示,因此這方法僅適合伺服器那種沒有介面的程式,如果你要彈出主窗體就要在希望彈窗的事件那裡寫程式碼
Application.MainForm.WindowState := wsMaximized
如果你嫌這樣太麻煩了,就將前面要用的這句話,改成
begin
Application.Initialize;
Application.CreateForm(TTaskReminder, TaskReminder);
Application.ShowMainForm := False ;//改這裡的一行程式碼
Application.Run;
end.
這樣就不會影響後面,你只要單擊生成的新窗體都可以彈出