你還是想用「你知道什麼時候該對話框完成」的比喻來實現這一點? 所以像
DoSomethingBeforeDialog();
Form:=TFakeFormDialog.Create(Nil);
try
Form.FakeShowModal();
finally
Form.Free;
end;
DoSomethingAfterDialog();
如果答案是肯定的,你會嘗試用線程來實現這一點,像谷歌Chrome瀏覽器執行此與標籤頁。但是,如果沒有線程只有你能趕上消息處理,像這樣
function TFakeModalDlg.FakeShowModal(FormParent: TWinControl): boolean;
begin
Parent:=FormParent;
SetBounds((FormParent.Width - Width) div 2, (FormParent.Height - Height) div 2,
Width, Height);
Show;
while NoButtonIsPressed() do
begin
Application.HandleMessage;
end;
Hide;
end;
A碼和你甚至有下面的代碼...
Form:=TFakeModalDlg.Create(Nil);
try
(Sender as TButton).Caption:='Going modal...';
Form.FakeShowModal(TabSheet1);
(Sender as TButton).Caption:='Returned from modal';
finally
Form.Free;
end;
稱爲從標籤乘次,但問題是這些的「對話框」應按「堆棧順序」關閉,即與其顯示的順序相反。我認爲這是不可能強迫用戶關閉形式開發的優先順序:)
我意識到在對話框和模塊中必須添加一些屬性。讓我們暫時忘記這一點。 但主要問題是如何在顯示對話框時在本地禁用模塊中的所有組件。循環瀏覽它們是一個糟糕的解決方案,因爲它們太多了。 – 2009-08-19 12:35:45
根據您的控件所包含的控件的類型,您應該能夠禁用父控件。例如,如果您的組件都在TTabSheet中,禁用TTabSheet將阻止訪問所有這些控件。 – 2009-08-19 13:03:37
剛剛有另一個想法。我可以簡單地將模塊(從TForm繼承)的Enabled屬性設置爲False來鎖定它上面的所有組件? 一個快速測試似乎很有前途:) – 2009-08-19 13:08:52