這是我從很久以前保存的文章。它由TeamB的Peter Below博士發佈到舊的Borland Delphi新聞組,但它今天仍然適用。它顯示瞭如何使用EM_STREAMIN
和EM_STREAMOUT
消息和相關回調將RTF文本放入TRichEdit
中並將其複製出來。
Uses RichEdit;
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 := E_FAIL;
end
else begin
pcb := Read(pbBuff^, cb);
if pcb <> cb then
result := 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;
所以使用例如與剪貼板伎倆,但它使用的書籤,查找並選擇你的標籤,你已經做的方式,通過對選定的文本PasteSpecial的像在與例如更換標籤剪貼板技巧。 –
是的,我意識到我沒有表達我的自我,讓我更新這個問題。我「隱式地」寫在那裏(現在我將寫出它的爆炸式地)對這個技巧的評論。 – LaBracca
是的,使用剪貼板這種東西通常被認爲是「壞/不禮貌的應用行爲」,因爲無論用戶放在那裏都會干擾(刪除/覆蓋)... –