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 ausstd::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.