Ich wollte eigentlich auf etwas anderes hinaus: Wenn ich mich an ein Event (OnActivate, OnShow) hänge, das von außen gesetzt werden kann - entweder im Objektinspektor oder im Code - wird der Code zur Plazierung des Forms nicht ausgeführt, und zwar ohne, dass es eine Warnung gibt oder sonstwas.
Daher habe ich etwas tiefer gegraben und bin fündig geworden:
Delphi-Quellcode:
TTotalCmdWfxForm =
class(TForm)
private
{ Handle to TC's main window }
FhTotalCmd : HWND;
{ Has this form been centered on the active screen? }
FCentered : Boolean;
function GetMonitorOfParent(
const AParent: HWND = 0): TMonitor;
procedure CenterOnMonitor(
const AMonitor: TMonitor;
procedure CMShowingChanged(
var Message: TMessage);
message CM_SHOWINGCHANGED;
end;
procedure TTotalCmdWfxForm.CMShowingChanged(
var Message: TMessage);
var Lmon: TMonitor;
begin
inherited;
if Self.Showing
then begin
if NOT FCentered
then begin
if (Screen.MonitorCount > 1)
then begin
Lmon:= GetMonitorOfParent(FhTotalCmd);
CenterOnMonitor(Lmon);
end;
FCentered:= True;
end;
end;
end;
Anscheinend ist es so (ausgehend von gezielt gesetzten Breakpoints auf das
inherited;
und die nachfolgende Zeile), dass die Nachricht einerseits zum richtigen Zeitpunkt und andererseits selten genug gesendet wird, so dass es nicht stört.
Offenbar ist es auf diese Weise möglich, in der Basisklasse privat deklarierte Messages zu überschreiben.
Sofern es keine (begründeten) Einwände gegen diese Variante gibt, werde ich es dabei belassen. Danke auf jeden Fall an alle Beteiligten!
MfG Dalai