1. 程式人生 > >Delphi7使用控制元件CoolTrayIcon時如何做到程式啟動就最小化到托盤

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

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;
關鍵程式碼就是 SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;這是對Windows訊息機制的處理。只是對窗體最小化的處理。相應的我們的程式碼(在工程檔案*.dpr)中可以改成
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.

這樣就不會影響後面,你只要單擊生成的新窗體都可以彈出