Da ich das ja nun anders gelöst habe, bekomme ich beim Einfügen ein anderes Problem.
Hier mal zur Übersicht die Funktionen, die ich aus o.G. thead übernommen habe:
Delphi-Quellcode:
type
TEditStreamCallBack = function (dwCookie: Longint; pbBuff: PByte;
cb: Longint; var pcb: Longint): DWORD; stdcall;
TEditStream = record
dwCookie: Longint;
dwError: Longint;
pfnCallback: TEditStreamCallBack;
end;
function EditStreamInCallback(dwCookie: Longint; pbBuff: PByte;
cb: Longint; var pcb: Longint): DWORD; Stdcall;
var
theStream: TStream;
dataAvail: LongInt;
begin
theStream := TStream(dwCookie);
with theStream do
begin
dataAvail := Size - Position;
Result := 0; {assume everything is ok}
if dataAvail <= cb then
begin
pcb := Read(pbBuff^, dataAvail);
if pcb <> dataAvail then {couldn't read req. amount of bytes}
result := UInt(E_FAIL);
end
else
begin
pcb := Read(pbBuff^, cb);
if pcb <> cb then
result := UInt(E_FAIL);
end;
end;
end;
function EditStreamOutCallback(dwCookie: Longint; pbBuff: PByte; cb:
Longint; var pcb: Longint): DWORD; stdcall;
var theStream: TStream;
begin
theStream := TStream(dwCookie);
with theStream do
begin
if cb > 0 then
pcb := Write(pbBuff^, cb);
Result := 0;
end;
end;
procedure GetRTFSelection( aRichEdit: TRichEdit; intoStream: TStream );
var editstream: TEditStream;
begin
with editstream do
begin
dwCookie:= Longint(intoStream);
dwError:= 0;
pfnCallback:= EditStreamOutCallBack;
end;
aRichedit.Perform( EM_STREAMOUT, SF_RTF or SFF_SELECTION,
longint(@editstream));
end;
procedure PutRTFSelection( aRichEdit: TRichEdit; sourceStream: TStream
);
var editstream: TEditStream;
begin
with editstream do
begin
dwCookie:= Longint(sourceStream);
dwError:= 0;
pfnCallback:= EditStreamInCallBack;
end;
aRichedit.Perform( EM_STREAMIN, SF_RTF or SFF_SELECTION,
longint(@editstream));
end;
procedure InsertRTF(aRichEdit:TRichEdit; s : String);
var aMemStream: TMemoryStream;
begin
if Length(s) > 0 then
begin
aMemStream := TMemoryStream.Create;
try
aMemStream.Write(s[1],length(s));
aMemStream.Position := 0;
PutRTFSelection( aRichEdit, aMemStream );
finally
aMemStream.Free;
end;
end;
end;
procedure CopyRTF(aSource, aDest:TRichEdit);
var aMemStream: TMemoryStream;
begin
aMemStream := TMemoryStream.Create;
try
GetRTFSelection(aSource, aMemStream );
aMemStream.Position := 0;
PutRTFSelection(aDest, aMemStream );
finally
aMemStream.Free;
end;
end;
ich hole mir den selektierten Text mittels:
Delphi-Quellcode:
CopyRTF(DestRTF, frmTT.redt_formattext);
// Den kann man jetzt hier noch Bearbeiten
frmTT.redt_formattext.Lines.SaveToStream(TT.FormatText); //TT.FormatText ist TMemoryStream
Speichere mir den in einer
DB. Der Text enthält kein abschließenden Zeilenvorschub. (Den will ich auch gar nicht).
Später lade ich mir dann das ganze wieder in den MemoryStream und will das in ein RichText an Cursorposition einfügen:
PutRTFSelection(DestRTF, TT.FormatText);
Problem ist jetzt, dass dann hinter TT.FormatText ein Zeilenvorschub mit eingefügt wird.
Aus der
DB wieder eingelesen wird der Stream korrekt, das habe ich geprüft. Also muss innerhalb der Procedure PutRTFSelection dieses irgendwie angefügt werden.
Leider ist mein Verständnis für den obigen Code nicht so groß, dass ich den Fehler so finde, und bräuchte diesbezüglich eure Unterstützung.
Danke.