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

Composants VCL Delphi Discussion :

Point qui clignote dans une cellule DBGrid


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut Point qui clignote dans une cellule DBGrid
    Bonjour,

    J'ai un point d'un pixel qui clignote en haut à gauche quand je sélectionne une cellule.

    Nom : Sans titre 2.jpg
Affichages : 426
Taille : 31,3 Ko

    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
    procedure TForm1.MyGridDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
      if (ActiveColor) and (VarToStr(Column.Field.Value) = 'Gregory' then
      begin
         TDBGrid(Sender).Canvas.Brush.Color := $008882FF;
         TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;
    end;
     
    procedure TForm1.button1Click(Sender: TObject);
    begin
       MyGrid.Options := [dgTitles, dgIndicator, dgColLines, dgRowLines, dgTitleClick];
       ActiveColor := True;
       MyGrid.Refresh;
    end;
    Merci.
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  2. #2
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut
    1: Je bloque le DBGrid, il n'a plus le focus.
    2: J'actualise le DBGrid.
    3: Je débloque le DBGrid.

    c'est magique le point disparait , mais ça me dit pas pour quoi , Auriez vous une petite idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyGrid.Enabled := False;
    MyGrid.Refresh;
    MyGrid.Enabled := True;
    Merci
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  3. #3
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut
    Une petite question qui me tracasse, pourquoi le DBGrid ne se met pas à jour automatiquement (DrawColumnCell).

    Merci
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  4. #4
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut DBGrid & TStringGrid
    Je viens de remarquer que le point apparaît lorsque le DBGrid / TStringGrid n'a plus le focus, si je clique sur la MainMenu, le point apparaît en clignotant dans la cellule sélectionné.

    Pourtant DBGrid / TStringGrid n'est pas en mode édition, le clignotement du point à la même cadence qu’un curseur qui clignote.

    Nom : 2018-03-02_12h55_11.gif
Affichages : 344
Taille : 47,3 Ko

    Merci.
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  5. #5
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Bonjour XeGregory,
    merci de préciser tes OS et EDI.
    @+

  6. #6
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    deux erreurs dans ton code :

    il manque une parenthèse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (ActiveColor) and (VarToStr(Column.Field.Value) = 'Gregory') then
    et l'option dgTitleClick n'existe pas du moins sous D7..
    c'est pour cette raison, qu'il est important de préciser son environnement de développement.

    avec ces corrections, ton code fonctionne correctement sans clignotement
    @+

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 456
    Points : 24 868
    Points
    24 868
    Par défaut
    Avec la parenthèse, il compile surtout

    Tu as le même problème avec un TDBGrid et un TStringGrid ?
    Très étrange, ces deux grilles ont un comportement assez différent, on a rarement les mêmes problèmes sur les deux

    Sinon, bien lourd le VarToStr, le AsString fait très bien le travail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if ActiveColor and (Column.Field.AsString = 'Gregory') then
      begin
         TDBGrid(Sender).Canvas.Brush.Color := $008882FF;
         TDBGrid(Sender).DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;
    Sinon, j'évite le DefaultDrawColumnCell du DBGrid quand je veux redessiner une cellule colorée, il t'ajoute des éléments indésirables dans certains cas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDBGrid(Sender).DrawTextWithBackgroundColor($008882FF, Rect, Column, State);
    DrawTextWithBackgroundColor n'existe pas dans un TDBGrid mais j'ai un class helper, j'ai fourni l'unité complète que je traine depuis D7 et que j'ai maintenu depuis presque une douzaine d'année au fil des versions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      TDBGridSliteHelper = class helper for TDBGrid
      public
        ...
        procedure DrawCheckBox(const Rect: TRect; Checked: Boolean; AEnabled: Boolean = True; ABackgroundColor: TColor = clNone);
        procedure DrawEllipsisButton(const Rect: TRect; ABackgroundColor: TColor = clNone; AColumn: TColumn = nil; State: TGridDrawState = []);
        procedure DrawTextWithBackgroundColor(ABackgroundColor: TColor; const Rect: TRect; Column: TColumn; State: TGridDrawState);
        ...
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //------------------------------------------------------------------------------
    procedure TDBGridSliteHelper.DrawTextWithBackgroundColor(ABackgroundColor: TColor; const Rect: TRect; Column: TColumn; State: TGridDrawState);
    begin
      with TDBGridSLTAssistant.Create(Self) do
      try
        DrawTextWithBackgroundColor(ABackgroundColor, Rect, Column, State);
      finally
        Free();
      end;
    end;
    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
    //------------------------------------------------------------------------------
    procedure TDBGridSLTAssistant.DrawTextWithBackgroundColor(ABackgroundColor: TColor; const ARect: TRect; AColumn: TColumn; AState: TGridDrawState);
    var
      vText: string;
      vRect: TRect;
    begin
      with DBGrid.Canvas do
      begin
        //  Force un fond opaque pour cacher le texte !
        Brush.Style := bsSolid;
        Brush.Color := ColorToRGB(ABackgroundColor);
        FillRect(ARect);
     
        // TextRect encapsule DraxTextEx et est aussi pénible avec ses paramètres in-out !
        vRect := ARect;
        if Assigned(AColumn.Field) then
          vText := AColumn.Field.DisplayText;
        Font.Color := TCanvasSLTAssistant.GetConstratedColor(ABackgroundColor); // Couleur de luminosité inverse : Contraste garanti pour les couleurs claires ou foncées
     
        // Gestion de l'Alignment corrigé selon de Vcl.DBGrids.WriteText
        // DT_CENTER Centers text horizontally in the rectangle.
        // DT_VCENTER Centers text vertically. This value is used only with the DT_SINGLELINE value.
        if AColumn.Alignment = taLeftJustify then
          TextRect(vRect, vRect.Left + 3, vRect.Top + 2, vText)
        else if AColumn.Alignment = taCenter then
          TextRect(vRect, vText, [tfCenter, tfSingleLine, tfVerticalCenter])
        else
        begin
          vRect.Right := vRect.Right - 3;
          TextRect(vRect, vText, [tfRight, tfSingleLine, tfVerticalCenter]);
        end;
     
        if (gdRowSelected in AState) or ((dgRowSelect in DBGrid.Options) and (gdSelected in AState)) then
        begin
          // Pour ne pas dessiner les bords de focus entre les colonnes (inspiré des tricheries dans TCustomGrid.DrawCellHighlight)
          vRect := ARect;
          InflateRect(vRect, 1, 0);
          DrawFocusRect(vRect);
        end
        else
          if gdSelected in AState then
            DrawFocusRect(vRect);
      end;
    end;
    je me demande si ton petit carré n'est pas un rescapé du bords de focus
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    je glisse une solution avec le TcxGrid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.cxGrid1DBTableView1CustomDrawCell(
      Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
      AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
    begin
      if (ActiveColor) and (AviewInfo.Text = 'Gregory') then
        ACanvas.Brush.Color := $008882FF;
    end;

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/12/2007, 08h28
  2. Affichage type Heure dans une cellule DBGrid
    Par BEN NASR dans le forum Delphi
    Réponses: 2
    Dernier message: 12/05/2007, 08h35
  3. Afficher une calendrier dans une cellule DBGrid
    Par BEN NASR dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/05/2007, 18h13
  4. Deplacer le curseur dans une cellule de DBGrid
    Par Sydaze dans le forum Composants VCL
    Réponses: 6
    Dernier message: 07/11/2005, 16h19
  5. Réponses: 3
    Dernier message: 01/12/2003, 13h14

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