2011-10-19 69 views
8

我有一個Modal窗體,並在Ok按鈕中處理一些信息,我需要在窗體中調用模態窗體。從Modal窗體關閉之前獲取數據

如何才能在關閉之前弄出它?

或延遲關閉,直到我說它可以關閉。

回答

10

我希望您的確定按鈕有ModalResult設置爲mrOK。如果要將錯誤檢查添加到確定按鈕,則將其更改爲mrNone。添加一個OnClick處理程序的按鈕,它可以執行任何您需要的檢查或處理。如果它確定表單可以關閉,請在OnClick處理程序中設置Self.ModalResult := mrOK

+3

阻止窗體關閉恭喜已達到[所有時間Delphi用戶](http://stackoverflow.com/tags/delphi/topusers)的頂部。 – NGLN

+0

任何人都知道爲什麼這個答案有2個downvotes?這似乎是解決「延遲關閉,直到我說可以關閉」部分問題的唯一答案。 –

+0

@DavidHeffernan,我的回答是:)。你有我的贊成! –

7

您確實需要在表單關閉之前訪問信息嗎?延遲表單的關閉會影響用戶的應用程序體驗(除非速度足夠快,以至於他們沒有注意到 - 在這種情況下,爲什麼延遲它?)

關閉窗體仍然可用於調用者(除非關閉操作是caFreeOnClose)。因此,您應該能夠將公共屬性添加到表單中,然後您可以在調用方中訪問該表單。

e.g

Type Form2 = Class(TForm) 
public 
    //Add a public property here 
end; 

從來電:

if Form2.ShowModal = mrOk then 
begin 
    InformationIWant = Form2.PublicProperty; 
end; 
+0

這裏有幾個問題:1.'Show'不是一個函數。你大概是指'ShowModal'。 2.你沒有提到談論「延遲關閉,直到我說它可以關閉」這部分的問題。 –

+0

@DavidHeffernan:謝謝大衛,我目前無法訪問Delphi,因此無法檢查。我已經更新了答案。我試圖解決你的第二點 –

+0

想要驗證數據並阻止表單關閉很常見。這必須發生在窗體內部,而不是'ShowModal'返回後。 –

2

至於除了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; 
+0

FreeAndNil(Form2)明確表示Form2可以是'ReturnValue'中的局部變量,而不是全局變量。 – mjn

5

只是別人在說什麼的組合。

正式確定如何從模態對話框中驗證和獲取數據是一個好主意。 一遍又一遍地使用相同的技術使得一切都更容易維護和閱讀。

一個例子:

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; 
2

大衛的回答另一種方法是爲使用OnCloseOnCloseQuery事件。與OnCloseQuery你可以通過設置CanClose := false;