cristh
asked on
How to add Picture to database ms access in Delphi ?
Hi There,
Do you know how to add picture (JPG, BMP) in database of MS Access by Delphi ? Can you tell me any code or some example project ?
Thank you very much,
Cristh
Do you know how to add picture (JPG, BMP) in database of MS Access by Delphi ? Can you tell me any code or some example project ?
Thank you very much,
Cristh
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Just place the picture on the Form, assing DataSource and DataField properties and Done
Look at the URL with step by step Explanations. Ready the summary in the first paragraph before considering.
http://www.efg2.com/Lab/Library/Delphi/ADO/Northwind/index.html
http://www.efg2.com/Lab/Library/Delphi/ADO/Northwind/index.html
ASKER
Thank you Ferruccio68.
Here is a component I wrote which can read images from the DB and display them in Picture
--------------------------
unit GIDBImage;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DB, DBCtrls, JPEG;
type
TGIDBImage = class(TImage)
private
{ Private declarations }
FDataLink : TFieldDataLink;
function GetDataField: String;
function GetDataSource: TDataSource;
function GetField : TField;
procedure SetDataField(const Value: String);
procedure SetDataSource(const Value: TDataSource);
procedure DataChange (Sender : TObject);
protected
{ Protected declarations }
procedure Loaded; override;
procedure CMGetDataLink (var Message : TMessage); message CM_GETDATALINK;
procedure Notification (AComponent : TComponent; Operation : TOperation); override;
procedure LoadPicture; virtual;
public
{ Public declarations }
constructor Create (AOwner : TComponent); override;
destructor Destroy; override;
property Field : TField read GetField;
published
{ Published declarations }
property DataField : String read GetDataField write SetDataField;
property DataSource : TDataSource read GetDataSource write SetDataSource;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('GI Data-Aware', [TGIDBImage]);
end;
{ TGIDBImage }
procedure TGIDBImage.CMGetDataLink(v
begin
Message.Result := Integer(FDataLink);
end;
constructor TGIDBImage.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable];
FDataLink := TFieldDataLink.Create;
FDataLink.Control := Self;
FDataLink.OnDataChange := DataChange;
end;
procedure TGIDBImage.DataChange(Send
begin
if FDataLink.Field <> nil then
LoadPicture
else
Picture.Graphic := nil;
end;
destructor TGIDBImage.Destroy;
begin
FDataLink.Free;
FDataLink := nil;
inherited Destroy;
end;
function TGIDBImage.GetDataField: String;
begin
Result := FDataLink.FieldName;
end;
function TGIDBImage.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;
function TGIDBImage.GetField: TField;
begin
Result := FDataLink.Field;
end;
procedure TGIDBImage.Loaded;
begin
inherited Loaded;
if (csDesigning in ComponentState) then DataChange(Self);
end;
procedure TGIDBImage.Notification(AC
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDataLink <> nil) and (AComponent = DataSource) then
DataSource := nil;
end;
procedure TGIDBImage.SetDataField(co
begin
FDataLink.FieldName := Value;
end;
procedure TGIDBImage.SetDataSource(c
begin
FDataLink.DataSource := Value;
if Value <> nil then Value.FreeNotification(Sel
end;
procedure TGIDBImage.LoadPicture;
var
IsJPG : Boolean;
JPG : TJpegImage;
MemStream : TMemoryStream;
begin
// load the picture
// check if the field is BLOB
if not Field.IsBlob then
begin
Picture.Graphic := nil;
Exit;
end;
// determine the type
with Field as TBlobField do
begin
IsJPG := Pos('JFIF', Copy(Value, 1, 10)) > 0;
end;
// if it is Bitmap - load it and exit
if not IsJPG then
begin
Picture.Assign(Field);
Exit;
end;
// load the JPG with MemoryStream
MemStream := TMemoryStream.Create;
JPG := TJPEGImage.Create;
try
TBlobField(Field).SaveToSt
MemStream.Seek(soFromBegin
// load the JPG and assign it
JPG.LoadFromStream(MemStre
Picture.Assign(JPG);
finally
JPG.Free;
MemStream.Free;
end;
end;
end.