AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Vollständige Sichtbarkeit eines Forms
Thema durchsuchen
Ansicht
Themen-Optionen

Vollständige Sichtbarkeit eines Forms

Ein Thema von taaktaak · begonnen am 4. Apr 2008 · letzter Beitrag vom 8. Sep 2009
Antwort Antwort
Seite 2 von 2     12   
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#11

Re: Vollständige Sichtbarkeit eines Forms

  Alt 9. Sep 2008, 19:37
Hi taaktaak,

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

Frederik
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#12

Re: Vollständige Sichtbarkeit eines Forms

  Alt 7. Sep 2009, 10:39
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
    ..
    ..
Ralph
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#13

Re: Vollständige Sichtbarkeit eines Forms

  Alt 8. Sep 2009, 00:01
Hi taaktakk,

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
Frederik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.056 Beiträge
 
Delphi 12 Athens
 
#14

Re: Vollständige Sichtbarkeit eines Forms

  Alt 8. Sep 2009, 10:13
vorallem das rausbekommen wäre für mich interessant,

obwohl mir da grad ein Gedankenblitz gekommen ist
- bei Beenden Form ausblenden (Hide), wiederherstellen (demaximieren ) und dann die Werte auslesen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#15

Re: Vollständige Sichtbarkeit eines Forms

  Alt 8. Sep 2009, 10:22
Hi Himitsu,

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 ) und dann die Werte auslesen.
Lol, ja das wäre auch ein Lösung. Nicht geeignet für Epileptiker

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
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 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