我的應用程序按照您描述的方式工作。這是我採取的方法。我本來希望找到一個更簡單的方法,但從來沒有。
我開始閱讀這些文章。這首先是一個偉大的寫了彼得以下:
http://groups-beta.google.com/group/borland.public.delphi.winapi/msg/e9f75ff48ce960eb?hl=en
其他信息,這裏也發現了,但是這並不能證明是一個有效的解決方案:爲我所用: http://blogs.teamb.com/DeepakShenoy/archive/2005/04/26/4050.aspx
最終這是我結束了。
我的啓動畫面兼作應用程序主窗體。主窗體與應用程序對象有特殊的聯繫。使用所有輔助形式可以使我獲得我一直在尋找的行爲。
在任務欄上的每個表單上,我都會重寫CreateParams。我這樣做對我的編輯形式和用戶所認爲的「主表」
procedure TUaarSalesMain.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := GetDesktopWindow;
end;
我的「主」的形式儘可能德爾福關注負載在其Activitate功能真正的主要形式。我使用一個成員變量來跟蹤第一個激活。然後在函數結束時,我隱藏了飛濺窗體,但不要關閉它。這對我很重要,因爲如果用戶正在編輯文檔並關閉主窗體,我不希望編輯屏幕同時被強制關閉。這樣,所有可見的表單都被視爲相同。
if FFirstActivate = false then
exit;
FFristActivate := false;
/*
Main Load code here
Update Splash label, repaint
Application.CreateForm
etc.
*/
// I can't change visible here but I can change the size of the window
Self.Height := 0;
Self.Width := 0;
Self.Enabled := false;
// It is tempting to set Self.Visible := false here but that is not
// possible because you can't change the Visible status inside this
// function. So we need to send a message instead.
ShowWindow(Self.Handle, SW_HIDE);
end;
但仍然存在問題。當所有其他表單關閉時,您需要關閉主窗口。我在父親<> nil的附近例程中有一個額外的檢查,因爲我使用表單作爲插件(形成我的目的,他們比框架更好地工作)。
我真的不喜歡使用空閒事件,但我沒有注意到這是對CPU的拖動。
{
TApplicationManager.ApplicationEventsIdle
---------------------------------------------------------------------------
}
procedure TApplicationManager.ApplicationEventsIdle(Sender: TObject;
var Done: Boolean);
begin
if Screen.FormCount < 2 then
Close;
end;
{
TApplicationManager.FormCloseQuery
---------------------------------------------------------------------------
}
procedure TApplicationManager.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
var
i: integer;
begin
for i := 0 to Screen.FormCount - 1 do
begin
if Screen.Forms[i] <> self then
begin
// Forms that have a parent will be cleaned up by that parent so
// ignore them here and only attempt to close the parent forms
if Screen.Forms[i].Parent = nil then
begin
if Screen.Forms[i].CloseQuery = false then
begin
CanClose := false;
break;
end;
end;
end;
end;
end;
{
TApplicationManager.FormClose
---------------------------------------------------------------------------
}
procedure TApplicationManager.FormClose(Sender: TObject;
var Action: TCloseAction);
var
i: integer;
begin
for i := Screen.FormCount - 1 downto 0 do
begin
if Screen.Forms[i] <> self then
begin
// Forms that have a parent will be cleaned up by that parent so
// ignore them here and only attempt to close the parent forms
if Screen.Forms[i].Parent = nil then
begin
Screen.Forms[i].Close;
end;
end;
end;
end;
到目前爲止,這已經很好地服務了我。我對Vista做了一些小改動,因爲我的「Main/Splash」屏幕圖標仍然顯示。我不記得那是什麼。我可能不需要設置寬度,高度,啓用,並在啓動畫面上發送隱藏消息。我只是想確保它沒有出現:-)。
處理密切事件是必要的。如果我沒有記錯,當windows發送關閉消息時需要這樣做。我認爲只有主要形式才能得到這個信息。
隱藏的聲音聽起來很可怕,但它實際上也可能解決另一個問題。如果沒有理想出現,這可能是我的目標。謝謝! – mj2008 2009-04-29 15:10:09