好多人都抱怨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.
|
请发表评论