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

Langage Delphi Discussion :

Problèmes avec TStringGgrid


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut Problèmes avec TStringGgrid
    Bonjour à tous,

    Sur une fiche nommée EssaiFiche se trouvent 2 TStringGrid nommés SG1 et SG2 et un TButton nommé BAnnul.

    BAnnul est invisible par défaut.

    Propriétés des deux SG1 et SG2.
    ColCount 1
    DefaultColWidth 180
    DefaultRowHeight 24
    FixedCols 0
    FixedRows 1
    Height 129
    RowCount 6
    Width 209
    autres sans modifications.

    Il faut que lorsque l'opérateur clique avec le bouton gauche sur SG1 toutes les cellules de SG2 deviennent blanches (non focalisées) et réciproquement pour SG2 vers SG1. Cela est réalisé parfaitement avec les événements OnDrawCell dont le code m'a été donné par le passé par un membre expert du forum dont j'ai oublié le nom mais que je remercie encore.

    Si l'opérateur clique avec le bouton droit sur une cellule de SG1 ou SG2 BAnnul devient visible mais la cellule reste blanche avec texte noir. Comment faire pour qu'elle devienne bleue avec texte blanc*?

    Si maintenant l'opérateur clique sur le BAnnul et qu'ensuite il clique sur l'autre SG la cellule du SG précédent reste bleue contrairement à ce qui se passait initialement. Comment faire pour qu'elle devienne blanche*?

    Ci-dessous mon code. Je ne donne que les codes associés à SG1, ceux associés à SG2 sont évidemment les mêmes après remplacement de SG1 par SG2.

    Merci d'avance à tous ceux qui pourront éclairer ma lanterne qui n'est pas du tout lumineuse.

    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
     
    var ARowM1,IRow:integer;
         RectM1:TRect;
         SG:byte;
     
    function CursorToRow(P:TPoint;SG:byte):integer;
    var PR:TPoint;
    begin
      //Détermine le N° de Row de la StringGrid à partir de la position du curseur
      case SG of
      1:begin //SG1
         PR:=EssaiFiche.ScreenToClient(P);
         PR.Y:=PR.Y-EssaiFiche.SG1.Top;
         Result:=Trunc((PR.Y-2)/25)-1+EssaiFiche.SG1.TopRow;
         end;
      2:begin
         PR:=EssaiFiche.ScreenToClient(P);
         PR.Y:=PR.Y-EssaiFiche.SG2.Top;
         Result:=Trunc((PR.Y-2)/25)-1+EssaiFiche.SG2.TopRow;
         end;
      end;
    end;
     
    procedure TEssaiFiche.SG1DrawCell(Sender: TObject; ACol, ARow: integer;
      Rect: TRect; State: TGridDrawState);
    begin
      with Sender as TStringGrid do with Canvas do
      begin
        //Sélection de la couleur du fond
        if SG1.Focused then
          if gdFixed in State then Brush.Color:=clBtnFace
          else if gdSelected in State then Brush.Color:=clBlue
          else Brush.Color:=clWhite
        else if gdFixed in State then Brush.Color:=clBtnFace
        else Brush.Color:=clWhite;
        //Remplissage du fond
        Fill(Rect);
        //Sélection de la couleur d'écriture
        if Brush.Color=clBlue then Font.Color:=clWhite
        else Font.Color:=clBlack;
        //Edition du Texte
        TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
      end;
    end;
     
    procedure TEssaiFiche.SG1MouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: integer);
    var Point: TPoint;
    begin
      Point:=Mouse.CursorPos;
      IRow:=CursorToRow(Point,1);
      SG:=1;
      if Button=mbLeft then
        begin
          //Code
        end
      else
        begin
          SG1.Row:=IRow;
          RectM1:=Rect(0,(IRow-SG1.TopRow+1)*25,180,(IRow-SG1.TopRow+2)*25);
          ARowM1:=IRow;BAnnul.Visible:=True;
          SG1.Enabled:=False;SG2.Enabled:=False;
        end;
    end;
     
    procedure TEssaiFiche.BAnnulClick (Sender: TObject);
    begin
      SG1.Enabled:=True;SG2.Enabled:=True;
      case SG of
      1:begin
         with SG1.Canvas do
         begin
           Brush.Color:=clBlue;Font.Color:=clWhite;
           FillRect(RectM1);
           TextOut(RectM1.Left+1,RectM1.Top,SG1.Cells[0,ARowM1]);
           SG1.Row:=ARowM1;
         end;
         end;
      2:begin
         with SG2.Canvas do
         begin
           Brush.Color:=clBlue;Font.Color:=clWhite;
           FillRect(RectM1);
           TextOut(RectM1.Left+1,RectM1.Top,SG2.Cells[0,ARowM1]);
           SG2.Row:=ARowM1;
         end;
      end;
      end;
      BAnnul.Visible:=False;
    end;

  2. #2
    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.

    Vite fait, mais je pense que ce code devrait te permettre d'obtenir ce que tu souhaites.
    Remarque : les 2 stringgrid partagent la même procedure OnDrawCell et OnMouseDown.
    Remarque : j'ai mis la cellule cliquée avec bouton droit en jaune pour que tu voies clairement ce qui se passe lorsque les stringgrid deviennent disabled.

    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
    procedure TForm1.SG1DrawCell(Sender: TObject; aCol, aRow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      C: TColor;
    begin
      with Sender as TStringGrid do
      begin
         if gdFixed in State then C:= clBtnface
         else
         if not enabled and (gdSelected in State) then C:= clyellow
         else
         if not Focused then C:= clWhite
         else
         if (gdFocused in State) or (gdSelected in State) then C:= clBlue
         else
            C:= clWhite;
         Canvas.Brush.Color:= C;
         Canvas.FillRect(Rect);
         Canvas.Font.Assign(Font);
         if C = clBlue then Canvas.Font.Color:= clWhite;
         Canvas.TextOut(Rect.Left, Rect.Top, Cells[ACol,ARow]);
      end;
    end;  
     
    procedure TForm1.SG1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      C, R: integer;
    begin
        if Button = mbRight then
        begin
           with Sender as TStringGrid do
           begin
             if not Focused then SetFocus;
             MouseToCell(X, Y, C, R);
             Col:= C;
             Row:= R;
           end;
           BAnnul.Visible:= true;
           SG1.Enabled:= false;
           SG2.Enabled:= false;
        end
        else  // bouton gauche
        begin
          //
        end;
    end; 
     
    procedure TForm1.BAnnulClick(Sender: TObject);
    begin
      SG1.Enabled:= true;
      SG2.Enabled:= true;
      BAnnul.Visible:= false;
    end;
    Thierry

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Bonjour.

    Vite fait, mais je pense que ce code devrait te permettre d'obtenir ce que tu souhaites.
    Remarque : les 2 stringgrid partagent la même procedure OnDrawCell et OnMouseDown.
    Remarque : j'ai mis la cellule cliquée avec bouton droit en jaune pour que tu voies clairement ce qui se passe lorsque les stringgrid deviennent disabled.

    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
    procedure TForm1.SG1DrawCell(Sender: TObject; aCol, aRow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
      C: TColor;
    begin
      with Sender as TStringGrid do
      begin
         if gdFixed in State then C:= clBtnface
         else
         if not enabled and (gdSelected in State) then C:= clyellow
         else
         if not Focused then C:= clWhite
         else
         if (gdFocused in State) or (gdSelected in State) then C:= clBlue
         else
            C:= clWhite;
         Canvas.Brush.Color:= C;
         Canvas.FillRect(Rect);
         Canvas.Font.Assign(Font);
         if C = clBlue then Canvas.Font.Color:= clWhite;
         Canvas.TextOut(Rect.Left, Rect.Top, Cells[ACol,ARow]);
      end;
    end;  
     
    procedure TForm1.SG1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      C, R: integer;
    begin
        if Button = mbRight then
        begin
           with Sender as TStringGrid do
           begin
             if not Focused then SetFocus;
             MouseToCell(X, Y, C, R);
             Col:= C;
             Row:= R;
           end;
           BAnnul.Visible:= true;
           SG1.Enabled:= false;
           SG2.Enabled:= false;
        end
        else  // bouton gauche
        begin
          //
        end;
    end; 
     
    procedure TForm1.BAnnulClick(Sender: TObject);
    begin
      SG1.Enabled:= true;
      SG2.Enabled:= true;
      BAnnul.Visible:= false;
    end;
    Thierry
    Un grand merci, Thierry, de ta réponse.

    Je n'ai pas encore pris la peine de l'étudier en profondeur pour en comprendre le code mais il me parait presque parfait, si ce n'est qu'après avoir cliqué droit sur une Row de SG1 puis avoir annulé, si on clique gauche sur SG2 la Row de SG1 reste jaune au lieu de devenir blanche. Si tu ne veux pas pousser plus loin, je pense que ça ne devrait pas être trop difficile à corriger et j'essaierai moi-même. Mais je crains de patiner passablement, alors si tu es assez gentil pour me donner la correction je t'en serais très reconnaissant.

  4. #4
    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
    Re-bonjour.

    Quand tu parles d'annuler, c'est bien en cliquant sur le bouton ?
    Bizarre, je n'ai pas ce problème.

    As-tu bien assigné à SG2 les mêmes procédures que celles de SG1 ? Tu ne dois avoir qu'une seule procedure OnDrawCell et une seule procedure OnMouseDown commune aux 2 stringgrid.
    Pas de problèmes pour t'aider par la suite, mais là, je n'ai plus le temps, je pars demain pour quelques jours en France. Mais j'emmène mon portable, donc peut-être à lundi ?
    Je regarderai encore ce forum ce soir.

    Thierry

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Re-bonjour.

    Quand tu parles d'annuler, c'est bien en cliquant sur le bouton ?
    Bizarre, je n'ai pas ce problème.

    As-tu bien assigné à SG2 les mêmes procédures que celles de SG1 ? Tu ne dois avoir qu'une seule procedure OnDrawCell et une seule procedure OnMouseDown commune aux 2 stringgrid.
    Pas de problèmes pour t'aider par la suite, mais là, je n'ai plus le temps, je pars demain pour quelques jours en France. Mais j'emmène mon portable, donc peut-être à lundi ?
    Je regarderai encore ce forum ce soir.

    Thierry
    Bien sûr, c'est en cliquant sur le bouton.

    Soyons parfaitement clairs. Il y a pour chaque StringGrid une procedure OnDrawCell et une autre OnMouseDown (soit en tout 4 procedures). Dans les deux OnDrawCell les codes sont identiques et de même dans les deux OnMouseDown.

    J'ai vérifié à nouveau et mes codes sont exactement ceux que tu m'as indiqués plus haut.

    J'ajoute qu'après avoir fait ce que je t'ai dit plus haut et que la Row de SG1 reste jaune, si je clique sur une autre Row de SG1 la jaune devient blanche et celle sur laquelle j'ai cliqué devient bien sûr bleue.

    Aucune urgence, merci encore et bon voyage.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Re-bonjour.

    Quand tu parles d'annuler, c'est bien en cliquant sur le bouton ?
    Bizarre, je n'ai pas ce problème.

    As-tu bien assigné à SG2 les mêmes procédures que celles de SG1 ? Tu ne dois avoir qu'une seule procedure OnDrawCell et une seule procedure OnMouseDown commune aux 2 stringgrid.
    Pas de problèmes pour t'aider par la suite, mais là, je n'ai plus le temps, je pars demain pour quelques jours en France. Mais j'emmène mon portable, donc peut-être à lundi ?
    Je regarderai encore ce forum ce soir.

    Thierry
    Bonjour,

    Entre temps j'ai examiné le plus soigneusement possible ce qui se passe chez moi.

    Voici 2 séquences non satisfaisantes:

    I/
    1/Je clique droit sur une row de SG1. La row devient jaune et le bouton Annulation apparaît.
    2/Je clique sur le bouton Annulation.
    3/Je clique gauche sur une row de SG2. La row de SG1 reste jaune au lieu de redevenir blanche.

    II/
    1/Je clique gauche sur une row de SG2. La row devient bleue ce qui est normal.
    2/Je clique droit sur une row de SG1. La row de SG1 devient jaune, ce qui est normal, mais la row de SG2 devient jaune au lieu de redevenir blanche.

    J'ai essayé d'analyser en profondeur mais j'avoue que je sèche.

    Il m'est quand même venu une question. Est-ce que les différences de réponses entre chez toi et chez moi ne pourraient pas provenir de ce que les propriétés Options des StringGrid ne seraient pas les mêmes? Chez moi elles sont par défaut c'est à dire :

    [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect]

    Merci et comme déjà dit aucune urgence.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Re-bonjour.

    Quand tu parles d'annuler, c'est bien en cliquant sur le bouton ?
    Bizarre, je n'ai pas ce problème.

    As-tu bien assigné à SG2 les mêmes procédures que celles de SG1 ? Tu ne dois avoir qu'une seule procedure OnDrawCell et une seule procedure OnMouseDown commune aux 2 stringgrid.
    Pas de problèmes pour t'aider par la suite, mais là, je n'ai plus le temps, je pars demain pour quelques jours en France. Mais j'emmène mon portable, donc peut-être à lundi ?
    Je regarderai encore ce forum ce soir.

    Thierry
    Bonjour,

    Je crois que je suis arrivé à résoudre le problème.

    Ci-dessous les codes, j'ai laissé après un // le code d'origine et ai fait apparaître en dessous le code modifié.

    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
     
    var SG:byte;
     
    procedure TEssaiFiche.SG1DrawCell(Sender: TObject; ACol, ARow: integer;
       Rect: TRect; State: TGridDrawState);
    var C:TColor;
    begin
      with Sender as TStringGrid do
      begin
        if gdFixed in State then C:=clBtnFace
        else
        //if not Enabled and (gdSelected in State) then C:=clYellow
        //modifié comme suit
        if (SG=1) and ((not Enabled) and (gdSelected in State)) then C:=clYellow
        else
        if not Focused then C:=clWhite
        else
        if (gdFocused in State) or (gdSelected in State) the C:=clBlue
        else C:=clWhite;
        Canvas.Brush.Color:=C;
        Canvas.FillRect(Rect);
        Canvas.Font.Assign(Font);
        if C:=Blue then Canvas.Font.Color:=clWhite;
        Canvas.TextOut(Rect.Left,Rect.Top,Cells[ACol,ARow]);
      end;
    end;
     
    procedure TEssaiFiche.SG1MouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: integer);
    var C, R: integer;
    begin
       if Button = mbRight then
       begin
         SG:=1;//ajouté
         with Sender as TStringGrid do
         begin
           if not Focused then SetFocus;
           MouseToCell(X,Y,C,R);
           Col:= C;
           Row:=R;
         end;
         BAnnul.Visible:= True;
         SG1.Enabled:= True;
         SG2.Enabled:= True;
       end
       else // bouton gauche
       begin
         //
       end;  
    end;
     
    procedure TEssaiFiche.BAnnulClick(Sender: TObject);
    begin
      SG1.Enabled:= True;SG2.Enabled:= True;
      BAnnul.Visible:=False;
      case SG of         //ajouté
      1:SG1.SetFocus; //ajouté
      2:SG2.SetFocus; //ajouté
      end;                 //ajouté
    end;
    Pas évident d'écrire le code de OnDrawCell !

    Peut-être y a-t-il plus simple.

    Merci encore pour ton aide précieuse.

  8. #8
    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.

    Pour résoudre ton problème, j'avais pensé à :
    1) propriété DefaultDrawing = false pour les 2 SG. C'est à faire lorsqu'on utilise la procedure OnDrawCell dans laquelle on redessine le tout. J'avais oublié de te le dire. Désolé.
    2) attribuer le focus à 1 des 2 stringgrid, ce qui l'oblige à se redessiner.

    Remarque : dans la procedure MouseDown, un clic droit doit rendre disabled les 2 SG. Mais je suppose que c'est de la distraction

    A +

    Thierry

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 111
    Points : 64
    Points
    64
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Bonjour.

    Pour résoudre ton problème, j'avais pensé à :
    1) propriété DefaultDrawing = false pour les 2 SG. C'est à faire lorsqu'on utilise la procedure OnDrawCell dans laquelle on redessine le tout. J'avais oublié de te le dire. Désolé.
    2) attribuer le focus à 1 des 2 stringgrid, ce qui l'oblige à se redessiner.

    Remarque : dans la procedure MouseDown, un clic droit doit rendre disabled les 2 SG. Mais je suppose que c'est de la distraction

    A +

    Thierry
    Bonjour,

    Concernant ton 2) ci-dessus ça rejoint ce que j'ai fait en rajoutant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    case SG of
    1:SG1.SetFocus;
    2:SG2.SetFocus;
    end;
    dans la procedure de BAnnul.

    Non, ce n'est pas le résultat d'une distraction, en réalité le programme est beaucoup plus complexe que ce qui est affiché dans le forum. Dans un but de simplification je n'ai conservé que ce qui était essentiel à l'exposé du problème.

    J'affiche maintenant la discussion comme résolue. Merci de ton aide ; j'ai pu tout mettre au point en utilisant ton code, mais je pense que je ne l'aurais pas trouvé par moi-même.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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