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 :

[D7] Modifier la couleur d'une ligne d'un DBdataGrid


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 19
    Points
    19
    Par défaut [D7] Modifier la couleur d'une ligne d'un DBdataGrid
    Bonjour,
    Je tente de modifier la couleur d'une ligne d'un DBDataGrid. Je repère cette ligne à l'aide du Dataset de la grille (qui est une ADOQuery). Une fois l'élément sélectionné, je le trace avec un BookMark.
    Je code sur le OnDrawColumnCell de la grille le changment de couleur à effectuer... sans succès et avec une erreur sur msado15.dll?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Définition du bookmark
      BookMarkCmd := ADOQry.GetBookmark;
      if ADOQry.BookmarkValid(BookMarkCmd) then
      begin
         ADOQry.GotoBookmark(BookMarkCmd);
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Modification de la couleur de fond de la ligne
    procedure TFForm.DBGridDrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumn;
      State: TGridDrawState);
    begin
      if ADOQry.BookmarkValid(BookMarkCmd) then
      begin
        DBGrid.Canvas.Brush.Color := clGreen;
        ADOQry.FreeBookmark(BookMarkCmd);
      end;
    end;

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Que veux tu faire exactement ? Mettre en couleur une ligne que tu as sélectionné ?

    Sinon quel est l'erreur exacte que tu as avec msado15.dll ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    En fait, je souhaite sélectionner une ligne d'un DBDataGrid au clic sur une autre DBDataGrid. Le principe : au clic sur un élément d'une liste de choix dans une datagrid, le choix en question s'insère dans une autre dbdatagrid (ou s'il y existe déjà, voit sa quantité incrémentée) et la sélection se fasse sur l'élément inséré ou modifié (pour qu'on le repère). J'ai laissé de côté le fait de colorer le fond de la ligne, je veux déjà le sélectionné.
    En fait, je n'ai plus l'erreur sur la dll, mais je n'arrive pas à faire fonctionner le bookmark.
    Je suis en train de voir le problème. En fait, à l'insertion d'un élément, la sélection revient toujours sur le premier élément de la grille!

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    J'ai testé le code trouvé au post
    suivant : http://www.developpez.net/forums/sho...light=bookmark

    Ca ne fonctionne pas sur ma grille!
    Le dataset de ma grille était une ADOQuery (un select sur une table) que j'ai modifié pour un ADOTable. Ca ne change rien au problème du bookmark, ça m'interroge seulement sur le choix à effectuer : utiliser les ADOQuery ou les ADOTable. Mais ça fera l'objet d'un autre post!?
    Je ne suis pas plus avancée!

  5. #5
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Bonjour,

    Je suis en train de voir le problème. En fait, à l'insertion d'un élément, la sélection revient toujours sur le premier élément de la grille!
    C'est normal, lors de certaines fonctions appelées par le DBGrid (append, insert...)replace le curseur en début (voir en fin..) de ton dataset.

    J'ai eu le même problème avec les bookmarks, je pouvais pas le replacer après avoir modifier la table par un insert. Alors je les utilisent plus...A la place je stock dans une variable la ligne du DBGrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    marqueue := TDrawGrid(nom).Row
    Et quand je veux le repositionner, je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Data.Dataset.DisableControls;
    Data.DataSet.First; if ( i<>1) then
      begin
        for i:=2 to marqueur do Data.DataSet.Next;
      end;
    Data.Dataset.EnableControls;
    Mais quelqu'un de plus expérimenter doit surement avoir une méthode plus propre...

    @+.
    For crying out loud !

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Considère :

    AdoQ1 -> Ds1 -> DbGrid1
    AdoQ2 -> Ds2 -> DbGrid2

    dans le OnClick de la DbGrid1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if Adoq2.locate('MonChampDeRecherche',AdoQ1.FieldByName('MonchampDeRecherche').aSString,[loCaseInsensitive]) then
    begin
      // L'enregistrement a été trouvé.
    end
    else
    begin
      // L'enregistrement n'exsite pas
      // La tu créés ton enregisterment.
    end;
    Pour la couleur de la ligne dans la DbGrid2 :

    - Tu mets l'options, dgAlwaysShowSelection à True;
    - Tu codes comme ci dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TfrmMain.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    begin
      // Si la ligne est sélectionnée on la met en rouge
     If gdSelected In State Then
       TDBGrid(Sender).Canvas.Brush.Color := clRed;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par PadawanDuDelphi
    Mais quelqu'un de plus expérimenter doit surement avoir une méthode plus propre...

    @+.
    Pour pas mal de personne vous n'arrivez pas encore à comprendre qu'un DbGrid ne contient pas de données, un dbGrid c'est vide ^^
    C'est la source de données qui possède les enregistrements, en l'occurence, la c'est les AdoQuery ou AdoTable.

    De plus ta méthode ne fonctionne que sur une petite table, imagine que c'est le 1 000 000 em enregistrement que tu sélectionnes, combien de temps ca va mettre pour faire le for et les next ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    @PadawanDuDelphi : Eh oui, donc je ne suis pas la seule à galérer avec les bookmark! Mais je rejoins l'idée de Malatar en terme de rapidité d'exécution avec l'emploi des ADOTables.
    @Malatar : J'ai testé ton code sur une table, mais ça plante au locate. Faut-il parcourir la table et tester l'existence avec le locate ou bien le locate se localise-t'il directement sur l'enregistrement s'il existe?

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par celine33
    @Malatar : J'ai testé ton code sur une table, mais ça plante au locate. Faut-il parcourir la table et tester l'existence avec le locate ou bien le locate se localise-t'il directement sur l'enregistrement s'il existe?
    Le Locate s'il trouve, positionne le curseur du DataSet (Query ou Table) sur l'enregistement.

    un petit sur le locate te donnera plus d'informations

    Sinon fait voir ton code complet du onclick, ca permettra de voir ou est l'erreur.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    Je n'utilise pas de boucle (j'ai vérifié l'aide de Delphi), mais le locate n'entraine pas le repositionnement sur mon champ. Que faire? Est ce que le fait que je teste sur une ADOTable et non une ADOQuery est en jeu??

  11. #11
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par celine33
    Je n'utilise pas de boucle (j'ai vérifié l'aide de Delphi), mais le locate n'entraine pas le repositionnement sur mon champ. Que faire? Est ce que le fait que je teste sur une ADOTable et non une ADOQuery est en jeu??
    Fait voir la partie du code qui utilise le locate, ca sera plus simple de voir l'erreur que de spéculer sur l'erreur possible qu'il y a dans ton code ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  12. #12
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    Voilà la structure de mon code :
    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
      if not tarifispresent(coderef) then // TARIF A INSERER
      begin
        Qte := 1;
        if DM.ADOTab_detailResa.Active = false then
          DM.ADOTab_detailResa.Active := true;
        DM.ADOTab_detailResa.Insert;
     
        with pdaDataModule do
        begin
          ADOTab_detailResaDET_CODRESA.AsFloat := valCodresa;
          ADOTab_detailResaDET_CODETARIF.AsString := codeRef; // coderef du tarif
          // ...
          //ADOTab_detailResa.Recordset.MoveLast; // ne fonctionne pas
        end;
      end
      else // TARIF DEJA EXISTANT => METTRE A JOUR LA QTE 
      begin
        //... requête de sélection de la QTE à modifier   
        DM.ADOQry.locate('DET_CODETARIF',codeRef,[loCaseInsensitive]);
        Qte := Qte + 1;
        // update de l'enregistrement 
      end;
    J'ai lu sur la doc des ADO Delphi de Developpez.com que le locate pouvait ne pas marcher dans certans cas...

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    ADOQry est bien relié à la deuxieme dbgrid par un datasource ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    Oui, le Dataset du 2ème DBGrid est ADOQry relié via un DataSource à la grille.
    J'ai réussi à gérer la sélection à la modification d'un élément en utilisant à la fois le LOCATE et un BOOKMARK. Je planche encore sur l'insertion. Je posterai mon code en temps voulu!

Discussions similaires

  1. modifier la couleur d une ligne DGW
    Par furax51 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/10/2011, 02h19
  2. Réponses: 1
    Dernier message: 18/12/2009, 20h43
  3. Réponses: 2
    Dernier message: 28/08/2007, 16h03
  4. Réponses: 5
    Dernier message: 06/06/2006, 10h27
  5. [C#] [DataGrid] Modifier la couleur d'une ligne
    Par nalaya dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/08/2004, 12h11

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