2011-10-19 18 views

Trả lời

10

Tôi mong rằng nút OK của bạn có ModalResult được đặt thành mrOK. Nếu bạn muốn thêm lỗi kiểm tra vào nút OK, hãy thay đổi điều đó thành mrNone. Thêm trình xử lý OnClick vào nút thực hiện bất kỳ thao tác kiểm tra hoặc xử lý nào bạn cần. Nếu nó xác định rằng biểu mẫu có thể đóng, hãy đặt Self.ModalResult := mrOK trong trình xử lý OnClick.

+3

Chúc mừng bạn đã đạt đến đỉnh [tất cả thời gian người dùng Delphi] (http://stackoverflow.com/tags/delphi/topusers). – NGLN

+0

Bất cứ ai biết tại sao Câu trả lời này có 2 downvotes? Nó dường như là câu trả lời duy nhất giải quyết "chậm trễ đóng cho đến khi tôi nói nó có thể đóng" một phần của câu hỏi. –

+0

@DavidHeffernan, câu trả lời của tôi có :). Và bạn có upvote của tôi! –

7

Bạn có thực sự cần truy cập thông tin trước khi biểu mẫu được đóng không? Việc trì hoãn việc đóng biểu mẫu sẽ ảnh hưởng đến trải nghiệm của người dùng của ứng dụng (trừ khi nó đủ nhanh để họ không nhận thấy - trong trường hợp này, tại sao phải trì hoãn?)

Biểu mẫu đóng vẫn có sẵn trong bộ nhớ cho người gọi (trừ khi hành động đóng là caFreeOnClose). Vì vậy, bạn sẽ có thể thêm các thuộc tính công khai vào biểu mẫu mà sau đó bạn có thể truy cập trong trình gọi.

ví dụ

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

Từ người gọi:

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

Một vài vấn đề ở đây: 1. 'Show' không phải là một hàm. Bạn có lẽ có nghĩa là 'ShowModal'. 2. Bạn không giải quyết một phần của câu hỏi mà nói về "trì hoãn đóng cho đến khi tôi nói nó có thể đóng". –

+0

@DavidHeffernan: Cảm ơn David, tôi hiện không có quyền truy cập vào Delphi nên không thể kiểm tra. Tôi đã cập nhật câu trả lời. Tôi đã cố gắng giải quyết điểm thứ hai của bạn –

+0

Thông thường bạn muốn xác thực dữ liệu và chặn đóng biểu mẫu. Điều đó phải xảy ra bên trong biểu mẫu chứ không phải sau khi 'ShowModal' trả về. –

2

Như Ngoài JamesB's answer.

Bạn phải gọi Form2.Free, sau khi bạn lấy thông tin mình muốn.

tôi thường thêm một chức năng mới cho đơn vị dưới hình thức thứ hai, một cái gì đó như:

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) làm cho nó rõ ràng rằng Form2 có thể là một biến địa phương trong 'ReturnValue', thay vì một biến toàn cục. – mjn

5

Chỉ cần một sự kết hợp của những gì người khác đang nói.

Bạn nên chính thức hóa cách xác thực và lấy dữ liệu từ hộp thoại phương thức. Sử dụng cùng một kỹ thuật lặp đi lặp lại giúp mọi thứ dễ dàng hơn để duy trì và đọc.

Một ví dụ:

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; 

từ hình thức chính của bạn:

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

Một thay thế cho câu trả lời của David là sử dụng một trong hai OnClose hoặc OnCloseQuery sự kiện. Với OnCloseQuery bạn có thể ngăn chặn biểu mẫu đóng bằng cách đặt CanClose := false;

Các vấn đề liên quan