Discussion:
TRichEdit -> Text einfügen
(zu alt für eine Antwort)
Carsten Schuette
2003-11-13 08:30:31 UTC
Permalink
Hallo,

ich habe ein TRichEdit und möchte nun den Inhalt eines Strings (den ich
zuvor aus einer anderen RTF-Datei gelesen habe) an der Cursorposition
einfügen, und zwar inkl. der Formatierungen.

Wenn ich einfach den Text einfüge schneidet das Control den Text
entweder nach dem eingefügten Text ab (ein Nullbyte hängt nicht am Ende
des Strings, das kann's also nicht sein) oder das Einfügen klappt nur
ohne die Formatierungen.

Hat jemand einen Tipp für mich?

Dank+Gruß,
Carsten Schuette

---
posted with XanaNews 1.15.7.4
Michael Winter
2003-11-13 21:19:52 UTC
Permalink
Post by Carsten Schuette
ich habe ein TRichEdit und möchte nun den Inhalt eines Strings (den ich
zuvor aus einer anderen RTF-Datei gelesen habe) an der Cursorposition
einfügen, und zwar inkl. der Formatierungen.
Das funktioniert ein wenig mühselig mit der Message EM_STREAMIN, und einem
Callback, das zu allem Überfluss auch noch mehrfach aufgerufen werden kann.
Hier sind zwei Methoden zum Lesen und Überschreiben der aktuellen Selektion
samt Callbacks:

uses
ComStrs, CommCtrl, RichEdit;

function GetRTFSelCB(dwCookie: LongInt; pbBuff: PByte; cb: Longint; var pcb: Longint): Longint; stdcall;
begin
pcb := cb;
if cb > 0 then begin
TStream(dwCookie).WriteBuffer(pbBuff^, cb);
Result := 0;
end else
Result := 1;
end;

function SetRTFSelCB(dwCookie: LongInt; pbBuff: PByte; cb: Longint; var pcb: Longint): Longint; stdcall;
begin
pcb := TStream(dwCookie).Read(pbBuff^, cb);
if pcb > 0 then
Result := 0
else
Result := 1;
end;

function GetRTFSelection(RichEdit: TRichEdit): String;
var
Str: TStringStream;
ES: TEditStream;
begin
Str := TStringStream.Create('');
try
ES.dwCookie := Integer(Str);
ES.dwError := 0;
ES.pfnCallback := GetRTFSelCB;
RichEdit.Perform(EM_STREAMOUT, SF_RTF or SFF_SELECTION, LongInt(@ES));
if ES.dwError <> 0 then
raise EOutOfResources.Create(sRichEditSaveFail);
Result := Str.DataString
finally
Str.Free
end
end;

procedure SetRTFSelection(RichEdit:TRichEdit; const Source: String);
var
Str: TStringStream;
ES: TEditStream;
begin
Str := TStringStream.Create(Source);
try
ES.dwCookie := Integer(Str);
ES.dwError := 0;
ES.pfnCallback := SetRTFSelCB;
RichEdit.Perform(EM_STREAMIN, SF_RTF or SFF_SELECTION, LongInt(@ES));
if ES.dwError <> 0 then
raise EOutOfResources.Create(sRichEditSaveFail);
finally
Str.Free;
end;
end;

und hier ein Beispiel, das die erste Zeile von RichEdit1 an RichEdit2
anhängt:

procedure TForm1.Button10Click(Sender: TObject);
begin
// RichEdit1: erste Zeile markieren
RichEdit1.SelStart := 0;
RichEdit1.SelLength := Length(RichEdit1.Lines[0]);
// RichEdit2: Cursor ans Ende
RichEdit2.SelStart := MaxInt;
// Text kopieren
SetRTFSelection(RichEdit2, GetRTFSelection(RichEdit1));
end;

-Michael
Carsten Schuette
2003-11-14 20:15:37 UTC
Permalink
werden kann. Hier sind zwei Methoden zum Lesen und Überschreiben der
Suuuuuuuuuuuuuuuuuper, danke!!

Carsten

Loading...