Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Gespeicherter windowState (wsMaximized) maximiert nicht (https://www.delphipraxis.net/147455-gespeicherter-windowstate-wsmaximized-maximiert-nicht.html)

DelphiBandit 9. Feb 2010 08:56


Gespeicherter windowState (wsMaximized) maximiert nicht
 
Hallo zusammen,

vorweg habe ich die Suchfunktion genutzt, aber für mein spezielles Problem keinen Ansatz gefunden. In meiner Anwendung werden die Fensterpositionen und deren Window-States gespeichert. Dieser Zustand der Fenster soll nach dem Neustart wieder hergestellt werden. So weit, so gut - dies Thema kam auch reichlich vor.

Unter Delphi 5 hat das bisher auch einwandfrei funktioniert, seit die IDE auf RS2007 upgedated wurde, allerdings nicht mehr :(

Ich versuche den Ist-Zustand mal zu beschreiben. Im FormCreate (abgeleitet) wird der WindowState auf wsMaximized gesetzt. Allerdings maximiert sich das Fenster nicht, sondern erscheint Top=0 und Left=0 mit der Breite und Weite der gespeicherten Werte für den Normalzustand. Schaltet man danach mit der Maus auf wsNormal um, verschiebt sich das Fenster an die korrekte Position mit den gespeicherten Werten, also auch Left und Top werden verarbeitet. Anschliessendes Maximieren per Maus und das Fenster ist dann jetzt auf voller Bildschirmgrösse. So als kümmere sich das Fenster im ersten Fall nur bedingt um das wsMaximized.

Um bei maximierten Zustand auf die "Normal"-Grösse zuzugreifen wird das Fenster vor dem Speichern auf wsNormal umgeschaltet, bevor es geschlossen wird. Die Werte kommen auch einwandfrei in der Datenbank an, werden korrekt ausgelesen und abgespeichert (Debugger / IBExpert).

Hat einer von Euch eine Idee dazu, warum das auf einmal nicht mehr funktioniert?

Nachtrag 1:
Habe da eben noch einen englischen Thread dazu gefunden und probiere den "Hack" im OnActivate mal aus:
http://www.delphigroups.info/2/6/325133.html

Nachtrag 2: Nein, geht leider auch nicht. Das Hauptformular kümmert sich nicht um wsMaximized :(

Gruss
Carsten

Delphi-Quellcode:
    if not EOF then
      begin // schon mal gespeichert
        xForm.Top := FieldByName('WinTop').AsInteger;
        xForm.Left := FieldByName('WinLeft').AsInteger;
        Application.ProcessMessages;
        (*
         * Falls durch Auflösungswechsel das Fenster
         * aus dem Blickfeld geraten ist, wieder in den sichtbaren
         * Bereich ziehen
         *)
        if xForm.Top > Screen.Height then
          xForm.Top := 0;
        if xForm.Left > Screen.Width then
          xForm.Left := 0;
        (*
           Nur bei Fenstern, deren Größe änderbar ist,
           darf die Größe geändert werden!
        *)
        if xForm.BorderStyle in [bsSizeable, bsSizeToolWin] then
        begin
          xForm.Height := FieldByName('WinHeight').AsInteger;
          xForm.Width := FieldByName('WinWidth').AsInteger;
        end;
        cWinState := FieldByName('WinStatus').AsString[1];
        case cWinState of
          'N': xForm.WindowState := wsNormal;
          'X': xForm.WindowState := wsMaximized;
          'M': xForm.WindowState := wsMinimized;
        end;
      end;
      Close;

eholzer 9. Feb 2010 11:35

Re: Gespeicherter windowState (wsMaximized) maximiert nicht
 
Ich habe viele Komponenten geprüft, aber einzige die es richtig macht ist hier http://www.delphidabbler.com/software/wdwstate

Eric

DelphiBandit 9. Feb 2010 14:44

Re: Gespeicherter windowState (wsMaximized) maximiert nicht
 
Hallo Eric,

vielen Dank für den Tipp mit der Komponente. Habe diese im "TSavePosForm" im OnCreate dynamisch erzeugt, da ich sie nicht für alle xx-Formulare visuell einfügen wollte. Das hat leider nicht funktioniert, da sie sich genau dort wohl auch einklinken will um ihre Save/Restore Aktionen durchzuführen.

Ich habe nach einem rumprobieren jetzt doch einen Weg gefunden, im Prinzip geht er in die Richtung des o.a. englischen Links. Ich merke mir im OnCreate den WindowState und arbeite ihn im OnActivate einmalig ab. Mein Fehler bei meinen ersten Versuchen damit war nur, dass das Fenster nicht mehr reagiert, wenn man wsMaximized vorher schon einmal im OnCreate zugewiesen hat. Dann reagiert das Fenster auf nichts mehr (OnActivate oder Testbutton zum Maximieren). Unterlässt man die Zuweisung, dann klappt das Maximieren im OnActivate anschliessend.

Und wenn meine Recherchen richtig waren, dann kommt das Problem wohl eher selten vor und auch nur, wenn viele Komponenten / Align / Splitter usw. sich in die Quere kommen und das Formular mit seinen Aktionen nicht fertig wird.

Bei dieser Gelegenheit habe ich auch gleich GetWindowPlacement(xForm.Handle, PosAndSize) eingebaut, damit kommt man jetzt auch an die Werte im maximierten Modus heran, ohne das Fenster verkleinern zu müssen.

Thread kann somit auf erledigt, Gruss Carsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz