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! 😃


Anmelden zum Antworten