2011-02-24 28 views
0

我們有一個應用程序處理我們自己的消息 - 一個有時間的過程爲他們讀取數據庫。 它被發現一條記錄,然後我們模式地顯示一個表單。德爾福 - 一個消息窗體作爲另一個任務的窗口

這是不好的解決方案,因爲可能用戶打字,看到任何東西等,並形式中止此操作。

我認爲我有時會看到,對話框,窗口與應用程序分離,它們似乎是另一個任務(任務欄在這段時間內有兩個元素)。 但這些事情是不經常發生的,他們是錯誤的...

但是,然後我想找到一種方法來引起同樣的事情。

定時器正在檢查數據庫,如果發現有記錄,那麼我們將在後臺顯示一個表單,似乎是另一個任務,它正在閃爍,並且定期更改它的標題。 當用戶點擊它時,它會自行銷燬,並以模態方式顯示原始的「消息」形式。

我們可以用Win32技巧做這件事嗎? 又如何?

感謝: DD


感謝第一個答案。

我試着創建一個簡單的例子。你可以看到這裏:

type 
    TC = class(TPanel) 
     private 
     protected 
      procedure WMActivate(var Message: TWMActivate); message WM_ACTIVATE; 

     public 
      procedure CreateParams(var Params: TCreateParams); override; 

end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    t : TC; 
begin 
    t := TC.Create(Self); 
    t.Width := 100; 
    t.Height := 100; 
    t.Caption := 'aaaa'; 
    ShowWindow(t.Handle, sw_SHOW); 
end; 


{ TC } 

procedure TC.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
    Params.WndParent := GetDesktopwindow; 
end; 

procedure TC.WMActivate(var Message: TWMActivate); 
begin 
    if Message.Active <> WA_INACTIVE 
     then begin 
      SHowMessage('b'); 
      SHowWindow(Self.Handle, sw_HIDE); 
     end; 
end; 

這是工作,但我有一個問題。 該任務的圖標與應用程序相同。 如果有人隨機點擊它,可能會點擊錯誤的項目。 如何重新定義子窗口的圖標?

感謝: DD

+1

如果您想要在屏幕上顯示某些內容,但不能竊取焦點,那麼您需要一個工具提示。 –

+0

我正在做類似的事情。我強烈建議您將所有數據庫讀取和消息對話框處理移至單獨的線程,因爲例如當數據庫連接發生某些事情時,如果不停止刷新計時器,則會在連接超時的無限循環中使用主窗體,並且從用戶的角度來看,這是程序滯後。 – 2011-02-24 12:33:26

+0

由於您將在單獨的線程中擁有它,因此您可以在該線程的同步方法中顯示您創建的消息窗體。 – 2011-02-24 12:37:13

回答

-1

不是一個完整的解決方案,而是一塊拼圖的你可能需要:顯示與自己的任務欄按鈕的表單,您可以覆蓋的CreateParams

procedure TForm1.CreateParams(var Params: TCreateParams); 
begin 
    inherited CreateParams(Params); 
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW; 
end; 
+2

'Params.WndParent:= GetDesktopWindow'?是有史以來最明智的? –

+0

@David Heffernan它允許表單保持打開狀態,即使主表單被隱藏。 Delphi中的表單管理並沒有使這些事情變得簡單,而這正是我設法解決這個問題的方式。當然可能有更好的方法。 OP可能不需要它,所以我會繼續編輯它。 – Kcats

+0

問題是表單竊取焦點。我認爲工具提示是通知的事情。 –

相關問題