TStringList-Problem
-
Hallo zusammen,
Ich muss eine Klasse schreiben, die ein TextFile erstellt (und Daten daraus liest, kommt aber später) und das nach einem bestimmten Muster, ähnlich dem Ini-File aber doch nicht ganz so. Also, meine Klasse sieht so aus://--------------------------------------------------------------------------- #include <vcl.h> #include "tgsd.h" #include <fstream.h> #include <map> //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall Tgsd::Tgsd(AnsiString Path_AS) { Path_AS_prvt=Path_AS; gsdList= new TStringList(); if (FileExists(Path_AS)) { gsdList->LoadFromFile(Path_AS_prvt); } } //--------------------------------------------------------------------------- __fastcall Tgsd::~Tgsd() { Stream_prvt.close(); gsdList->SaveToFile(Path_AS_prvt); delete gsdList;gsdList = NULL; } //--------------------------------------------------------------------------- bool __fastcall Tgsd::WriteComment(AnsiString Text) { int i=0; // Zählvariable damit die Gelöschten Zeichen im Hilfsstring dannach nicht fehlen. AnsiString TextChanged_AS = Text; // Hilfsstring damit für das Einfügen von ; eine Schlaufe gemacht werden kann. while (TextChanged_AS.Pos("\n")) { Text.Insert("\; ",TextChanged_AS.Pos("\n")+1+i); TextChanged_AS = TextChanged_AS.Delete(TextChanged_AS.Pos("\n"),1); i=i+3; } if (((gsdList->Strings[0])[1]) != '\;') gsdList->Insert(0,"\; " + Text); return 1; } //--------------------------------------------------------------------------- bool __fastcall Tgsd::WriteString(AnsiString Section, AnsiString Name, AnsiString Value) { if (gsdList->IndexOf("#"+ Section) == -1) gsdList->Add("#"+ Section); if (gsdList->IndexOf(Name + "=" + gsdList->Values[Name]) != -1) gsdList->Delete(gsdList->IndexOf(Name + "=" + gsdList->Values[Name])); try { int test=Value.ToInt(); gsdList->Add(Name + "=" + Value); } catch(...) { gsdList->Add(Name + "=\"" + Value + "\""); } return 1; } //--------------------------------------------------------------------------- bool __fastcall Tgsd::WriteEnd(AnsiString Name, int HexValue) { if (gsdList->IndexOf("; <Module-Definition-List>") == -1) { gsdList->Add("; <Module-Definition-List>"); gsdList->Add("Module = " + Name + " " + "0x" + IntToHex(HexValue,2)); gsdList->Add("EndModule"); return 1; } return 0; } //--------------------------------------------------------------------------- //---------------------------------------------------------------------------
ja, und ich rufe die Funktionen so auf:
void __fastcall TForm1::Button1Click(TObject *Sender) { Tgsd *gsd = new Tgsd("c:\\test.gsd"); gsd->WriteString("testSection", "testname","testvalue"); gsd->WriteString("testSection", "testname2","10"); gsd->WriteEnd("Preset Config PPO-Typ 1", 0x44); gsd->WriteComment(Memo1->Text); delete gsd; } //---------------------------------------------------------------------------
und mein TextFile das rauskommt sieht komischerweise so aus:
; =============== ; TTest von Tgsd ; leer ; =============== ; #testSection ; <Module-Definition-List> Module = Preset Config PPO-Typ 1 0x44 EndModule testname="testvalue" testname2=10
Warum ist das zeug von der Funktion gsd->WriteEnd("Preset Config PPO-Typ 1", 0x44); nicht am schluss, sondern ewas aus der Funktion
WriteString()?
Aus der Hilfe:Wenn die Liste nicht sortiert ist, wird S an das Ende der Liste angehängt.
Danke für die Hilfe!
-
Vermutlich hast du die Funktion zweimal aufgerufen, dann schreibt WriteEnd durch die if-Abfrage nichts in die Datei. Es steht noch der alte Eintrag drin, an den die WriteString Zeilen angefügt wurden.
-
ah ja, hups, genau das war es.
Danke!