Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Vollständige Sichtbarkeit eines Forms (https://www.delphipraxis.net/111533-vollstaendige-sichtbarkeit-eines-forms.html)

Assertor 9. Sep 2008 18:37

Re: Vollständige Sichtbarkeit eines Forms
 
Hi taaktaak,

Zitat:

Zitat von taaktaak
Moin, Moin.
... weil ich sonst gar nicht mitbekommen hätte, dass Assertor meinen Code verbessert hast. Prima!

Bitte gerne! Du hast mir mit Deiner Vorlage ja auch geholfen - und das nicht das erste mal soweit ich mich erinnere.

Gruß Assertor

:cheers:

taaktaak 7. Sep 2009 09:39

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
    ..
    ..

Assertor 7. Sep 2009 23:01

Re: Vollständige Sichtbarkeit eines Forms
 
Hi taaktakk,

Zitat:

Zitat von taaktaak
Für alle Interessierten hier die kleine aber wichtige Korrektur:

Position/Größe dürfen nicht korrigiert werden, wenn das Formular maximiert dargestellt wird.

Jein, ich nutze unsere ;) Prozeduren etwas anders, d.h. ich lade immer die zuvor gespeicherte Position und Maximiere oder Normalisiere dann das Fenster.

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

himitsu 8. Sep 2009 09:13

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.

Assertor 8. Sep 2009 09:22

Re: Vollständige Sichtbarkeit eines Forms
 
Hi Himitsu,

Zitat:

Zitat von himitsu
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.

Lol, ja das wäre auch ein Lösung. Nicht geeignet für Epileptiker :mrgreen:

Hier aus meinem Nähkästchen:
Delphi-Quellcode:
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;
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.

Beim Laden dann umgekehrt:
Delphi-Quellcode:
[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)
Gruß Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 Uhr.
Seite 2 von 2     12   

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