Memo



  • Hey Leute!

    Ich hab ein Problem und ich hoffe ihr könnt mir helfen.

    In 3 Memofelder habe ich jeweils unterschiedliche Zahlen untereinander stehen. Den Inhalt der 3 Memofelder übertrage ich ein viertes Memofeld mit folgendem Text.

    TMemo* Memo[3] = {Memo1, Memo2, Memo3};

    for (int i = 0; i < 3; i++)
    {
    Memo4->Lines->Add(Memo[i]->Text);
    }

    Mein Problem ist, das es den Inhalt der 3 Memofelder im 4ten Memofeld untereinander schreibt. Das ist mir auch soweit klar, dass das passiert. Da ich ja Add verwende und am Ende der Zeichenkette die neue Liste hinzufügt.

    Gibt es eine Möglichkeit den Inhalt nebeneinander wie in Spalten im 4ten Memofeld hinzuzufügen? In der Art wie eine Tabelle?
    Oder gibt es noch eine andere Möglichkeit?



  • Hmm, soweit ich weiß, gibt es in TMemo keine Möglichkeit Spalten einzuziehen.

    Mit TListView kannst du allerdings Spalten erstellen.

    Gruß Smoose



  • Du kannst natürlich auch das Tabulatorzeichen '\t' als Trenner benutzen:

    TMemo* Memo[3] = {Memo1, Memo2, Memo3};
    
    String sText;
    for (int i = 0; i < 3; i++)
    {
      sText += Memo[i]->Text;
      sText += '\t';
    }
    Memo4->Lines->Add(sText); // als 1 Zeile ausgeben
    


  • Danke erstmal!

    Im weitern liegt noch mein Problem noch darin,dass ich das 4te Memofeld als Textfile abspeichere und das mit Excel öffne. Dabei sollte die einzelnen Memofelder die ja nun im 4ten Memofeld enthalten sind in den einzelnen Spalten dargestellt werden.
    Hat da jemand noch eine hilfreiche Idee?



  • Für Excel eignet sich am besten das CSV-Format, s.a. http://de.wikipedia.org/wiki/CSV_(Dateiformat) (also Semikolons als Standard-Trennzeichen).



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


Log in to reply