Re: Vollständige Sichtbarkeit eines Forms
Hi taaktaak,
Zitat:
Gruß Assertor :cheers: |
Re: Vollständige Sichtbarkeit eines Forms
Von RWarnecke wurde in meinem aktuellen Projekt "rzDelphiGuide" ein Fehler entdeckt, der von der Prozedur FitFormFullInView() produziert wird. Für alle Interessierten hier die kleine aber wichtige Korrektur:
Position/Größe dürfen nicht korrigiert werden, wenn das Formular maximiert dargestellt wird. Der Anfang der Prozedur ist daher wie folgt zu ändern:
Delphi-Quellcode:
procedure FitFormFullInView(AForm: TCustomForm);
var MonNo, MonL, MonW, MonT, MonH: Integer; begin if (AForm.WindowState<>wsMaximized) and not (FormFullInView(AForm)) then begin .. .. |
Re: Vollständige Sichtbarkeit eines Forms
Hi taaktakk,
Zitat:
Vorteil: Wenn der Benutzer die Anwendung maximiert startet, kann er trotzdem zur vorherigen Größe zurückkehren. Und diese vorherige Größe ist dann per FitFormFullInView an die aktuellen Gegebenheiten der Bildschirme angepasst. Zusätzlich hatte ich noch ein paar Funktionen für das Speichern der tatsächlichen "normalen Größe" trotz maximiertem Fenster geschrieben und mit einer AutoSize garniert, so daß ein Erststart der Anwendungen zu einem Fenster von 80% Größe (bzw. bliebig) auf dem Primärmonitor führt. Bei Interesse kann ich die Codeschnipsel hier posten. Gruß Assertor |
Re: Vollständige Sichtbarkeit eines Forms
vorallem das rausbekommen wäre für mich interessant,
obwohl mir da grad ein Gedankenblitz gekommen ist - bei Beenden Form ausblenden (Hide), wiederherstellen (demaximieren :lol: ) und dann die Werte auslesen. |
Re: Vollständige Sichtbarkeit eines Forms
Hi Himitsu,
Zitat:
Hier aus meinem Nähkästchen:
Delphi-Quellcode:
Ist so aus einer meiner Units und wird so nicht kompilieren, aber die Idee sollte rüberkommen: TWindowPlacement.rcNormalPosition ist die einfachste Lösung dafür.
procedure SaveWindowState(AConfigFile: TXMLConfig;
AForm: TForm; const Section: UnicodeString; const AllowMinimize: Boolean = False; const AdjustNonClientHeight: Integer = 0); var p: TWindowPlacement; r: TRect; begin Assert(AConfigFile <> nil); Assert(AForm <> nil); with AConfigFile do begin if (AForm.WindowState <> wsMinimized) or (AllowMinimize) then begin { calculate window's normal size and position using Windows API call - the form's Width, Height, Top and Left properties will give maximized window size if form is maximized, which is not what we want here. AdjustNonClientHeight is used to support libraries like DevExpress Ribbon components which adjust the form size after loading to support drawing in glass/nonclient area under Vista. } p.length := SizeOf(TWindowPlacement); if not (GetWindowPlacement(AForm.Handle, @p)) then begin AppLog.Log(evtError, {$IFDEF UNICODE}Format{$ELSE}UnicodeFormat{$ENDIF}( SWindowPositionGetError, [SysErrorMessage(GetLastError)])); end else begin r := p.rcNormalPosition; WriteInteger(Section, 'Left', r.Left); WriteInteger(Section, 'Top', r.Top); WriteInteger(Section, 'Width', r.Right - r.Left); if AdjustNonClientHeight = 0 then WriteInteger(Section, 'Height', r.Bottom - r.Top) else WriteInteger(Section, 'Height', r.Bottom - r.Top + AdjustNonClientHeight); end; end; case AForm.WindowState of wsMinimized: if AllowMinimize then WriteString(Section, 'WindowState', 'Minimized'); wsMaximized: WriteString(Section, 'WindowState', 'Maximized'); else WriteString(Section, 'WindowState', 'Normal'); // wsNormal end; end; end; Beim Laden dann umgekehrt:
Delphi-Quellcode:
Gruß Assertor
[Pseudocode]
// try to load saved window positions (even if maximized to preserve size) if ValueExists(Section, 'Left') or ValueExists(Section, 'Top') or ValueExists(Section, 'Width') or ValueExists(Section, 'Height') then begin // all values or at least one of them x1 := ReadInteger(Section, 'Left', AForm.Left); y1 := ReadInteger(Section, 'Top', AForm.Top); x2 := ReadInteger(Section, 'Width', AForm.Width); y2 := ReadInteger(Section, 'Height', AForm.Height); // do the positions differ from current position? if (x1 <> AForm.Left) or (x2 <> AForm.Width) or (y1 <> AForm.Top) or (y2 <> AForm.Height) then begin AForm.SetBounds(x1, y1, x2, y2); end; end else begin // center form (with default size e.g. 80%) if values are not found CenterFormToMonitor(AForm); end; // always check if the current form fits into monitor/desktop area FitFormFullInView(AForm); // load window state // Setzte AForm.WindowState auf wsMaximized, wsNormal // (oder wsMinimized wenn wir das erlauben wollen) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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