Link to home
Start Free TrialLog in
Avatar of cristh
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
ASKER CERTIFIED SOLUTION
Avatar of Ferruccio Accalai
Ferruccio Accalai
Flag of Italy image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial

   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(var Message: TMessage);
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(Sender: TObject);
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(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opRemove) and (FDataLink <> nil) and (AComponent = DataSource) then
    DataSource := nil;
end;

procedure TGIDBImage.SetDataField(const Value: String);
begin
  FDataLink.FieldName := Value;
end;

procedure TGIDBImage.SetDataSource(const Value: TDataSource);
begin
  FDataLink.DataSource := Value;
  if Value <> nil then Value.FreeNotification(Self);
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).SaveToStream(MemStream);
    MemStream.Seek(soFromBeginning, 0);
    // load the JPG and assign it
    JPG.LoadFromStream(MemStream);
    Picture.Assign(JPG);
  finally
    JPG.Free;
    MemStream.Free;
  end;
end;

end.

   Just place the picture on the Form, assing DataSource and DataField properties and Done
Avatar of ManiElan
ManiElan

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
Avatar of cristh

ASKER


 Thank you Ferruccio68.