AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular Position speichern

Ein Thema von Sugar · begonnen am 28. Jul 2015 · letzter Beitrag vom 29. Jul 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.375 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Formular Position speichern

  Alt 29. Jul 2015, 08:31
Nimm doch einfach die Jedi-Komponente TJvFormStorage (Zu finden in der Gruppe JV Persistence).
Oder musst du das zwingend in der Datenbank speichern?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Formular Position speichern

  Alt 29. Jul 2015, 10:13
Also, ich weiß ja nicht, was ihr hier für Klimmzüge veranstaltet. 500 Zeilen Code?

Delphi-Quellcode:
unit Unit6;

interface

uses
  Windows, SysUtils, IniFiles;

type
  TFoobar = class(TObject)
  private
    FFormName: AnsiString;
    FLeft: Integer;
    FTop: Integer;
    FWidth: Integer;
    FHeight: Integer;
  public
    constructor Create(FormName: AnsiString; Left, Top, Width, Height: Integer);
    procedure SaveSizePos;
end;

implementation

{ TFoobar }

constructor TFoobar.Create(FormName: AnsiString; Left, Top, Width, Height: Integer);
begin
  inherited Create;
  FFormName := FormName;
  Fleft := Left;
  FTop := Top;
  FWidth := Width;
  FHeight := Height;
end;

procedure TFoobar.SaveSizePos;
var
  Ini: TIniFile;
begin
  Ini := TIniFile.Create('Z:\test.ini');
  try
    Ini.WriteInteger(FFormName, 'left', Fleft);
    Ini.WriteInteger(FFormName, 'top', FTop);
    Ini.WriteInteger(FFormName, 'width', FWidth);
    Ini.WriteInteger(FFormName, 'height', FHeight);
  finally
    Ini.Free;
  end;
end;

end.
Die Routine zum laden habe ich mir mal gespart. In OnClose der Formulare dann:

Delphi-Quellcode:
procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);
var
  SizePos: TFoobar;
begin
  SizePos := TFoobar.Create(Self.Name, Self.Left, Self.Top, Self.Width, Self.Height);
  try
    SizePos.SaveSizePos;
  finally
    SizePos.Free;
  end;
end;
Sieht dann so aus:
Code:
[Form5]
left=98
top=327
width=349
height=280
[Form1]
left=879
top=206
width=651
height=338
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
737 Beiträge
 
Delphi 12 Athens
 
#3

AW: Formular Position speichern

  Alt 29. Jul 2015, 10:26
So wie ich den OP verstanden habe, geht es nicht darum, dass ein Form seine eigene Position speichern und lesen kann, sondern es liegt in einer DB eine Liste von Formnamen mit zugehörigen Positionen vor und nur diese Forms sollen erzeugt und angezeigt werden.

Man braucht also eine irgendwie geartete Zuordnung FormName -> FormKlasse um eine Instanz der entsprechenden Klasse zu erzeugen. Vorschläge dazu wurden in #8 und #10 gemacht.

Wenn die Form dann erst einmal erzeugt ist, kann sie sich die Position ja wieder selbst aus der DB oder sonst woher auslesen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Formular Position speichern

  Alt 29. Jul 2015, 10:38
Die Anzahl der Zeilen ist doch nicht entscheidend (auch wenn einige hier im Forum das meinen), solange es DRY ist und die geforderte Aufgabe löst.

Wird die Aufgabe damit nicht gelöst, dann ist auch eine Zeile Code schon zu viel.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Formular Position speichern

  Alt 29. Jul 2015, 10:41
Ok, es sollen also automatisch die Formulare geöffnet werden, die beim letzten mal geöffnet waren?

Beim Start der Anwendung:
wenn in Ini Section FormA existiert, dann FormA.Show
wenn in Ini Section FormB existiert, dann FormB.Show

