Solved

how to show image from db else than save it to file?

Posted on 2004-08-25
3
296 Views
Last Modified: 2010-04-05
Now i'm saving pictures in temp.jpg after that i'm showing them in image1.picture
the code is:

procedure TForm8.DBGrid1CellClick(Column: TColumn); //NUOTRAUKOS RODYMAS
begin
Labelededit1.Text := AdoQuery1.fieldbyname('id').Value;

AdoQuery2.SQL.Clear;
AdoQuery2.SQL.Add('Select picture from klientai where id = '+ Labelededit1.Text +'');
AdoQuery2.Open;

if not TBlobField(AdoQuery2.FieldByName('picture')).IsNull then  //is there a picture?
    begin
      TBlobField(AdoQuery2.fieldbyname('picture')).SaveToFile('Temp.jpg');
      Image1.Picture.LoadFromFile('Temp.jpg');
      Image1.visible := true;
    end
  else
    begin
      Image1.Picture.Bitmap.Assign(Nil);  //there is no Image
      Image1.visible := false;
    end;
end;

I don't want to save them in file, how else i can do it?
0
Comment
Question by:selas
  • 2
3 Comments
 
LVL 13

Accepted Solution

by:
BlackTigerX earned 500 total points
ID: 11893899
saving it to a stream... should be something like (I just modified your code to save to a stream instead of a file)

var
  Jpeg:TJpegImage;
  tmp:TMemoryStream;
begin
  Jpeg:=TJpegImage.create;
  tmp:=TMemoryStream.create;
  try
    AdoQuery2.SQL.Clear;
    AdoQuery2.SQL.Add('Select picture from klientai where id = 1');
    AdoQuery2.Open;

    if not TBlobField(AdoQuery2.FieldByName('picture')).IsNull then  //is there a picture?
    begin
      TBlobField(AdoQuery2.fieldbyname('picture')).SaveToStream(tmp);
      tmp.Seek(0, soFromBeginning);
      Jpeg.LoadFromStream(tmp);
      Image1.Picture.Assign(jpeg);
      Image1.visible := true;
    end
    else
    begin
      Image1.Picture.Bitmap.Assign(Nil);  //there is no Image
      Image1.visible := false;
    end;
  finally
    jpeg.Free;
    tmp.Free
  end
end;
0
 
LVL 13

Expert Comment

by:BlackTigerX
ID: 11893925
forgot to mention, make sure you add jpeg to the uses clause
0
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 11894481
// here is DBImage component which works with Bitmap and JPG. You can easily add support for GIF

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.
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Send message from delphi to whatsapp, is it possible? 3 1,693
Delphi Form ownership 4 115
Dev express lookupcombo 3 35
Wincontrol not (correctly) drawn 15 42
Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question