AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Mit savetoFile/loadfromFile Daten ins Formular bringen
Thema durchsuchen
Ansicht
Themen-Optionen

Mit savetoFile/loadfromFile Daten ins Formular bringen

Ein Thema von EdAdvokat · begonnen am 25. Nov 2018 · letzter Beitrag vom 27. Nov 2018
Antwort Antwort
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#1

AW: Mit savetoFile/loadfromFile Daten ins Formular bringen

  Alt 25. Nov 2018, 15:49
Hmm..

Ob nun StringList oder die ObjectList ist egal...

Deine Logic funktioniert noch nicht..

z.B.:
( Ausgehend von nur der einen Form )

- Application wird gestartet
- Form.OnShow
-> Daten werden geladen
-> Erster Datensatz wird angezeigt (Index[0]), wenn vorhanden
- Neuer Datensatz anlegen
-> Daten eingeben
-> Fertig (Button Speichern), dann neues TName erzeugen und der Liste anhängen
-> (Eventuell speichern, aber kann auch erst beim Schließen der Form gemacht werden)
- NAVIGATION
Hier brauchst Du 2 Buttons, zum Vor und Zurückgehen durch die Liste
-> Entsprechend des neuen Index den entsprechenden Eintrag (Index[x]) anzeigen
- Form.OnCLose
-> Liste speichern (wenn nicht vorher bei Button Speichern passiert ist)

Es wird also nicht immer wieder geladen!

(Irgendwie habe ich ein Dejavu, war so etwas nicht auch bei den Vocabeln.. )

Also, erstmal eine Logic/Stuktur erstellen, dann für die einzelnen Punkte den Source schreiben, am Besten auch in jeweis separaten procedure/functionen....

Apropo:
Verwende KEINE 'globalen' Variablen, wenn diese nicht (über mehrere Forms) als Globales verwendet werden müssen.
Im hiesigen Fall kann die ObjectList als Variable unter private mit z.B. dem Namen FDataList : TObjectlist.

Auch das var Name: TName; ist unglücklich, da 'Name' auch gleich eine propterty vom Form ist...

