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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    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)

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