2012-03-07 5 views
5

Il progetto su cui lavoro consiste di diverse 100 forme. Sono principalmente chiamati dalla mainform. Il nome dell'applicazione è in tutte le formcaptions.Tentativo di catturare il oncreate di un modulo

Ora una diversa "versione" dell'applicazione deve avere le didascalie del modulo modificate in un altro nome applicazione. Ma questo è condizionale.

Quello che mi è venuta è stata vincolante il

Screen.OnActiveFormChange := ScreenOnActiveFormChange; 

nel FormCreate e fare una procedura per questo.

procedure TFormMAIN.ScreenOnActiveFormChange(Sender: TObject); 
begin 
    if Newversion then begin 
    if assigned(screen.activeform) then begin 
     Screen.ActiveForm.Caption := SwapFormCaption(Screen.ActiveForm.Caption); 
    end; 
    end; 
end; 

Questo funziona bene nel 95% dei casi. Ma in quei 5% la forma è mostrata troppo veloce. La finestra viene disegnata prima che la didascalia venga aggiornata e Windows la lascia lì. Ma la didascalia ha già un nuovo valore. Quale rimedio funzionante stava aumentando e diminuendo l'altezza del modulo di 1 pixel e poi si sarebbe mostrato giusto. form.repaint non ha aiutato qui. Questo è un modo piuttosto brutto di fare le cose.

Quello che voglio veramente è intercettare la creazione della sotto-form invece dell'attivazione. Ho cercato di trovare risorse in merito, ma non ha avuto successo.

+13

Il modo migliore per farlo è quello di rendere tutti i vostri moduli derivano da una base comune classe. Quindi puoi controllare le impostazioni comuni a tutti i moduli da una singola posizione –

+0

Dopo ulteriori indagini, penso che sia in qualche modo un bug di videobuffer. Quando trascino la finestra, la didascalia non cambia e rimane errata. A meno che non lo trascino per scivolare fuori dal desktop. Quando lo trascino indietro, la parte che non è stata mostrata sul dekstop viene modificata nella didascalia corretta mentre la parte rimasta visibile rimane errata. –

risposta

0

Hai provato a usare window api?

SetWindowText(Screen.ActiveForm.Handle,PChar(SwapFormCaption(Screen.ActiveForm.Caption)); 

Edit: 1 più suggerimento: Aggiungere una chiamata DrawMenuBar API per forzare ridisegnare della barra dei menu della finestra

DrawMenuBar(Screen.ActiveForm.Handle); 
+0

Questo fa esattamente lo stesso del codice che ho postato, con lo stesso problema. –

+0

DrawMenuBar funziona bene, grazie. –