Memo



  • Bis lang hab ich immer nur ein Memofeld in CSV-Format gespeichert.Mit den Trennzeichen funktioniert auch soweit ganz gut. Aber sobald ich mehrere Memofelder zusammenfasse, wie oben beschrieben, bekomme ich Probleme.
    Gibts wirklich zu dem Problem keine andere Lösung? Für jeden Ansatz würde ich mich freuen.



  • Wahrscheinlich ist das Problem das, dass mit den einzelnen Memotexten die Steuerzeichen der Zeilenumbrüche mit
    in den Gesamttext einfliessen und du einen mehrzeiligen Text im Memo4 hast.
    Mit TrimRight entfernst du diese Steuerzeichen aus den einzelnen Memotexten...

    edit:Beispiel

    Memo4->Lines->Add(
       Memo1->Text.TrimRight() + ";\t" +
       Memo2->Text.TrimRight() + ";\t" +
       Memo3->Text.TrimRight());  // Memo 3 ohne Delimiter und Tab
    


  • Hey dies Funktioniert soweit.Danke 😉

    In Memo4 erscheint nun:

    Memo1;Memo2;Memo3;

    Aber sobald z.b. in Memo1 und in Memo2 Zahlen hinzukommen wie z.b.:

    Memo1 Memo2
    1 1
    2 2
    3 3

    Dann erscheint in Memo4:

    Memo1
    1
    2
    3; Memo2
    1
    2
    3; Memo3;

    Ich wollte eig.erreichen,dass Memo4 so aufgebaut ist

    Memo1Memo2Memo3;
    1 1
    2 2
    3; 3;

    Ist das Überhaupt möglich?



  • Hallo

    ja, das ist mit entsprechenden Aufwand möglich. Statt einfach den gesamten Inhalt von Memo2 an Memo1 anzuhängen, mußt du mit einer entsprechenden Schleife jede einzelne Zeile von Memo2 an die entsprechende Zeile von Memo1 anhängen. Natürlich mit Prüfung der Zeilenanzahl...
    TMemo ist auch nicht als Tabellenkomponente gedacht. Verwende z.B. TStringGrid, um den Benutzer direkt ohne Umwege über TMemo seine Daten in eine passende Tabellenkomponente einzugeben. Dann brauchst du nur noch beim CSV-Export die einzelnen Zellen des StringGrids zeilenweise abzulaufen, in ein manuell angelegte TStringList zusammenpacken und als Datei speichern.

    bis bald
    akari



  • Danke akari!

    Ich hab es mal mit einem StringGrid probiert und zwar so:

    StringGrid1->RowCount= Memo1->Lines->Count;
    //Anzahl Zeilen des Memos->Anzahl der Zeilen von StringGrid

    int i,x;
    for (i=0;i<Memo1->Lines->Count;i++) //Zeilen
    for (x=0;x<Memo1->Lines->Count;x++)
    StringGrid1->Cells[0][i]=Memo1->Lines->Strings[x]; //Ausgabe in Spalte 1

    int j,y;
    for (j=0;j<Memo2->Lines->Count;j++) //Zeilen Memo2
    for (y=0;y<Memo2->Lines->Count;y++)
    StringGrid1->Cells[1][j]=Memo2->Lines->Strings[y]; //Ausgabe in Spalte 2

    Für jedes Memofeld benutze ich eine Spalte.
    Nun ist das Problem, das die Schleife für die Strings[x]läuft nicht.Die sollte eig. die einzelen Zeilen des Memos durchlaufen.
    Bekomm hier immer die letzte Zahl aus dem z.b.Memo1 in meine StringGrid-Spalte1 geschrieben.
    Wo liegt hier das Problem? Wie könnte man das besser anstellen?



  • 🙂 Ich habs!Mein Fehler!

    StringGrid1->RowCount= Memo1->Lines->Count;
    //Anzahl Zeilen des Memos->Anzahl der Zeilen von StringGrid

    int i,x;
    for (i=0;i<Memo1->Lines->Count;i++) //Zeilen

    StringGrid1->Cells[0][i]=Memo1->Lines->Strings[i]; //Ausgabe in Spalte 1



  • Em, wie meinst du das mit:

    "Zellen des StringGrids zeilenweise abzulaufen, in ein manuell angelegte TStringList zusammenpacken und als Datei speichern"



  • klauslohs schrieb:

    ...in ein manuell angelegte TStringList zusammenpacken und als Datei speichern

    Manuell angelegt bedeutet auch dynamisch erzeugt.

    Umgesetzt würde der Code für das Auslesen des StringGrid so aussehen:

    TStringList *list = new TStringList();  // dyn. erz.
    
       for (int i = 0; i < StringGrid1->RowCount; i++) {
          String Line;
          for (int j = 0; j < StringGrid1->ColCount; j++) {
             // Eintrag der Zeile zellenweise sammeln und Delimiter anhängen
             Line += StringGrid1->Cells[j][i] + ';';
          }
          list->Add(Line);
       }
       list->SaveToFile("test.csv");
       delete list;
    

    Mit einem Doppelklick auf das Datei-Icon im Datei-Explorer sollte Excel eine dem StringGrid entsprechende Tabelle präsentieren.

    mfg
    kpeter



  • Man könnte die StringList noch in einen auto_ptr packen. Dann braucht man auch kein delete mehr.



  • Braunstein schrieb:

    Man könnte die StringList noch in einen auto_ptr packen. Dann braucht man auch kein delete mehr.

    Machen wir mal:
    Zeile 12 wird entfernt.

    #include <memory>
    // wir schreiben in Zeile 1
       std::auto_ptr<TStringList> list(new TStringList);
    


  • Danke an allen Helfern! Das läuft! 😃


Anmelden zum Antworten