RichEdit, Text einfügen, dabei ggf. abschließendes Return entfernen
-
Auch wenn man trennscharf kopiert, aus HTML eingefügter Text ins RichEdit schließt mit einem Return ab. Das will ich löschen.
Ich hatte schon viele Versuche, bisher gelang es nur über ein Dummy-RichEdit. Aber sowas ist unbefriedigend, irgendwie kein Programmiersti(e)l. Was ich momentan hab, hat den Vorteil, daß mein BCB die Syntax akzeptiert, hat den Nachteil, daß es nichts bewirkt. :p
int clippos = Txt->SelStart; Txt->PasteFromClipboard(); AnsiString PasteText = Txt->Text.SubString(clippos,Txt->SelStart-clippos); // Tastaturzeichen werden erkannt, das '\n' nicht. if (PasteText[PasteText.Length()] == '\n') // zeigt auch ohne die if-Anweisung keinen Effekt PasteText.TrimRight();
Nun steh ich da, ich armer Tor
und bin verwirrter, als zuvor. :p
-
Nach dem Pasten ist es zu spät, von da an sorgt die interne StringList des RichEdit unerbittlich für die Umbrüche.
Du musst du dir den Clipboard-Inhalt selbst holen, ggf. bearbeiten und dann im RE einfügen, siehe TClipBoard.
Bei aus Opera kopiertem und per PasteFromClipboard eingefügtem Text wird übrigens kein ungewollter Zeilenumbruch angehängt.
-
Jaaaa, auf den richtigen Browser kommt es an. :p Gesaugt hab ich ihn schon, aber ich komm damit (noch) nicht in unser internes Board (HTA-Login). Ein weiterer Ansporn, es weiter zu versuchen.
Hmmm... es gelang mir aber schon, '\n' im RichEdit zu löschen. Nur eben nicht an der gewünschten Stelle. Hatte gehofft, mal eine gezielte Stringmanipulation hinzubekommen. Aber was nicht gehen kann...
Bzw. Delete(12,93) schneidet Zeichen aus. Aber das wird wohl auch das '\n' höchstens miterfassen. Muß also doch mit dem Dummy arbeiten. Wenn es der Weg ist, ist es auch kein schlechter Programmiersti(e)l.
Im Clipboard selbst arbeiten, ist wohl im BCB3 noch nicht unterstützt (bin aber nicht ganz sicher). Auf jeden Fall hatte ich schon fehlgeschlagene Versuche, die an und für sich richtig aufgebaut waren (davon war ich zumindest überzeugt *grins*).
Dank dir sehr, @Jansen, jetzt seh ich klarer.
-
Den bereinigten Text vom Dummy ins Clipboard kopieren, dann ins Ziel-RichEdit pasten klappt. Jetzt versuche ich, SelText direkt via Insert zu übernehmen. Eine ShowMessage kann den Text anzeigen, ins Ziel-RichEdit bring ich ihn aber nicht. Es gelingt weder wie im Code unten, noch als String DruidStr, noch als String "Quatsch". Das hängt mir jetzt zu hoch. Insert muß doch möglich sein. Falsche Syntax?
if (Clipboard()->HasFormat(CF_TEXT)) { int zielpos; // Dummy-RichEdit Druide->SelectAll(); Druide->ClearSelection(); Druide->PasteFromClipboard(); AnsiString strText = Druide->Text; if (strText[strText.Length()] == '\n') { zielpos = Druide->SelStart-1; Druide->SelStart = 0; Druide->SelLength = zielpos; //Funktioniert, ich such den direkten Weg //Druide->CopyToClipboard(); } else Druide->SelectAll(); //Funktioniert, ich such den direkten Weg //RichEdit->PasteFromClipboard(); RichEdit->Text.Insert(Druide->SelText, RichEdit->SelStart);
-
Insert fügt eine Zeile ein, was du brauchst ist SelText.
-
Ich mag Referenzen. Wenn nur nicht immer wieder das kleine entscheidende i-Tüpfelchen fehlen würde.
Ich brauch SelText????? <- So viele Staunfalten bekam meine Stirn.
Natürlich funktioniert es.
Grundsätzlich hab ich's sogar verstanden. Aber selbst wär ich da nie drauf gekommen. Auf jeden Fall ganz großen Dank, @Jansen. Ein lang umknobeltes Thema ist im Kasten.
Aber halt dich fest, den else-Zweig hab ich jetzt erst dazugesetzt, als ich den vermeintlichen Fehler gesehen hab. Aber nur wie ich es ursprünglich hatte, läuft es zuverlässig. Dabei sollte int zielpos einen zufälligen Wert haben, wenn am Ende des Dummy kein '\n' ist. Ich halt's im Kopf nicht aus. Es funktioniert präzise, obwohl das IMHO gar nicht sein darf.
Druide->PasteFromClipboard(); AnsiString strText = Druide->Text; if (strText[strText.Length()] == '\n') { zielpos = Druide->SelStart-1; Druide->SelStart = 0; Druide->SelLength = zielpos; } clippos = Txt->SelStart; RichEdit->SelText = Druide->SelText, RichEdit->SelStart;