Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fensterpositionen speichern? (https://www.delphipraxis.net/95330-fensterpositionen-speichern.html)

smart 5. Jul 2007 09:26


Fensterpositionen speichern?
 
Guten Morgen!

Wie kann man am einfachsten Fensterpositionen bei sehr vielen Formen speichern?

Gruß
Heike

Luke_83 5. Jul 2007 09:31

Re: Fensterpositionen speichern?
 
Delphi-Quellcode:
Am einfachsten über die Variablen

Form1.Top    -> Abstand vom oberen Desktop Rand
Form1.Left   -> Abstand vom Linken Desktop Rand
Form1.Width  -> Breite der Fenster
Form1.Height -> Höhe der Fenster

Robert Marquardt 5. Jul 2007 09:41

Re: Fensterpositionen speichern?
 
Ich nehme mal an du willst die Position einer form abspeichern, so das sie an der gleichen Position erscheint wenn sie das naechste Mal wieder erstellt wird. Das nennt sich Persistenz von Daten. Die JVCL hat dazu geeignete Komponenten. Ich glaube das Beispiel JvAppStorage ist dafuer zustaendig. die Daten werden wahlweise in die Registry, ein INI-File oder ein XML File gespeichert.

smart 5. Jul 2007 09:44

Re: Fensterpositionen speichern?
 
Zitat:

Zitat von Luke_83
Delphi-Quellcode:
Am einfachsten über die Variablen

Form1.Top    -> Abstand vom oberen Desktop Rand
Form1.Left   -> Abstand vom Linken Desktop Rand
Form1.Width  -> Breite der Fenster
Form1.Height -> Höhe der Fenster

Hi.

Das ist Klar. Ich hatte mich bestimmt unklar ausgedrückt. Ich erzeuge dynamisch viele Formen. (Form1 .. Form20...) Die genaue Anzahl ist unbestimmt. Jetzt möchte ich die Position der Formen speichern. Jetzt ist es sehr umständlich z. B. 20 mal Form1.Top usw. zu coden. Vorallen wenn man das Ende nicht kennt.

Gruß
Heike

Luckie 5. Jul 2007 09:49

Re: Fensterpositionen speichern?
 
Du wirst deine Fenster ja irgendwie verwalten müssen in einem Array oder einer Liste. Diese Verwaltungsstruktur kannst du ja durchgehen. Oder du leitest deine Formulare von einem eignen Fomrluar ab, welches du schon um die gewünschten Eigenschaften und Methoden erweitert hast.

RavenIV 5. Jul 2007 09:52

Re: Fensterpositionen speichern?
 
Bei der RxLibrary sind zwei Komponenten dabei, die das unterstützen.
Beide speichern die Werte in einem ini-File oder in der Registry

TFormPlacement
- Kann die Grösse und Position des Forms speichern

TFormStorage
- Kann die Grösse und Position des Forms speichern
- Kann die Properties der anderen Komponenten auf dem Form speichern

Muetze1 5. Jul 2007 10:15

Re: Fensterpositionen speichern?
 
Ansonsten schau die mal die Eigenschaften des Screen Objektes an. Wenn du die Formulare erstellst, dann sollte Screen.FormCount und Screen.Forms[] diese mit aufführen. Darüber kannst du iterieren und im Zusammenhang mit dem Namen/ClassName die Positionen speichern und wiederherstellen.

Luke_83 5. Jul 2007 10:20

Re: Fensterpositionen speichern?
 
Delphi-Quellcode:

Hallo hab mal folgenden Code geschrieben. Vielleicht hilft er dir ja ein wenig weiter.


procedure TForm1.Forms_spichern;
var Formen:TForm;
    i:Integer;
    F:TextFile;
    Temp:String;
    Max_Forms:Integer;
begin

Max_Forms:=4; //Anzahl der Formen
AssignFile(F,'C:\Forms.txt');
ReWrite(F);

 For i:=1 to Max_Forms do Begin
    Formen:= TForm ( FindComponent ('Form'+InttoStr(i) ));

    Temp:=Inttostr(Formen.Top);   Writeln(F,Temp);
    Temp:=Inttostr(Formen.Left);  Writeln(F,Temp);
    Temp:=Inttostr(Formen.Top);   Writeln(F,Temp);
    Temp:=Inttostr(Formen.Height); Writeln(F,Temp);

  End;
  CloseFile(F);
end;

Muetze1 5. Jul 2007 10:26

Re: Fensterpositionen speichern?
 
FindComponent() findet immer nur Unterelemente des Elementes, dessen FindComponent() aufgerufen wird. Da ich aber kein Element kenne, welches Formulare als Unterkomponenten hat, wüsste ich auch nicht, wie FindComponent() Formulare finden könnte/sollte.

hoika 5. Jul 2007 10:28

Re: Fensterpositionen speichern?
 
Hallo,

ich leite alle meine Forms von einem Basis-Form ab,
dort wird im OnClose die Position gespeichert (bei ModalResult mrOK)
und im FormCreate geladen.

Wie du Formulare ableitest, steht im Handbuch.
Bei deinen "alten" musst du wie folgt vorgehen

- dfm öffnen (nicht die pas)
ich geh davon aus, dass die dfm im TextFormat vorliegt,
sonst halt ändern
- object in inherited ändern
- speichern, Datei schliessen
- pas öffnen
- uses "unit das Basis-Forms"
- TForm1 = class(TForm) ändern in
TForm1 = class(TBaseForm)
- in FormCreate als 1. Zeile ein inherited
- bei OnClose-Benutzung im jeweiligen Form muss auch noch ein inherited rein

Die Benutzung eines Basisforms hat auch noch andere Vorteile,
z.B. Vista-spezifische Sachen einbauen (siehe die letzten Entwickler-Zeitungen),
bestimmte wiederverwendbare Routinen reinpacken usw.

Heiko

Hansa 5. Jul 2007 11:56

Re: Fensterpositionen speichern?
 
Wenn man die genannten (IMHO unnötig komplizierten) Ansätze mit dem letzten von hoika kombiniert, dann kommt so was dabei raus :

Delphi-Quellcode:
procedure Tfrm.FormShow(Sender: TObject);
var FensterIni : TIniFile;
begin
  inherited;
  try
    FensterIni := TIniFile.Create(FensterDateiName);
    Left  := FensterIni.ReadInteger(Name,'Left',Left);
    Top   := FensterIni.ReadInteger(Name,'Top',Top);
  finally
    FensterIni.Free;
  end;
end;

procedure Tfrm.FormClose(Sender: TObject;
  var Action: TCloseAction);
var FensterIni : TIniFile;
begin
  inherited;
  try
    FensterIni := TIniFile.Create(FensterDateiName);
    if not CDstart then begin // auf CD kann nicht gespeichert werden !
      FensterIni.WriteInteger(Name,'Left',Left);
      FensterIni.WriteInteger(Name,'Top',Top);
    end;
  finally
    FensterIni.Free;
  end;
  Action := caFree;
end;
Der Benutzer verschiebt die Forms nach Lust und Laune und die letzten Koordinaten werden immer im OnClose abgespeichert. Er wird sie also wieder genau dort auffinden, wo er sie hingeschoben hat. Um die paar Zeilen nun aber nicht jedesmal neu schreiben zu müssen schiebt man eine Basisform am Besten in die Objektablage und benutzt da dann bei new -> Forms -> Others "inherited". Das ist in etwa das, was hoika von Hand unnötig simuliert.

Edit : sehe gerade, die umständliche "hoika-Methode" :lol: bezieht sich auf alte Forms. Da muss mans wohl so umständlich machen. Besser ist, alles was gewisse Forms betrifft direkt in ein Basis-Form zu packen. Bei mir ist da alles drin. Auch Tastatur-Routinen etc.

Muetze1 5. Jul 2007 12:20

Re: Fensterpositionen speichern?
 
Dein Quellcode ist unsauber. Verschiebe den Konstruktoraufruf vor das jeweilige Try. Bei einer Exception im Constructor würde Free auf die (nicht initialisierte, lokale) Instanzenvariable zugreifen und versuchen diese freizugeben - und das kracht dann. Wenn du das Create ausserhalb von Try/finally hast, dann hast du im Try/finally Block immer eine gültige Instanz (die er auch freigeben kann) und wenn der Konstruktuer eine Exception wirft, dann gibt er die nicht erstellte Instanz auch nicht frei...

Hansa 5. Jul 2007 12:45

Re: Fensterpositionen speichern?
 
Mütze, mach das Thema jetzt nicht zu sehr OT. :mrgreen: Krachen tut mal nichts. Allerdings wurde das tatsächlich verkehrt aus der Delphi-Hilfe abgekupfert. @Fragesteller : die Antwort auf die Frage steht tatsächlich fast identisch in der Delphi-Hilfe zu TIniFile. :shock:

hoika 5. Jul 2007 14:00

Re: Fensterpositionen speichern?
 
Hallo Hansa,

jepp umständlich, aber anderes geht es bei "alten" Forms nicht.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:56 Uhr.

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