回答
我希望您的確定按鈕有ModalResult
設置爲mrOK
。如果要將錯誤檢查添加到確定按鈕,則將其更改爲mrNone
。添加一個OnClick
處理程序的按鈕,它可以執行任何您需要的檢查或處理。如果它確定表單可以關閉,請在OnClick
處理程序中設置Self.ModalResult := mrOK
。
您確實需要在表單關閉之前訪問信息嗎?延遲表單的關閉會影響用戶的應用程序體驗(除非速度足夠快,以至於他們沒有注意到 - 在這種情況下,爲什麼延遲它?)
關閉窗體仍然可用於調用者(除非關閉操作是caFreeOnClose)。因此,您應該能夠將公共屬性添加到表單中,然後您可以在調用方中訪問該表單。
e.g
Type Form2 = Class(TForm)
public
//Add a public property here
end;
從來電:
if Form2.ShowModal = mrOk then
begin
InformationIWant = Form2.PublicProperty;
end;
這裏有幾個問題:1.'Show'不是一個函數。你大概是指'ShowModal'。 2.你沒有提到談論「延遲關閉,直到我說它可以關閉」這部分的問題。 –
@DavidHeffernan:謝謝大衛,我目前無法訪問Delphi,因此無法檢查。我已經更新了答案。我試圖解決你的第二點 –
想要驗證數據並阻止表單關閉很常見。這必須發生在窗體內部,而不是'ShowModal'返回後。 –
至於除了JamesB's answer。
您必須打電話給Form2.Free,á收到您想要的信息後。
我一般添加新的功能,爲第二形態的單位,是這樣的:
type
TForm2 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
InformationIWant : SomeType;
end;
var
Form2: TForm2;
function ReturnValue : SomeType
implementation
function ReturnValue : Sometype;
begin
try
if Form2 = nil then
Form2 := TForm2.Create(nil);
Form2.Windowstate := wsNormal;
Form2.BringToFront;
SetForegroundWindow(Application.Handle);
if Form2.ShowModal then
Result := InformationIWant
finally
FreeAndNil(Form2);
end;
end;
FreeAndNil(Form2)明確表示Form2可以是'ReturnValue'中的局部變量,而不是全局變量。 – mjn
只是別人在說什麼的組合。
正式確定如何從模態對話框中驗證和獲取數據是一個好主意。 一遍又一遍地使用相同的技術使得一切都更容易維護和閱讀。
一個例子:
Type TFormModal = Class(TForm)
procedure OnOkClick(Sender : TObject);
function ValidateInterface : boolean;
public
procedure SetInterface(input data here);
procedure GetInterface(output data here);
end;
procedure TFormModal.OnOkClick(Sender : TObject);
begin
if ValidateInterface
then modalResult := mrOk
else modalResult := mrNone;
end;
從您的主要形式有:
procedure MainForm.OnShowMyModalFormClick(sender : TObject);
var
myModal : TFormModal;
begin
...
myModal := TFormModal.Create(nil);
try
myModal.SetInterface(...);
if (myModal.ShowModal = mrOk) then myModal.GetInterface(...);
finally
myModal.Free;
end;
...
end;
大衛的回答另一種方法是爲使用OnClose
或OnCloseQuery
事件。與OnCloseQuery
你可以通過設置CanClose := false;
- 1. 在關閉主窗體之前關閉邊線程
- 2. Webix在獲取表單數據之前關閉modalbox
- 3. 從C#中的前景窗體關閉背景窗體wpf
- 4. 從子窗體關閉父窗體
- 5. 從另一個窗體關閉窗體
- 6. 從窗體參數中獲取數據
- 7. 如何防止父窗口關閉之前關閉子窗口
- 8. 函數之前的窗體或窗體之前的函數?
- 9. Rails Modal窗體 - 無法獲取驗證錯誤以Modal顯示
- 10. 如何從Windows窗體獲取數據
- 11. 父窗口獲取焦點時窗口窗體自動關閉
- 12. 獲取數據是關閉
- 13. iPhone:獲取數據關閉
- 14. 在關閉窗口之前提交域數據
- 15. 關閉Lean Modal
- 16. 在Bootstrap UI中從Modal獲取數據
- 17. 使用javascript在打開新窗體之前關閉所有打開的窗體
- 18. 從WPF中的Modal窗口獲取值
- 19. 如何關閉當前窗體Winform C#
- 20. 在asp.net中關閉當前web窗體
- 21. 從窗體關閉命令窗口
- 22. 關閉窗口之前顯示提示
- 23. Windows窗體關閉後刪除窗體數據
- 24. 在關閉窗體之前進行檢查?
- 25. 如何關閉之前的MDI子以父窗體
- 26. 在JQuery中關閉Modal後關閉父窗口
- 27. $ .ready()在關閉主體之前
- 28. 如何在Safari關閉之前捕捉窗口關閉?
- 29. 如何關閉當前窗體並返回主窗體
- 30. Modal立即關閉
阻止窗體關閉恭喜已達到[所有時間Delphi用戶](http://stackoverflow.com/tags/delphi/topusers)的頂部。 – NGLN
任何人都知道爲什麼這個答案有2個downvotes?這似乎是解決「延遲關閉,直到我說可以關閉」部分問題的唯一答案。 –
@DavidHeffernan,我的回答是:)。你有我的贊成! –