Solche Problematiken löse ich bei mir mit einem Event, der nach dem Anzeigen des Fensters ausgelöst wird.
Das ganze sieht dann ungefähr wie folgt aus:
Delphi-Quellcode:
Const
UM_AFTERSHOW = WM_USER + 1000;
TMyForm =
class(TForm)
private
FOnAfterShow : TNotifyEvent;
// Event für Funktionen, die _nach_ dem Anzeigen des Fensters passieren sollen
procedure CMShowingChanged(
var Message: TMessage);
message CM_SHOWINGCHANGED;
procedure UMAfterShow(
var message: TMessage);
message UM_AFTERSHOW;
published
property OnAfterShow : TNotifyEvent
read FOnAfterShow
write FOnAfterShow;
end;
implementation
//----------------------------------------------------------------------------------------------------------------------
// Änderung des Anzeigemodus eines Fensters
//----------------------------------------------------------------------------------------------------------------------
procedure TMyForm.CMShowingChanged(
var Message: TMessage);
begin
inherited;
Application.ProcessMessages();
PostMessage(
Handle,UM_AFTERSHOW,0,0);
end;
//----------------------------------------------------------------------------------------------------------------------
// Message AfterShow erhalten
//----------------------------------------------------------------------------------------------------------------------
procedure TMyForm.UMAfterShow(
var message: TMessage);
begin
if Assigned(FOnAfterShow)
then FOnAfterShow(Self);
end;
Alternativ kann man natürlich die Message direkt in der TForm schicken (dann eben mittels Postmessage am Ende vom OnShow-Event) ,
meine Fenster sind aber alle von meiner privaten Fensterklasse abgeleitet, so dass ich nach Belieben im Designer den Eventhandler zuweisen kann und die gewünschte Funktionalität immer zu Verfügung habe.
Bei OnActivate muss natürlich darauf geachtet werden, dass ein Fenster auch öfters aktiviert werden kann (z.B. wenn zwischendurch ein anderes Fenster aktiviert wurde).