RichEdit->PlainText
-
'n Abend
Ich habe ein RichEdit und möchte formatierten Text in die Zwischenablage kopieren. Das geschieht eigentlich von alleine.
Allerdings möchte ich bereits bei Keydown im wissen, wie der selektierte Bereich formatiert ist.
Das Clipboard weiß ja auch wie es unterm SelText aussieht.
Wenn ich RichEdit->PlainText auf false setze, sagt die Borlandhilfe, das man mit formatiertem Text arbeitet. Ich kriege aber immer nur reinen Text.
Ausserdem versuche ich auch bei Einfügen des formatierten Textes
per Clipboard()->AsText an den Text ranzukommen.
Ich meine auch AsText müsste formatierten Text rauskommen. RichEdit speichert ja keine Binärdaten.Was tun?
-
TRichEdit verfügt über eigene Clipboardfunktionen. Wenn Du die verwendest, wird die Formatierung beibehalten.
-
Ja genau.
Zu diesem Zweck habe ich mir dieses Monster hier gebasteltAnsiString UnformatRichText(TRichEdit *RichEdit1) { TMemoryStream *MemS = new TMemoryStream(); TStrings *StrL = new TStringList; TRichEdit *tmpRichEdit = new TRichEdit(RichEdit1->Parent); RichEdit1->CopyToClipboard(); tmpRichEdit->Visible = false; tmpRichEdit->Parent = RichEdit1->Parent; tmpRichEdit->PlainText = false; tmpRichEdit->PasteFromClipboard(); tmpRichEdit->Lines->SaveToStream(MemS); MemS->Position = 0; StrL->LoadFromStream(MemS); AnsiString returnString = StrL->Text; delete tmpRichEdit; delete MemS; delete StrL; return returnString; }
-
Hallo,
Wozu soll das gut sein was du hier tust. Wenn du unformatierten Text haben willst, sollte RichEdit->Lines->Text ausreichen.
-
Oder, wenn Du unbedingt über die Zwischenablage gehen willst:
AnsiString DerText = Clipboard()->AsText;Das liefert Dir, unabhängig davon, ob formatierter Text eingefügt wurde, unformartierten Text.
Allerdings finde ich, dass Deine Postings sich wiedersprechen. Im ersten Posting willst Du formatierten Text in der Zwischenablage habe und beschwerst Dich, dass Du nur 'plain' Text bekommst. Der Name der von Dir geposteten Funktion deutet aber darauf hin, dass Du unformatierten Text haben willst.Ach so, nicht vergessen, zu prüfen, ob in der Zwischenablage überhaupt etwas als 'plain' Text enthalten ist. Stichwort Clipboard()->HasFormat();
-
Mißverständnis.
Ich möchte den RichEdit-Quelltext haben.
Also sowas{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil MS Sans Serif;}}
Und das gegebenenfalls nur von selectiertem Text
-
Dann verwende die Clipboard-Funktionen des RichEdit. Solange PlainText auf false steht, bleibt die Formatierung erhalten.
-
Ja siehe oben in meinem Codebeispiel.
Oder meinst Du es geht unkomplizierter?
-
Was machst Du denn mit dem AnsiString, in dem die RTF-Anweisungen enthalten sind? Wozu soll es gut sein, die RTF-Anweisungen in dem AnsiString zu haben?
-
Wie gesagt, ich bastele an einer UNDO-REDO Funktion.
Die Aktionen werden in einer Liste Documentiert ,um sie Schritt für Schritt
Vor und Rückwärts zu durchlaufen.Wenn ich aber buntgefärbten(nicht einfarbig gefärbten) Text ausschneide, und ihn woanders wieder hinsetze, kann ich die RTF-Formatieung in ,einer Liste nicht nur über den reinen Text nachvollziehen, sondern speicher den RTF-Quelltext in die Liste usw...
Funktioniert jetzt auf jeden Fall.
-
Tja, weiß nicht. Die Lösung gefällt mir zwar nicht wirklich, aber mir fällt auch nichts besseres ein. Müßte ich mich mal mit auseinander setzen. Dazu fehlt mir aber die Zeit.
-
Mir gefällt die Lösung auch nich richtich
-
Hallo, ich habe das mal vor einiger Zeit so gemacht:
//============================================================================== /*! \brief set formated text (RichText) to RTF control \param AnsiString RtfCode - formated text (RichText) \retval none \return void */ //============================================================================== void __fastcall TfrmCommentDialog::SetText(AnsiString RtfCode) { TStringStream *pStream = new TStringStream(RtfCode); rtfText->Lines->LoadFromStream(pStream); delete pStream; } //============================================================================== /*! \brief get formated text (RichText) from RTF control \param void \retval none \return AnsiString - formated text (RichText) */ //============================================================================== AnsiString __fastcall TfrmCommentDialog::GetText() { TStringStream *pStream = new TStringStream(""); AnsiString saRtfCode; rtfText->Lines->SaveToStream(pStream); saRtfCode = pStream->DataString; delete pStream; return saRtfCode; }Gruß Nighthero
-
Ja aber,
So hast Du das ganze RichEdit im TMemoryStream.
Wenn Du vorher ins Clipboard kopierst kannst Du eben auch nur die selektierte Auswahl holen
-
du solltest statt richedit 1.0 mind. die richedit 2.0 verwenden, dort gibts dann multilevel undo/redo
siehe MDSN:
EM_GETTEXTMODE, EM_GETUNDONAME, EM_GETREDONAME, EM_SETUNDOLIMIT
-
Danke für den Tip.
Verstehe aber nur ein Viertel.
z.B CreateWindowEx? geht gar nich rein.
-
http://home.att.net/~robertdunn/Yacs.html
http://home.att.net/~robertdunn/CodeSamples/RichEdit20.zip
-
Probiere gerade den Code aus und werde mit Fehlern bombardiert.
Erst fing es an in der Funktion
bool TRichEdit20::FindTextEx(AnsiString text, int startPos,
TFindOptions findOptions, int& foundPos, int& foundLength)in class richedit20
Da kam es zu Zweideutigkeiten mit
FINDTEXTEX.
Ich habe dann daraus Richedit::FINDTEXTEX gemacht.Das wurde zwar akzeptiert, aber jetzt hagelt es andere Fehler
Alles voll mit "......Typname erwartet"
-
fang doch erstmal klein an und nimm nur den teil der die richedit20.dll laedt und das entspr. steuerelement auf deinem formular erzeugt. damit du erst einmal sichre sein kannst, dass es ueberhaupt funktioniert.
-
Jetzt funktioniert alles,
Weiß auch nicht so genau warum.Danke erst mal.