Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmap in Access speichern (https://www.delphipraxis.net/84343-bitmap-access-speichern.html)

thomasch 15. Jan 2007 16:52


Bitmap in Access speichern
 
Hallo,
eigentlich geht es mir um Folgendes:
- ich brauche ein TreeView, bei dem der Benutzer ggf. neue Nodes mit eigenen Bitmaps erzeugen können soll, die später auch so erhalten bleiben sollen.
Da mir aus dviersen Gründen nur eine Access2000 DB zur verfügung steht, dachte ich, diese Bilder als BLOBs dort abzulegen und, zumindest bis mir etwas besseres einfällt, beim Programmstart die Imagelist aus der DB heraus aufzubauen.

Um das zu testen, hab ich erstmal versucht, ein TDBImage aus Access heraus darzustellen - was gründlich daneben ging.

Jetzt meine Fragen:
- Gibt es einen eleganteren Weg, benutzerdefinierte Bitmaps persistent zu machen?

- Ist das, was Access2000 unter dem Datentyp "OLE - Objekt" versteht ein BLOB oder geh bin ich da auf von falschen Grundlagen aus?

Ach so - ich nutze Delphi7 Pro mit den DevExpress Tools.

Vielen Dank schonmal


Thomasch

Der_Unwissende 15. Jan 2007 18:41

Re: Bitmap in Access speichern
 
Zitat:

Zitat von thomasch
- Ist das, was Access2000 unter dem Datentyp "OLE - Objekt" versteht ein BLOB oder geh bin ich da auf von falschen Grundlagen aus?

Hi,
oh, da liegst Du mal richtig gut daneben. OLE ist eine Microsoft-Technologie, steht für Object Linking and Embedding. OLE ist die Basis für die Kommunikations/Einbettung von ganz unterschiedlichen Programmen (die einander nicht zur Entwicklungszeit kennen). So kommt OLE z.B. zum Einsatz, wenn Du in Word eine Tabelle erstellst/bearbeitest. An dieser Stelle wirkt es dann so, als ob hier eine Excel Instanz offen wäre (ein gelinktes oder eingebettes Excel Objekt ist das auch).
Das gleiche kannst Du z.B. auch mit Delphi machen (z.B. Excel reinlinken) oder eben auch umgekehrt. Ich denke allerdings, dass man am ehesten die Tabellenkalkulation im Schreibprogramm kennt.
Ein OLE-Objekt hat also nichts mit einem beliebigen Strom roher Daten zu tun.

Gruß Der Unwissende

thomasch 15. Jan 2007 19:23

Re: Bitmap in Access speichern
 
Zitat:

Zitat von Der_Unwissende
Ein OLE-Objekt hat also nichts mit einem beliebigen Strom roher Daten zu tun.

*gnarf* Also ist da doch drin, was drauf steht... :cry:

Ich hab halt gehofft, dass das "Ole Objekt" als Datentyp ein BLOB ist, der an der Stelle nur anders heist.

Hat jemand eine Idee für einen anderen Lösungsansatz meines Problems?
Im Prinzip suche ich ja eine Art ImageList, der ich Bitmaps zur Laufzeit hinzufügen kann und die dann dort beim nächsten Programmaufruf wieder zur Verfügung stehen.
Das über eine .ini Datei, in der Nummer und Pfad der Bitmaps stehen, halte ich etwas für gewagt.


Thomasch

alzaimar 15. Jan 2007 20:08

Re: Bitmap in Access speichern
 
Leider werden Bitmaps in Access nicht einfach roh abgespeichert, sondern mit einem Header versehen, in dem steht, wie und mit welcher Anwendung das 'BLOB' bearbeitet werden kann.

Vom Inhalt des Feldes musst Du nur die ersten 78 Bytes wegschnippeln, dann hast Du eine BMP, mit der Du arbeiten kannst.

Das ist allerdings (glaube ich) nur dann richtig, wenn die Bitmap innerhalb einer Access-Anwendung erstellt wurde, oder innerhalb Access selbst. Wenn Du von außen eine BMP einspeicherst (mit den DevExpress-Grids geht das ja ohne eine Zeile Code), dann klappt das auch so.

Ich habe mir ein Konvertierungstool geschrieben, das diese 78 Bytes abschneidet. Dann öffnet man die Tabelle, weist der Spalte im TcxGrid die TcxImage-Property zu und -wupps- ist das Bild im Grid sichtbar..

Jens Schumann 15. Jan 2007 21:02

Re: Bitmap in Access speichern
 
Hallo alzaimar,
das Problem mit 78 Byte hatte ich vor 5 Jahren auch. Damals bin ich den Umweg über einen VariantArray und einen TMemorystream gegangen.
Delphi-Quellcode:
procedure TForm1.WriteBitmapToDatabase(BMP : TBitmap);
var
  FRecordID    : Integer;
  V            : Variant;
  P            : Pointer;
  ADOConnection : Connection;
  ADORecordset : Recordset;
  SQL          : String;
  MemoryStream : TMemoryStream;
begin
  FRecordID:=AddNewRecord;
  coboID.Items.Add(IntToStr(FRecordID));
  MemoryStream:=TMemoryStream.Create;
  SQL:=Format(sqlWritePicture,[FRecordID]);
  ADORecordset:=CoRecordset.Create;
  Try
    Bmp.SaveToStream(MemoryStream);
    MemoryStream.Seek(0,soFromBeginning);
    V:=VarArrayCreate([0,MemoryStream.Size], varByte);
    P:=VarArrayLock(V);
    MemoryStream.Read(P^,MemoryStream.Size);
    ADORecordset.Open(SQL,FADOConnection,adUseServer,adLockOptimistic,adOptionUnspecified);
    ADORecordset.Fields.Item['TYPE_'].Value:='BMP';
    ADORecordset.Fields.Item['PICTURE'].Value:=V;
    ADORecordset.Update(EmptyParam,EmptyParam);
  Finally
    VarArrayUnLock(V);
    MemoryStream.Free;
    ADORecordset:=Nil;
    end;
end;

procedure TForm1.btnReadClick(Sender: TObject);
var
  FRecordID    : Integer;
  V            : Variant;
  P            : Pointer;
  ADORecordset : Recordset;
  SQL          : String;
  MemoryStream : TMemoryStream;
begin
  Screen.Cursor:=crHourGlass;
  MemoryStream:=TMemoryStream.Create;
  SQL:=Format(sqlReadPicture,[coboID.Items[coboID.ItemIndex]]);
  ADORecordset:=CoRecordset.Create;
  Try
    ADORecordset.Open(SQL,FADOConnection,adUseServer,adLockOptimistic,adOptionUnspecified);
    V:=VarArrayCreate([0,ADORecordset.Fields.Item['PICTURE'].ActualSize], varByte);
    V:=ADORecordset.Fields.Item['PICTURE'].Value;
    P:=VarArrayLock(V);
    MemoryStream.Write(P^,ADORecordset.Fields.Item['PICTURE'].ActualSize);
    MemoryStream.Seek(0,soFromBeginning);
    Image2.Picture.Bitmap.LoadFromStream(MemoryStream);
  Finally
    VarArrayUnLock(V);
    MemoryStream.Free;
    ADORecordset:=Nil;
    Screen.Cursor:=crDefault;
    end;
end;
Das Feld TYPE_ ist ein Text und PICTURE ein OLE Feld.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 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