Ver Mensaje Individual
  #2  
Antiguo 13-06-2007
loxod loxod is offline
Miembro
 
Registrado: feb 2007
Ubicación: Mexico
Posts: 45
Reputación: 0
loxod Va por buen camino
yo he usado el siguiente codigo, pero uso un richediten vez de un dbrichedit

Código Delphi [-]

unit rtf2blob_u;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, DBCtrls, Db, DBTables, StdCtrls, ComCtrls,
  richedit;  

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    DataSource1: TDataSource;
    Table1: TTable;
    DBNavigator1: TDBNavigator;
    procedure Button1Click(Sender: TObject);
    procedure Table1AfterScroll(DataSet: TDataSet);
    procedure Table1BeforePost(DataSet: TDataSet);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}


var
  EditStream : TEditStream;  
  bs : TBlobStream;  
  L : Longint;  


//solo para cargar un archivo rtf
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (table1.state = dsInsert) or
     (table1.state = dsEdit) then
  begin
    If opendialog1.execute then
      Richedit1.Lines.LoadfromFile(opendialog1.FileName);
  end
  else
    Showmessage('El Dataset debe estar en modo de Edicion');
end;


Function MyEditStreamCallBackOut(dwCookie: Longint; pbBuff: PByte;
                              cb: Longint; var pcb: Longint): Longint; stdCall;
Begin
  bs.WriteBuffer(pbbuff^,cb);
  pcb := DWord(@L);
  result := cb;
end;


Function MyEditStreamCallBackIn(dwCookie: Longint; pbBuff: PByte;
                                cb: Longint; var pcb: Pointer): Longint; stdcall;
var
  dw : DWord;
Begin
  pcb := @cb;
  if cb > bs.Size - bs.position then
    dw := bs.Size - bs.position
  else
    dw := cb;
  if dw <> 0 then
    bs.ReadBuffer(pbbuff^,dw);
  result := 0;
  dw := bs.position;
  move(dw,pcb,sizeof(dw));
end;


//Obtiene el contenido del archivo rtf desde el campo BlobField
procedure TForm1.Table1AfterScroll(DataSet: TDataSet);
begin
  bs := TBlobStream.Create(TBlobField(table1.FieldByName('rtfBlob')),bmRead);
  try
    bs.Position := 0;
    editStream.dwCookie := SF_RTF;
    editStream.dwError := 0;
    editStream.pfnCallback := @MyEditStreamCallBackIn;
    Richedit1.Perform(EM_StreamIn,SF_RTF,DWord(@EditStream));
  finally
    bs.free;
  end;
end;

//almacena el rft en el blobfield
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
  bs := TBlobStream.Create(TBlobField(table1.FieldByName('rtfBlob')),bmWrite);
  try
    editStream.dwCookie := SF_RTF;
    editStream.dwError := 0;
    editStream.pfnCallback := @MyEditStreamCallBackOut;
    Richedit1.Perform(EM_StreamOut,SF_RTF,DWord(@EditStream));
  finally
    bs.free;
  end;
end;

end.

espero que te sirva
Responder Con Cita