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

Lazarus Pascal Discussion :

Événement lié à la fin de remplissage d'un DBGrid


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut Événement lié à la fin de remplissage d'un DBGrid
    Bonjour,

    Voici mon souci : je remplis un dbgrid via un Tsqlquery dès l' ouverture de ma fiche.
    Dans ce dggrid, en fonction de la valeur d'un champ, je colorie de façons différentes mon champ : vert si disponible , rouge si indisponible.
    Mon souci serait que j'aimerais récuperer le nombre de badges disponibles et le nombre mis en rouge sans avoir à passer par un autre TSQLquery.
    Peut-on ajouter un compteur au cours du remplissage du dbgrid et le faire afficher à la fin ?
    Y a-t-il un événement pour cela ?
    J'ai essayé la solution ci-dessous mais elle ne fonctionne pas :
    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
     
    procedure Tfrm_bd_temp.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer;
      Column: TColumn; AState: TGridDrawState);
    begin
       with (sender as Tdbgrid) do
      begin
          if datasource.dataset.fields[3].AsString='1' then
          begin
             if column.index=2 then
               canvas.Font.color:=clgreen;
             nb_dispo:=nb_dispo+1;
             lbl_dispo.caption:='Badges disponibles '+ inttostr(nb_dispo);
          end;
          if datasource.dataset.fields[3].AsString='2'  then
             if column.index=2 then
                canvas.Font.color:=clred;
          if datasource.dataset.fields[3].AsString='3' then
            if  column.index=2 then
              canvas.Font.color:=strtoint('$EDD38C');
          if datasource.dataset.fields[3].AsString='4' then
            if  column.index=2 then
              canvas.Font.color:=strtoint('$CCCCCC');
      end;
    end;
    Merci d avance.

  2. #2
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par wwilly17 Voir le message
    J'ai essayé la solution ci-dessous mais elle ne fonctionne pas
    Bonjour,

    Plus précisément : qu'est-ce qui ne fonctionne pas ? Rien ne se passe ? Les résultats sont faux ? ....

    Citation Envoyé par wwilly17 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure Tfrm_bd_temp.DBGrid1PrepareCanvas(sender: TObject; DataCol: Integer;
      Column: TColumn; AState: TGridDrawState);
    begin
       with (sender as Tdbgrid) do
      begin
          if datasource.dataset.fields[3].AsString='1' then
          begin
             if column.index=2 then
               canvas.Font.color:=clgreen;
             nb_dispo:=nb_dispo+1;
             lbl_dispo.caption:='Badges disponibles '+ inttostr(nb_dispo);
          end; // [...]
    Par exemple, ce bout de code incrémente nb_dispo quel que soit l'index de la colonne, même si le canvas n'est pas mis au vert : est-ce ce qui est voulu ?
    Quand ce problème aura été traité, on essaiera de simplifier le code .

    Cordialement,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  3. #3
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    De toutes façons, il ne faut pas placer une incrémentation de nb_dispo dans un événement OnPrepareCanvas ou OnDrawColumnCell.
    Pourquoi ?
    pcq ces événements sont appelés à chaque fois que le DBGrid doit redessiner une cellule. Ce qui est très fréquent.

    Cordialement
    Thierry

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2015
    Messages : 135
    Points : 64
    Points
    64
    Par défaut
    Bonjour,
    pour répondre à la première réponse, ce qui ne fonctionne pas c'est la modification du caption de mon libellé... il ne fait rien.
    Ensuite je veux bien ne pas placer ce code dans cet événement, mais dans lequel alors ?
    Cordialement

  5. #5
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Je confirme qu'il ne faut pas chercher à faire cela dans un événement, et surtout pas dans OnPrepareCanvas.

    Pour utiliser une seule requête, une première solution serait de commencer par compter les "disponibles " en parcourant toute la requête comme le propose Gilles, en ayant désactivé son lien à la grille, puis de se remettre au début sans la fermer et la relier à la grille pour afficher ses premières lignes. Au lieu de parcourir, il est plus élégant d'appliquer un Filter et de lire RecordCount, mais il faut vérifier que cette propriété tient bien compte du filter (je ne m'en rappelle plus car j'utilise peu SqlDb).

    Mais écrire et utiliser une autre requête basée sur un Count me paraîtrait cependant plus simple et plus lisible et ne devrait pas être trop consommateur si la table est indexée sur le champ "disponible".

    Et si tu as un SGBD digne de ce nom, acceptant une sous-requête dans la requête principale, qui retournerait sur chaque ligne le même nombre de "disponibles", ce serait une bonne solution.
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

Discussions similaires

  1. [script.aculo.us] Evenement sur la fin du revert d'un Draggable
    Par brunoperel dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 11/06/2009, 10h59
  2. Attendre la fin d'un evenement
    Par bastok dans le forum Windows Forms
    Réponses: 9
    Dernier message: 15/03/2008, 21h14
  3. declancher un evenement à la fin d'une video [flash8]
    Par walkabout dans le forum Intégration
    Réponses: 1
    Dernier message: 15/10/2007, 14h45
  4. detection evenement fin d'execution
    Par suckthewindow dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 18/07/2006, 18h32
  5. Réponses: 2
    Dernier message: 28/06/2006, 16h50

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