(ini)alle Werte ohne den Key aus einer Section in memo ausgeben
-
moin zusammen,
jetzt werden sich einigen denken der schon wieder und seine "ini" jow
na ja , es geht darum das in alle meine werte aus der ini in einer memo saugeben will.. zb.
schaut so meine Section aus:
[Abschnitt1]
Key1=Wert1
Key2=Wert2
Key3=Wert3ich will das die in der memo so dar gestellt werden:
Wert1
Wert2
Wert3ich hab schon die ganz zeit versucht wie ich es machen kann.
Memo1->Lines->Add(ini->ReadString("Name",IntToStr(sList++),NULL));
so gibt er immer den ersten Wert aus.
Naja ich denke mal der ansatz ist Richtig sprich das er nen String aus der ini lesen soll in der Section "Name" und dann frage ich mich wie mach ich dem ganzen klar das alle Werte nehmen soll ohne die schlüssel.
jemand nen tip, bitte keien fertige lösung (hilft ja ned weiter)
mfg
|23|
-
schau mal unter ReadSectionValues in der BCB-Hilfe
-
Einige Fragen zum Tag zu denen du dir mal Gedanken machen und die Antworten hier reinschreiben solltest:
1. Hast du dir die restlichen Methoden von TIniFile schon mal genauer angeschaut? (z.B. ReadSection*)
2. Wieso übergibst du als dritter Parameter NULL?
3. Was beinhaltet "sList" bzw. wer ist "sList"?
4. Was liefert "ReadString" zurück? (Die Ergebnisse mal mit dem Debugger prüfen!)
5. Was treibt sList während deiner Programmdurchläufe?...
sollte fürn Anfang reichen...
-
gut mein ansatz war doch etwas falsch.. ja die Methoden hab ich mir durch gelesen naja die mir schon vom name her helfen könnten.. den z.b. "DeleteKey" brauch ich in dem fall ja ned durch zulesen...
nun weiter im text.:
Gibt nur die Key aus:
ini->ReadSection("Name",Memo1->Lines);
Gibt die Keys und die Werte aus:
ini->ReadSectionValues("Name",Memo1->Lines);
und das dumme an ReadString ist das er nur 1 wert ausgeben kann und nicht gleich alle wie blöde auch
ist aber noch ned mein Ziel
-
Dann gehört wohl noch ein Zwischenschritt hin? Was erwartet ReadSectionValues denn als Parameter?
-junix
-
(const AnsiString Section, Classes::TStrings* Strings);
Der Parameter Strings kann auf ein TStrings-Objekt zeigen oder auf eine Komponenteneigenschaft, wie z.B. Items für eine TListBox-Komponente, die selbst ein TStrings-Objekt darstellt.
da werd ich nur so draus schlau das ReadSectionValues halt die Section erwartet und wo er sie ausgeben kann und das kann ein TStrings-Objekt sein.
-
Na also.. und statt das hald direkt in das Memo rauszubröseln kannst du das Ergebnis ja erst zwischenspeichern und passend nach deinen wünschen filtern, indem du hald statt der Eigenschaft Lines einfach deine eigne Instanz eines TStrings-Objekts übergibst?
-junix
-
danke guter tip:
ini->ReadSectionValues("Name",sList2);
und nu ?
ini->ReadSectionValues("Name",sList2); int i = sList2->???????; Memo1->Lines->Add(i);
...ich find keiner von dem Methoden die mir helfen könnte hab mir alle durch gelesen
-
Eigenschaften wie Keys und Values sind dir auch noch nicht aufgefallen?
-junix
-
jab jetzt hab ich mich da acuh durch gelesen leider bittet der BCB kein beispiel. nur :
_property AnsiString Values[AnsiString Name] = {read=GetValue, write=SetValue};
woraus ich irgendwie ned schlau werde
-
unter ReadSectionValues ist auch ein Beispiel zu der Eigenschaft Values von TString...
natürlich könntest du auch mit Hilfe der AnsiString-Funktionen jede Zeile der Stringlist nach dem "=" absuchen und den darauffolgenden Teil in irgendeiner Form in einer Liste darstellen, z.b. über SubString, Pos und ähnliches
[Edit] schau dir auch mal die Verwendung von TStringList an
-
Hab ich alles, und alles taugt nix fuck nur zum aufregen
mit ini->ReadSectionValues("Name",ListBox1->Items); bekomme ich die ganze Section ausgegeben ich will aber nur alle "Values" haben und den den scheiss key und das = zeichen !!
-
Statt dich verbal in die Gosse zu begeben würdest du dich besser mal um das kümmern was man dir gesagt hat?
Folgende Eigenschaften und Methoden, vereint in einer kleinen Funktion führen zur Lösung:
TMemo::Lines::Add
TStringList::Names
TStringList::ValuesWenn du etwas nicht schnallst wies beschrieben ist, frag nach. Aber frag gezielt nach und nicht "woraus ich irgendwie ned schlau werde ".
_property AnsiString Values[AnsiString Name] = {read=GetValue, write=SetValue};
Diese Zeile ist die Deklaration des Property "Values". Was verstehst du daran nicht? Welches sind die unbekannten in dieser Deklaration? Kannste vielleicht irgend was näheres in der Borland-Hilfe dazu erfahren? Gibt es da vielleicht nicht auch was dazu in der FAQ? Was bringt eine Suche nach TStringList und Values im VCL Forum - oder gar in den Usenet-Groups? Hast du vielleicht eine Theorie wie man das Teil da verwenden könnte? Hast du die Theorie schon getestet? Wie sieht die Theorie aus? Wieso hast du die Theorie noch nicht getestet? ...
Fragen über Fragen die du dir stellen solltest... aber was schreib ich hier überhaupt. Meinen Hinweisen folgst du ja eh ned. Wäre hald mit Arbeit verbunden...
-junix
EDIT: Ausserdem hat Linnea auch bereits alternativvorschläge gemacht mit denen man arbeiten könnte, statt hier rumzufluchen. Wieso bist du diesen Vorschlägen nicht nachgegangen?
-
Nur mal als Frage junix. Seit wann hat TStringList eine Eigenschaft namens Keys? Ist das mit BCB6 eingeführt worden? Bei mir (BCB5) heisst die äquivalente Eigenschaft Names.
-
Stimmt... Names wäre der korrekte Eigenschaft... hab keine VCL-Hilfe in der Nähe und alels ausm Kopf zusammenzudröseln is etwas schwierig (o;
-
junix schrieb:
Fragen über Fragen die du dir stellen solltest... aber was schreib ich hier überhaupt....
Aber Sokrates währe stolz auf Dich gewesen.
-
void __fastcall TForm1::BitBtn1Click(TObject *Sender) { ListBox1->Clear(); ini->ReadSection("Name",ListName); ini->ReadSection("Vorname",ListVorname); ini->ReadSection("Nummer",ListNummer); int i = 0; while ((i < ListName->Count) && (i < ListVorname->Count)) { AnsiString asName,asVorname,asNummer; asName = ini->ReadString("Name",IntToStr(i+1),""); asVorname = ini->ReadString("Vorname",IntToStr(i+1),""); asNummer = ini->ReadString("Nummer", IntToStr(i+1),""); if ((ListName->Strings[i]) == (ListVorname->Strings[i])) { ListBox1->Items->Strings[i] = AnsiString(asName) + " " + asVorname + " "+asNummer; } i++; } }
vieleicht nicht schön aber es rennt sauber.
-
|23| schrieb:
vieleicht nicht schön aber es rennt sauber.
Und wenn da zwischen drinn ein Record fehlt? also Sektion 1, 2, 4 und 5 existieren?
-junix
-
dieses kann ja nicht passieren da alle eingeben so gemacht werden das er automatisch immer im Key 1,2,3,4 usw. einträg und immer von der letzten Position anfängt, sprich ich bin beim Eintrag 23 und wenn ich einen weitern Eintrag mache mach lautet der Schlüssel 24.
aber dieses ist jetz nicht so schlim den jetzt will ich für das ganze ne suchfunktion schreiben. und diese soll nicht so simpel sein wie meien nadere:
for (int i=0; i<=AusgabeMemo1->Lines->Count; i++) if (AusgabeMemo1->Lines->Strings[i].Pos(SucheEdit1->Text)) Memo1->Lines->Add(AusgabeMemo1->Lines->Strings[i]);
es soll so gesucht werden das ich einen in ein Edit feld z.b das wort i eingebe und er mir alle eintrage zeigt die mit i anfangen und geb ich nahc dem i da g ein z.b ig soll er das automatisch erkennen und alle ergebnise mir ig ausgeben usw...
mfg
|23|
-
Da dein Ansatz zwar funktioniert aber auf lange sicht in den Abgrund führt, empfehle ich mal folgendes Stück Code zu testen:
TStringList *list_TSLp = new TStringList(); list_TSLp->Text = "Key1=Val1\r\nKey2=Val2\r\nKey3=Val3\r\n"; ShowMessage(list_TSLp->Values["Key2"]); delete list_TSLp;
-junix