程式一問 |
答題得分者是:老大仔
|
cursegold
一般會員 ![]() ![]() 發表:16 回覆:36 積分:15 註冊:2006-08-22 發送簡訊給我 |
|
老大仔
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
cursegold
一般會員 ![]() ![]() 發表:16 回覆:36 積分:15 註冊:2006-08-22 發送簡訊給我 |
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
1.建議標題請用有意思的內容
2.使用tray 有兩種架構, 一種為Service Mode, 一種為Ap Mode 都可以做到, 建議用Ap Mode 來寫, 可以容易Deubg及發展, 也就是你現在的程式只要加上一些控制icon 的就可以了, 無須更改到你的程式 差異如下 在變數宣告中, 在 Private 與 Public 中加入以下宣告 private procedure StartRun(Sender: Tobject; var Done: boolean); protected procedure ModifyTrayIcon(Action: DWORD); procedure WndProc(var msg: TMessage); override; 在實作中寫下宣告的定義 // 使用startrun 來做是 form1 Create 完成後再進行 icon 的動作, 可以確保程式的安全性, 因為 create 當中 // 有些物件尚未被建立, 而這時如果建立icon 有可能會引發錯誤, 如果你想實證, 可以取消 startrun 相關設計 // 把 startrrun 中的 ModifyTrayIcon(NIM_ADD) 放到 onCreate 中去試試看就知道, 或許可行, 或許當掉 procedure TForm1.StartRun(Sender: Tobject; var Done: boolean); var xhandle: longInt; begin xhandle:= FindWindow('TForm1',nil); if xhandle = 0 then exit; Application.OnIdle:= nil; Done:= True; Form1.Hide; // 首次啟動畫面, 建立icon ModifyTrayIcon(NIM_ADD); end; procedure TForm1.ModifyTrayIcon(Action: DWORD); begin BorderIcons := []; with IconNotifyData do begin hIcon := Application.Icon.Handle; uCallbackMessage := WM_USER 5; cbSize := sizeof(IconNotifyData); Wnd := Handle; uID := 0; uFlags := NIF_MESSAGE NIF_ICON NIF_TIP; end; strPCopy(IconNotifyData.szTip, ''標題的caption); shell_NotifyIcon(Action, @IconNotifyData); end; // 這段是在控制呼叫你的main form show 功能, 必須搭配 popup 功能 procedure TForm1.WndProc(var msg: TMessage); var mousePos: TPoint; begin case msg.Msg of WM_USER 5: begin case msg.LParam of WM_LBUTTONDOWN: begin GetCursorPos(mousePos); if Form1.Showing then Form_RS232.Hide else begin Show; Form1.SetFocus; end; end; end; case msg.LParam of WM_RBUTTONDOWN: begin GetCursorPos(mousePos); PopupMenu1.Popup(mousePos.x, mousePos.y); //right click, so popup menu end; end; end; end; inherited; end; procedure TForm1.FormCreate(Sender: TObject); begin ....... (如果有自己的程式, 不動, 最後加入下列這句) Application.OnIdle:= StartRun; end; // 記住, 必須在 onCloseQuery 下寫, 而不是 onClose 下 // 因為如果點選視窗右上的[X] 不會觸發 onClose 事件 procedure TForm1.FormCloseQuery(Sender: TObject; begin ...... (加入下列這句, 關閉程式才會釋放icon) ModifyTrayIcon(NIM_DELETE); end; 大致是這樣, 不知還有沒有漏掉的, 先做做看吧 |
cursegold
一般會員 ![]() ![]() 發表:16 回覆:36 積分:15 註冊:2006-08-22 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |