Текущий архив: 2004.06.13;
Скачать: CL | DM;
ВнизRTF и буфер обмена Найти похожие ветки
← →
Lexandr (2004-05-27 12:24) [0]Ребята, есть такой компонент TRichEdit, я его использую для того чтобы загружать RTF файлы. У меня два компонента - в одном полный текст, а во-втором я из первого должен ПРОГРАММНО скопировать определенный фрагмент документа (с форматированием). Ничего кроме, как через буфер я не нашел. Но проблема в том что под ХР буфер ИНОГДА с этим компонентом (или вообще) парится и не хочет программно ничего копировать. И что примечательно все начинает работать через час-пол работы с ХР или там с Word-ом (я так подозреваю что это из-за того, что буфер может хранить несколько объектов или еще что-то, незнаю)
Посоветуйте что-нибудь: 1) может какой другой компонент есть для RTF 2) или както можно скопировать часть документа через переменные, а не через буфер 3) или еще что-то
Мастера, помогите решить проблему, одна надежда на Вас
← →
Lexandr (2004-05-27 16:39) [1]Ребята!!! Ну помогите же кто нибудь!!! Неужели эта проблема не решаемая!
← →
Lexandr (2004-05-27 20:06) [2]Хотябы подскажите где взять работающий компонент TX TEXT CONTROL
Пожалуйста!!!
← →
MetalFan (2004-05-27 21:26) [3]есть у меня две процедурки копирования через потоки)))
unit uRicheditCopy;
interface
uses StdCtrls, ComCtrls, Classes, Richedit, windows;
function RichCopyToStream(ARich : TRichEdit) : TStream;
function RichPasteFromStream(ARich : TRichEdit; aStream : TStream) : boolean;
implementation
function AnEditCopyStreamCallBack(dwCookie : longint; pbBuff : PByte;
cb : longint; var pcb : longint) : longint; stdcall;
var
lStrm : TStream;
begin
lStrm := TStream(dwCookie);
if cb > 0 then
begin
pcb := lStrm.Write(pbBuff^, cb);
Result := 0;
end;
end;
function RichCopyToStream(ARich : TRichEdit) : TStream;
var
lEditStream : EDITSTREAM;
lWParam : integer;
begin
Result := TMemoryStream.Create;
zeroMemory(@lEditStream, SizeOf(EDITSTREAM));
lEditStream.pfnCallback := AnEditCopyStreamCallBack;
lEditStream.dwCookie := longint(Result);
lWParam := SF_RTF or SFF_SELECTION;
ARich.Perform(EM_STREAMOUT, lWParam, longint(@lEditStream));
end;
function AnEditPasteStreamCallBack(dwCookie : longint; pbBuff : PByte;
cb : longint; var pcb : longint) : longint; 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 RichPasteFromStream(ARich : TRichEdit; aStream : TStream) : boolean;
var
lEditStream : EDITSTREAM;
lWParam : integer;
begin
zeroMemory(@lEditStream, SizeOf(EDITSTREAM));
aStream.Seek(0,0);
lEditStream.pfnCallback := AnEditPasteStreamCallBack;
lEditStream.dwCookie := longint(aStream);
lWParam := SF_RTF or SFF_SELECTION;
Result := ARich.Perform(EM_STREAMIN, lWParam, longint(@lEditStream)) = 0;
end;
end.
можеть не совсем красиво, но работает!
только текст копируется выделенный... хотя можно копировать и весь)
удачи!
← →
Lexandr (2004-05-28 11:29) [4]Большое-прибольшое человеческое СПАСИБО!!!
← →
MetalFan © (2004-05-28 11:38) [5]на здоровье)
сам был очень рад, когда додумался)
и мастерам спасибо - они мне такую фишку подсказали!
Страницы: 1 вся ветка
Текущий архив: 2004.06.13;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.035 c