Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

richedit

152 views
Skip to first unread message

Valera Selev

unread,
May 10, 2003, 12:29:58 PM5/10/03
to
Hello, All!

Есть два richedit'а. Как в один объект занести строку из другого с сохранением
всех её аттрибутов (цвет, подчёркивание,...)?

<<< WBR, Stormbringer >>>
<<< *500:322/67.64* >>> AKA <<< *2:462/162.7* >>>

... I feel so alive for the very first time, I can't deny you...

Leonid Troyanovsky

unread,
May 11, 2003, 5:12:08 AM5/11/03
to
Приветствую, Valera.

> Есть два richedit'а. Как в один объект занести строку из другого с
> сохранением
> всех её аттрибутов (цвет, подчёркивание,...)?

By Peter Below (TeamB):

To extract and insert formatted
text you need to work with EM_STREAMIN and EM_STREAMOUT since the available
interface of the Delphi controls can only do that for the complete content of
a rich edit control. Add richedit to your Uses clause and play with the
following functions:

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;

To copy the selection from one control to the other your do this:

Var
aMemStream: TMemoryStream;
begin
aMemStream := TMemoryStream.Create;
try
GetRTFSelection( richedit1, aMemStream );
aMemStream.Position := 0;
PutRTFSelection( richedit2, aMemStream );
finally
aMemStream.Free;
end;
end;

--
С уважением, LVT.


Valera Selev

unread,
May 11, 2003, 1:17:20 AM5/11/03
to
Hello, Valera!

10.05.2003 at 21:29 Valera Selev wrote to All:

VS> Есть два richedit'а. Как в один объект занести строку из другого с
VS> сохранением всех её аттрибутов (цвет, подчёркивание,...)?

Пробую делать через clipboard:

richedit2.Selectall;
richedit2.CopyToClipboard;
richedit1.PasteFromClipboard;

Работает нормально, но хочется, чтобы предыдущее содержимое клипборда
сохранялось. Делаю так:

var buff:tclipboard;
begin
buff:=clipboard;
richedit2.Selectall;
richedit2.CopyToClipboard;
richedit1.PasteFromClipboard;
setclipboard(buff);
end;

Hо желаемого эффекта нет. Где ошибка?

<<< WBR, Stormbringer >>>
<<< *500:322/67.64* >>> AKA <<< *2:462/162.7* >>>

... I can't do anything right, You don't know me, stay out of my life...

Valera Selev

unread,
May 12, 2003, 8:57:35 AM5/12/03
to
Hello, Leonid!

11.05.2003 at 14:12 Leonid Troyanovsky wrote to Valera Selev:

LT> To extract and insert formatted
LT> text you need to work with EM_STREAMIN and EM_STREAMOUT since the

Этих самых EM_STREAMIN and EM_STREAMOUT в W'98 нет.
Может, ты знаешь, как правильно сохранить клипборд в переменную типа
TClipboard, а затем восстановить из неё значение клипборда? (см. мою мессагу за
11 мая).

<<< WBR, Stormbringer >>>
<<< *500:322/67.64* >>> AKA <<< *2:462/162.7* >>>

... Everyday is a new day, I'm thankful for every breath I take...

Leonid Troyanovsky

unread,
May 14, 2003, 2:16:28 PM5/14/03
to
Приветствую, Valera.

LT> text you need to work with EM_STREAMIN and EM_STREAMOUT since the

> Этих самых EM_STREAMIN and EM_STREAMOUT в W'98 нет.

Это почему?
Version: Requires Rich Edit 1.0 or later.
А сейчас, IMHO, уже время 3.0

Каким образом ты убедился в отсутствии оных?

