Section 2 : Utilisation de DBImage pour extraire JPEG : dans le mauvais sens
DBImage - prenez-en un (Le DBImage - prenez-en un)
Lorsque j'essaie de faire quelque chose de nouveau avec Delphi, la première chose que je fais est de demander une méthode à l'aide intégrée de Delphi. Voici à quoi répondra la documentation d'aide : Une TDBImage (dans la page Contrôles de données de la palette de composants) représente une image graphique d'un champ BLOB dans l'enregistrement actuel de la base de données. Utilisez TDBImage pour représenter les valeurs des champs graphiques. TDBImage permet aux formulaires d'afficher des données graphiques à partir d'une base de données. TDBImage n'a que quelques propriétés de visibilité des données supplémentaires par rapport au composant TImage. Les deux propriétés les plus importantes sont : DataSource (source de données) et Field (champ). La propriété DataSource connecte le composant graphique à la base de données. Sur notre formulaire, il existe un composant DataSource nommé DataSource1 - qui représente un ensemble de données. La propriété Field indique le champ (dans la table) qui contient l'image.
Tout est clair, placez maintenant un composant DBImage sur le formulaire et nommez-le DBImage1 par défaut. Afin de véritablement connecter le DBImage au champ BLOB de la table, il suffit de faire la configuration suivante (à l'aide de l'inspecteur d'objets) :
DBImage1.DataSource = DataSource1
DBImage1.Field = Image
C'est une astuce nécessaire pour afficher une image JPEG qui existe dans le champ Image de la table des applications.
Pour vérifier que cette configuration fonctionne, la seule chose que nous devons faire est de définir la propriété Active du composant ADOTable1 sur True. Nous pouvons le faire dans l'inspecteur d'objets pendant la conception. Une fois cela fait, la boîte de dialogue suivante apparaîtra :
Quoi? Pourquoi le message « L'image bitmap n'est pas valide » s'affiche-t-il ? Nous avons des images JPEG au lieu d’images BMP – est-ce là le problème ? Revenons pour aider.
Après avoir cliqué un moment dans l'aide, je suis arrivé à la conclusion : pour obtenir l'image JPG dans la base de données, nous devons utiliser l'objet TJpegImage. Pour afficher des images, nous avons besoin d'une version simple et invisible du composant Image. Dans le même temps, nous devons utiliser un flux pour charger l'image depuis l'objet BLOB. Description du document d'aide : Nous devons utiliser TADOBlobStream pour accéder ou modifier la valeur du champ BLOB ou mémo (note) dans l'ensemble de données ADO.
Section 3 : Utiliser des flux pour extraire des fichiers JPEG : mauvaise méthode
Extraire le JPEG - prenez-en deux !
Puisque nous ne pouvons rien faire avec DBImage, supprimez-le du formulaire et insérez un composant TImage standard (page supplémentaire) nommé ADOImage. Malheureusement, le composant Image ne possède aucune propriété prenant en compte les données. Un programme distinct est donc requis pour afficher l'image à partir de la table de base de données qu'elle représente. Le moyen le plus simple d'y parvenir est de placer un bouton sur le formulaire, de mettre tout le code du programme dans son événement OnClick et de nommer le bouton : "btnShowImage".
Pour utiliser ADOBLOBStream, la documentation d'aide recommande de créer une instance de TADOBlobStream, en utilisant la méthode « stream » pour lire les champs graphiques de l'ensemble de données, puis de libérer le flux BLOB. Quelque part au milieu, nous devrons charger une image JPEG à partir d'un objet TADOBlobStream à l'aide de la méthode LoadFromStream. Les propriétés Picture et Graphic du composant Image seront utilisées pour stocker et afficher des images.
Objet champ, qu'est-ce que c'est ?
À ce stade, je suppose qu'un peu de connaissance des objets de terrain est plus que suffisant pour maîtriser ce chapitre. Dans le développement de la base de données Delphi, l'un des objets principaux est l'objet TField. Les composants de champ sont des objets non visuels qui représentent les champs d'un ensemble de données au moment de l'exécution (ou de la conception). TADOTable (et d'autres sous-classes de TDataSet) fournissent un accès au moment de la conception à l'éditeur de champs. L'éditeur de champs vous permet de sélectionner les champs que vous souhaitez inclure dans l'ensemble de données. Plus important encore, il crée une liste robuste de composants de champ utilisés dans l'ensemble de données de l'application. Pour appeler l'éditeur de champs, double-cliquez sur le composant TADOTable. Par défaut, la liste des champs est vide. Cliquez sur le bouton Ajouter pour ouvrir une boîte de dialogue répertoriant les champs de la table Applications. Par défaut, tous les champs sont sélectionnés, puis sélectionnez OK.
Delphi donnera le nom par défaut du champ comme suit : Nom de la table (table) + Nom du champ (champ). Cela signifie que notre champ d'image s'appelle : ADOTable1Picture.
La méthode Create de TADOBlobStream crée une instance pour lire ou écrire un objet de champ BLOB spécifié, dans ce cas le champ ADOTable1Picture.
Nous écrivons le code du programme dans l'événement OnClick du bouton btnShowImage. Ce code lira l'image du champ Image de la ligne actuellement sélectionnée. Le code source est le suivant :
utilise jpeg ;
...
PRocédure TForm1.btnShowImageClick(Expéditeur : TObject);
var bS : TADOBlobStream ;
Photo : TJpegImage ;
commencer
bS := TADOBlobStream.Create
(AdoTable1Picture, bmRead);
essayer
Pic:=TJpegImage.Create;
essayer
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Pic;
enfin
Pic.Gratuit;
fin ;
enfin
bS.Gratuit
fin ;
fin ;
OK, exécutons ce projet. Bien entendu, définissez la propriété ADOTable1.Active sur True. Une fois le formulaire affiché, cliquez sur le bouton et l'affichage suivant apparaîtra :
Euh, que se passe-t-il ? Le code est correct à 100% mais pourquoi l'image ne s'affiche-t-elle pas ? N'oubliez pas « n'abandonnez jamais, ne vous rendez jamais » ! Passons au niveau des octets et voyons ce qui se passe !