Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Timage aus Blobfeld (https://www.delphipraxis.net/89954-timage-aus-blobfeld.html)

WS1976 9. Apr 2007 12:01

Datenbank: ACCESS • Zugriff über: ADO Komponenten

Timage aus Blobfeld
 
Hallo,

ein Icon (.ico) wurde in ein Access Blobfeld gespeichert.
wie kriege ich direkt aus Blobfeld wieder ein Timage?

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  blobF : TBlobField;
  blobstream:tstream;
  fname:string;
begin
   mytable.Active:=true;
   myTable.first;
   fname:=myTable.FieldByName('name').AsString;
   blobF := mytable.FieldByName('Picture') as TBlobField;
   blobf.SaveToFile('test.ico');
   s.LoadFromFile('test.ico');
   image1.Picture.LoadFromFile('test.ico');
end;
Bisher mache ich das über den Umweg abspeichern auf Platte.
gehts auch einfacher?

Danke

Neutral General 9. Apr 2007 12:14

Re: Timage aus Blobfeld
 
Hi,

Vielleicht mit

Delphi-Quellcode:
Image1.Picture.Icon.LoadFromStream
Gruß
Neutral General

WS1976 9. Apr 2007 12:18

Re: Timage aus Blobfeld
 
Hallo,

geht nicht. Ich kann nur einen Tblobstream erzeugen.
Der ist nicht kompatibel zu einem Stream den ich mit Timage benutzen kann.

Danke

Neutral General 9. Apr 2007 12:25

Re: Timage aus Blobfeld
 
Hi,

Dann speicherst du das Blobfield in nen normalen Stream und lädst dann das Icon daraus aus.

Delphi-Quellcode:
var Stream: TMemoryStream;
begin
// [...]
  Stream := TMemoryStream.Create;
  try
    blobf.SaveToStream(Stream);
    Image1.Picture.Icon.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
// [...]
end;
Gruß
Neutral General

dataspider 9. Apr 2007 12:38

Re: Timage aus Blobfeld
 
... oder mit CreateBlobStream:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  AStream: TStream;
begin
  MyTable.Active := true;
  MyTable.First;
  AStream := MyTable.CreateBlobStream(FieldByName('Picture'), bmRead);
  try
    image1.Picture.LoadFromStream(AStream);
  finally
    AStream.Free;
  end;
end;
Cu, Frank

WS1976 10. Apr 2007 08:35

Re: Timage aus Blobfeld
 
Hallo dataspider,

dein Code funktioniert einwandfrei. Für alle die das nachvollziehen wollen:
bei dir hat sich leider ein kleiner Fehler eingeschlichen.
(hab try except; weggelassen)
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var AStream: TStream;
begin
  MyTable.Active := true;
  MyTable.First;
  AStream := MyTable.CreateBlobStream(Mytable.FieldByName('Picture'), bmRead);
  image1.Picture.Icon.LoadFromStream(AStream);
end;
Bei dir:
image1.Picture.LoadFromStream(AStream);
Die Methode Loadfromstream gibt's bei picture nicht!
Richtig:
image1.Picture.Icon.LoadFromStream(AStream);

Zu deinem Code Neutral General:
dein Code funktioniert nicht. Ergebnis Streamlesefehler. (Warum hab ich noch nicht rausgefunden.)

Vielen Dank!!!
Ihr habt mir sehr geholfen.

dataspider 10. Apr 2007 08:42

Re: Timage aus Blobfeld
 
Zitat:

Zitat von WS1976
Richtig:
image1.Picture.Icon.LoadFromStream(AStream);

Hi,

jup, habe den Fehler von oben übernommen. Ich denke aber, es sollte dann

Delphi-Quellcode:
  image1.Picture.Bitmap.LoadFromStream(AStream);
Cu, Frank

WS1976 10. Apr 2007 16:28

Re: Timage aus Blobfeld
 
hallo,
habe eine komplette Unit gebaut:

1.)
Procedure save_file_to_access (s:TObject;pfad,fname,name,Fieldname:string);
Speichert ein Icon komplett in einer Access Datenbank
s --> TADOTable
pfad --> Pfad des Icons
fname --> Filename des Icons
name --> Bezeichner des Namens in der Accessdatenbank
Fieldname --> Bezeichner des OLE Feldes in der Accesdatenbank

2.)
Procedure save_access_to_file(s: TObject;pfad,fname,name,Fieldname:string);
Holt ein Icon aus einer Access datenbank und legt es als File ab.
s --> TADOTable
pfad --> Pfad des Icons
fname --> Filename des Icons
name --> Bezeichner des Namens in der Accessdatenbank
Fieldname --> Bezeichner des OLE Feldes in der Accesdatenbank

3.)
Procedure save_access_to_Image(s,t: TObject;Fieldname:string);
Holt ein Icon aus einer Access Datenbank und stellt es als Timage dar.
s --> TADOTable
T --> Timage in dem das Icon erscheinen soll
Fieldname --> Bezeichner des OLE Feldes in der Accesdatenbank


Delphi-Quellcode:
unit U_blobmanage;

interface
uses
DB, Classes, ADODB, ExtCtrls;

Procedure save_file_to_access(s: TObject;pfad,fname,name,Fieldname:string);
Procedure save_access_to_file(s: TObject;pfad,fname,name,Fieldname:string);
Procedure save_access_to_Image(s,t: TObject;Fieldname:string);

implementation

Procedure save_file_to_access(s: TObject;pfad,fname,name,Fieldname:string);
var blobF : TBlobField;
begin
   TADOTable(s).Active:=true;
   TADOTable(s).Insert;
   if (Pfad<>'') then
      if (pfad[length(pfad)]<>'\') then pfad:=pfad+'\';
   TADOTable(s).FieldByName(name).AsString:=fname;
   blobF := TADOTable(s).FieldByName(Fieldname) as TBlobField;
   blobf.LoadFromFile(pfad+fname);
   TADOTable(s).Post;
end;

Procedure save_access_to_file(s: TObject;pfad,fname,name,Fieldname:string);
var
  blobF : TBlobField;
begin
   TADOTable(s).Active:=true;
   TADOTable(s).first;
   if (Pfad<>'') then
      if (pfad[length(pfad)]<>'\') then pfad:=pfad+'\';
   fname:=TADOTable(s).FieldByName(name).AsString;
   blobF := TADOTable(s).FieldByName(Fieldname) as TBlobField;
   blobf.SaveToFile(pfad+fname);
end;

Procedure save_access_to_Image(s,t: TObject;Fieldname:string);
var AStream: TStream;
begin
  TADOTable(s).Active := true;
  TADOTable(s).First;
  AStream := TADOTable(s).CreateBlobStream(TADOTable(s).FieldByName(Fieldname), bmRead);
  TImage(t).Picture.Icon.LoadFromStream(AStream);
end;
end.
Vielleicht kann jemand den Code gebrauchen.
Viele Grüsse und vielen Dank besonders an Neutral General und dataspider.

dataspider 11. Apr 2007 07:58

Re: Timage aus Blobfeld
 
Hi,

ich habe mir eine Proc mal rausgepickt und angepasst.
Es ist besser, statt TObject TDataSet als Parameter zu definieren.
Die Prüfung, ob die Datei existiert, sollte zu Beginn erfolgen.
Die Benennung der Parameter sollte nachvollziehbar sein.

Delphi-Quellcode:
...
procedure SaveFileToDB(DataSet: TDataSet; const FilePath, FileName,
    NameFieldname: string; DataFieldName: string);
...
procedure SaveFileToDB(DataSet: TDataSet; const FilePath, FileName,
    NameFieldname: string; DataFieldName: string);
Var
  FullFileName: String;
begin

  FullFileName := IncludeTrailingPathDelimiter(FilePath) + FileName;

  // PreCondition - File must exist
  if not FileExists(FullFileName) then
    exception.Create(Format('Datei %s nicht vorhanden', [FullFileName]));

  with DataSet do
  begin
    if not Active then
      Active := true;
    Insert;
    FieldByName(NameFieldname).AsString := FileName;
    TBlobField(FieldByName(DataFieldName)).LoadFromFile(FullFileName);
    Post;
  end;
end;
Vielleicht hilft es dir noch etwas.

Cu, Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz