Autor |
Beitrag |
chickenfigt1989
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 06:38
Hallo,
Ich hab ein Eingabeformular das meine Daten in einer Ini Datei Speichern.
Die Ini Einträge sehen so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| [1] Vorname=Max Nachname=Mustermann Straße=Musterstraße Nr=4 Plz=50000 Ort=Musterhausen Vorwahl=051 Rufnummer=455645 Anrede=Herr
[2] Vorname=Max Nachname=Mustermann Straße=Musterstraße Nr=4 Plz=50000 Ort=Musterhausen Vorwahl=051 Rufnummer=455645 Anrede=Herr
[3] Vorname=Max Nachname=Mustermann Straße=Musterstraße Nr=4 Plz=50000 Ort=Musterhausen Vorwahl=051 Rufnummer=455645 Anrede=Herr |
Die Einträge werden mit aufsteigender Nummer mittels einen Zähler gespeichert.
Jeder Eintrag wird eine Nummer höher gespeichert.
Wie kann ich nun die Einträge aus der Ini Datei in ein Listview einlesen lassen?
Ist es möglich die Einträge aus der Ini in einer Listbox ausgeben zu lassen wobei dann jeder Eintrag ein OnKlick Ereignis hat und wen ja wie würde man so etwas Realisieren?
Danke schonmal für eure Hilfe
lg
Moderiert von Narses: Titel geändert, war: "Ini Inhalt in Listview".
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 28.02.12 07:18
Eigentlich ist das relativ trivial, aber für mich stellt sich erst einmal die Frage wo denn das Problem liegt:
Beim Auslesen der Datei oder beim Anzeigen in der ListView? 
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 28.02.12 15:34
Moin!
chickenfigt1989 hat folgendes geschrieben : | Ich hab ein Eingabeformular das meine Daten in einer Ini Datei Speichern. |
INI-Dateien sind kein Datenlager, jedenfalls keine gute Lösung wenn es um mehr als eine Handvoll geht oder performant sein soll.  Ganz heißer Tipp, auch wenn dich das vermutlich eh nicht interessiert: Nimm TMemIniFile, nicht TIniFile
Genau hier ist dein Problem, das Konzept ist nicht geeignet. Mach das besser so:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| [Daten] Count=2
Vorname1=Max Nachname1=Mustermann Straße1=Musterstraße Nr1=4 Plz1=50000 Ort1=Musterhausen Vorwahl1=051 Rufnummer1=455645 Anrede1=Herr
Vorname2=Max Nachname2=Mustermann Straße2=Musterstraße Nr2=4 Plz2=50000 Ort2=Musterhausen Vorwahl2=051 Rufnummer2=455645 Anrede2=Herr | Vor dem Ausgeben ein .EraseSection('Daten'); absetzen, dann die Anzahl schreiben und die Daten hinterher.
chickenfigt1989 hat folgendes geschrieben : | Wie kann ich nun die Einträge aus der Ini Datei in ein Listview einlesen lassen? |
Auslesen konzeptionell so:
Delphi-Quelltext 1: 2: 3: 4: 5:
| Anzahl := IniFile.ReadInteger('Daten', 'Count', 0); for i := 1 to Anzahl do begin Name := IniFile.ReadString('Daten', 'Name'+IntToStr(i), ''); end; |
chickenfigt1989 hat folgendes geschrieben : | Ist es möglich die Einträge aus der Ini in einer Listbox ausgeben zu lassen wobei dann jeder Eintrag ein OnKlick Ereignis hat und wen ja wie würde man so etwas Realisieren? |
Ja.
Aber wie jaenicke schon treffend sagte, wo genau liegt das Problem, und geht´s nun um eine List Box oder ein List View?  Vorab schonmal: bitte nicht in diesem Thread die ListBox/-View Problematik weiter ansprechen, dafür ist ein neuer Thread unter VCL aufzumachen!  Hier sollte es nur um den Datenzugriff gehen. Danke!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 28.02.12 18:03
Wobei das Konzept bei INIs ja damals schon oft so benutzt wurde (wobei Count gar nicht nötig ist): Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| [Information] Count=2
[Setting1] Data=Foo
[Setting2] Data=Foo | Oder auch nur mit den Sektionen. Aber natürlich ging es da in der Tat um Konfigurationsdaten.
Jedenfalls kann man einfach eine Liste der Sektionen holen und dann in jeder Sektion die Einträge ansprechen. Die können dann ja ruhig alle gleich heißen, das ist ja korrekt. Und genauso funktioniert es ja auch heutzutage mit XML-Dateien (nur einfacher halt).
Also sprich so ca., wenn es darum geht eine Liste mit Einstellungen zu füllen: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var FileContents: TMemIniFile; Sections, SectionContents: TStringList; CurrentSection: string; MySettings: TObjectList<TSetting>; begin ... FileContents.ReadSections(Sections); Sections.Delete(Sections.IndexOf('Information')); for CurrentSection in Sections do begin FileContents.ReadSectionValues(CurrentSection, SectionContents); MySettings.Add(TSetting.Create(SectionContents)); end; ... | Und im Konstruktor von TSetting können die Einstellungen dann aus der TStringList gelesen werden. Alternativ kann man natürlich auch die INI direkt übergeben: Delphi-Quelltext 1: 2: 3:
| for CurrentSection in Sections do MySettings.Add(TSetting.Create(FileContents, CurrentSection)); ... |
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 22:52
Hey,
Hab nun meine Speichermethode Abgeändert nun sieht die Ini so aus wie Narses vorgeschlagen hat:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| [Daten] Count=2 Vorname1=Sepp Nachname1=Maier Straße1=Harrerstr. Nr1=9 Plz1=5465123 Ort1=Berlin Vorwahl1=051 Rufnummer1=54652 Anrede1=Herr Vorname2=Sepp Nachname2=Maier Straße2=Schwimmbadstr. Nr2=8 Plz2=645646 Ort2=Hamburg Vorwahl2=068 Rufnummer2=546231 Anrede2=Herr |
Nun wollte ich nach Narses vorschlag gehen mit:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm2.Button1Click(Sender: TObject); var anzahl:String; i:string; begin Anzahl := TIniFile.ReadInteger('Daten', 'Count', 0); for i := 1 to Anzahl do begin Listbox1.Items := TIniFile.ReadString('Daten', 'Name'+IntToStr(i), '');
end; |
Allerdings bekomm ich folgende Fehler:
Delphi-Quelltext 1: 2: 3:
| [Error] Unit2.pas(34): This form of method call only allowed for class methods [Error] Unit2.pas(35): For loop control variable must have ordinal type [Error] Unit2.pas(36): There is no overloaded version of 'IntToStr' that can be called with these arguments |
Woran liegt das und wie kann ich die beheben?
lg
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 28.02.12 23:03
Moin!
chickenfigt1989 hat folgendes geschrieben : | Woran liegt das und wie kann ich die beheben? |
- Anzahl ist ein Integer, kein String (die Methode in meinem Code heißt auch ReadInteger)
- Du verwendest die Typenbezeichnung der Klasse (TIniFile), das geht so nicht. Du musst eine Instanz davon anlegen und mit einer Datei verbinden.
- i ist auch ein Integer (hast du jemals eine for-Schleife mit einem String als Laufvaribale gesehen?
)
Das sollte schonmal weiterbringen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 23:18
Nun sieht mein Code so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm2.Button1Click(Sender: TObject); var anzahl:Integer; i:Integer; iniFile:TIniFile; filename: String; begin filename := ExtractFilePath(ParamStr(0)) + 'adressen.ini'; TIniFile.Create(filename); Anzahl := IniFile.ReadInteger('Daten', 'Count', 0); for i := 1 to Anzahl do begin Listbox1.Items := IniFile.ReadString('Daten', 'Name'+IntToStr(i), '');
end; |
Hoffe es ist halbwegs richtig
Jetzt bekomme ich nur noch folgenden Fehler:
Delphi-Quelltext 1:
| [Error] Unit2.pas(40): Incompatible types: 'TStrings' and 'String' |
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 28.02.12 23:27
Moin!
Naja, wenn du den Code etwas besser formatierst, kann man ihn auch besser lesen. Einrücken ist nicht nur für Mädchen!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm2.Button1Click(Sender: TObject); var Anzahl: Integer; i: Integer; IniFile: TIniFile; Filename: String; begin Filename := ExtractFilePath(ParamStr(0)) +'adressen.ini'; TIniFile.Create(filename); Anzahl := IniFile.ReadInteger('Daten', 'Count', 0); for i := 1 to Anzahl do begin Listbox1.Items.Add(IniFile.ReadString('Daten', 'Name'+IntToStr(i), '')); end; |
chickenfigt1989 hat folgendes geschrieben : | Jetzt bekomme ich nur noch folgenden Fehler: |
Das liegt daran, dass die Eigenschaft .Items einer Listbox kein String ist, du musst neue Elemente mit der Methode .Add() der Klasse TStrings einfügen/anhängen (habe ich oben schon mit drin).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 23:34
Jap Danke hab es gerade bemerkt.
Allerdings gibt es jetzt ne Acces Violation
Delphi-Quelltext 1:
| Anzahl := IniFile.ReadInteger('Daten', 'Count', 0); |
Irgendwas stimmt wohl nicht mit dieser Zeile
Zuletzt bearbeitet von chickenfigt1989 am Di 28.02.12 23:37, insgesamt 1-mal bearbeitet
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 28.02.12 23:36
Moin!
chickenfigt1989 hat folgendes geschrieben : | Allerdings gibt es jetzt ne Acces Violation
Delphi-Quelltext 1:
| Anzahl := IniFile.ReadInteger('Daten', 'Count', 0); | Irgendwas stimmt wohl nicht mit dieser Zeile |
Nein, mit dieser Zeile ist alles OK, das "Problem" liegt in der Zeile davor.  Ich wollte mal sehen, ob zu weißt, was du da tust, deshalb hab ich das so gelassen...
Und, Vorschläge?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 23:40
Naja Vorschlag nicht wirklich aber ich denk mal weil ich die instanz nicht mit einer Datei verbunden habe?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 28.02.12 23:43
Moin!
chickenfigt1989 hat folgendes geschrieben : | ich denk mal weil ich die instanz nicht mit einer Datei verbunden habe? |
Nö, das ist OK, du übergibst im Konstruktor ja den Dateinamen, das reicht dafür aus.
Was könnte es noch sein?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 23:44
Weil ich die Typenbezeichnung von TIniFile benutz?
Naja wenn es dass auch nicht ist werde ich erstmal ins Bett gehen und Morgen nochmal in ruhe drüber schauen.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 28.02.12 23:47
Moin!
chickenfigt1989 hat folgendes geschrieben : | Weil ich die Typenbezeichnung von TIniFile benutz? |
Auch das ist korrekt so, du verwendest ja einen Konstruktor, da muss man das genau so machen.
chickenfigt1989 hat folgendes geschrieben : | Naja wenn es dass auch nicht ist werde ich erstmal ins Bett gehen und Morgen nochmal in ruhe drüber schauen. |
Mach das, schadet nicht.
Ich geb dir mal einen Tipp für den guten Schlaf mit: wo legst du denn in deinem Code fest, welchen Inhalt diese Variable haben soll: Delphi-Quelltext 1: 2:
| var IniFile: TIniFile; |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 23:52
Ja hier mit der oder?
Delphi-Quelltext 1:
| Anzahl := IniFile.ReadInteger('Daten', 'Count', 0); |
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 28.02.12 23:54
Moin!
Hm  hab ich mich vielleicht nicht gut genug ausgedrückt. Nochmal:
chickenfigt1989 hat folgendes geschrieben : | Delphi-Quelltext 1:
| Anzahl := IniFile.ReadInteger('Daten', 'Count', 0); | |
Ich meine den Inhalt der markierten Variablen, mit der Zeile legst du den Inhalt von Anzahl fest (zur Erinnerung: Zuweisung schreibt auf den linken Teil vom ':=').
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Di 28.02.12 23:56
Ja das ist mir klar aber wieso muss ich der Variable IniFile was zuweisen?
Den ich weis ja den Inhalt der Ini der Variable Anzahl zu
oder bin ich da auf den Holzweg?
lg
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 29.02.12 00:02
Moin!
chickenfigt1989 hat folgendes geschrieben : | Ja das ist mir klar aber wieso muss ich der Variable IniFile was zuweisen? |
Weil du in der Zeile, in der es die Exception gibt, auf diese Variable zugreifst (sie steht auf der rechten Seite vom ':='). Wenn du nie was reingeschrieben hast (also diese Variable nie auf der linken Seite eines ':=' aufgetaucht ist), was sollte dann (sinnvolles) drin stehen?
chickenfigt1989 hat folgendes geschrieben : | Den ich weis ja den Inhalt der Ini der Variable Anzahl zu
oder bin ich da auf den Holzweg? |
Du bist zielmäßig nicht auf dem Holzweg, genau das soll da passieren.  Der Teufel steckt hier eher etwas im Detail. Ich denke, der Tipp oben mit der Frage nach dem "Inhalt" von IniFile (damit ist offensichtlich nicht der Dateiinhalt gemeint, sondern was anderes) sollte dich weiter bringen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
chickenfigt1989 
      
Beiträge: 444
Erhaltene Danke: 2
|
Verfasst: Mi 29.02.12 00:06
Hab grad nochmal durchgeschaut und ich glaub ich hab den fehler gefunden.
Delphi-Quelltext 1:
| inifile := TIniFile.Create(filename); |
Aufjedenfall wird mir jetzt in der Listbox der Vorname angezeigt
Wenn es richtig ist bedank ich mich Recht herzlich für deine Bemühungen
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 29.02.12 00:08
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|