![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавление тектса из одного RichEdit d другой
GrISeR © (2004-10-09 22:20:00)Необходимо добавить текст из одного RichEdit в другой с сохранением стиля (fsBold, ...). Нашел пока единственный способ - скопировать в буфер, потом вставить.=))) Хочеться как-нить получше это сделать, без использования буфера.
GrISeR (2004-10-09 23:38:00) [1]Огромное спасибо, все работает...
Правда я хотел проще, а получилось еще сложнее...ну не важно - все равно спасибо. Не откажусь от комментариев по коду =)) понять хочется, как это работает... =))
Defunct (2004-10-09 23:08:00) [2]Семен Сорокин © (09.10.04 22:50) [4]
> вот в закромах валялось :)
Где-то я это уже видел, закрома родины хоть и бездонные, но исходники наудивление одинаковые ;>
Это часом не из примера раскраски текста по синтаксису (RichSyntax (C) Serhiy Perevoznyk) разных языков программирования?
Семен Сорокин (2004-10-09 22:50:00) [3]вот в закромах валялось :)
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;
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;
Defunct (2004-10-09 22:42:00) [4]тогда вы привели
> пока единственный способ
можно, конечно, руцями в Stream добавлять, но ваш способ проще.
GrISeR (2004-10-09 22:38:00) [5]Мне нужно добавить текст, а не просто скопировать.
Defunct (2004-10-09 22:31:00) [6]SaveToStream
LoadFromStream