2012-06-08 7 views
12

Qual è il modo consigliato per garantire che la mainform sia completamente ingrandita e tutti i controlli vengano ridisegnati prima di mostrare un modulo modale sul primo caricamento dell'applicazione?Modo corretto per garantire che la forma principale sia ingrandita e completamente ridisegnata prima di mostrare un modulo modale sul carico dell'applicazione

Devo mostrare una finestra di dialogo modale all'avvio dell'applicazione (non una schermata di accesso) ma se imposto il modulo su wsMaximized mentre lo schermo ingrandisce, i controlli non hanno la possibilità di ridisegnare e si rimane con un brutto pasticcio .

mi mostrano lo schermo modale attualmente utilizzando il seguente:

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

risposta

14

Cosa faccio di solito è inviare un messaggio personalizzato di nuovo al mio modulo. In questo modo non verrà elaborato fino a quando non saranno già gestiti altri messaggi per il modulo. Nel momento in cui questo messaggio viene elaborato, il tuo modulo dovrebbe aver già finito il ridisegno.

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; 

Se siete preoccupati per il messaggio di ottenere alla vostra applicazione di nuovo in qualche modo, è sempre possibile aggiungere una variabile booleana privato per indicare che è stata gestita una volta.

+1

+1. Se pubblichi il messaggio in "OnShow", invece, verrà elaborato più avanti nel processo; questo elimina ogni possibilità che venga inviato troppo presto. (E non dovrebbe essere 'FormCreate' invece?' OnCreate' è il nome della proprietà stessa.) –

+0

@Ken: Grazie per la correzione. Per quanto riguarda l'uso di 'OnShow', penso che il modulo verrà creato, mostrato, quindi attivato tutto prima che' Application.Run' inizi a pompare la coda dei messaggi, quindi non ha molta importanza. Anche altre forme e datamodules stanno per essere creati (e hanno attivato anche i loro eventi "OnCreate"). Non ho ancora avuto questo idioma in pratica quando usato da "OnCreate". – afrazier

+0

Grazie per il tuo aiuto - +1 a @KenWhite anche per la raccomandazione di OnShow –