Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#8

AW: Positionierung einer Form in Multimonitorumgebung

  Alt 8. Nov 2015, 13:25
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
  Mit Zitat antworten Zitat