Text aus Memo ausschneiden



  • Hallo zusammen,

    könnt Ihr mir bei einem kleinen Problem helfen?

    Ich habe ein Memo Feld. In dem steht 123456. Jetzt möchte ich die 3. Stelle ausschneider und einem Char zuweisen.

    Char Text;
    Ausschneider der 3. Stelle -> Text;
    So jetzt muss ich noch kurz aus der 3. Stelle einen Int Wert erstellen (atoi).

    Ist bestimmt nur ein kleiner Befehl aber ich habe Ihn gestern nicht rausbekommen. Ich hatte immer Probleme mit AnsiString und String Konvert.

    Thx a lot.

    blue3



  • Über Memo1->Lines->String[] kommst du an die einzelnen Zeilen in deinem Memofled. Ich denk damit kommst du schon weiter 😉

    Achja, du kannst auch StrToInt() verwenden, um Strings in Zahlen zu konvertieren 🙂



  • Moin Moin,

    wie kann ich denn eigentlich aus der Zahle 123456 nur die dritte stelle auslesen.

    Unter Unix gibt es dort den Befehl cut unter C kenne ich ihn nicht.

    Ich stelle mir das so vor:

    Zeile = 123456
    Jetzt soll die dritte Stelle also die 3 in eine Variable umgeleitet werden.

    Blue3



  • int v;
    v=Memo1->Lines->Strings[1][3];
    


  • THX a Lot



  • Zwerg23 schrieb:

    int v;
    v=Memo1->Lines->Strings[1][3];
    

    Auch wenn's nur ein Beispiel ist, aber bitte nicht so!

    Du kannst folgerndermaßen vorgehen:

    int zahl = StrToInt(Memo1->Lines->Strings[0][3]);
    


  • Auch wenn's nur ein Beispiel ist, aber bitte nicht so!

    Du kannst folgerndermaßen vorgehen:

    int zahl = StrToInt(Memo1->Lines->Strings[0][3]);
    

    [/quote]

    Warum nicht? Ich persönlich würde deine Lösung sogar schlimmer finden 😃

    Begründung:

    Memo1->Lines->Strings[0]
    

    is vom typ AnsiString, da sind wir uns ja wohl einig.

    Memo1->Lines->Strings[0][3]
    

    ist nun ein Zeichen dieses Strings, also vom Typ int (oder von mir aus auch vom Typ char)
    nun ist aber der Aufruf

    StrToInt(Memo1->Lines->Strings[0][3])
    

    sehr unpassend 😉 da es ja keinen String mehr gibt



  • Bei deinem Beispiel würde er aber auch nicht die gewünschte Zahl erhalten. Er würde den Ascii-Code für die Zahl "3" erhalten, will aber die Zahl 3 selbst erhalten.



  • Zwerg23 schrieb:

    int v;
    v=Memo1->Lines->Strings[1][3];
    

    [...]

    Memo1->Lines->Strings[0][3]
    

    ist nun ein Zeichen dieses Strings, also vom Typ int (oder von mir aus auch vom Typ char)

    Offenbar möchte blue3 nicht den ASCII-Wert des Zeichens wissen (was das Resultat deines Beispieles wäre), sondern den Wert der Ziffer.
    StrToInt funktioniert deshalb, weil intern ein temporärer AnsiString erzeugt wird. Und der Konstruktor von AnsiString ist so überladen, dass er auch char als Parameter akzeptiert.



  • Ok, is aber wohl auch dann nicht die feine Art, wenn es "unbedingt" der Zahlenwert selber sein muss, dann besser wohl so:

    int v;
    v=Memo1->Lines->Strings[0][3]-'0';
    

    Aber da fällt mir noch was viel besseres ein:

    int v;
    v=StrToInt(Memo1->Lines->Strings[0].SubString(3,1));
    


  • Ein Vorteil von StrToInt ist, dass eine Exception geworfen wird, falls es sich bei dem Zeichen nicht um eine Ziffer handelt, was andernfalls von Hand geprüft werden müsste (isdigit() o.ä.).

    Und was soll an der SubString-Variante besser sein?
    Falls das ironisch gemeint war (Smiley vergessen?), warum dann nicht so:

    v=StrToInt(Memo1->Lines->Strings[0].SubString(3,1)[1]);
    

    😉



  • SubString hätte den Vorteil, dass - wenn die Variable mal aus 2 Ziffern bestehen würde - eine Wandlung genauso einfach währe
    z.B. so:

    int v;
    v=StrToInt(Memo1->Lines->Strings[0].SubString(3,2));
    

Anmelden zum Antworten