![]() |
Delphi-Version: 10.2 Tokyo
Mit savetoFile/loadfromFile Daten ins Formular bringen
Ich probiere mal wieder und komme nicht weiter. Ich bin relativ unbedarft auf dieser Strecke.
Die unit von Taladan habe ich im Forum gefunden: ![]() Dazu habe ich für die dort def. Felder (ID,Name,Herkunft,Geschlecht) auf meiner Formular-unit entsprechende edit-Komponenten eingerichtet. mit den Methoden savetofile/loadfromFile möchte ich also eingegebene Daten nach z.B e:\test\daten.dat speichern und von dort dann mit loadfromfile wieder ins Formular aufnehmen. Sicher wohl eine ganz einfache Art und Weise, doch es klappt einfach nicht. Beim savetoFile kommt ein Datensatz an und wird gespeichert. Weitere Datensätze werden nicht gespeichert. Beim Aufruf loadfromFile erhalte ich lediglich den Wert für die ID mit 0. Die anderen Felder werden nicht gefüllt. Wo klemmt es da bei mir? anbei meine stümperhaften Versuche:
Delphi-Quellcode:
procedure TForm1.speichernClick(Sender: TObject);
var FileN :string; begin Name:=TName.create; Name.ID:=strtoint(Edit1.text); Name.Name:=edit2.text; Name.Herkunft:=Edit3.text; Name.Geschlecht:= true; //checkBox1.Checked; objectlist.Add(Name); objectlist.SaveToFile('e:\Test\daten.dat'); init; end; procedure TForm1.ladenClick(Sender: TObject); var FileN:string; begin objectlist.LoadFromFile('e:\test\daten.dat'); Edit1.text:=inttostr(Name.ID); Edit2.Text:=Name.Name; Edit3.text:=Name.Herkunft; CheckBox1.Checked:=Name.Geschlecht; end; procedure TForm1.FormCreate(Sender: TObject); begin Name:=TName.Create; Objectlist:=TMyObjectList.create; end; procedure TForm1.FormDestroy(Sender: TObject); begin Name.free; objectlist.Free; end; |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Moin,
bevorzugen würde ich Objeklisten, wenn ganze Objekte gespeichert werden sollen. Deine Aufgabe scheint hier zu sein, verschiedene Eigenschaften unterschiedlichster Objekte zu befüllen, zu sichern. Da neige ich zur bewährten StringList zu greifen. Hier einige Beispiele 1. Laden / Speichern
Delphi-Quellcode:
2. Quellcodebasiertes Befüllen
procedure TForm1.Button2Click(Sender: TObject);
var tempStringList : TStringList; fileName : String; begin fileName := 'c:\temp\myfile.txt'; tempStringList := TStringList.Create; try tempStringList.LoadFromFile(fileName); {Load string from text file} showmessage( tempStringList.Text); tempStringList.SaveToFile(fileName); {save the text in a file } finally tempStringList.Free; end; end;
Delphi-Quellcode:
3, Befüllen / Auslesen von Namen und zugehörigen Werten
ar
animals : TStringList; // Define our string list variable i : Integer; begin // Define a string list object, and point our variable at it animals := TStringList.Create; // Now add some names to our list animals.Add('Cat'); animals.Add('Mouse'); animals.Add('Giraffe'); // Now display these animals for i := 0 to animals.Count-1 do ShowMessage(animals[i]); // animals[i] equates to animals.Strings[i] // Free up the list object animals.Free; end;
Delphi-Quellcode:
var
names : TStringList; // Define our string list variable ageStr : String; i : Integer; begin // Define a string list object, and point our variable at it names := TStringList.Create; // Now add some names to our list names.CommaText := 'Neil=45, Brian=63, Jim=22'; // And now find Brian's age ageStr := names.Values['Brian']; // Display this value ShowMessage('Brians age = '+ageStr); // Now display all name and age pair values for i := 0 to names.Count-1 do begin ShowMessage(names.Names[i]+' is '+names.ValueFromIndex[i]); end; // Free up the list object names.Free; end; 4. Setzen von Namen-Wert-Kombinationen aus einem String
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var SL: TStringList; Temp: string; i: Integer; begin SL := TStringList.Create; SL.Delimiter := '|'; SL.QuoteChar := '"'; SL.StrictDelimiter := True; SL.DelimitedText := 'O=0 | ! .!=!.!'; Temp := 'Count: ' + IntToStr(SL.Count) + #13; for i := 0 to SL.Count - 1 do Temp := Temp + Format('Name: %s Value: %s'#13, [SL.Names[i], SL.ValueFromIndex[i]]); ShowMessage(Temp); end; Für das Speichern/Laden von einigen Eigenschaften ist das gutn machbar. Viele Grüße // Martin |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Hmm..
Zitat:
Wenn du mit der Liste laden willst, dann solltest Du auch mit NAME aus der 'Liste' arbeiten. Lösche zunächst erstmal dein globales NAME aus dem src... und hole dieses beim Laden aus der objectlist.. |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Danke HolgerX
ich habe nun die var Name aus dem Formular direkt in die Methode SavetoFile als lokale Variable übernommen und nun sieht diese Methode so aus:
Delphi-Quellcode:
weiterhin ist jedoch im Formular noch die var objectlist:TMyobjectlist global deklariert.
procedure TForm1.speichernClick(Sender: TObject);
var Name: TName; begin Name:=TName.create; try Name.ID:=strtoint(Edit1.text); Name.Name:=edit2.text; Name.Herkunft:=Edit3.text; Name.Geschlecht:=checkBox1.Checked; ObjectList.Add(Name); objectlist.SaveToFile('e:\Test\daten.dat'); init; finally FreeAndNil(Name); end; end; Am Ergebnis hat sich jedoch nichts verändert. Weiterhin wird nur ein Datensatz im File gespeichert und im Form aufrufen kann ich es auch nicht. Ich mache da wohl grundsätzlcih was falsch. |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Dir fehlt nach dem Laden ein
Delphi-Quellcode:
Name := ObjectListe.Items[index] as tname;
Falls es dann noch Probleme gibt: Wie sieht die gespeicherte Datei aus? |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Liste der Anhänge anzeigen (Anzahl: 1)
Danke Olli73.
habe
Delphi-Quellcode:
aufgenommen (Index 0)weil er ein Integer wünschte. War das richtig so? Nun wird mein Datensatz
Name := ObjectList.Items[0] as tname;
aus dem File geladen und im Form angezeigt. Das geht leider nur mit einem Datensatz ID = 0; Name = Otto; Herkunft = Berlin und Geschlecht= true. Ein zweiter eingegebener Datenatz überschreibt den ersten. Das Anzeigen des geladenen Datensatzs im Form geht auch nur nach Neuaufruf des Programms. Alles eigentlich nicht so konfortabel. Ich will nur experimentieren und sicher ist die Arbeit mit einer StringList dafür besser geeignet, doch ich wollte es auch mal mit einer Objectlist versuchen. Die gespeicherte Datei daten.dat anbei |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
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... |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
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:
Methode speichern:
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;
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? |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
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. |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mein bisheriger Stand.
|
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
.. 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 |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
.. neuer Versuch:
Delphi-Quellcode:
FDataList.Items[0] as TName gibt doch eine Klasseninstanz zurück.
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; Es sollte daher nicht notwendig sein die Instanz Names noch zusätzlich zu erstellen. Also so:
Delphi-Quellcode:
Grüße
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; Klaus |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Hmm..
Delphi-Quellcode:
Also gleich richtig machen..
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; Oben in der Form kannst Du bei
Delphi-Quellcode:
das 'var' löschen...
private
{ Private-Deklarationen } var FDataList:TMyobjectlist; public 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:
dein laden sieht dann so aus: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;
Delphi-Quellcode:
Jetzt nur noch ein Button für Vor:
procedure TForm1.ladenClick(Sender: TObject);
begin FDatalist.LoadFromFile('e:\test\daten.dat'); // Laden der Liste FAktuelerIndex := 0; // Auf ersten Datensatz setzen ZeigeDaten; //Anzeigen end;
Delphi-Quellcode:
und eine für Zurück
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;
Delphi-Quellcode:
Und schon kannst DU durch die Datensätze navigieren...
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; Jetzt noch dein speichern reparieren:
Delphi-Quellcode:
und noch einen Button für einen Leeren Datensatz
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;
Delphi-Quellcode:
Um den aktuellen Datensatz aus der Liste zu löschen genügt ein weiterer Button:
procedure TForm1.ButtonLeerClick(Sender: TObject);
begin init; FAktuelerIndex := -1; // Auf nicht Vorhandenen Datensatz setzen end;
Delphi-Quellcode:
Was jetzt noch fehlt sind Sicherheitsüberprüfungen beim Laden/ZeigeDaten wenn die Liste leer ist...
procedure TForm1.ButtonLoeschenrClick(Sender: TObject);
begin FDatalist.Delete(FAktuelerIndex); // Aktuellen Datensatz aus Liste löschen FAktuelerIndex := 0; // Auf ersten Satz setzen ZeigeDaten; end; Aber etwas musst Du ja auch noch machen.... ;) (Aus dem Kopf ohne Delphi herunter getippt, also keine Garantie auf Fehlerfreiheit ;) ) |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
HolgerX Klasse!!!
ich habe es probiert und nach ersten Erkenntnissen klappt es. Das werde ich ganz intensiv durchgehen und nachvollziehen. Ich bin wirklich dankbar für diese Hilfe, denn allein hätte ich das nicht hinbekommen. Wenn noch Fragen auftreten würde ich mich melden - aber erst morgen. nochmals Danke:) |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Hmm...
und mit
Delphi-Quellcode:
kannst Du neuen Datensätze anhängen oder eben den gerade gewählten verändert speichern...
procedure TForm1.speichernClick(Sender: TObject);
var Names: TName; begin if FAktuelerIndex > -1 then Names := FDatalist.Items[FAktuelerIndex] as TName; // Aktuelles Object bearbeiten else 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; if FAktuelerIndex = -1 then begin FDatalist.Add(Names); // Nur an die Liste Anhängen, wenn neu FAktuelerIndex := FDatalist.Count-1; // Auf den letzten Datensatz setzen end; FDatalist.SaveToFile('e:\Test\daten.dat'); // Speichern ZeigeDaten; // Könnte man auch sparen, nur zur Sicherheit ;) except on E:Exception do ShowMessage(E.Message); end; end; (Aus dem Kopf ohne Delphi herunter getippt, also keine Garantie auf Fehlerfreiheit ) |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo HolgerX Irgendwie ist doch noch der Wurm drin, denn wenn ich einen neuen Datensatz hinzufügen möchte beispielsweise über leeren DS erhalte ich eine Fehlermeldung und die gespeicherten DS sind futsch.
Ich kann die erstellten DS laden und vor- zurück navigieren - alles ok. Nur wenn ich wie auch immer einen Datensatz hinzufügen möchte gibt es Ärger. anbei die aktuelle Version |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Das Problem besteht beim speichern sowohl beim Abändern eines bestehenden DS als auch beim Anlegen eines neuen DS. Er wirft die Excecption:
--------------------------- ptest2 --------------------------- Zugriffsverletzung bei Adresse 005EDF6D in Modul 'pTest2.exe'. Lesen von Adresse 00000000. --------------------------- OK --------------------------- und die daten.dat steht auf 0, ist also futsch. Es muss doch wohl an der Procedure speichern liegen.
Delphi-Quellcode:
hängt das evtl mit FAktuelerIndex -Werten zusammen? Wert -1 - lege neuen Datensatz an? Index 0 ist der erste DS.
procedure TForm1.speichernClick(Sender: TObject);
var Names: TName; begin if FAktuelerIndex > -1 then Names := FDatalist.Items[FAktuelerIndex] as TName // Aktuelles Object bearbeiten else 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; if FAktuelerIndex = -1 then begin FDatalist.Add(Names); // Nur an die Liste Anhängen, wenn neu FAktuelerIndex := FDatalist.Count-1; // Auf den letzten Datensatz setzen end; FDatalist.SaveToFile('e:\Test\daten.dat'); // Speichern ZeigeDaten; // Könnte man auch sparen, nur zur Sicherheit ;) except on E:Exception do ShowMessage(E.Message); end; wäre ein FDatalist.Insert hilfreich? |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Hmm..
Hänge mal den kompletten Sourcecode ein , nicht nur pas und dpr.. ;) Es fehlt vom Formular die dfm.. |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..
OK, hab mir nen Testformular gebastelt... Ich konnte nur einen Fehler in der daten.pas finden, beim Laden... Es wurde das count von der Objectliste gesetzt und dann pern Insert weitere Objecte hinzugefügt, somit waren im Anschluss doppelt so viele Objecte in der Liste, wie es eigentlich sein sollten und die hälfte nur 'nil'... Nachdem ich das Count nicht mehr gesetzt habe und aus insert ein add gemacht habe, lief es.. (Erstellt und getestet mit D6 ;) ) |
AW: Mit savetoFile/loadfromFile Daten ins Formular bringen
HolgerX ich danke dir, denn ich habe an der Methode speichern herumgedoktert mit der neuen Variante und dann mit der von gestern abend, doch auf die unit daten wäre ich nicht gekommen und da habe ich mich auch nicht rangetraut.
Jedenfalls sieht es jetzt wesentlich besser aus und ich werde alle möglichen eingaben probieren. Nochmals Danke für die Hilfe und ich habe wieder was dazugelernt, auch wenn ich nunmehr auf die 70 zugehe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 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