2012-03-07 4 views
5

Projekt, nad którym pracuję składa się z kilku 100 formularzy. Są one najczęściej wywoływane z formuły głównej. Nazwa aplikacji znajduje się we wszystkich formcaptions.Próbujesz złapać powstanie formularza

Teraz inna "wersja" aplikacji musi mieć podpisy formularza zmienione na inną nazwę aplikacji. Ale to jest warunkowe.

Co wymyśliłem było związanie

Screen.OnActiveFormChange := ScreenOnActiveFormChange; 

w formcreate i czyni procedurę tym.

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; 

Działa to dobrze w 95% przypadków. Ale w tych 5% forma jest pokazywana zbyt szybko. Okno zostanie narysowane przed aktualizacją napisu, a okna pozostaną tam. Ale podpis ma już nową wartość. Co pracowało remedium zwiększało się i zmniejszało wysokość formularza o 1 piksel, a następnie wyświetlało się poprawnie. form.repaint nie pomogło tutaj. To jest dość brzydki sposób robienia rzeczy.

Tym, czego naprawdę chcę, jest przechwycenie utworzenia podformularza zamiast aktywacji. Próbowałem znaleźć informacje na ten temat, ale nie udało mi się.

+13

Najlepszym sposobem, aby to zrobić jest, aby wszystkie formy wywodzą się ze wspólnej podstawy klasa. Następnie możesz kontrolować ustawienia wspólne dla wszystkich formularzy z jednego miejsca. –

+0

Po dalszych badaniach uważam, że jest to jakaś awaria robota wideo. Kiedy przeciągam okno, podpis nie zmienia się i pozostaje nie tak. Chyba że go przeciągnę, żeby zsunąć się z pulpitu. Kiedy przeciągnę to z powrotem, część, która nie została pokazana w dekstop, zmieni się na prawidłowy napis, podczas gdy część, która pozostała widoczna, pozostanie błędna. –

Odpowiedz

0

Czy próbowałeś używać okna api?

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

Edit: 1 więcej sugestia: Dodaj połączenie DrawMenuBar API zmusić przerysować paska menu okna

DrawMenuBar(Screen.ActiveForm.Handle); 
+0

Działa to dokładnie tak samo, jak kod, który napisałem, z tym samym problemem. –

+0

DrawMenuBar działa dobrze, dzięki. –