Abschnitt 2: DBImage zum Extrahieren von JPEG verwenden – der falsche Weg
DBImage – nimm eins (Das DBImage – nimm eins)
Wenn ich versuche, mit Delphi etwas Neues zu machen, frage ich zunächst die integrierte Hilfe von Delphi nach einer Methode. Dies ist die Antwort in der Hilfedokumentation: Ein TDBImage (auf der Seite „Datenkontrollen“ der Komponentenpalette) stellt ein grafisches Bild eines BLOB-Felds im aktuellen Datensatz der Datenbank dar. Verwenden Sie TDBImage, um Grafikfeldwerte darzustellen. Mit TDBImage können Formulare grafische Daten aus einer Datenbank anzeigen. TDBImage verfügt lediglich über etwas mehr Datensichtbarkeitseigenschaften als die TImage-Komponente. Die beiden wichtigsten Eigenschaften sind: DataSource (Datenquelle) und Field (Feld). Die DataSource-Eigenschaft verbindet die grafische Komponente mit der Datenbank. Auf unserem Formular gibt es eine DataSource-Komponente namens DataSource1, die einen Datensatz darstellt. Die Field-Eigenschaft gibt das Feld (in der Tabelle) an, das das Bild enthält.
Alles ist klar. Platzieren Sie nun eine DBImage-Komponente im Formular und nennen Sie sie standardmäßig DBImage1. Um das DBImage wirklich mit dem BLOB-Feld der Tabelle zu verbinden, müssen wir nur die folgende Konfiguration vornehmen (mithilfe des Objektinspektors):
DBImage1.DataSource = DataSource1
DBImage1.Field = Bild
Dies ist ein notwendiger Trick, um ein JPEG-Bild anzuzeigen, das im Feld „Bild“ der Anwendungstabelle vorhanden ist.
Um zu überprüfen, ob diese Konfiguration funktioniert, müssen wir lediglich die Active-Eigenschaft der ADOTable1-Komponente auf True setzen. Wir können dies während des Entwurfs im Objektinspektor tun. Sobald Sie dies getan haben, wird das folgende Dialogfeld angezeigt:
Was? Warum wird „Bitmap-Bild ist ungültig“ angezeigt? Wir haben JPEG-Bilder statt BMP-Bilder – ist das das Problem? Gehen wir zurück, um zu helfen.
Nachdem ich eine Weile in der Hilfe geklickt hatte, kam ich zu dem Schluss: Um das JPG-Bild in die Datenbank zu bekommen, müssen wir das TJpegImage-Objekt verwenden. Um Bilder anzuzeigen, benötigen wir eine einfache, unsichtbare Version der Image-Komponente. Gleichzeitig müssen wir einen Stream verwenden, um das Bild vom BLOB-Objekt zu laden. Beschreibung des Hilfedokuments: Wir sollten TADOBlobStream verwenden, um auf den Wert des BLOB- oder Memofelds (Notizfelds) im ADO-Datensatz zuzugreifen oder ihn zu ändern.
Abschnitt 3: Streams zum Extrahieren von JPEG verwenden – falsche Methode
Ziehen Sie das JPEG - nehmen Sie zwei!
Da wir mit dem DBImage nichts anfangen können, entfernen Sie es aus dem Formular und fügen Sie eine reguläre TImage-Komponente (zusätzliche Seite) mit dem Namen ADOImage ein. Leider verfügt die Bildkomponente über keine datensensitiven Eigenschaften, sodass ein separates Programm erforderlich ist, um das Bild aus der Datenbanktabelle anzuzeigen, die es darstellt. Der einfachste Weg, dies zu erreichen, besteht darin, eine Schaltfläche auf dem Formular zu platzieren, den gesamten Programmcode in sein OnClick-Ereignis einzufügen und die Schaltfläche zu benennen: „btnShowImage“.
Um ADOBLOBStream zu verwenden, empfiehlt die Hilfedokumentation, eine TADOBlobStream-Instanz zu erstellen, die „stream“-Methode zum Lesen der Grafikfelder aus dem Datensatz zu verwenden und dann den BLOB-Stream freizugeben. Irgendwo in der Mitte müssen wir mithilfe der LoadFromStream-Methode ein JPEG-Bild aus einem TADOBlobStream-Objekt laden. Die Bild- und Grafikeigenschaften der Bildkomponente werden zum eigentlichen Speichern und Anzeigen von Bildern verwendet.
Feldobjekt, was ist das?
An dieser Stelle gehe ich davon aus, dass bereits ein wenig Wissen über Feldobjekte ausreicht, um dieses Kapitel zu meistern. Bei der Entwicklung der Delphi-Datenbank ist das TField-Objekt eines der Hauptobjekte. Feldkomponenten sind nicht visuelle Objekte, die die Felder eines Datensatzes zur Laufzeit (oder Entwurfszeit) darstellen. TADOTable (und andere TDataSet-Unterklassen) bieten Entwurfszeitzugriff auf den Feldeditor. Mit dem Feldeditor können Sie die Felder auswählen, die Sie in den Datensatz aufnehmen möchten. Noch wichtiger ist, dass eine robuste Liste der im Datensatz der Anwendung verwendeten Feldkomponenten erstellt wird. Um den Fields Editor aufzurufen, doppelklicken Sie auf die TADOTable-Komponente. Standardmäßig ist die Feldliste leer. Klicken Sie auf die Schaltfläche „Hinzufügen“, um ein Dialogfeld zu öffnen, in dem die Felder der Anwendungstabelle aufgelistet sind. Standardmäßig sind alle Felder ausgewählt. Wählen Sie dann „OK“.
Delphi gibt den Standardnamen des Felds wie folgt an: Tabellenname (Tabellenname) + Feldname (Feldname). Das bedeutet, dass unser Bildfeld den Namen ADOTable1Picture trägt.
Die Create-Methode von TADOBlobStream erstellt eine Instanz zum Lesen oder Schreiben eines angegebenen BLOB-Feldobjekts, in diesem Fall das ADOTable1Picture-Feld.
Wir schreiben Programmcode in das OnClick-Ereignis des btnShowImage-Buttons. Dieser Code liest das Bild aus dem Bildfeld der aktuell ausgewählten Zeile. Der Quellcode lautet wie folgt:
verwendet JPEG;
...
PROcedure TForm1.btnShowImageClick(Sender: TObject);
var bS: TADOBlobStream;
Bild: TJpegImage;
beginnen
bS := TADOBlobStream.Create
(AdoTable1Picture, bmRead);
versuchen
Pic:=TJpegImage.Create;
versuchen
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
Endlich
Bildfrei;
Ende ;
Endlich
bS.Free
Ende ;
Ende ;
OK, lassen Sie uns dieses Projekt ausführen. Setzen Sie die ADOTable1.Active-Eigenschaft natürlich auf True. Nachdem das Formular angezeigt wird, klicken Sie auf die Schaltfläche und die folgende Anzeige erscheint:
Äh, was ist los? Der Code ist 100 % korrekt, aber warum wird das Bild nicht angezeigt? Denken Sie daran: „Niemals aufgeben, niemals kapitulieren“! Lassen Sie uns einen Drilldown auf die Byte-Ebene durchführen und sehen, was los ist!