2012-06-08 13 views
12

Jaki jest zalecany sposób, aby zapewnić pełne zmaksymalizowanie formuły głównej, a wszystkie formanty zostały przerysowane przed pokazaniem formy modalnej przy pierwszym załadowaniu aplikacji?Prawidłowy sposób zapewnienia, że ​​formant główny został zmaksymalizowany iw pełni przerysowany przed wyświetleniem formularza modalnego podczas ładowania aplikacji.

Muszę pokazać modalne okno dialogowe po uruchomieniu aplikacji (nie ekran logowania), ale jeśli ustawię formularz na wsMaximized, gdy ekran zmaksymalizuje, kontrolki nie będą miały szansy na przerysowanie i pozostaniesz z brzydkim bałaganem .

pokażę modalne ekranu w chwili obecnej przy użyciu następujących:

procedure TForm1.FormActivate(Sender: TObject); 
var 
    frmOrderLookup:TfrmOrderLookup; 
begin 
    onactivate := nil; 
    frmOrderLookup:=TfrmOrderLookup.Create(nil); 
    try 
    frmOrderLookup.showmodal; 
    finally 
    frmOrderLookup.Free; 
    end; 
end; 

Odpowiedz

14

Co zwykle zrobić to pisać niestandardowy komunikat z powrotem do mojego formularza. W ten sposób nie zostanie on przetworzony, dopóki inne wiadomości dla formularza nie zostaną już obsłużone. Zanim ten komunikat zostanie przetworzony, Twój formularz powinien już zostać przerysowany.

type 
    TMyForm = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    procedure HandleLookupMessage(var Message: TMessage); message WM_USER + 1; 
    end; 

procedure TMyForm.HandleLookupMessage(var Message: TMessage); 
var 
    frmOrderLookup: TfrmOrderLookup; 
begin 
    frmOrderLookup := TfrmOrderLookup.Create(Application); 
    try 
    frmOrderLookup.ShowModal; 
    finally 
    frmOrderLookup.Release; 
    end; 
end; 

procedure TMyForm.FormCreate(Sender: TObject); 
begin 
    // Maximise form here if needed 
    PostMessage(Handle, WM_USER + 1, 0, 0); 
end; 

Jeśli martwisz się o przesłanie swojej aplikacji na uzyskanie jeszcze jakoś, zawsze można dodać zmienną logiczną prywatny, aby wskazać, że to było obsługiwane raz.

+1

+1. Jeśli opublikujesz wiadomość w "OnShow" zamiast tego, zostanie ona przetworzona w późniejszym etapie procesu; to eliminuje jakąkolwiek szansę na to, że zostanie wysłane zbyt wcześnie. (A czy nie powinno to być 'FormCreate'?' OnCreate' to nazwa samej właściwości.) –

+0

@Ken: Dzięki za poprawkę. Jeśli chodzi o użycie 'OnShow', myślę, że formularz zostanie utworzony, pokazany, a następnie aktywowany, zanim' Application.Run' zacznie pompować kolejkę wiadomości, więc nie ma to większego znaczenia. Inne formularze i datamoduły również muszą zostać stworzone (i mają również uruchomione zdarzenia "OnCreate"). Nie miałem tego idiomu, który zawiodłby mnie jeszcze w praktyce, gdy był używany z 'OnCreate'. – afrazier

+0

Dzięki za pomoc - +1 do @KenWhite za rekomendację OnShow –