PDA

Ver la Versión Completa : Concatenar Streams


johncook
24-11-2004, 00:22:11
Hola:
Alguien sabe como concatenar streams??
Tengo las siguientes variables:
a,b,c: TMemoryStream;
En a guardo las lìneas de un rxrichedit y en b lo mismo

a grandes rasgos necesito que:
c:=a+b

muchas gracias.

roman
24-11-2004, 03:35:12
¿Cómo estás intentando hacerlo?

No lo he probado pero a juzgar por la ayuda de Delphi podrías hacer algo como:


c.CopyFrom(a, 0);
c.CopyFrom(b, 0);


// Saludos

johncook
24-11-2004, 11:46:07
Bueno Román... NO me queda mas que agradecerte.--- Muchísimas gracias....
La única forma que no había probado era esa ya que me parecia que el stream se podría sobreescribir. Ahora acabo de probarlo y funciona a la perfección.
Nuevamente gracias.
Saludos.
John Cook. ;)

roman
24-11-2004, 16:38:16
¿Y realmente te sirvió? Es que después de contestar me quedé pensando que si quieres unir el contenido de dos RichEdit quizá no sea tan sencillo porque hay que considerar el encabezado de un documento RTF y si simplemente pegas ambos pues el encabezado del segundo aparecerá insertado a la mitad. Aunque esto a lo mejor no es visible al usuario no sé qué consecuencias pueda tener. O quizá estoy equivocado y no pasa nada. :)

// Saludos

johncook
25-11-2004, 00:56:35
La verdad que no te quedaste pensando en vano......
Al ejemplo lo había probado con unos memos y andaba a la perfección, pero ahora que acabo de probarlos con los richedit y no me funcionan.
Podrías darme una mano?

Muchas gracias.

roman
25-11-2004, 02:03:43
Podrías darme una mano?


Tengo ahora poco tiempo para probarlo pero te sugiero revises este enlace (http://216.101.185.148/scripts/isapi.dll/article?id=3056EC1A&article=460803) con un código de Peter Below. Peter Below es un participante en los foros de Borland muy respetado y aunque, como te digo, no he podido probar su código, me parece que su función PutRTFSelection es lo que necesitas.

// Saludos

johncook
27-11-2004, 03:25:43
Que tal Román. Acá te adjunto la unidad que redefiní (solo cambié el richedit por un rxrichedit) y la forma en la que la utilicé.


unit u_sumarrtf;

interface

uses Windows, ComCtrls, Classes, rxriched;

type
TEditStreamCallBack = function (dwCookie: Longint; pbBuff: PByte;cb:
Longint; var pcb: Longint): DWORD; stdcall;

TEditStream = record
dwCookie: Longint;
dwError: Longint;
pfnCallback: TEditStreamCallBack;
end;

procedure GetRTFSelection( aRichEdit: TRxRichEdit; intoStream:
TStream );

procedure PutRTFSelection( aRichEdit: TRxRichEdit; sourceStream:
TStream);

procedure InsertRTF(aRichEdit:TRxRichEdit; s : String);

procedure CopyRTF(aSource, aDest:TRxRichEdit);

procedure AppendRTF(aRichEdit:TRxRichEdit; s : String);

implementation

uses RichEdit, Messages;

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;
if dataAvail <= cb then
begin
pcb := Read(pbBuff^, dataAvail);
if pcb <> dataAvail then
result := DWord(E_FAIL);
end
else
begin
pcb := Read(pbBuff^, cb);
if pcb <> cb then
result := DWord(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: TRxRichEdit; 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: TRxRichEdit; 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:TRxRichEdit; 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:TRxRichEdit);
var aMemStream: TMemoryStream;
begin
aMemStream := TMemoryStream.Create;
try
GetRTFSelection(aSource, aMemStream );
aMemStream.Position := 0;
PutRTFSelection(aDest, aMemStream );
finally
aMemStream.Free;
end;
end;

procedure AppendRTF(aRichEdit:TRxRichEdit; s : String);
var start, length, eventmask : integer;
begin
eventmask := SendMessage(aRichEdit.Handle,EM_SETEVENTMASK,0,0);
SendMessage(aRichEdit.Handle,WM_SETREDRAW,0,0);
start := aRichedit.SelStart;
length := aRichEdit.SelLength;
aRichEdit.SelLength := 0;
aRichEdit.SelStart := System.Length(aRichEdit.Text);
InsertRTF(aRichEdit,s);
aRichEdit.SelStart := start;
aRichEdit.SelLength := length;
SendMessage(aRichEdit.Handle,WM_SETREDRAW,1,0);
InvalidateRect(aRichEdit.Handle,nil,true);
SendMessage(aRichEdit.Handle,EM_SETEVENTMASK,0,eventmask);
end;

end.



Después la uso de la siguiente manera´:


Stream := TMemoryStream.Create;
Origen.SelectAll;
GetRTFSelection( Origen, Stream );
Stream.Position := 0;
Destino.SelStart:=Destino.GetTextLen;
PutRTFSelection( Destino, Stream );
Stream.Free;


Espero que les sea de utilidad.
Saludos