ListBox Items dauerhaft anlegen
-
Hallo,
wie kann ich in einer ListBox eine Item dauerhaft anlegen, ohne jetzt vielleicht in einer txt Datei oder so speichern zu müssen und dann beim nächsten Programmstart wieder zu laden?
Geht das?Thx
-
Im Objektinspektor Items bestücken.
-
Das meinte ich nicht, vielleicht habe ich mich falsch ausgedrückt. Ich habe eine ListBox, da stehen aucxh schon Items drin. Wenn ich nun eine Aktion ausführe im Prog (Button) dann soll ein weiteres Item hinzugefügt werden und zwar dauerhaft.
Danke trotzdem für deine Antwort.
-
Aha
Was heisst "dauerhaft" ?
-
Hallo
ich gehe davon aus, das dauerhaft -> "immer bei jedem Programmstart vorhanden"
das geht nur Speichern in txt/INI/Reg oder in der Exe selbst
MfG
Klaus
-
@ klaus: Ja so war es gemeint.
Es gibt also keine andere Möglichkeit? Ich wollte es eigentlich vermeiden eine weitere datei zu erzeugen. Wie speicher ich es denn in der Exe ab?
-
hallo,
in der exe speicherst du es ab, indem du wie bereits erwähnt, das item property bestückst, dann wirds direkt in der exe abgelegt, aber du suchst ja nen dynamischen weg.
da kommt es dann auch darauf an, wiviel da gespeichert werden soll und was das für zeug ist das da gespeichert werden soll, wenn es um programmeinstellungen geht dann bietet sich die registry an, bei größeren sachen kommst du um eine datei nicht herum, wie willst du es denn sonst speichern, wennnicht in datei/registry???mfg
murph
-
ok, das ich um eine datei wohl nicht herum komme habe ich begriffen. Da ich schon eine ini Datei habe würde ich die Items gerne darin abspeichern.
Nun habe ich aber schon eine ListBox welche sich ihre Items ebenfalls aus der Datei lädt.
Wie kann ich denn dann beim Speichern/Laden einen unterschied der darin enthaltenen Strings machen? Also das die eine ListBox nur ihre Items daraus lädt bzw. speichert und die andere nur ihre eigenen.
Geht das irgendwie?
-
Über die "Sektion" kannst du doch bestimmen, welche Daten du lesen / schreiben möchtest.
Bsp:
[ListBox1]
Item1=Hallo
Item2=Welt[ListBox2]
Item1=Tschüss
Item2=Welt...
Wenn du dir jetzt die Methoden ReadString / WriteString von TIniFile anschaust, dann siehst du, dass du als ersten Parameter die Sektion angegen musst.
-
2 verschiedene dateien? oder mit ner ini-datei arbeiten und dort die komplette sektion auslesen (ReadSection) und der entsprechenden listbox zu ordnen!
-
Ja das mit den Section habe ich mir auch schon gedacht. Nun meine Frage, wie lege ich eine neue Section an? Wurde aus der Hilfe nicht so ganz schlau.
Da habe ich nur read section und Section exists gefunden.
-
Für den Umgang mit IniFiles: http://home.t-online.de/home/mario_kluge/index.html
Ansonsten schau dir mal genau WriteString() an.
Dort gibst du als ersten Parameter ja auch die Sektion an.
Wenn die Sektion noch nicht besteht, dann wird sie automatisch erstellt!
-
hey super. Die Seite hilft mir echt weiter.
Nun habe ich noch ein kleines Problem bei dem ReadSectionValues.
Es funktioniert nicht ganz so wie ich es möchte. Mein Code sieht so aus:void __fastcall TForm1::FormCreate(TObject *Sender) { StatusBar1->Panels->Items[0]->Text ="Ready"; TIniFile *lkIniFile = new TIniFile("NetBomb.ini"); lkIniFile->ReadSectionValues("History", ListBox1->Items); delete lkIniFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { String history = "history"; TIniFile *lkIniFile = new TIniFile("NetBomb.ini"); for (int i = 0; i < ListBox1->Items->Count; i++) { lkIniFile->WriteString("History",history + i , ListBox1->Items->Strings[i]); } delete lkIniFile;
Beim Laden steht in der ListBox aber nicht nur der Value, sondern der komplette String, also history1=Aufgabe erledigt!
Was mach ich falsch?
-
Entweder musst du nach ReadSection die einzelnen Strings parsen oder du verwendest eine Schleife und liest mit ReadString die jeweiligen Werte aus.
[Zusatz]
Ich würde als beim Laden die Werte der Sektion in eine Stringliste laden und dann die einzelnen Strings der Liste in einer Schleife parsen und mein Wert ermitteln und dann in die ListBox schreiben.Für das Parsen kannst du dir mal die AnsiString-Methoden SubString und Pos anschauen.
[/Zusatz][ Dieser Beitrag wurde am 06.02.2003 um 13:48 Uhr von JeGr editiert. ]
-
Du machst nichts falsch, du machst nur nicht das, was Du willst
Aus der Hilfe (sollte man mal gelesen haben:)
Mit ReadSectionValues können Schlüssel und die Werte aller Schlüssel innerhalb eines Abschnitts der INI-Datei in eine String-Liste (TStrings-Nachkomme) eingelesen werden.
Um nun nur den Wert zu bekommen, kannst Du jeweils den vorderen Teil abschneiden (siehe Methoden Substring, Pos von AnsiString), oder Du liest solange mit ReadString (ReadInteger...) die Schlüssel aus, bis Du als Rückgabewert den Defaultwert bekommst, also der Eintrag nicht existiert.
-
Du kannst auch beim Speichern die Anzahl der Einträge mitspeichern.
Dann geht das Auslesen ohne große Probleme:Vor Deiner for-Schleife
WriteInteger("History","ItemAnzahl",ItemAnzahl);
Beim Einlesen dann halt eine Schleife bis ItemAnzahl.
Nix Pharsen, Fertig.[ Dieser Beitrag wurde am 06.02.2003 um 14:06 Uhr von Bibo editiert. ]
-
Super, ich danke euch für eure Hilfen. Das einlesen klappt nun ohne Probleme. Nur wie kann ich es erreichen das die Einträge nicht doppelt abgespeichert werden?
Jedesmal wenn ich das Prog beende, werden ja die Einträge in die ini gespeichert, egal ob sie schon da sind. Wie kann ich das am besten überprüfen?
-
SectionExists
und
EraseSection!
-
Ist das nicht sehr riskant?
So wie ich es verstanden habe löscht EraseSection eine ganz Sektion. Was aber nun wenn das Prog abstürtz?
Dann ist die Ini hin und die Daten sind weg.
-
Ich denke nicht, dass es ein Problem ist, wenn Du beim Beenden immer speicherst. Es werden die Daten ja nicht ein zweites Mal eingetragen, sondern nur die existierenden Werte überschrieben. D.h. die Datei wird nicht größer, es sei denn, es kommen neue Informationen hinzu.
Nur wenn Du sehr Viele lange Einträge und hast (> 10.000 bei ca 80 Zeichen pro Schlüssel) wird das Speichern überhaupt bemerkbar. (Hängt natürlich auch vom der Systemgeschwindigkeit ab).Ansonsten kannst Du ja die Routine so umbauen, dass Du immer erst guckst, welcher Wert in der Ini steht und nur dann den Wert schreibst, wenn er sich geändert hat. So kannst Du auch Schlüssel, die zuviel sind wieder löschen.
Ich denke aber nicht, dass Du soviel Aufwand treiben musst.