TRichEdit string.find und GetTextLen()



  • Hallo Zusammen,

    wieso wird bei s.find("\r") das Zeichen "" ignoriert und bei GetTextLen() nicht?

    TForm_main* Frm = Form_main;
    TRichEdit* re = Frm->RichEdit_main;
    TMenuItem* mmi = Frm->MenuItem_NC_code;
    TCheckBox* cb = Frm->CheckBox_neueZeile;
    
    const std::string Satzende = "\r";
    const std::size_t l_satzende = Satzende.length(); // nur Länge ermitteln
    
    if (mmi->Checked == true) {
        if (cb->Checked == true) {
            String str;
            for (auto x : Value) { // UnicodeString
                str.operator+=(x);
            }
            re->Lines->Append(str);
        } else {
            re->SelStart = 0;
            re->SelLength = re->GetTextLen();
            String str = re->SelText; // UnicodeString
            std::string s(str.begin(), str.end()); // std::string
            std::size_t l_length = re->GetTextLen();
    
            std::vector<std::size_t> xpos;
            std::size_t found = 0; // unbedingt initialisieren
            while ((found = s.find(Satzende, found)) != std::string::npos) {
                xpos.push_back(found);
                found += Satzende.length();
            }
    
            std::size_t zaehler = 0;
            std::size_t max = 0;
            std::string m;
            for (auto x : xpos) {
                max = x;
                zaehler++;
                m.operator+=(std::to_string(x));
                m.operator+=(char(59));
            }
            StatusBarSub(Frm->StatusBar_main, 3, m.c_str());
    
            if (max == l_length) {
                s.erase(max, Satzende.length());
            }
    
            if (l_length > 0) {
                s.operator+=(char(32));
                s.operator+=(Value);
            } else {
                s.operator+=(Value);
            }
            re->Text = s.c_str();


  • Dieser Beitrag wurde gelöscht!


  • @xfor9 sagte in TRichEdit string.find und GetTextLen():

    wieso wird bei s.find("\r") das Zeichen "" ignoriert und bei GetTextLen() nicht?

    Der Unterschied zwischen s.find("\r") und GetTextLen() liegt in der Art und Weise, wie sie das Zeichen "\r" behandeln.

    s.find("\r"): Die std::string-Methode sucht nach der Zeichenfolge \r und ignoriert \n, da es explizit nach \r sucht.

    GetTextLen(): Diese Methode zählt alle Zeichen im Text, einschließlich der unsichtbaren Zeichen wie \r, die Teil von \n (Zeilenumbruch) sind.



  • @Erhard-Henkes
    vielen Dank für die Antwort.

    beim Debugger hab ich das jetzt auch herausgefunden, nur wie kann ich das dann machen ?
    Suche den letzten Zeilenumbruch und Diesen dann löschen.



  • @xfor9
    meine Lösung:
    TForm_main* Frm = Form_main;
    TRichEdit* re = Frm->RichEdit_main;
    TMenuItem* mmi = Frm->MenuItem_Editor_code;
    TCheckBox* cb = Frm->CheckBox_neueZeile;

    const std::string lineFeed = "\r";
    const int l_lineFeed = lineFeed.length(); // nur Länge ermitteln
    
    if (mmi->Checked == true) {
        if (cb->Checked == true) {
            String str;
            for (auto x : Value) { // UnicodeString
                str.operator+=(x);
            }
            re->Lines->Append(str);
        } else {
            re->SelStart = 0;
            re->SelLength = re->GetTextLen(); // Gesamter Text
            String str = re->SelText; // UnicodeString
            std::string s(str.begin(), str.end()); // C++ string
            std::vector<int> xpos;
    
        START:
            int l_length = s.length();
            int found = s.rfind(lineFeed);
    
            if (found != std::string::npos) {
                if ((found + lineFeed.length()) == l_length) {
                    s.erase(found, lineFeed.length());
                    goto START;
                }
            }
    
            s.operator+=(char(32));
            s.operator+=(Value);
    
            re->Text = s.c_str();
            StatusBarSub(Frm->StatusBar_main, 3, std::to_string(found).c_str());
        }
    }


  • Gibt's nen Grund dafür, dass du operator+= ausschreibst, anstatt direkt die Zeichen anzuhängen?
    Oder noch besser: konstruier´ den String direkt aus std::string:

    String const Str( s.c_str() );
    
    // += statt operator+=()
    s += ' ';   // s.operator+=( (char) 32 );
    s += Value; // s.operator+=( Value  );
    

    Noch ne Frage:
    Du greifst von außerhalb des Formulars auf Formularelemente (TRichEdit, TMenuItem, TCheckBox, etc.) zu? Das ist absolutes no go!



  • @xfor9 sagte in TRichEdit string.find und GetTextLen():

    goto START

    Tue mir bitte einen Gefallen. Wirf bitte alle goto Anweisungen heraus und versprich mir bitte, sowas nie wieder zu tun.

    Nutze stattdessen Schleifen oder Funktionen.


Anmelden zum Antworten