Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Concatenar Streams (https://www.clubdelphi.com/foros/showthread.php?t=16322)

johncook 24-11-2004 00:22:11

Concatenar Streams
 
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ódigo Delphi [-]
c.CopyFrom(a, 0);
c.CopyFrom(b, 0);

// Saludos

johncook 24-11-2004 11:46:07

gracias..
 
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

Cita:

Empezado por johncook
Podrías darme una mano?

Tengo ahora poco tiempo para probarlo pero te sugiero revises este enlace 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é.

Código Delphi [-]
 
 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´:

Código Delphi [-]
        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


La franja horaria es GMT +2. Ahora son las 21:04:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi