好多人都抱怨delphi没有提供一个可以把任意数据放入数据库的控件,虽然说用代码实现也不难,但是有控件会更方便,这次我终于还是抽出空来做了 这么个控件,以后就可以直接拖放了。它支持把任意数据类型写入数据库,也可以从数据库读出到流,或是直接保存为文件。另外,我加了一些对常用图像的处理, 保存jpg或是gif格式的图像很方便,并且可以直接显示到image上。
unit RaDBOLE;
interface
uses
SysUtils, Classes, DB, DBTables, JPEG, ExtCtrls, GIFCtrl;
type
TImageType = (itBMP, itJPG, itGIF, itOther);
TOnSaveData = procedure(Sender: TObject) of object;
TOnLoadData = procedure(Sender: TObject) of object;
TOnShowImage = procedure(Sender: TObject; ImageType: TImageType) of object;
type
TRaDBOLE = class(TComponent)
private
fDataSet: TDataSource;
fDataField: string;
fImage: TImage;
fGifImage: TRxGIFAnimator;
fOnSaveData: TOnSaveData;
fOnLoadData: TOnLoadData;
fOnShowImage: TOnShowImage;
protected
public
constructor Create(AOwner: TComponent); override;
{保存到数据库}
function SaveToDatabase(AFileName: string): boolean;
{追加到数据库}
function AppendToDatabase(AFileName: string): boolean;
{从数据库读出到流}
function LoadToStream(var AStream: TStream): boolean;
{从数据库读出到文件}
function LoadToFile(AFileName: string): boolean;
{读取图片}
procedure GetImage;
published
property DataSet: TDataSource read fDataSet write fDataSet;
property DataField: string read fDataField write fDataField;
property Image: TImage read fImage write fImage;
property GifImage: TRxGIFAnimator read fGifImage write fGifImage;
property OnSaveData: TOnSaveData read fOnSaveData write fOnSaveData;
property OnLoadData: TOnLoadData read fOnLoadData write fOnLoadData;
property OnShowImage: TOnShowImage read fOnShowImage write fOnShowImage;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Rarnu Components', [TRaDBOLE]);
end;
{ TRaDBOLE }
function TRaDBOLE.AppendToDatabase(AFileName: string): boolean;
var
mm: tmemorystream;
begin
result := True;
mm := tmemorystream.Create;
mm.LoadFromFile(AFileName);
mm.Position := 0;
try
fDataSet.DataSet.Append;
tblobfield(fDataSet.DataSet.FieldByName(fDataField)).LoadFromStream(mm);
fDataSet.DataSet.Post;
except
result := False;
end;
mm.Free;
if Assigned(OnSaveData) then
OnSaveData(Self);
end;
constructor TRaDBOLE.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fDataSet := nil;
fDataField := '';
fImage := nil;
end;
procedure TRaDBOLE.GetImage;
var
ww: tmemorystream;
JPEG: TJPEGImage;
IT: TImageType;
begin
if fImage = nil then Exit;
ww := tmemorystream.Create;
tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(ww);
try
fImage.Picture.Assign(fDataSet.DataSet.FieldByName(fDataField));
IT := itBMP;
except
try
JPEG := TJPEGImage.Create;
JPEG.Assign(fDataSet.DataSet.FieldByName(fDataField));
fImage.Picture.Assign(JPEG);
IT := itJPG;
except
try
if fGifImage = nil then Exit;
fGifImage.Image.Assign(fDataSet.DataSet.FieldByName(fDataField));
IT := itGIF;
except
IT := itOther;
end;
end;
end;
//fImage.Picture.Graphic.LoadFromStream(ww);
ww.Free;
if Assigned(OnShowImage) then
OnShowImage(Self, IT);
end;
function TRaDBOLE.LoadToFile(AFileName: string): boolean;
var
tt: tmemorystream;
begin
result := True;
tt := tmemorystream.Create;
try
tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(tt);
tt.Position := 0;
tt.SaveToFile(AFileName);
except
result := False;
end;
tt.Free;
if Assigned(OnLoadData) then
OnLoadData(Self);
end;
function TRaDBOLE.LoadToStream(var AStream: TStream): boolean;
var
tt: tmemorystream;
begin
result := True;
tt := tmemorystream.Create;
try
tblobfield(fDataSet.DataSet.FieldByName(fDataField)).SaveToStream(tt);
tt.Position := 0;
AStream := tt;
except
result := False;
end;
tt.Free;
if Assigned(OnLoadData) then
OnLoadData(Self);
end;
function TRaDBOLE.SaveToDatabase(AFileName: string): boolean;
var
mm: tmemorystream;
begin
result := True;
mm := tmemorystream.Create;
mm.LoadFromFile(AFileName);
mm.Position := 0;
try
fDataSet.Edit;
tblobfield(fDataSet.DataSet.FieldByName(fDataField)).LoadFromStream(mm);
fDataSet.DataSet.Post;
except
result := False;
end;
mm.Free;
if Assigned(OnSaveData) then
OnSaveData(Self);
end;
end.