stringlist / speichern / laden / hinzufügen



  • hallo Ihr,

    hab wiedermal ein kleines Problem 😉 und zwar hab ich eine Stringliste in der ich etwas hinzufügen will, an der nächsten freien Stelle wo nichts drin steht um genau zu sein habs mit einer for schleife versucht wo der erste Wert jeweils in einen AnsiString geladen wird un geschaut wird ob er leer ist, scheint aber irgendwie nicht zu funktionieren als erstes hat er es immer ans ende geschmissen jetzt bin ich an der 20stelle angelangt 🙂 woran kann das liegen gibts eine vorgegebene funktion um zu wissen ob die zelle leer ist?

    greetz
    hck

    //--> Wiedervorlage bzw. TStringList wird gefüllt...
    //Wiedervorlage vorbereiten / füllen
    #define SIZEOF_BUFFER 1024
    FILE *fp;
    int row;
    char *buffer=new char[SIZEOF_BUFFER];
    
    // Datei zum Lesen öffnen
    if((fp=fopen("c:\\wv.txt", "r"))==NULL)
    {   ShowMessage("Datei konnte nicht geöffnet werden");
        delete buffer;
        return;
    }
    
    // Griddaten einlesen
    for(row=0; fgets(buffer, SIZEOF_BUFFER, fp); row++)
        sg_wv2->Rows[row]->CommaText=buffer;
    
    fclose(fp);
    delete buffer;
    //Füllen ist fertig
    
    ----------------------------
    
    //neue wiedervorlage in StringList einfügen
    AnsiString tst;
    int rl,rl2;
    
     for(int ui;ui<50;ui++)
     {
     tst = sg_wv2->Cells[0][ui];
     rl = tst.AnsiPos(" ");
      if(rl == 1)                                 //besagte Schleife
       rl2 = ui;
       ui = 49;
     }
    
    sg_wv2->Cells[0][rl2-1] = e_wvdatum->Text;
    sg_wv2->Cells[1][rl2-1] = e_wvuhrzeit->Text;
    sg_wv2->Cells[2][rl2-1] = e_wvnotiz->Text;
    sg_wv2->Cells[3][rl2-1] = Edit1->Text;
    sg_wv2->Cells[4][rl2-1] = Edit2->Text;       //An dieser Stelle Dateneintrag      
    sg_wv2->Cells[5][rl2-1] = Edit3->Text;
    sg_wv2->Cells[6][rl2-1] = Edit4->Text;
    sg_wv2->Cells[7][rl2-1] = Edit5->Text;
    sg_wv2->Cells[8][rl2-1] = Edit6->Text;
    sg_wv2->Cells[9][rl2-1] = Edit7->Text;
    
    FILE *fo;
    int rows, rowscount;
    
    rowscount=sg_wv2->RowCount;
    
    // Datei zum Schreiben öffnen
    if((fo=fopen("c:\\wv.txt", "w"))==NULL)
    {   ShowMessage("Datei konnte nicht geöffnet werden");
        return;
    }
    
    // Griddaten schreiben                                       //Daten speichern
    for(rows=0; rows<rowscount; rows++)
    {   fputs(sg_wv2->Rows[rows]->CommaText.c_str(), fo);     
        fputc('\n', fo);
    }
    
    fclose(fo);
    


  • Hallo

    kommt davon, wenn man C und VCL miteinander mischt.

    Jedenfalls schmeiß die ganzen c-Funktionen (fopen, fputs...) raus und benutz die Mittel der VCL. Mit einer TStringList ist das ganze viel kürzer und übersichtlicher.

    /Edit : und zum eigentlichen Thema :

    for(int ui;ui<50;ui++) // ui wird nicht initialisiert
     {
     tst = sg_wv2->Cells[0][ui];
     rl = tst.AnsiPos(" "); // Das überprüft nicht, ob tst leer ist!
      if(rl == 1) // Wenn ein Schleifenkörper                               mehrere Anweisungen hat, must du diese in {...} einschließen, sonst wird nur die erste ausgeführt
       rl2 = ui;
       ui = 49;
     }
    

    bis bald
    akari



  • ok ist rausgeschmissen jetzt macht er es an die letzte stelle allerdings nur beim ersten mal danach werde die werte einfach immer nur überschrieben...



  • Hallo

    schau dir nochmal mein Edit vom letzten Post an.

    bis bald
    akari



  • hab die schleife mal umgeschrieben -->

    for(int ui=0;ui<50;ui++)
     {
     tst = sg_wv2->Cells[0][ui];
      if(tst.IsEmpty() == true)
       {rl2 = ui;ui = 50;}
     }
    

    mitdem selben ergebnis das letzt gespeicherte wird überschrieben --> bzw. auch nich direkt unter den anderen einträgen gelistet sondern irgendwo im stringgrid



  • Hallo

    sorry ich habe den Überblick verloren, was du eigentlich machen willst und wo genau dein Problem ist.
    Poste nochmal deinen aktuellen, relevanten Code und beschreib dein Problem verständlicher. Am besten mit Beispiel.

    bis bald
    akari



  • sry 😉

    und zwar möchte ich ne art wiedervorlage machen mit datum, uhrzeit un nen kleinen text. das laden der wiedervorlage is kein problem, sondern in dem fall das auslesen und neu speichern --> angenommen den fall ich möchte "24.12.2006,
    10:00, Weihnachtskarten verschicken, Herr Alfred, Gurke, Strasse, PLZ, etc" eintragen macht er das ganze ohne Probleme allerdings an einer komplett falschen stelle die schleife soll ja prüfen ob die erste zelle eines datensatzes leer, wenn nicht geht er weiter, ist sie leer soll schleife abgebrochen werden un in die aktuelle zelle der text reingeschrieben werden.

    komischerweise schreibt er den datensatz nicht unter den vorhandenen sondern irgendwo im stringgrid rein (schleife hat also im endeffekt keine/kaum wirkung), bei nochmaligen aufrufen des formulars wird der letzt gespeicherte datensatz überschrieben...
    hoffe das war halbwegs verständlich.

    AnsiString tst;
    int rl,rl2;
    
     for(int ui=0;ui<50;ui++)
     {
     tst = sg_wv2->Cells[0][ui];
      if(tst.IsEmpty() == true)   // Schleife Überprüfung ob zelle leer ist
       {rl2 = ui;ui = 49;}
     }
    
    sg_wv2->Cells[0][rl2-1] = e_wvdatum->Text;
    sg_wv2->Cells[1][rl2-1] = e_wvuhrzeit->Text;
    sg_wv2->Cells[2][rl2-1] = e_wvnotiz->Text;
    sg_wv2->Cells[3][rl2-1] = Edit1->Text;
    sg_wv2->Cells[4][rl2-1] = Edit2->Text;
    sg_wv2->Cells[5][rl2-1] = Edit3->Text;           // Datensatz wird geschrieben
    sg_wv2->Cells[6][rl2-1] = Edit4->Text;
    sg_wv2->Cells[7][rl2-1] = Edit5->Text;
    sg_wv2->Cells[8][rl2-1] = Edit6->Text;
    sg_wv2->Cells[9][rl2-1] = Edit7->Text;
    
    TStringList *list = new TStringList();
    
    list->Add(sg_wv2->ColCount);
    for (int y = 0; y < sg_wv2->RowCount; y++)
       list->Add(sg_wv2->Rows[y]->CommaText);
    
    list->SaveToFile("c:\\wv.txt");
    delete list;
    


  • Hallo

    rl2 = sg_wv2->RowCount; // Startwert
    for(int ui=0;ui<sg_wv2->RowCount;ui++) // keine absolute Grenze, sondern eben alle Zeilen
     {
      if(sg_wv2->Cells[0][ui].IsEmpty())   // String nicht kopieren, Bedingung verbessert
      { 
        rl2 = ui; 
        break; // automatischer abbruch
      }
     }
    
    if (rl2 == sg_wv2->RowCount)
    {
      // etwas machen, wenn keine leere Zeile gefunden wurde
    }
    else
    {
      sg_wv2->Cells[0][rl2] = e_wvdatum->Text; // kein -1
      ...
    }
    

    bis bald
    akari



  • öhhhhhm darauf wär ich nicht gekommen 😉 funzt bloß so wie du es geschrieben hast nicht hab da jetzt noch eine kleine Anpassung vorgenommen und es läuft einwandfrei für jemanden den interessiert noch kurz quelltext.

    danke akari!!!

    AnsiString tst;
    int rl2;
    
    for(int ui=0;ui<sg_wv2->RowCount;ui++)
     {
      tst = sg_wv2->Cells[0][ui];
      tst = tst.Trim();
      if(tst.IsEmpty() == true)
      {
        rl2 = ui;
        break;
      }
     }
    


  • Hallo

    Das liegt eben, das "ist leer" und "scheint leer zu sein" nicht das gleiche ist.
    Leerzeichen sind eben auch Zeichen. Hättest du von Anfang an gesagt, das in den Zellen auch Leerzeichen sein können, die als leer gelten, hät ich das so geschrieben 😉

    for(int ui=0;ui<sg_wv2->RowCount;ui++)
     {
      if(sg_wv2->Cells[0][ui].Trim().IsEmpty())
      {
        rl2 = ui;
        break;
      }
     }
    

    bis bald
    akari



  • naja die leerzeichen dürften ja nur durch die vcl speicherweise kommen 😛

    meine datei sieht so aus deswegen, hab ich mir gedacht versuch ich das mal ^^

    10
    Datum,Uhrzeit,Text," "," "," "," "," "," "," "
    27.11.2006,13:18:20,"keine ahnung was denkst klappt?",Cosimo,Abbruzzese,"*** 3",,40822,,****2
    " "," "," "," "," "," "," "," "," "," "


Anmelden zum Antworten