Geändert von HolgerX (25. Nov 2018 um 15:53 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Mit savetoFile/loadfromFile Daten ins Formular bringen

  Alt 26. Nov 2018, 15:31
ich war in der Zwischenzeit nicht untätig und habe mir die ganze Sache nochmals durchdacht.
Ich muss darauf hinweisen, dass ich ein Anfänger und vermutlich ein lausiger Programmierer bin, doch ich mache das einfach für mich und habe
Freude daran, wenn mir was gelingt. Das nur vorweg, damit etwas Verständnis für meine naiven Fragen in eure Gedult und die Antworten einfließen können.
Ja nun zum Anliegen selbst: ich habe die Form und die logic jeweils in eine unit verpackt. Auch die variablen sind private gesetzt.
Zur logic - was will ich erreichen:
- Applikation wird gestartet;
- nach Button Daten laden wird der erste Datensatz in den edit-Feldern angezeigt (ID,Name,Herkunft,Geschlecht)
- Button clear löscht die angezeigten Daten; vermutlich muss ich jedoch die Daten auch freigeben und nicht nur im Form löschen;
- Neuer Datensatz anlegen Daten werden eingegeben, Button Speichern betätigen dann neues TName erzeugen und der Liste (Add) anhängen
- Navigation mit Button vor und Buttun zurück

mehr will ich zunächst nicht erreichen. War das mit Logic gemeint?

Nun die Herkules-Aufgabe: Die Form ist schlicht und einfach drei Editfelder eine checkbox und Button laden Button speichern Button vor und zurück.
Die logic in unit Daten ist die vom Link in #1. Name in Names geändert, damit keine Mißverst. auftreten.
Methode Laden:

Delphi-Quellcode:
procedure TForm1.ladenClick(Sender: TObject);
var Names:TName;
begin
  Names:=TName.create;
  try
    FDatalist.LoadFromFile('e:\test\daten.dat');
    Names := FDatalist.Items[0] as TName;
    Edit1.text:=inttostr(Names.ID);
    Edit2.Text:=Names.Name;
    Edit3.text:=Names.Herkunft;
    CheckBox1.Checked:=Names.Geschlecht;
  finally
    FreeAndNil(Names);
  end;
end;
Methode speichern:

Delphi-Quellcode:
procedure TForm1.speichernClick(Sender: TObject);
var Names: TName;
begin
  Names:=TName.create;
  try
    Names.ID:=strtoint(Edit1.text);
    Names.Name:=edit2.text;
    Names.Herkunft:=Edit3.text;
    Names.Geschlecht:=checkBox1.Checked;
    FDatalist.Add(Names);
    FDatalist.SaveToFile('e:\Test\daten.dat');
  init;
  finally
    FreeAndNil(Names);
  end;
end;

Probleme dabei: ich kann nur einen Datensatz eingeben und wenn abgespeichert wurde, kann so kein neuer eingegeben werden und auch der gespeicherte
nicht geladen werden, da er noch in Verwendung ist. Also müßte er für die Neueingabe eines zweiten DS freigegeben werden.
Weitere Handlungen am Programm sind erst nach Neustart des Prog. möglich, z.B. Datensatz laden.
Die Eingabe eines DS überschreibt den bereits gespeicherten DS.- blöd.

Was sollte ich tun? HolgerX schreibt: (Button Speichern), dann neues TName erzeugen und der Liste anhängen.
Das möchte ich auch aber wie?
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Mit savetoFile/loadfromFile Daten ins Formular bringen

  Alt 26. Nov 2018, 16:24
Hallo,
könntest Du mal bitte Deinen jetzt-Stand als Projekt ranhängen? Das macht es für faule Kerle wie ich es bin einfacher mal reinzuschauen und nachzuvollziehen wo was in der Logik klemmt.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Mit savetoFile/loadfromFile Daten ins Formular bringen

  Alt 26. Nov 2018, 16:51
Hier mein bisheriger Stand.
Angehängte Dateien
Dateityp: zip projekt1.zip (3,5 KB, 6x aufgerufen)
Norbert
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Mit savetoFile/loadfromFile Daten ins Formular bringen

  Alt 26. Nov 2018, 18:18
.. mit SaveToFile wird die Datei wieder überschrieben.
Wenn Du mehrere "Datensätze" in das File schreiben willst
musst Du den schon bestehenden Inhalt vorher wieder einlesen.

Grüße
Klaus
Klaus

Geändert von Klaus01 (26. Nov 2018 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Mit savetoFile/loadfromFile Daten ins Formular bringen

  Alt 26. Nov 2018, 18:35
.. neuer Versuch:
Delphi-Quellcode:
rocedure TForm1.ladenClick(Sender: TObject);
var Names:TName;
begin
  Names:=TName.create;
  try
    FDatalist.LoadFromFile('e:\test\daten.dat');
    Names := FDatalist.Items[0] as TName;
    Edit1.text:=inttostr(Names.ID);
    Edit2.Text:=Names.Name;
    Edit3.text:=Names.Herkunft;
    CheckBox1.Checked:=Names.Geschlecht;
  finally
    FreeAndNil(Names);
  end;
end;
FDataList.Items[0] as TName gibt doch eine Klasseninstanz zurück.
Es sollte daher nicht notwendig sein die Instanz Names noch zusätzlich zu erstellen.

Also so:
Delphi-Quellcode:
procedure TForm1.ladenClick(Sender: TObject);
var Names:TName;
begin
  FDatalist.LoadFromFile('e:\test\daten.dat');
  try
    Names := FDatalist.Items[0] as TName;
    Edit1.text:=inttostr(Names.ID);
    Edit2.Text:=Names.Name;
    Edit3.text:=Names.Herkunft;
    CheckBox1.Checked:=Names.Geschlecht;
  except
    // do error handling
  end;
end;
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
989 Beiträge
 
Delphi 6 Professional
 
#7

AW: Mit savetoFile/loadfromFile Daten ins Formular bringen

  Alt 26. Nov 2018, 19:04
Hmm..

Delphi-Quellcode:
rocedure TForm1.ladenClick(Sender: TObject);
var Names:TName;
begin
  Names:=TName.create; // Wieso ein NEUES machen..
  try
    FDatalist.LoadFromFile('e:\test\daten.dat');
    Names := FDatalist.Items[0] as TName; // ... Es wird doch aus der Liste geholt und dass NEUE ins Nirvana geschickt..
    Edit1.text:=inttostr(Names.ID);
    Edit2.Text:=Names.Name;
    Edit3.text:=Names.Herkunft;
    CheckBox1.Checked:=Names.Geschlecht;
  finally
    FreeAndNil(Names); // Und hier wird sogar das aus der Liste gleich gekillt
  end;
end;
Also gleich richtig machen..

Oben in der Form kannst Du bei

Delphi-Quellcode:
 private
    { Private-Deklarationen }
    var FDataList:TMyobjectlist;

  public
das 'var' löschen...

füge dort noch hinzu

Delphi-Quellcode:
 private
    { Private-Deklarationen }
    FDataList:TMyobjectlist;
    FAktuelerIndex : integer; //<-- Index des aktuellen Satzes
    procedure ZeigeDaten;
  public

und noch das:

Delphi-Quellcode:
 
procedure TForm1.ZeigeDaten;
var
  Names:TName;
begin
  // holen des aktuellen Satzes aus der Liste und Anzeigen
  Names := FDatalist.Items[FAktuelerIndex] as TName;
  Edit1.text:=inttostr(Names.ID);
  Edit2.Text:=Names.Name;
  Edit3.text:=Names.Herkunft;
  CheckBox1.Checked:=Names.Geschlecht;
end;
dein laden sieht dann so aus:

Delphi-Quellcode:
procedure TForm1.ladenClick(Sender: TObject);
begin
  FDatalist.LoadFromFile('e:\test\daten.dat'); // Laden der Liste
  FAktuelerIndex := 0; // Auf ersten Datensatz setzen
  ZeigeDaten; //Anzeigen
end;
Jetzt nur noch ein Button für Vor:
Delphi-Quellcode:
procedure TForm1.ButtonVorClick(Sender: TObject);
begin
  inc(FAktuelerIndex); // Nächster Datensatz
  if FAktuelerIndex >= FDatalist.Count then
    FAktuelerIndex := 0; // Wieder von vorne beginnen, wenn bereits letzter gewesen
  ZeigeDaten;
end;
und eine für Zurück
Delphi-Quellcode:
procedure TForm1.ButtonRueckClick(Sender: TObject);
begin
  inc(FAktuelerIndex, -1); // Vorheriger Datensatz
  if FAktuelerIndex < 0 then
    FAktuelerIndex := FDatalist.Count-1; // Wieder vom letzten beginnen, wenn bereits am Anfang
  ZeigeDaten;
end;
Und schon kannst DU durch die Datensätze navigieren...

Jetzt noch dein speichern reparieren:

Delphi-Quellcode:
procedure TForm1.speichernClick(Sender: TObject);
var Names: TName;
begin
  Names:=TName.create; // Neues Object erstellen
  try
    // Daten aus Controls holen
    Names.ID:=strtoint(Edit1.text);
    Names.Name:=edit2.text;
    Names.Herkunft:=Edit3.text;
    Names.Geschlecht:=checkBox1.Checked;
    FDatalist.Add(Names); // An die Liste Anhängen
    FDatalist.SaveToFile('e:\Test\daten.dat'); // Speichern

    FAktuelerIndex := FDatalist.Count-1; // Auf den letzten Datensatz setzen

    ZeigeDaten; // Könnte man auch sparen, nur zur Sicherheit ;)
  finally
// FreeAndNil(Names); // <- NICHT löschen!!! Denn das Object ist ja in der Liste !!!
  end;
end;
und noch einen Button für einen Leeren Datensatz
Delphi-Quellcode:
procedure TForm1.ButtonLeerClick(Sender: TObject);
begin
  init;
  FAktuelerIndex := -1; // Auf nicht Vorhandenen Datensatz setzen
end;
Um den aktuellen Datensatz aus der Liste zu löschen genügt ein weiterer Button:

Delphi-Quellcode:
procedure TForm1.ButtonLoeschenrClick(Sender: TObject);
begin
  FDatalist.Delete(FAktuelerIndex); // Aktuellen Datensatz aus Liste löschen
  FAktuelerIndex := 0; // Auf ersten Satz setzen
  ZeigeDaten;
end;
Was jetzt noch fehlt sind Sicherheitsüberprüfungen beim Laden/ZeigeDaten wenn die Liste leer ist...
Aber etwas musst Du ja auch noch machen....

(Aus dem Kopf ohne Delphi herunter getippt, also keine Garantie auf Fehlerfreiheit )
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:01 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