![]() |
Fensterpositionen speichern?
Guten Morgen!
Wie kann man am einfachsten Fensterpositionen bei sehr vielen Formen speichern? Gruß Heike |
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 |
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.
|
Re: Fensterpositionen speichern?
Zitat:
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 |
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.
|
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 |
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.
|
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; |
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.
|
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 |
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:
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.
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; 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. |
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...
|
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:
|
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