我們有一個應用程序處理我們自己的消息 - 一個有時間的過程爲他們讀取數據庫。 它被發現一條記錄,然後我們模式地顯示一個表單。德爾福 - 一個消息窗體作爲另一個任務的窗口
這是不好的解決方案,因爲可能用戶打字,看到任何東西等,並形式中止此操作。
我認爲我有時會看到,對話框,窗口與應用程序分離,它們似乎是另一個任務(任務欄在這段時間內有兩個元素)。 但這些事情是不經常發生的,他們是錯誤的...
但是,然後我想找到一種方法來引起同樣的事情。
定時器正在檢查數據庫,如果發現有記錄,那麼我們將在後臺顯示一個表單,似乎是另一個任務,它正在閃爍,並且定期更改它的標題。 當用戶點擊它時,它會自行銷燬,並以模態方式顯示原始的「消息」形式。
我們可以用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
如果您想要在屏幕上顯示某些內容,但不能竊取焦點,那麼您需要一個工具提示。 –
我正在做類似的事情。我強烈建議您將所有數據庫讀取和消息對話框處理移至單獨的線程,因爲例如當數據庫連接發生某些事情時,如果不停止刷新計時器,則會在連接超時的無限循環中使用主窗體,並且從用戶的角度來看,這是程序滯後。 – 2011-02-24 12:33:26
由於您將在單獨的線程中擁有它,因此您可以在該線程的同步方法中顯示您創建的消息窗體。 – 2011-02-24 12:37:13