> Может, ты знаешь, как правильно сохранить клипборд в переменную типа
> TClipboard, а затем восстановить из неё значение клипборда? (см. мою мессагу
> за

Hе стоит усилий. Или, проще сказать, что неосуществимо.

--
С уважением, LVT.


Valera Selev

unread,
May 15, 2003, 1:35:22 PM5/15/03
to
Hello, Leonid!

14.05.2003 at 23:16 Leonid Troyanovsky wrote to Valera Selev:


LT>> text you need to work with EM_STREAMIN and EM_STREAMOUT since the
>> Этих самых EM_STREAMIN and EM_STREAMOUT в W'98 нет.

LT> Это почему?

В хелпе по этой функции написано: Win32s: No
И у меня не работает.

<<< WBR, Stormbringer >>>
<<< *500:322/67.64* >>> AKA <<< *2:462/162.7* >>>

... Boom! Here comes the Boom! How you like me now?

Leonid Troyanovsky

unread,
May 17, 2003, 2:18:57 AM5/17/03
to
Приветствую, Valera.

VS> Этих самых EM_STREAMIN and EM_STREAMOUT в W'98 нет.
LT> Это почему?

> В хелпе по этой функции написано: Win32s: No

Win32s и не нужен.
Сей монстр жил до Win95, и, слава Богу, кажется вымер.

> И у меня не работает.

А что конкретно у тебя не работает?
У меня под рукой нет 98, испытать код не могу, но ты можешь,
хотя бы, проанализировать возвращаемое Perform(EM_*) -
количество считанных/записанных символов.

Может ты пытаешься управлять edit'ом в чужом приложении?

--
С уважением, LVT.


Valera Selev

unread,
May 17, 2003, 1:03:32 PM5/17/03
to
Hello, Leonid!

17.05.2003 at 11:18 Leonid Troyanovsky wrote to Valera Selev:

LT> Win32s и не нужен.
LT> Сей монстр жил до Win95, и, слава Богу, кажется вымер.

Упс, я чё-то думал, что Win32s это Win98 и выше.. :)

>> И у меня не работает.

LT> А что конкретно у тебя не работает?

При компиляции выдаёт Undeclared identifier: 'EM_STREAMOUT'; на строчку
result := E_FAIL; ругается сообщением Constant expression violates subrange
bounds. И это только начало...

LT> Может ты пытаешься управлять edit'ом в чужом приложении?

Hет.

<<< WBR, Stormbringer >>>
<<< *500:322/67.64* >>> AKA <<< *2:462/162.7* >>>

... I feel so alive for the very first time, I can't deny you...

Andrey Repin

unread,
May 18, 2003, 12:45:41 AM5/18/03
to
Отписал(а) Valera Selev к Leonid Troyanovsky про richedit

LT>>> text you need to work with EM_STREAMIN and EM_STREAMOUT since the
>>> Этих самых EM_STREAMIN and EM_STREAMOUT в W'98 нет.
LT>> Это почему?

VS> В хелпе по этой функции написано: Win32s: No
VS> И у меня не работает.

Win32s - это 32-битная надстройка над WfW (Win 3.1x)


/Daemon/ aka /ANR Daemon/ aka /sirAndrey/ в миру /*Андрей Репин/*
[БК http://www.combats.ru/ - Demons city]
... [18.05.03 09:45:41] Daemon@DAEMON2 uptime 10:32:54

Leonid Troyanovsky

unread,
May 18, 2003, 11:00:50 PM5/18/03
to
Приветствую, Valera.

LT> А что конкретно у тебя не работает?

> При компиляции выдаёт Undeclared identifier: 'EM_STREAMOUT'; на строчку

А ты делал "Add richedit to your Uses clause" ?
richedit.pas и содержит требуемые декларации.

> result := E_FAIL; ругается сообщением Constant expression violates subrange
> bounds. И это только начало...

Hу, так давай последовательно исправлять, начиная с uses.

--
С уважением, LVT.


Valera Selev

unread,
May 22, 2003, 11:50:02 AM5/22/03
to
Hello, Leonid!

19.05.2003 at 08:00 Leonid Troyanovsky wrote to Valera Selev:

LT> А ты делал "Add richedit to your Uses clause" ?
LT> richedit.pas и содержит требуемые декларации.


>> result := E_FAIL; ругается сообщением Constant expression violates
>> subrange bounds. И это только начало...

LT> Hу, так давай последовательно исправлять, начиная с uses.

Вставил в uses richedit. Сообщение "Constant expression violates subrange
bounds" всё-равно выскакивает.
Да, пробовал заменять E_FAIL на любое целое число - всё, кажется, работает.
Почему так происходит?

<<< WBR, Stormbringer >>>
<<< *500:322/67.64* >>> AKA <<< *2:462/162.7* >>>

... I am the Messenjah...

Leonid Troyanovsky

unread,
May 30, 2003, 2:03:19 PM5/30/03
to
Приветствую, Valera.

> Да, пробовал заменять E_FAIL на любое целое число - всё, кажется, работает.
> Почему так происходит?

Дык, E_FAIL и есть целое число: -2147467259
Определено в windows.pas, и его тоже надо use.
Hу, или описать самому, если есть желание.

--
С уважением, LVT.


0 new messages