Announcement

Collapse
No announcement yet.

Fenstergröße abspeichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fenstergröße abspeichern

    Hallo,
    ich möchte meine Fenstergröße des Hauptprogrammes abspeichern, so daß beim nächsten Start das Programm in der gleichen Größe angezeigt wird. Das scheint aber bei einem Vollbild nicht zu stimmmen.
    Wer hat Erfahrungen damit, was daran nicht stimmen kann? Alles wird in einer Ini Datei abgespeichert.
    Hier die Programmteile:
    Speichern: WriteInteger('Screen','Left',fmMain.Left );
    WriteInteger('Screen','Top',fmMain.Top );
    WriteInteger('Screen','Height',fmMain.Height );
    WriteInteger('Screen','Width',fmMain.Width );
    Zurückladen:
    fmMain.Left := ReadInteger('Screen','Left',0 );
    fmMain.Top := ReadInteger('Screen','Top',0 );
    fmMain.Height := ReadInteger('Screen','Height',600 );
    fmMain.Width := ReadInteger('Screen','Width',800 );

    In der Ini Datei steht dann
    Left=-4 //warum nicht 0?
    Top=-4 //warum nicht 0?
    Height=742
    Width=1032
    Ich nutze XP und D5 Prof.

    Danke im Voraus.
    Zuletzt editiert von Zeras; 19.07.2008, 20:06.

  • #2
    Hallo M.,

    zunächst mal ein Tip. Die Klasse TIniFile eignet sich hervorragend um solche Daten zu speichern.

    ZUm anderen: Merk dir doch einfach noch den Zustand des Fensters. Hier aus der Hilfe dazu:

    type TWindowState = (wsNormal, wsMinimized, wsMaximized);

    Beschreibung

    TWindowState beschreibt den Status eines Formularfensters. Die folgende Tabelle führt die möglichen Werte auf:

    Wert Bedeutung

    wsNormal Das Formular besitzt seinen normalen Status (wedern minimiert noch maximiert).
    wsMinimized Das Formular ist minimiert.
    wsMaximized Das Formular ist maximiert.
    Ende Zitat aus der Delphi-Hilfe.

    Wenn du das Fenster über die Dimension in die Größe bringst, wie es ist, wenn es maximiert ist, ist das eh nicht derselbe Zustand. Darum ist es besser sich zusätzlich noch den Zustand zu merken und das Fenster wieder in diesen Zustand zu bringen.

    Gruß

    Wolfgan

    Comment


    • #3
      Hi Zeras,<BR><BR>
      das ganze ist etwas komplizierter. Ich hab dir mal meine Unit zusammengeschrumpft auf das Wesentliche. Damit speichere ich die Formulare abhängig von der Bildschirmauflösung und sorge dafür, dass sie immer im Bildschirm erscheinen. Ich nutze zwar die Registry zum Speichern, aber eine Abwandlung für ini's sollte nicht das Problem sein.
      <PRE>
      unit RWSysFunction;
      interface
      uses
      Forms, Classes, SysUtils, Registry, TypInfo
      {$IFOPT C+}
      ,Dialogs
      {$ENDIF}
      , Windows;
      function ApplicationName: string;
      function GetScreenResString: string;
      function GetStorePath: string;
      function GetFormStorePath(AForm : TCustomForm): string;
      procedure LoadFormState(AForm : TCustomForm);
      procedure SaveFormState(AForm : TCustomForm);
      procedure CheckFormPosition(AForm : TCustomForm);
      implementation
      Const
      keyWindowState = 'FormState';
      sTop = 'Top';
      sLeft = 'Left';
      sRight = 'Right';
      sBottom = 'Bottom';
      sPropStoreKey = 'Software\RwSoftWorks';
      function ApplicationName: string;
      begin
      Result := Application.Name;
      if Result = '' then
      Result := ChangeFileExt(ExtractFilename(Application.ExeName) , '');
      end;
      function GetScreenResString: string;
      begin
      Result := format('%dX%d',[screen.Width, Screen.Height]);
      end;
      function GetStorePath: string;
      begin
      Result := format('%s\%s',[sPropStoreKey,ApplicationName]);
      end;
      function GetFormStorePath(AForm : TCustomForm): string;
      begin
      Result := format('%s\%s',[GetStorePath, AForm.Name]);
      end;
      procedure LoadFormState(AForm : TCustomForm);
      var
      WP : TWindowPlacement;
      Reg : TRegIniFile;
      AWindowState : TWindowState;
      ASection : String;
      const
      Vis: array [Boolean] of Integer =
      (SW_HIDE, SW_SHOW);
      Metrics: array [bsSingle..bsSizeToolWin] of Word =
      (SM_CXBORDER, SM_CXFRAME, SM_CXDLGFRAME, SM_CXBORDER, SM_CXFRAME);
      begin
      ASection := GetScreenResString;
      AWindowState := AForm.WindowState;
      if (AForm.Parent <> nil) then exit;
      Reg := TRegIniFile.Create(KEY_READ);
      try
      try
      WP.Length := SizeOf(TWindowPlacement);
      GetWindowPlacement(AForm.Handle, @WP);
      WP.showCmd := Vis[AForm.Visible];
      Reg.RootKey := HKEY_CURRENT_USER;
      if Reg.OpenKey(GetFormStorePath(AForm), False) then
      begin
      if AForm.BorderStyle <> bsNone then
      begin
      WP.ptMaxPosition.X := -GetSystemMetrics(Metrics[AForm.BorderStyle]);
      WP.ptMaxPosition.Y := -GetSystemMetrics(Metrics[AForm.BorderStyle] + 1);
      end
      else
      WP.ptMaxPosition := Point(0, 0);
      with WP.rcNormalPosition do
      begin
      Top := Reg.ReadInteger(ASection, sTop, 0);
      Left := Reg.ReadInteger(ASection, sLeft, Left);
      Right := Reg.ReadInteger(ASection, sRight, Right);
      Bottom := Reg.ReadInteger(ASection, sBottom, Bottom);
      SetWindowPlacement(AForm.Handle, @WP);
      AWindowState := TWindowState(
      Reg.ReadInteger(ASection, keyWindowState, Integer(AWindowState)));
      if AWindowState <> wsMinimized then
      AForm.WindowState := AWindowState;
      end;
      end;
      except
      {$IFOPT C+}
      on E:Exception do
      ShowMessage(E.Message);
      {$ENDIF}
      end;
      finally
      FreeAndNil(Reg);
      end;
      CheckFormPosition(AForm);
      end;
      procedure SaveFormState(AForm : TCustomForm);
      var
      WP : TWindowPlacement;
      Reg : TRegIniFile;
      ASection : String;
      begin
      if (AForm.Parent <> nil) then exit;
      ASection := GetScreenResString;
      Reg := TRegIniFile.Create(KEY_ALL_ACCESS);
      try
      try
      Reg.RootKey := HKEY_CURRENT_USER;
      Reg.OpenKey(GetFormStorePath(AForm), True);
      with Reg do
      begin
      WriteInteger(ASection, keyWindowState, Integer(AForm.WindowState));
      GetWindowPlacement(AForm.Handle, @WP);
      with WP.rcNormalPosition do
      begin
      WriteInteger(ASection, sTop, Top);
      WriteInteger(ASection, sLeft, Left);
      WriteInteger(ASection, sRight, Right);
      WriteInteger(ASection, sBottom, Bottom);
      end;
      end;
      except
      {$IFOPT C+}
      on E:Exception do
      ShowMessage(E.Message);
      {$ENDIF}
      end;
      finally
      FreeANdNil(Reg);
      end
      end;
      procedure CheckFormPosition(AForm : TCustomForm);
      Const
      Metrics: array [bsSingle..bsSizeToolWin] of Word =
      (SM_CXBORDER, SM_CXFRAME, SM_CXDLGFRAME, SM_CXBORDER, SM_CXFRAME);
      Var
      ABorder : Integer;
      AMaxWidth : Integer;
      AMaxHeight : Integer;
      begin
      if AForm.WindowState = wsMaximized then
      ABorder := GetSystemMetrics(Metrics[AForm.BorderStyle])
      else
      ABorder := 0;
      AMaxWidth := GetSystemMetrics(SM_CXFULLSCREEN) + (2*ABorder);
      AMaxHeight := GetSystemMetrics(SM_CYFULLSCREEN) +
      GetSystemMetrics(SM_CYCAPTION) + (2*ABorder);
      // bei Maximized wird der Rahmen des Form's nicht angezeigt...
      with AForm do
      begin
      if (left < ABorder) then left := ABorder;
      if (top < ABorder) then Top := ABorder;
      if Width > AMaxWidth then
      Width := AMaxWidth;
      if Height > AMaxHeight then
      Height := AMaxHeight;
      if (Width + ABorder + Left) > AMaxWidth then
      Left := AMaxWidth - Width - ABorder;
      if (Height + ABorder + Top) > AMaxHeight then
      Top := AMaxHeight - Height - ABorder;
      end;
      end;
      end.
      </PRE>
      Im Form dann mit LoadFormState(self) bzw. SaveFormState(Self) ...<BR><BR>
      Gruß, Fran

      Comment


      • #4
        Hi Zeras,<br>wenn's etwas weniger sein darf, nimm die RX Tools, da gibt es eine Komponente "FormStorage", welche all das wegschreibt, wobei du INI oder Registry auswählen kannst :-

        Comment


        • #5
          Hallo Michael,<BR><BR>
          ..wenn's etwas weniger sein darf...<BR>
          die RX ist jetzt in Projekt JEDI, und wenn du das erst mal benutzt, kannst du mal die Unit' s zählen, die dann eingebunden werden. Wenn ich eine derart riesege Bibliothek nicht auch aus anderen Gründen ... eh schon nutze, würde ich mich nicht von dieser - nur wegen einem simplen FormStorage - abhängig machen. ;-)<BR><BR>
          Fran

          Comment


          • #6
            Hallo Leute,

            daß das so ein Problem sein könnte, habe ich nicht gedacht. Ich habe erst mal die erste Lösung eingebaut, zuerst Zustand Fenster merken und wenn nicht maximized, dann noch die Koordinaten und Größen merken. Das scheint zu gehen. Die andere Lösung von Frank werde ich mir aber mal genauer unter die Lupe nehmen. Wird wohl für zukünftige Projekte nutzbar sein.
            Vielen Dank.

            Matthia

            Comment


            • #7
              Hi Frank,<br>ich setze in D5 halt noch RX ein, wobei das "etwas weniger" auf die Anwendbarkeit bezogen war. Schon die RX hat "unzählbare" Bestandteile :-)<br>Da man sich halt im Laufe der Zeit so an einiges gewöhnt... RX ist bei mir "untrennbar" mit D5 verbunden <bg><br>Happy new year, cu Michae

              Comment

              Working...
              X