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
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
EditStream : TEditStream;
bs : TBlobStream;
L : Longint;
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;
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;
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