IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

Charger une image dans un champ TDBImage et l'enregistrer


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut Charger une image dans un champ TDBImage et l'enregistrer
    Bonjour,
    Voila je cherche à charger une image dans un champ TDBImage et l'enregistrer.
    J'utilise Delphi 7 et la base de données et en access.

    Merci de me guider.

    PS : l'image représente la photo d'un client, elle doit être en Jpeg.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    je ne dirais que
    ici

    ou pour régler d'autres problèmes d'utiliser la fonction recherche du Forum

    enfin pour ce qui est du Jpg il suffit d'indiquer dans la clause uses JPEG

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Salut,
    J'ai vu, mais ça ne répond pas à ce que je cherche,
    voila j'ai réussi à chargé l'image mais je ne sais pas comment l'enregistrer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if OpenPictureDialog_Photo.Execute then
    Photo.Picture.LoadFromFile(OpenPictureDialog_Photo.FileName);

    PS : j'ai ajouté Jpeg dans Uses biensur.

    Dans le bouton Enregistrer Table.Post; ne fonctionne pas avec ce champ, il enregistre tous les autres champs non image, sauf celui là, c'est quoi la solution SVP.

    Merci.

  4. #4
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    Salut,

    Pour enregistrer une image dans une BD access il faut utiliser la procedure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure SaveJpegToTable(Table: TADOquery; PicField:TBlobField; sPicPath: string);
    var
      fS  : TFileStream;
    begin
      fs:=TFileStream.Create(sPicPath, fmOpenRead);
      try
       Table.Insert;//ou table.edit;
       PicField.LoadFromStream(fs);
       Table.Post;
      finally
       fs.Free;
      end;
    end;
    Et dans un bouton en supposant que votre champ s'appele "Photo" il faut faire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
    Chemin :String;
    begin
    Chemin:='c:\dossier\image.jpg';
    SaveJpegToTable(Query1, Query1Photo, Chemin );
    end;
    On peut même utiliser un ADOTABLE a la Place de TQuery;

  5. #5
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    Et lorsque vous voulez afficher l'image avec un DBImage et bien au lieu de l'mage ca vous affiche message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Bitmap image is Not Valid
    Pour solutionner ca il faut deposer un TImage sur la form et faut utiliser la function suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    function JpegStartsInBlob
             (PicField:TBlobField):integer;
    var
     bS     : TADOBlobStream;
     buffer : Word;
     hx     : string;
    begin
     Result := -1;
     bS := TADOBlobStream.Create(PicField, bmRead);
     try
      while (Result = -1) and
            (bS.Position + 1 < bS.Size) do
      begin
       bS.ReadBuffer(buffer, 1);
       hx:=IntToHex(buffer, 2);
       if hx = 'FF' then begin
         bS.ReadBuffer(buffer, 1);
         hx:=IntToHex(buffer, 2);
         if hx = 'D8' then Result := bS.Position - 2
         else if hx = 'FF' then
          	bS.Position := bS.Position-1;
       end; //if
      end; //while
     finally
      bS.Free
     end;  //try
    end;
    Et l'appeler ainsi par exemple dans un bouton ou dans le scroll de la query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    procedure TForm1.Button2Click(Sender: TObject);
    var
      bS  : TADOBlobStream;
      Pic : TJpegImage;
    begin
      bS := TADOBlobStream.Create
            (Query1Photo, bmRead);
      try
        bS.Seek(JpegStartsInBlob(Query1Photo),
                soFromBeginning);
        Pic:=TJpegImage.Create;
        try
         Pic.LoadFromStream(bS);
         ADOImage.Picture.Graphic:=Pic;
        finally
         Pic.Free;
        end;
      finally
        bS.Free
      end;
    end;

  6. #6
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Citation Envoyé par freud Voir le message
    Salut,

    Pour enregistrer une image dans une BD access il faut utiliser la procedure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure SaveJpegToTable(Table: TADOquery; PicField:TBlobField; sPicPath: string);
    var
      fS  : TFileStream;
    begin
      fs:=TFileStream.Create(sPicPath, fmOpenRead);
      try
       Table.Insert;//ou table.edit;
       PicField.LoadFromStream(fs);
       Table.Post;
      finally
       fs.Free;
      end;
    end;
    Et dans un bouton en supposant que votre champ s'appele "Photo" il faut faire comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
    Chemin :String;
    begin
    Chemin:='c:\dossier\image.jpg';
    SaveJpegToTable(Query1, Query1Photo, Chemin );
    end;
    On peut même utiliser un ADOTABLE a la Place de TQuery;
    Bonjour,
    je vous remercie pour votre réponse, Mais j'ai pet être mal procédé, veuillez me guider.
    Voila j'ai une base de données en Access comme j'ai cité en haut, la connexion à la base est via ADO,
    Donc voila, j'ai ajouté un ADOquery (mais je ne l'ai relié à rien )
    Ajouter un bouton pour enregistrer :
    Voilama procedure SaveJpegToTable suivit du bouton d'enregistrement, dies moi où c'est faut SVP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    procedure SaveJpegToTable(Table: TADOquery; PicField:TBlobField; sPicPath: string);
    var
      fS  : TFileStream;
    begin
      fs:=TFileStream.Create(sPicPath, fmOpenRead);
      try
       DM_Location.ADOTable_Clients.Insert;//ou table.edit;
       DM_Location.ADOTable_ClientsPhotoduClient.LoadFromStream(fs);
       DM_Location.ADOTable_Clients.Post;
      finally
       fs.Free;
      end;
    end;
     
     
    procedure TForm_AjtClient.Button2Click(Sender: TObject);
    Var
    Chemin :String;
    begin
    Chemin:='D:\temp\image.jpg';
    SaveJpegToTable(ADOQuery1, ADOQueryPhoto, Chemin );
    end;
    Info supplémentaire :
    Table des clients : ADOTable_Clients
    Table Name : CLIENTS
    FieldName : PhotoduClient

    Et je veux bien comprendre cette ligne : SaveJpegToTable(ADOQuery1, ADOQueryPhoto, Chemin )




    Merci beaucoup.

  7. #7
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    Salut,

    1)-Vous devez affecter a la propriété connection de votre query le composant ADOConnection1.

    2)-Faite un clic droit sur le composant query et cliquez sur editeur de champs pour recuperer le champ "PhotoduClient"

    3)-Inserer la procedure SaveJpegToTable sous la partie Implementation de votre form .

    Il est plus souple de passer en parametre SaveJpegToTable votre table au lieu de l'appeler dans cette procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DM_Location.ADOTable_Clients
    4)-Dans un bouton faite l'insertion de la photo en indiquant le chemin par un openDialog ou autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    ...................................
    ...................................
    var
      Form1: TForm1;
     
    implementation
     
    procedure SaveJpegToTable(Table: TADOquery; PicField:TBlobField; sPicPath: string);
    var
      fS  : TFileStream;
    begin
      fs:=TFileStream.Create(sPicPath, fmOpenRead);
      try
       Table.Insert;//ou table.edit;
       PicField.LoadFromStream(fs);
       Table.Post;
      finally
       fs.Free;
      end;
    end;
     
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
    Chemin :String;
    begin
    Chemin:='c:\dossier\image.jpg';
    SaveJpegToTable(ADOTable_Clients
    , DM_Location.ADOTable_ClientsPhotoduClient, Chemin );
    end;
    end.

    Cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SaveJpegToTable(ADOQuery1, ADOQueryPhoto, Chemin );
    C'est l'appel de la procedure que vous faite dans le bouton avec comme paramètres :

    ADOTable_Clients (la table)
    DM_Location.ADOTable_ClientsPhotoduClient (le champ photo)
    Chemin (chemin de l'image)

  8. #8
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    ReSalut.
    Quand je fais ce que vous m'avez demandé à la lettre, j'ai eu ça :
    [Erreur] Unit_AjtClient.pas(145): Types incompatibles : 'TADOQuery' et 'TADOTable'

    C'est logique puisque je lui demande d'executter la procdure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaveJpegToTable (DM_Location.ADOTable_Clients, DM_Location.ADOTable_ClientsPhotoduClient, Chemin )
    (Paramètres : DM_Location.ADOTable_Clients, DM_Location.ADOTable_ClientsPhotoduClient, Chemin)

    Or qu'elle etait déclaré avec des paramèttres Query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    implementation
     
    uses Unit_DM, Unit_GestionLocation;
    procedure SaveJpegToTable(Table: TADOquery; PicField:TBlobField; sPicPath: string);
    C'est quoi la solution.

    À Noter que même si j'ajoute un TADOQuerry, je ne peux pas lui ajouter un champs puisqu'il dit que la propriété sql est vide.

    Voila mes codes au complets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    implementation
     
    uses Unit_DM, Unit_GestionLocation;
    procedure SaveJpegToTable(Table: TADOquery; PicField:TBlobField; sPicPath: string);
    var
      fS  : TFileStream;
    begin
      fs:=TFileStream.Create(sPicPath, fmOpenRead);
      try
       DM_Location.ADOTable_Clients.Insert;//ou table.edit;
       PicField.LoadFromStream(fs);
       DM_Location.ADOTable_Clients.Post;
      finally
       fs.Free;
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm_AjtClient.Button_EnregistrerPhotoClick(Sender: TObject);
    Var
    Chemin :String;
    begin
    Chemin:='D:\temp\image.jpg';
    SaveJpegToTable(DM_Location.ADOTable_Clients, DM_Location.ADOTable_ClientsPhotoduClient, Chemin );
    end;

  9. #9
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    Comme argument dans la procedure il faut mettre un TADOTable et laisser le code tel quel ne pas le moidifer pour mettre le : DM_Location.ADOTable_Clients.Insert; parce que votre table sera passée en parametre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure SaveJpegToTable(Table: TADOTable; PicField:TBlobField; sPicPath: string);
    var
      fS  : TFileStream;
    begin
      fs:=TFileStream.Create(sPicPath, fmOpenRead);
      try
       Table.Insert;//ou table.edit;
       PicField.LoadFromStream(fs);
       Table.Post;
      finally
       fs.Free;
      end;
    end;

  10. #10
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Oui je l'avais fait, il m'affiche :

    [Erreur fatale] Impossible de créer le fichier de sortie et il affiche le chemin de l'exécutable.

  11. #11
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    A l'insertion de l'image ?

  12. #12
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Même pas, à sa compilation.

  13. #13
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    ca se compile pas, comment ca ?
    Supprime ton exe et reconstruis le

  14. #14
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Je l'ai supprimé, reconstruit, il affiche :
    [Erreur fatale] Impossible de créer le fichier de sortie ....exe

  15. #15
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Effectivement il y avait un petit soucis dans l'emplacement des fichiers.
    Mais maintenant il affiche TADOTable non déclaré (il vise les paramètres de la procédure).

  16. #16
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    Bonjour,

    Il faut ajouter les unités ADODB et DB dans la section :

  17. #17
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Maintenant il affiche en ajoutant ADODB, DB dans uses :
    [Erreur] WARNING. Duplicate resource(s):
    [Erreur] Type 2 (BITMAP), ID CDROM:
    [Erreur] File C:\...\Project.res resource kept; file d:\program files\borland\delphi7\Lib\FileCtrl.res resource discarded.

  18. #18
    Membre éprouvé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Par défaut
    il faut supprimer le fichier ressource .res se trouvant dans le dossier de l'application et va se recréer tout seul et ne pas supprimer celui afficher par le message

  19. #19
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Je ne voix pas lequel.

  20. #20
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 48
    Par défaut
    Ah ok, c'est fait, mais maintenant j'ai cette erreur : Impossible d'ouvrir le fichier "D:\temp\image.jpg" Le fichier spécifié est introuvable.

Discussions similaires

  1. [TImageList] Charger une image dans un TImage
    Par xenos dans le forum Delphi
    Réponses: 5
    Dernier message: 17/05/2006, 18h30
  2. Charger une image dans un Timage
    Par michel71 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/04/2006, 08h55
  3. [Image] charger une image dans le main
    Par GLDavid dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 31/03/2006, 17h11
  4. [FLASH MX2004] une image dans un champ texte
    Par barok dans le forum Flash
    Réponses: 3
    Dernier message: 30/03/2006, 17h15
  5. Charger une image dans un thread
    Par KRis dans le forum Langage
    Réponses: 3
    Dernier message: 25/08/2005, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo