2013-07-30 41 views
5

Tình huống là như sau: trên mẫu ứng dụng tạo sự kiện một số điều kiện không được tôn trọng, vì vậy ứng dụng cần phải đóng.Delphi - dừng ứng dụng trên biểu mẫu chính tạo

Vâng, đây là thiết kế kém nhưng cách đóng ứng dụng? Sử dụng Application.MainForm.Close tạo ra một AV. Application.Terminate không phải là lựa chọn tốt. Những ý tưởng khác?

+6

'Application.Terminate' chắc chắn hoạt động. Nhưng tốt hơn là viết mã của bạn trong tệp .DPR và không phải trong trình xử lý sự kiện 'OnCreate' của biểu mẫu chính của bạn ... –

+3

Kiểm tra các điều kiện trước khi bạn tạo biểu mẫu. Nếu bạn cần khá, bạn có thể bỏ qua mã .dpr tạo các biểu mẫu và gọi 'Application.Run'. Ví dụ, bạn có thể gọi 'exit' trong phần thân của tệp .dpr. –

+0

@AndreasRejbrand - đây là những gì tôi đang làm :) Những gì tôi muốn hỏi là làm thế nào để chấm dứt nó bên trong sự kiện OnCreate. – RBA

Trả lời

11

Application.Terminate công trình tốt. Tuy nhiên, hãy nhớ rằng việc kết thúc bị trễ, tất cả những điều đó là gửi một tin nhắn WM_QUIT tới hàng đợi tin nhắn của chuỗi cuộc gọi, vì vậy ứng dụng sẽ không thực sự chấm dứt cho đến khi Application.Run() được gọi để bắt đầu xử lý hàng đợi tin nhắn của chuỗi chính. Do đó, bạn có thể thấy màn hình chờ nhấp nháy MainForm trong giây lát trước khi ứng dụng thực sự bị chấm dứt. Nếu bạn muốn tránh điều đó, bạn có thể đặt Application.ShowMainForm tài sản để sai, ví dụ:

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    if (some condition) then 
    begin 
    Application.ShowMainForm := False; 
    Application.Terminate; 
    end; 
end; 

Tuy nhiên, như những người khác đã nói, một thiết kế tốt hơn là để làm việc kiểm tra trong file DPR của dự án để thay thế và thậm chí không tạo các MainForm ở tất cả nếu cần thiết, ví dụ:

Application.Initialize; 
if not (some condition) then 
begin 
    Application.CreateForm(TMainForm, MainForm); 
    Application.Run; 
end; 
2
Application.Terminate 

là đủ tốt trừ khi bạn quan tâm để tinh chỉnh thiết kế của mình để kiểm tra các điều kiện này trước khi biểu mẫu được tạo (trong dpr).

4

Vâng, nếu bạn muốn dính vào thiết kế xấu của bạn, đây là một câu trả lời xấu:

try 
    Application.Terminate 
except 
end;