我使用德爾福2010年建立一個Win32 GUI應用程序在Windows XP/Vista和Windows 7上運行開關Application.Mainform並調用MainformOnTaskBar原因閃爍Windows任務欄
基本上,Application.MainForm是隻讀屬性,不能在運行時,一旦經由Application.CreateForm創建的第一個形式被改變:
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
上面的例子將使Form1中作爲應用程序的MainForm中。它將在Windows 7任務欄的縮略圖預覽中顯示。
在運行時將Application.MainFormOnTaskBar設置爲true可讓我們享受Windows aero主題功能。
我需要在運行時切換應用程序的mainform。例如,將Form2設置爲主窗體。我用下面的代碼,使其工作:
procedure SetAsMainForm(aForm:TForm);
var
P:Pointer;
begin
Application.MainFormOnTaskBar := False;
try
P := @Application.Mainform;
Pointer(P^) := aForm;
aForm.Show;
finally
Application.MainFormOnTaskBar := True;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetAsMainForm(Form2);
end;
執行Button1.Click將窗體2爲MainForm,然後更新Windows的任務欄縮略圖預覽。但是,任務欄可能會閃爍開關。
我的問題是:
- 有什麼辦法走這樣的閃爍?
- 設置Application.MainformOnTaskBar:False是否安全並在運行時再次將其設置爲True?
此外,您也可以在它們之間建立兩個不同的過程和交換數據。這當然有點貴,如果你不得不分享數據,這可能並不理想。 – 2010-11-09 15:22:34
這將是阻止任務欄閃爍,@Jens的反義詞。任務欄將來自同一進程的按鈕分組,這就是爲什麼Chau的代碼似乎將一個按鈕替換爲另一個按鈕 - 它們佔據了任務欄上的相同位置。但是,如果按鈕屬於兩個不同的進程,那麼任務欄不會將它們放在一起。你不僅有閃爍的按鈕,而且有從一個地方跳到另一個地方的按鈕。 – 2010-11-09 15:29:30
取決於它們是否應該同時可見,以及它們是否足夠分離兩個不同的可執行文件。問題是爲什麼Chau需要改變主要形式呢?我在猜測,使用兩個相同的可執行程序甚至兩個不同的進程可能是一個更好的主意。 – 2010-11-09 15:34:46