@Sir Rufo: Das mag sein. Aber ich küsse lieber. -> KISS Prinzip. Und damit ich mich nicht wiederhole, habe ich den Code in eine Klasse ausgelagert.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie (29. Jul 2015 um 10:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.314 Beiträge
 
Delphi 12 Athens
 
#6

AW: Formular Position speichern

  Alt 29. Jul 2015, 10:36
@Luckie:

Wie ich es sehe, geht es Ihm nicht primär darum, die Position zu lesen und zu speichern. Vielmehr speichert er beim Verlassen des Programms die Positionen UND den Namen der Fenster. Anhand des Namen soll nun beim Starten die entsprechenden Forms instanziert werden, um alle Fenster, die er vor beenden des Programms offen hatte, wieder zu öffnen.

EDIT: da war bcvs wohl schneller.
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de

Geändert von bernau (29. Jul 2015 um 10:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.314 Beiträge
 
Delphi 12 Athens
 
#7

AW: Formular Position speichern

  Alt 29. Jul 2015, 10:43
@Sugar: Schaum mal hier. Beitrag #6

http://www.delphipraxis.net/46874-an...ten-forms.html
Gerd
Kölner Delphi Usergroup: http://wiki.delphitreff.de
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Formular Position speichern

  Alt 29. Jul 2015, 12:49
Bei mir hat sich folgende Vorgehensweise bestens bewährt:

In meinen Datenbanken gibt es gewöhnlich eine Tabelle BENUTZER, die für Single-User-Anwendungen nur einen Datensatz enthält, bei Multi-User-Anwendungen für jeden registrierten Benutzer einen weiteren Datensatz. Dort steht dann z.B. in den Spalten MAIN_LEFT, MAIN_TOP, MAIN_WIDTH, MAIN_HEIGHT, MAIN_MAX, wo das Fenster mit welcher Größe positioniert werden und ob es maximiert angezeigt werden soll. Jedes Formular, dessen Fensterparameter gespeichert werden sollen, erhält zwei private Methoden: Einstellungen_Lesen und Einstellungen_Speichern, die beim OnShow bzw. beim OnClose aufgerufen werden. Darin steht dann folgender Code:

Delphi-Quellcode:
Procedure TFormMain.Einstellungen_Lesen;
begin
  Self.Left := DatMod.Qset_Benutzer.FieldByName('MAIN_LEFT').AsInteger;
  Self.Top := DatMod.Qset_Benutzer.FieldByName('MAIN_TOP').AsInteger;
  Self.Width := DatMod.Qset_Benutzer.FieldByName('MAIN_WIDTH').AsInteger;
  Self.Height := DatMod.Qset_Benutzer.FieldByName('MAIN_HEIGHT').AsInteger;
  IF DatMod.Qset_Benutzer.FieldByName('MAIN_MAX').AsBoolean THEN
     Self.WindowState := wsMaximized ELSE
     Self.WindowState := wsNormal;
end;

Procedure TFormMain.Einstellungen_Speichern;
Var
  Maxi : Boolean;

begin
  Maxi := Self.WindowState = wsMaximized;
  Self.WindowState := wsNormal;

  DatMod.Qset_Benutzer.Edit;
  DatMod.Qset_Benutzer.FieldByName('MAIN_LEFT').AsInteger := Self.Left;
  DatMod.Qset_Benutzer.FieldByName('MAIN_TOP').AsInteger := Self.Top;
  DatMod.Qset_Benutzer.FieldByName('MAIN_WIDTH').AsInteger := Self.Width;
  DatMod.Qset_Benutzer.FieldByName('MAIN_HEIGHT').AsInteger := Self.Height;
  DatMod.Qset_Benutzer.FieldByName('MAIN_MAX').AsBoolean := Maxi;
  DatMod.Qset_Benutzer.Post;
end;
Eine Kennzeichnung der Spalten für die verschiedenen Formulare benötigst du im Grunde nur deswwegen, damit du dich selbst nicht unnötig in Verwirrung stürzt. Dafür kannst du ja den Namen des Formulars verwenden, gefolgt von einem Unterstrich und den jeweiligen Bezeichnungen für Left, Top usw. Jedes Formular richtet sich dann beim Erscheinen vollkommen selbständig aus und speichert seine Parameter beim Schließen ebenso automatisch, so daß du dich nicht weiter darum kümmern mußt. Diese Methoden mußt du nur einmal schreiben und kannst sie dann einfach in das neue Formular kopieren, wobei du natürlich die Spaltenbezeichner anpassen mußt. Wenn du das eine Weile so gehandhabt hast, machst du das praktisch im Schlaf und hast das sozusagen in Nullkommanix erledigt.

Eine weitere Tabelle verwende ich z.B. für Spaltenbreiten von Grids, die ebenfalls für jeden Benutzer gesondert abgespeichert werden. Sonstige Einstellungen wie Farben usw. werden ebenfalls in der Benutzertabelle gespeichert, die bei umfangreichen Anwendungen auch mal um die 100 Spalten beherbergt.

Diese Vorgehensweise hat sich im Laufe der Jahre so weit entwickelt, daß ich damit vollkommen zufrieden bin und mich weder um Registry-Einträge noch um User-Verzeichnisse kümmern muß.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.166 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Formular Position speichern

  Alt 29. Jul 2015, 13:04
Es Fehlt dann nur noch die Überprüfung ob der Monitor noch existiert...

Besonders Interessant, wenn der User per Datensicherung die Daten auf einen anderen PC/Laptop übertragen will...

Sollten die Daten 1. Computernamen bezogen gespeichert werden und bei laden getestet werden ob es die Top/Left Positions auf dem aktuellen Computer gibt...

Mavarik
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

AW: Formular Position speichern

  Alt 29. Jul 2015, 13:10
Sollten die Daten 1. Computernamen bezogen gespeichert werden und bei laden getestet werden ob es die Top/Left Positions auf dem aktuellen Computer gibt...
Eine vortreffliche Ergänzung, die mir bislang nicht in den Sinn gekommen ist. Dafür danke ich dir herzlich

In der Tat hatte ich gelegentlich Rückfragen von Kunden zu bearbeiten, die sich darüber beschwerten, daß ein Formular, das sie zur Anzeige gewählt hatten, nicht sichtbar sei. Ich habe dann natürlich jedesmal erklärt, daß das Formular nur deshalb nicht zu sehen sei, weil es sich außerhalb des Bildschirms befände und anschließend erläutert, wie man dieses Formular via Tastatur wieder in den sichtbaren Bereich herüberziehen kann. Diese Problematik hat sich mit deiner Hilfe nun endgültig erledigt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:03 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