AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bitmap in Access speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap in Access speichern

Ein Thema von thomasch · begonnen am 15. Jan 2007 · letzter Beitrag vom 15. Jan 2007
Antwort Antwort
thomasch

Registriert seit: 7. Apr 2005
57 Beiträge
 
Delphi 2007 Architect
 
#1

Bitmap in Access speichern

  Alt 15. Jan 2007, 16:52
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
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Bitmap in Access speichern

  Alt 15. Jan 2007, 18:41
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
  Mit Zitat antworten Zitat
thomasch

Registriert seit: 7. Apr 2005
57 Beiträge
 
Delphi 2007 Architect
 
#3

Re: Bitmap in Access speichern

  Alt 15. Jan 2007, 19:23
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...

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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Bitmap in Access speichern

  Alt 15. Jan 2007, 20:08
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..
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Bitmap in Access speichern

  Alt 15. Jan 2007, 21:02
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 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