Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.042 c
1-1085866179
CyberSpy
2004-05-30 01:29
2004.06.13
TabControl


1-1085848740
anonimus
2004-05-29 20:39
2004.06.13
Узнать код по исходной и шифрованной строке


3-1084477476
Inspired
2004-05-13 23:44
2004.06.13
Создать поле в табл Access из Delphi6 через адо query


8-1080833138
Pa5ha
2004-04-01 19:25
2004.06.13
D3D


8-1079775966
*BES*
2004-03-20 12:46
2004.06.13
Dll в WinAmp