Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2004
johncook johncook is offline
Miembro
 
Registrado: oct 2004
Posts: 65
Poder: 20
johncook Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 24-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿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
Responder Con Cita
  #3  
Antiguo 24-11-2004
johncook johncook is offline
Miembro
 
Registrado: oct 2004
Posts: 65
Poder: 20
johncook Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 24-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿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
Responder Con Cita
  #5  
Antiguo 25-11-2004
johncook johncook is offline
Miembro
 
Registrado: oct 2004
Posts: 65
Poder: 20
johncook Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 25-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 27-11-2004
johncook johncook is offline
Miembro
 
Registrado: oct 2004
Posts: 65
Poder: 20
johncook Va por buen camino
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

Última edición por roman fecha: 27-11-2004 a las 04:32:30. Razón: Añadir etiqueta [delphi] para formato de código
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:38:50.


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
Copyright 1996-2007 Club Delphi