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 :

Image / Record / Base de données / DBGrid


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Image / Record / Base de données / DBGrid
    Bonjour à toutes et à tous,

    J'ai besoin d'afficher dans un DBGrid des images selon des conditions, vous allez me dire VA VOIR LA FAQ abruti de Buzz..., vous pourriez rester poli éH OH

    ... humm déjà fais + d'autre lien évidement.

    Base ACCESS / ADODB / D2009

    Voilà comment je souhaite procéder :
    1) Dans mon unité commune
    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
    type
      TFileExtension = Record
        eExtension  : String;
        eImage      : TImage;
      end;
     
      FileExtension     : Array of TFileExtension;
     
    procedure LectureExtension;
    var
      n : Integer;
    begin
     
      SetLength(FileExtension,0);
      Finalize(FileExtension);
     
      With FData.QryCommun do
      begin
        Sql.Clear;
        Sql.Add('Select * From FileExtensions');
        try
          Active := True;
          SetLength(FileExtension,Recordset.RecordCount);
          for n := 0 to High(FileExtension) do
          begin
            FileExtension[n].eExtension  := FieldByName('Extension').AsString;
            FileExtension[n].eImage      := TImage(FieldByName('Image'));
            next;
          end;
        finally
          Close;
        end;
      end;
     
    end;
    2) Au Create de la form principal, je charge les images (pas plus de 30)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFPrincipal.FormCreate(Sender: TObject);
    begin
    // ...
     LectureExtension;
    // ...
    end;
    3) Dans le DrawCell de mon DBGrid je tente de d'afficher l'image sauf que je ne sais pas comment traduire le eImage

    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
    36
    procedure TFPrincipal.SMDBGridGEDDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    Var
      i: Byte;
      xRect: TRect;
      xColSort: String;
    begin
      With Sender as TSMDBGrid Do With Canvas Do
      Begin
        if DataSource.DataSet.RecordCount > 0 then
        begin
    
          xRect := Rect;
          FillRect(xRect);
    
    // ...
    
          if (Column.FieldName = 'FExtension' ) then
          begin
            for I := Low(FileExtension) to High(FileExtension) do
            begin
               if FileExtension[i].eExtension = DataSource.DataSet.FieldByName('FExenstion').AsString then
    
               ???????? FileExtension[I].eImage   ?????????
    
            end;
    
            xRect := Rect;
            xRect.Left := Rect.Left + <eImage>.Width + 2;
          end;
    
          DefaultDrawColumnCell(xRect, DataCol, Column, State);
        end;
      end;
    
    end;
    Comment puis'je faire pour l'afficher ? (en considèrent que mes images sont toutes des PNG ou toute des BMP peu importent mais qu'un seul format.)

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Salut,

    Je remarque que :
    1- tu te couches tard
    2- plus sérieusement, tu utilises un SMDBGrid (excellent DBGrid au demeurant )

    L'auteur à déjà répondu pas mal de fois sur comment gérer une image dans la Grid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.SMDBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
    begin
    if Field.FieldName = 'COLUMN3' then
    begin
    SMDBGrid1.Canvas.FillRect(Rect);
     
    SMDBGrid1.Canvas.StretchDraw(Rect, yourImageWhereTextIconIs.Picture.Graphic);
    end;
    end;
    je dirais donc que dans ton cas cela devrait donner quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StretchDraw(Rect,FileExtension[I].eImage.Picture.Graphic);
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Serge,

    Je remarque que :
    1- tu te lève tôt
    2- euh rien....

    Citation Envoyé par SergioMaster Voir le message

    je dirais donc que dans ton cas cela devrait donner quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StretchDraw(Rect,FileExtension[I].eImage.Picture.Graphic);
    Cela ne fonctionne pas je me prends une belle violation, peut-être qu'un record de Timage ça le fait pas...

    Si j'y arrive pas je passerai par une TimageList.

    Merci.

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut Buzz

    Hello Sergio.

    @Buzz:
    Pourquoi utiliser un TImage dans ton record ? TImage est un contrôle visuel qui possède un owner et doit également avoir un parent défini.

    A la ligne 27 de ton premier code, tu fais un simple cast sur la valeur de ta colonne. Pas étonnant que tu obtiennes une belle AV.

    Utilise plutôt un TGraphic ou TBitmap (qu'il faudra instancié et libéré). Ensuite pour le rendu dans le Grid c'est comme d'habitude, cf le code exemple de Sergio.

    @+ Claudius.

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Peut être est-ce la manière dont tu "loade" l'image ?

    si je comprend bien , les images et extensions sont dans un fichier BDD (donc image dans un Blob Graphique ?) je ne crois pas que forcer Memo en TImage soit orthodoxe (en tout cas moi , je fais pas ) . C'est donc plutôt la partie LectureExtension qu'il faudrait revoir .

    Tu me connais , ADO/Access et moi cela fait 2 voire 3 , mais j'aurais plutôt fait ainsi (comme je fais avec firebird ;-) )

    Code fait a la volée : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      bS  : TADOBlobStream;
    begin
      bS := TADOBlobStream.Create(FieldByName('Image'), bmRead);
      try
        FileExtension[n].eImage.LoadFromStream(bs); // manque peut être un Picture . 
      finally
        bS.Free
      end;

    et comme le rajoute Cl@udius (qui m'a grillé de quelques secondes )un TGraphic plutôt qu'un TImage
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Claudius, cubitus radius...

    J'ai illustré ce que tu as proposé :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Jpeg, pngimage, GIFImg,
      Dialogs, ADODB, DB, Grids, DBGrids, SMDBGrid, ExtCtrls;
     
    type
      TFileExtension = Record
        eExtension  : String;
        eImage      : TGraphic;
      end;
     
     
     
    type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOTblDocuments: TADOTable;
        ADOQry: TADOQuery;
        SMDBGrid1: TSMDBGrid;
        DataSource1: TDataSource;
        procedure FormCreate(Sender: TObject);
        procedure SMDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
      private
        { Déclarations privées }
        procedure LectureExtension;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      FileExtension     : Array of TFileExtension;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.LectureExtension;
    var
      n : Integer;
      BS: TStream;
      Graphic: TGraphic;
      FirstBytes: AnsiString;
    begin
      Graphic := nil;
     
      SetLength(FileExtension,0);
      Finalize(FileExtension);
     
      With ADOQry do
      begin
        Sql.Clear;
        Sql.Add('Select * From Extension');
        try
          Active := True;
          SetLength(FileExtension,Recordset.RecordCount);
          for n := 0 to High(FileExtension) do
          begin
            FileExtension[n].eExtension  := FieldByName('Extension').AsString;
            BS := CreateBlobStream(FieldByName('Image'), bmRead);
            try
              SetLength(FirstBytes, 8);
              BS.Read(FirstBytes[1], 8);
              if Copy(FirstBytes, 1, 2) = 'BM' then
              begin
                Graphic := TBitmap.Create;
              end else
              if FirstBytes = #137'PNG'#13#10#26#10 then
              begin
                Graphic := TPngImage.Create;
              end else
              if Copy(FirstBytes, 1, 3) =  'GIF' then
              begin
                Graphic := TGIFImage.Create;
              end else
              if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
              begin
                Graphic := TJPEGImage.Create;
              end;
              if Assigned(Graphic) then
              begin
                try
                  BS.Seek(0, soFromBeginning);
                  Graphic.LoadFromStream(BS);
                  FileExtension[n].eImage.Assign(Graphic);
                except
                end;
                Graphic.Free;
              end;
            finally
              BS.Free;
            end;
     
            next;
          end;
        finally
          Close;
        end;
      end;
     
    end;
     
    procedure TForm1.SMDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    Var
      xRect: TRect;
      i: Integer;
    begin
      With Sender as TSMDBGrid Do With Canvas Do
      Begin
        if DataSource.DataSet.RecordCount > 0 then
        begin
     
          xRect := Rect;
          FillRect(xRect);
     
          if Column.FieldName = 'eExtension' then
          begin
     
            for I := Low(FileExtension) to High(FileExtension) do
            begin
               if FileExtension[i].eExtension = DataSource.DataSet.FieldByName('eExtension').AsString then
               begin
                SMDBGrid1.Canvas.FillRect(xRect);
     
                SMDBGrid1.Canvas.StretchDraw(xRect, FileExtension[0].eImage);
               end;
            end;
          end;
     
          DefaultDrawColumnCell(xRect, DataCol, Column, State);
        end;
      End;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      LectureExtension;
    end;
     
    end.
    Mais je n'ai aucune image qui s'affiche, je doit avoir oublié un truc.


    PS Sergio :
    Tu me connais , ADO/Access et moi cela fait 2 voire 3 ,
    tout se soigne... lool

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    un else peut être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         if Column.FieldName = 'eExtension' then
          begin
             .....
          end
          else
          DefaultDrawColumnCell(xRect, DataCol, Column, State);
    sinon à quoi sert le if si tu fait un DefaultDraw
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Cela ne viens pas du if (et puis j'ai pas mis toute la procédure et j'ai copier coller le projet réel dans cette New unité)

    En fait mon problème viens du chargement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            FileExtension[n].eExtension  := FieldByName('Extension').AsString;
            BS := CreateBlobStream(FieldByName('Image'), bmRead);
            try
              SetLength(FirstBytes, 8);
              BS.Read(FirstBytes[1], 8);
    Quand je fais un showmessage(Copy(FirstBytes, 1, 2));, j'ai un super hiéroglyphe en réponse.
    Ce que j'ai fais pour gagné du temps, j'ai copier coller une image de mon Paint dans le champs, direct sous ACCESS, c'est peut-être cela qui gêne.

  9. #9
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon j'ai ajouté cela dans le create de ma form

    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
    procedure TForm1.FormCreate(Sender: TObject);
    Var
      BS: TStream;
      FS: TStream;
    begin
      With ADOTbl do
      begin
        Open;
        Insert;
        FieldByName('Extension').AsString := '.pdf';
        BS := CreateBlobStream(FieldByName('Image') ,bmWrite);
          Try
          FS := TFileStream.Create('c:\IDE\test.bmp',fmOpenRead or fmShareDenyNone);
          Try
            BS.CopyFrom(FS,0);
          Finally
            FS.Free;
          End;
        Finally
          BS.Free;
        End;
        Post;
      end;
     LectureExtension;
    end;
    Dans le champs de ma base j'ai maintenant une donnée en Binaire.
    Lorsque je vais dans la procédure LectureExtension; il trouve un 'BM', mais lorsqu'il passe sur

    FileExtension[n].eImage.Assign(Graphic);
    (j'ai essayé directe FileExtension[n].eImage.LoadFromFile('c:\IDE\test.bmp');

    Mais je me prends une violation d'accès.

    Avez-vous une piste ?

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bien

    J'ai complétement changé de méthode grace à cette source

    GETICON

    Qui fonctionne super bien.

    Merci à vous pour votre participation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. inserer une image dans base de données ?
    Par ouldfella dans le forum Requêtes
    Réponses: 7
    Dernier message: 20/12/2006, 16h04
  2. Réponses: 3
    Dernier message: 19/09/2006, 15h36
  3. [MySQL] Stocker une image en base de données
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/03/2006, 22h51
  4. [MySQL] insertion d'une image en base de données
    Par SENCABOY dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/02/2006, 11h07
  5. [VB.NET]Champ image dans base de donnée access
    Par dankes dans le forum Windows Forms
    Réponses: 10
    Dernier message: 06/10/2005, 15h31

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