2013-07-30 14 views
5

Sytuacja wygląda następująco: w głównym formularzu tworzenia aplikacji niektóre warunki nie są przestrzegane, więc aplikacja musi zostać zamknięta.Delphi - zatrzymaj aplikację na głównym formularzu Utwórz

Tak, to zły projekt, ale w jaki sposób należy zamknąć aplikację? Korzystanie z Application.MainForm.Close generuje AV. Application.Terminate nie jest dobrym wyborem. Inne pomysły?

+6

'Aplikacja.Terminate' na pewno działa. Ale lepiej może napisać swój kod w pliku .DPR, a nie w procedurze obsługi zdarzeń "OnCreate" w głównym formularzu ... –

+3

Sprawdź warunki przed utworzeniem formularza. Jeśli potrzebujesz dość, możesz pominąć kod .dpr, który tworzy formularze i wywołuje 'Application.Run'. Na przykład możesz wywołać 'exit' w treści twojego pliku .dpr. –

+0

@AndreasRejbrand - właśnie to robię :) Chcę zapytać, jak zakończyć to wydarzenie wewnątrz zdarzenia OnCreate. – RBA

Odpowiedz

11

Application.Terminate działa dobrze. Należy jednak pamiętać, że jest to terminacja opóźniona, wszystko co robi, to wysłanie wiadomości o następującej treści: WM_QUIT do kolejki komunikatów wątku wywołującego, więc aplikacja nie zostanie faktycznie zakończona, dopóki nie zostanie wywołana Application.Run(), aby rozpocząć przetwarzanie kolejki komunikatów głównego wątku. Z tego powodu na chwilę może pojawić się migotanie MainForm na ekranie, zanim aplikacja zostanie faktycznie zakończona. Jeśli chcesz tego uniknąć, można ustawić właściwość Application.ShowMainForm false, np:

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

Jednakże, jak inni stwierdzili, lepsza konstrukcja jest zrobić czek w pliku DPR projektu zamiast a nawet tworzyć MainForm w razie potrzeby, np.:

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

jest wystarczająco dobry, chyba że chcesz dopracować swój projekt, aby sprawdzić te warunki przed utworzeniem formularza (w dpr).

4

Cóż, jeśli chcesz, aby trzymać się złej konstrukcji, tutaj jest złym odpowiedź:

try 
    Application.Terminate 
except 
end; 
Powiązane problemy