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ème de couleur avec TStringGrid


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ème de couleur avec TStringGrid
    Bonjour à tous.

    Soit un TstringGrid avec Options [goRangeSelect, goEditing].

    Si je clique sur une Row celle-ci apparaît avec toute la cellule bleue et le texte blanc.

    Si je clique à nouveau sur la même Row le texte reste blanc mais seul le fond du texte est bleu (et non pas celui de toute la cellule).

    Comment trouver les limites du rectangle du texte*? En fait je voudrais changer la couleur de fond du texte en laissant le reste de la cellule blanc.

    Merci d'avance à qui pourra m'éclairer.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 703
    Points : 5 319
    Points
    5 319
    Par défaut
    Sur l'événement OnDrawCell de ta grille tu à le Rect qui correspond au rectangle de ta cellule.
    Pour changer la couleur, il suffit de dessiner sur le Canvas.

    Tu dois avoir un exemple dans la FAQ qui correspond à ta demande.

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 355
    Points : 3 132
    Points
    3 132
    Par défaut
    Bonjour,

    pour connaitre les dimensions du rectangle qui contient une chaine, il y a la fonction Drawtext avec le dernier paramètre égal à DT_CALCRECT

    A+

    Charly

  4. #4
    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
    Un grand merci à tous les deux pour votre aide.

    En réalité, à l'ouverture de ma discussion j'ai considérablement simplifié le problème qui, comme vous pouvez le deviner, s'intègre dans un code beaucoup plus complexe.

    Merci de me laisser un peu de temps pour tester vos suggestions dans le vrai code.

    Je reprendrai contact dès que possible.

    Georges.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Points : 63
    Points
    63
    Par défaut StringGrid et texte en couleur dans une cellule
    Je ne sais pas si j'ai bien compris ton problème. Une petite source qui pourra peut-être t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      if (Row<>0) and (Col <> 0) then
      begin
          StringGrid1.Canvas.Brush.Color:=clYellow;
          StringGrid1.Canvas.FillRect(Rect);
      end;
      if AnsiContainsStr(StringGrid1.Cells[Col,Row],'-') then
        StringGrid1.Canvas.Font.Color:=clBlue
      else
        StringGrid1.Canvas.Font.Color:=clBlack;
      StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[Col,Row]);

  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
    Bonjour et merci à tous.

    Je sèche lamentablement pour intégrer vos suggestions. Je pose donc mon problème à nouveau d'une façon plus détaillée.

    Sur ma fiche principale unique nommée EssaiFiche se trouvent les composnts suivants :

    2 StringGrid nommés SG1 et SG2 dont les propriétés sont :
    ColCount 1
    DefaultColWidth 130
    DefaultDrawing False
    FixedCols 0
    FixedRows 1
    Height 129
    Width 177
    Autres par défaut.

    1 RadioGroup nommé RGCorrec avec
    items "Corriger" + "Annuler".

    1 Button nommé BOK et caption "OK".

    1 Button nommé BAnnul et caption "Annuler".

    Ci-dessous 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
    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
     
    implementation
    var SG,LastRow:integer;
         FCorrec:Boolean;
         GrOpNor,GrOpEdi:set of TGridOption;
         LastLibel:string;
     
    procedure TEssaiFiche.FormActivate(Sender: TObject);
    begin
      GrOpNor:=[goFixedHorzLine,goFixedVertLine,goVertLine,goHorzLine,goRowSelect];
      GrOpEdi:=[goFixedHorzLine,goFixedVertLine,goVetLine,goHorzLine,goEditing];
      with SG1 do
      begin
        Options:=grOpNor;
        Cells[0,1]:='1WWWW';Cells[0,2]:='1XXXX';Cells[0,3]:='1YYYY';Cells[0,4]:='1ZZZZ';
      end;
      with SG2 do
      begin
        Options:=grOpNor;
        Cells[0,1]:='2WWWW';Cells[0,2]:='2XXXX';Cells[0,3]:='2YYYY';Cells[0,4]:='2ZZZZ';
      end;
    end;
     
    procedure TEssaiFiche.SG1DrawCell(Sender: TObject; ACol,
       ARow: integer; Rect: TRect; State: TGridDrawState);
    var C:TColor;
    begin
      if FCorrc=True then  Exit;
      with Sender as TStringGrid do
      begin
        if (BOK.Visible) and (SG=1) then C:=clAqua
        else if gdFixed in State then C:=clBtnFace
        else if (SG=1) and ((not Enabled) and (gdSelected in State)) then C:=clAqua
        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 the 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 Point:TPoint;
         C,R:integer;
    begin
      if RGCorrec.Visible then SG1.Row:=LastRow;
      Point:=Mouse.CursorPos;
      if Button=mbRight then
        begin
          SG:=1;
          with Sender as TStringGrid do
          begin
            if not Focused then SetFocus;
            MouseToCell(X,Y,C,R);
            Col:=C;Row:=R;SG1.Row:=R;
          end;
          RGCorrec.Visible:=True;SG.Enabled:=False;SG2.Enabled:=False;
        end;
    end;
     
    procedure TEssaiFiche.RGCorrecClick(Sender: TObject);
    begin
      if RGCorrec.ItemIndex=0 then
      begin
        RGCorrec.Visible:=False;RGCorrec.ItemIndex:=-1;
        FCorrec:=True;BOK.Visible:=True;BAnnul.Visible:=True;
        case SG of
        1:begin
           LastRow:=SG1.Row;LastLibel:=SG1.Cells[0,SG1.Row];
           SG1.Enabled:=True;SG1.Options:=GrOpEdi;SG1.SetFocus;
           end;
        2:begin
           LastRow:=SG2.Row;LastLibel:=SG2.Cells[0,SG2.Row];
           SG2.Enabled:=True;SG2.Options:=GrOpEdi;SG2.SetFocus;
           end;
        end;
      end
      else
      begin
        SG1.Enabled:=True;SG2.Enabled:=True;RGCorrec.Visible:=False;
        case SG of
        1:SG1.SetFocus;
        2:SG2.SetFocus;
        end;
        RGCorrec.ItemIndex:=-1;
      end;
    end;
     
    procedure TEssaiFiche.BOKClick(Sender: TObject);
    begin
      SG1.Enabled:=True;SG2.Enabled:=True;BOK.Visible:=False;BAnnul.Visible:=False;FCorrec:=False;
      case SG of
      1:begin
         if SG1.Cells[0,SG1.Row]='' then
           begin
             MessageDlg('L''intitulé n''est pas spécifié.',mtError,[mbOK],0);
             SG1.Cells[0,SG1.Row]:=LastLibel;SG1.SetFocus;Exit;
           end;
           SG1.Options:=grOpNor;SG1.SetFocus;
         end;
       2:begin
          if SG2.Cells[0,SG2.Row]='' then
            begin
              MessageDlg('L''intitulé n''est pas spécifié.',mtError,[mbOK],0);
              SG2.Cells[0,SG2.Row]:=LastLibel;SG2.SetFocus;Exit;
            end;
          SG2.Options:=grOpNor;SG2.SetFocus;
         end;
      end;
      LastLibel:='';BOK.Visible:=False;BAnnul.Visible:=False;
    end;
     
    procedure TEssaiFiche.BAnnulClick(Sender: TObject);
    begin
      FCorrec:=False;SG1.Enabled:=True;SG2.Enabled:=True;
      BOK.Visible:=False;BAnnul.Visible:=False;
      case SG of
      1:begin
         SG1.Options:=grOpNor;SG1.Cells[0,LastRow]:=LastLibel;SG1.SetFocus;
         end;
      2:begin
         SG2.Options:=grOpNor;SG2.Cells[0,LastRow]:=LastLibel;SG2.SetFocus;
         end;
      end;
      LastLibel:='';BOK.Visible:=False;BAnnul.Visible:=False;
    end;
    Les procedures de SG2 sont exactement similaires à celles de SG1.

    Les procedures OnDrawCell sont telles qu'une seule Row puisse être sélectionnée quelque soit la StringGrid.

    Ce que je voudrais :

    1/Cliquer avec le bouton droit de la souris sur une Row.
    2/Cliquer sur Corriger.
    3/Entrer un nouvel intitulé.
    ou 4/Cliquer (bouton gauche) sur la Row choisie.

    Dans les cas 3 et 4 je voudrais que la couler de fond reste clAqua.

    Merci d'avance pour votre aide.

  7. #7
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 703
    Points : 5 319
    Points
    5 319
    Par défaut
    Si j'ai bien suivi ton code (j'ai un peu la tête dans le cul ce matin), je suppose que la couleur dans les cas 3 et 4 est à clBlue
    A cause de
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (gdFocused in State) or (gdSelected in State) then C:=clBlue
    En tout cas, ton problème doit se situer sur ce code
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (BOK.Visible) and (SG=1) then C:=clAqua
        else if gdFixed in State then C:=clBtnFace
        else if (SG=1) and ((not Enabled) and (gdSelected in State)) then C:=clAqua
        else if not Focused then C:=clWhite
        else if (gdFocused in State) or (gdSelected in State) then C:=clBlue
        else C:=clWhite;

    Autre chose qui n'a rien à voir.
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    implementation
    var SG,LastRow:integer;
         FCorrec:Boolean;
         GrOpNor,GrOpEdi:set of TGridOption;
         LastLibel:string;
    Toutes ces variables sont partagées avec d'autres écrans ?
    Ce n'est que mon avis personnel, mais les variable globales sont à éviter au maximum.
    Si elles sont utilisées uniquement par ta form, je te suggère de les déclarer dans la partie "private" de cette form

  8. #8
    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 popo Voir le message
    Si j'ai bien suivi ton code (j'ai un peu la tête dans le cul ce matin), je suppose que la couleur dans les cas 3 et 4 est à clBlue
    A cause de
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (gdFocused in State) or (gdSelected in State) then C:=clBlue
    En tout cas, ton problème doit se situer sur ce code
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (BOK.Visible) and (SG=1) then C:=clAqua
        else if gdFixed in State then C:=clBtnFace
        else if (SG=1) and ((not Enabled) and (gdSelected in State)) then C:=clAqua
        else if not Focused then C:=clWhite
        else if (gdFocused in State) or (gdSelected in State) then C:=clBlue
        else C:=clWhite;

    Autre chose qui n'a rien à voir.
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    implementation
    var SG,LastRow:integer;
         FCorrec:Boolean;
         GrOpNor,GrOpEdi:set of TGridOption;
         LastLibel:string;
    Toutes ces variables sont partagées avec d'autres écrans ?
    Ce n'est que mon avis personnel, mais les variable globales sont à éviter au maximum.
    Si elles sont utilisées uniquement par ta form, je te suggère de les déclarer dans la partie "private" de cette form
    Merci popo de tes observations.

    Mais non et sauf erreur de ma part la couleur clBlue dans les cas 3 et 4 n'est pas causée par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    else if (gdFocused in State) or (gdSelected in State) then C:=clBlue
    Difficile de suivre exactement ce qui se passe avec OnDrawCell le pas à pas n'étant pratiquement pas utilisable. J'ai donc mis des Label "mouchards" qui m'indiquent combien de fois OnDrawCell est appelé et chaque fois la position du Rect. Et dans les cas 3 et 4 je constate que OnDrawCell n'est appelé qu'une seule fois avec Rect.Top = 0.

    Je ne comprends d'ailleurs pas pourquoi et c'est pourquoi je sèche lamentablement. J'avoue d'ailleurs n'avoir pas encore bien compris tout le comportement de OnDrawCell.

    Merci encore.

    Georges.

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par Stevens.Georges Voir le message
    Ce que je voudrais :

    1/Cliquer avec le bouton droit de la souris sur une Row.
    2/Cliquer sur Corriger.
    3/Entrer un nouvel intitulé.
    ou 4/Cliquer (bouton gauche) sur la Row choisie.

    Dans les cas 3 et 4 je voudrais que la couler de fond reste clAqua.
    Une remarque préalable : Quand la cellule de la grille passe en mode édition, un composant TInplaceEdit est superposé sur la cellule. Ce composant descend de TCustomMaskEdit, utilise les couleurs de windows par défaut et n'est pas prévu pour être accessible.
    A moins de développer votre propre StringGrid où la couleur de ce composant, voire ce composant serait accessible, il ne sera pas possible de conserver clAqua comme couleur de fond lors de l'édition.

    Cela dit, j'ai repris votre code que j'ai adapté (formatage, ajout par ci, suppression par la ) pour qu'il colle le plus possible à vos spécifications :
    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
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
      private
        { Déclarations privées }
        // Transfert des variables globales privées en variables privées de la fiche
        // cf. remarque de @popo
        SG, LastRow: Integer;
        FCorrec: Boolean;
        GrOpNor,GrOpEdi: set of TGridOption;
        LastLibel: string;
     
    //...
     
    procedure TEssaiFiche.FormActivate(Sender: TObject);
    begin
      GrOpNor := [goFixedHorzLine, goFixedVertLine, goVertLine, goHorzLine, goRowSelect];
      GrOpEdi := [goFixedHorzLine, goFixedVertLine, goVertLine, goHorzLine, goEditing];
      with SG1 do
      begin
        Options := grOpNor;
        Cells[0,1] := '1WWWW';
        Cells[0,2] := '1XXXX';
        Cells[0,3] := '1YYYY';
        Cells[0,4] := '1ZZZZ';
      end;
      with SG2 do
      begin
        Options := grOpNor;
        Cells[0,1] := '2WWWW';
        Cells[0,2] := '2XXXX';
        Cells[0,3] := '2YYYY';
        Cells[0,4] := '2ZZZZ';
      end;
      // Pour que la fiche soit initialement dans un état cohérent !
      BOK.Visible := False;
      BAnnul.Visible := False;
      RGCorrec.Visible := False;
      RGCorrec.ItemIndex := -1;
    end;
     
    procedure TEssaiFiche.SG1DrawCell(Sender: TObject; ACol,
       ARow: integer; Rect: TRect; State: TGridDrawState);
    var
      C: TColor;
      Info: String;
    begin
        // Inutile !
        // if FCorrec then
        // Exit;
        // On sait que Sender est du type TStringGrid, autant utiliser le transtypage direct, plus rapide
        with TStringGrid(Sender) do
        begin
          // Je crois qu'ici, vous avez perdu de vue vos spécifications... 
          // if (BOK.Visible) and (SG = 1) then
          //   C := clAqua
          // else if gdFixed in State then
          //   C := clBtnFace
          // else if (SG = 1) and ((not Enabled) and (gdSelected in State)) then
          //   C := clAqua
          // else if not Focused then
          //  C := clWhite
          // else if (gdFocused in State) or (gdSelected in State) then
          //  C := clBlue
          // else
          //  C := clWhite;
     
          // 3 cas possibles : colonne fixe, sélectionnée ou autre
          if gdFixed in State then
            C := clBtnFace
          else if gdSelected in State then
            C := clAqua
          else
            C := clWhite;
          //
          Canvas.Brush.Color := C;
          Canvas.FillRect(Rect);
          Canvas.Font.Assign(Font);
          // Inutile !
          // if C = clBlue 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
      Point: TPoint;
      C, R: Integer;
    begin
      // Inutile !
      // if RGCorrec.Visible then
      //  SG1.Row := LastRow;
      Point := Mouse.CursorPos;
      if Button = mbRight then
      begin
        SG := 1;
        with TStringGrid(Sender) do
        begin
          // Inutile, vous allez désactiver le composant juste après !
          // if not Focused then
          //  SetFocus;
          MouseToCell(X, Y, C, R);
          Col := C;
          Row := R;
          SG1.Row := R;
        end;
        RGCorrec.Visible := True;
        SG1.Enabled := False;
        SG2.Enabled := False;
      end;
    end;
     
    procedure TEssaiFiche.RGCorrecClick(Sender: TObject);
    begin
      if RGCorrec.ItemIndex = 0 then
      begin
        // Code appelé quelque soient les cas, déplacé en fin de procédure
        // RGCorrec.Visible := False;
        // RGCorrec.ItemIndex := -1;
        FCorrec := True;
        BOK.Visible := True;
        BAnnul.Visible := True;
        case SG of
          1: begin
               LastRow := SG1.Row;
               LastLibel := SG1.Cells[0, SG1.Row];
               SG1.Enabled := True;
               SG1.Options := GrOpEdi;
               SG1.SetFocus;
               // Donner le focus, c'est bien, passer en mode édition, c'est mieux !
               SG1.EditorMode := True;
             end;
          2: begin
               LastRow := SG2.Row;
               LastLibel := SG2.Cells[0, SG2.Row];
               SG2.Enabled := True;
               SG2.Options := GrOpEdi;
               SG2.SetFocus;
               SG2.EditorMode := True;
             end;
        end;
      end
      else
      begin
        SG1.Enabled := True;
        SG2.Enabled := True;
        // RGCorrec.Visible := False;
        case SG of
          1: SG1.SetFocus;
          2: SG2.SetFocus;
        end;
        // RGCorrec.ItemIndex := -1;
      end;
      RGCorrec.Visible := False;
      RGCorrec.ItemIndex := -1;
    end;
     
    procedure TEssaiFiche.BOKClick(Sender: TObject);
    begin
      SG1.Enabled := True;
      SG2.Enabled := True;
      BOK.Visible := False;
      BAnnul.Visible := False;
      FCorrec := False;
      case SG of
        1: begin
             if SG1.Cells[0, SG1.Row] = '' then
             begin
               MessageDlg('L''intitulé n''est pas spécifié.', mtError, [mbOK], 0);
               SG1.Cells[0, SG1.Row] := LastLibel;
               SG1.SetFocus;
               Exit;
             end;
             SG1.Options := grOpNor;
             SG1.SetFocus;
           end;
        2: begin
             if SG2.Cells[0, SG2.Row] = '' then
             begin
               MessageDlg('L''intitulé n''est pas spécifié.', mtError, [mbOK], 0);
               SG2.Cells[0, SG2.Row] := LastLibel;
               SG2.SetFocus;
               Exit;
             end;
             SG2.Options := grOpNor;
             SG2.SetFocus;
           end;
      end;
      LastLibel := '';
      BOK.Visible := False;
      BAnnul.Visible := False;
    end;
     
    procedure TEssaiFiche.BAnnulClick(Sender: TObject);
    begin
      FCorrec := False;
      SG1.Enabled := True;
      SG2.Enabled := True;
      BOK.Visible := False;
      BAnnul.Visible := False;
      case SG of
        1: begin
             SG1.Options := grOpNor;
             SG1.Cells[0, LastRow] := LastLibel;
             SG1.SetFocus;
           end;
        2: begin
             SG2.Options := grOpNor;
             SG2.Cells[0, LastRow] := LastLibel;
             SG2.SetFocus;
           end;
      end;
      LastLibel := '';
      BOK.Visible := False;
      BAnnul.Visible := False;
    end;
    Enfin, votre gestion pour conserver et restaurer le contenu d'une cellule peut toutefois être mis en défaut. Après être passé en mode correction, on peut toujours se placer sur une autre cellule et la modifier. Votre mécanisme devient inopérant.

    Une alternative serait lors du passage en mode correction de :
    1. laisser la grille désactivée,
    2. afficher un composant TEdit sur la cellule à modifier dont on gérerait les touches Entrée et Echap, et à qui on aurait affecté le contenu de la cellule et dont on pourrait gérer à loisir la couleur de fond,
    3. masquer le composant lors de la validation ou annulation,
    4. mettre à jour la cellule de la grille s'il s'agit d'une validation.
    5. réactiver grille

    Bonne continuation !
    Philippe.

  10. #10
    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 Ph. B. Voir le message
    Bonjour,
    Une remarque préalable : Quand la cellule de la grille passe en mode édition, un composant TInplaceEdit est superposé sur la cellule. Ce composant descend de TCustomMaskEdit, utilise les couleurs de windows par défaut et n'est pas prévu pour être accessible.
    A moins de développer votre propre StringGrid où la couleur de ce composant, voire ce composant serait accessible, il ne sera pas possible de conserver clAqua comme couleur de fond lors de l'édition.

    Cela dit, j'ai repris votre code que j'ai adapté (formatage, ajout par ci, suppression par la ) pour qu'il colle le plus possible à vos spécifications :
    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
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
      private
        { Déclarations privées }
        // Transfert des variables globales privées en variables privées de la fiche
        // cf. remarque de @popo
        SG, LastRow: Integer;
        FCorrec: Boolean;
        GrOpNor,GrOpEdi: set of TGridOption;
        LastLibel: string;
     
    //...
     
    procedure TEssaiFiche.FormActivate(Sender: TObject);
    begin
      GrOpNor := [goFixedHorzLine, goFixedVertLine, goVertLine, goHorzLine, goRowSelect];
      GrOpEdi := [goFixedHorzLine, goFixedVertLine, goVertLine, goHorzLine, goEditing];
      with SG1 do
      begin
        Options := grOpNor;
        Cells[0,1] := '1WWWW';
        Cells[0,2] := '1XXXX';
        Cells[0,3] := '1YYYY';
        Cells[0,4] := '1ZZZZ';
      end;
      with SG2 do
      begin
        Options := grOpNor;
        Cells[0,1] := '2WWWW';
        Cells[0,2] := '2XXXX';
        Cells[0,3] := '2YYYY';
        Cells[0,4] := '2ZZZZ';
      end;
      // Pour que la fiche soit initialement dans un état cohérent !
      BOK.Visible := False;
      BAnnul.Visible := False;
      RGCorrec.Visible := False;
      RGCorrec.ItemIndex := -1;
    end;
     
    procedure TEssaiFiche.SG1DrawCell(Sender: TObject; ACol,
       ARow: integer; Rect: TRect; State: TGridDrawState);
    var
      C: TColor;
      Info: String;
    begin
        // Inutile !
        // if FCorrec then
        // Exit;
        // On sait que Sender est du type TStringGrid, autant utiliser le transtypage direct, plus rapide
        with TStringGrid(Sender) do
        begin
          // Je crois qu'ici, vous avez perdu de vue vos spécifications... 
          // if (BOK.Visible) and (SG = 1) then
          //   C := clAqua
          // else if gdFixed in State then
          //   C := clBtnFace
          // else if (SG = 1) and ((not Enabled) and (gdSelected in State)) then
          //   C := clAqua
          // else if not Focused then
          //  C := clWhite
          // else if (gdFocused in State) or (gdSelected in State) then
          //  C := clBlue
          // else
          //  C := clWhite;
     
          // 3 cas possibles : colonne fixe, sélectionnée ou autre
          if gdFixed in State then
            C := clBtnFace
          else if gdSelected in State then
            C := clAqua
          else
            C := clWhite;
          //
          Canvas.Brush.Color := C;
          Canvas.FillRect(Rect);
          Canvas.Font.Assign(Font);
          // Inutile !
          // if C = clBlue 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
      Point: TPoint;
      C, R: Integer;
    begin
      // Inutile !
      // if RGCorrec.Visible then
      //  SG1.Row := LastRow;
      Point := Mouse.CursorPos;
      if Button = mbRight then
      begin
        SG := 1;
        with TStringGrid(Sender) do
        begin
          // Inutile, vous allez désactiver le composant juste après !
          // if not Focused then
          //  SetFocus;
          MouseToCell(X, Y, C, R);
          Col := C;
          Row := R;
          SG1.Row := R;
        end;
        RGCorrec.Visible := True;
        SG1.Enabled := False;
        SG2.Enabled := False;
      end;
    end;
     
    procedure TEssaiFiche.RGCorrecClick(Sender: TObject);
    begin
      if RGCorrec.ItemIndex = 0 then
      begin
        // Code appelé quelque soient les cas, déplacé en fin de procédure
        // RGCorrec.Visible := False;
        // RGCorrec.ItemIndex := -1;
        FCorrec := True;
        BOK.Visible := True;
        BAnnul.Visible := True;
        case SG of
          1: begin
               LastRow := SG1.Row;
               LastLibel := SG1.Cells[0, SG1.Row];
               SG1.Enabled := True;
               SG1.Options := GrOpEdi;
               SG1.SetFocus;
               // Donner le focus, c'est bien, passer en mode édition, c'est mieux !
               SG1.EditorMode := True;
             end;
          2: begin
               LastRow := SG2.Row;
               LastLibel := SG2.Cells[0, SG2.Row];
               SG2.Enabled := True;
               SG2.Options := GrOpEdi;
               SG2.SetFocus;
               SG2.EditorMode := True;
             end;
        end;
      end
      else
      begin
        SG1.Enabled := True;
        SG2.Enabled := True;
        // RGCorrec.Visible := False;
        case SG of
          1: SG1.SetFocus;
          2: SG2.SetFocus;
        end;
        // RGCorrec.ItemIndex := -1;
      end;
      RGCorrec.Visible := False;
      RGCorrec.ItemIndex := -1;
    end;
     
    procedure TEssaiFiche.BOKClick(Sender: TObject);
    begin
      SG1.Enabled := True;
      SG2.Enabled := True;
      BOK.Visible := False;
      BAnnul.Visible := False;
      FCorrec := False;
      case SG of
        1: begin
             if SG1.Cells[0, SG1.Row] = '' then
             begin
               MessageDlg('L''intitulé n''est pas spécifié.', mtError, [mbOK], 0);
               SG1.Cells[0, SG1.Row] := LastLibel;
               SG1.SetFocus;
               Exit;
             end;
             SG1.Options := grOpNor;
             SG1.SetFocus;
           end;
        2: begin
             if SG2.Cells[0, SG2.Row] = '' then
             begin
               MessageDlg('L''intitulé n''est pas spécifié.', mtError, [mbOK], 0);
               SG2.Cells[0, SG2.Row] := LastLibel;
               SG2.SetFocus;
               Exit;
             end;
             SG2.Options := grOpNor;
             SG2.SetFocus;
           end;
      end;
      LastLibel := '';
      BOK.Visible := False;
      BAnnul.Visible := False;
    end;
     
    procedure TEssaiFiche.BAnnulClick(Sender: TObject);
    begin
      FCorrec := False;
      SG1.Enabled := True;
      SG2.Enabled := True;
      BOK.Visible := False;
      BAnnul.Visible := False;
      case SG of
        1: begin
             SG1.Options := grOpNor;
             SG1.Cells[0, LastRow] := LastLibel;
             SG1.SetFocus;
           end;
        2: begin
             SG2.Options := grOpNor;
             SG2.Cells[0, LastRow] := LastLibel;
             SG2.SetFocus;
           end;
      end;
      LastLibel := '';
      BOK.Visible := False;
      BAnnul.Visible := False;
    end;
    Enfin, votre gestion pour conserver et restaurer le contenu d'une cellule peut toutefois être mis en défaut. Après être passé en mode correction, on peut toujours se placer sur une autre cellule et la modifier. Votre mécanisme devient inopérant.

    Une alternative serait lors du passage en mode correction de :
    1. laisser la grille désactivée,
    2. afficher un composant TEdit sur la cellule à modifier dont on gérerait les touches Entrée et Echap, et à qui on aurait affecté le contenu de la cellule et dont on pourrait gérer à loisir la couleur de fond,
    3. masquer le composant lors de la validation ou annulation,
    4. mettre à jour la cellule de la grille s'il s'agit d'une validation.
    5. réactiver grille

    Bonne continuation !
    Un grand merci, Ph. B pour votre contribution sur laquelle vous avez du passer pas mal de temps.

    A la lecture de votre remarque préalable, je comprends que j'aie séché. Je me doutais bien qu'il se passait quelque chose en "souterrain". Et si je vous comprends bien ce que je cherche, conserver clBlue pour la cellule sélectionnée sauf dans le cas de correction où je voudrais qu'elle soit clAqua, n'est pas possible à moins de développer mon propre StringGrid, ce qui, je crains, dépasse mes compétences.

    Merci encore.

  11. #11
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par Stevens.Georges Voir le message
    Un grand merci, Ph. B pour votre contribution sur laquelle vous avez du passer pas mal de temps.
    Il n'y avait pas de match... de rugby à la télé !

    Citation Envoyé par Stevens.Georges Voir le message
    Et si je vous comprends bien ce que je cherche, conserver clBlue pour la cellule sélectionnée sauf dans le cas de correction où je voudrais qu'elle soit clAqua, n'est pas possible à moins de développer mon propre StringGrid, ce qui, je crains, dépasse mes compétences.
    1. Avez-vous testé le code que j'ai fourni ? Car je n'emploie jamais la couleur clBlue...
    2. Réécrire une grille avec le comportement que vous souhaitez n'a rien d'insurmontable, d'autant que le code initial est fourni et qu'il s'agit en gros de rendre visible des éléments jusque la masqués et d'introduire une propriété.
    3. Vous pouvez aussi repartir de ma suggestion. En mode correction, plaquer un composant TEdit sur la cellule de la grille et gérer le transfert des données entre la cellule et le composant...
    Philippe.

  12. #12
    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 Ph. B. Voir le message
    Bonjour,
    Il n'y avait pas de match... de rugby à la télé !


    1. Avez-vous testé le code que j'ai fourni ? Car je n'emploie jamais la couleur clBlue...
    2. Réécrire une grille avec le comportement que vous souhaitez n'a rien d'insurmontable, d'autant que le code initial est fourni et qu'il s'agit en gros de rendre visible des éléments jusque la masqués et d'introduire une propriété.
    3. Vous pouvez aussi repartir de ma suggestion. En mode correction, plaquer un composant TEdit sur la cellule de la grille et gérer le transfert des données entre la cellule et le composant...
    Bonjour,

    Non pas de match de rugby mais un de foot qui nous amène à un deuil national...!

    Oui j'ai testé votre code mais j'aimerais arriver à conserver le clBlue hors de Correction. C'est pourquoi je vais travailler sur votre suggestion de plaquer un TEdit sur la cellule à corriger. Il me semble que ça devrait marcher. Je vous tiendrai au courant.

    Merci.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Points : 63
    Points
    63
    Par défaut N'importe quel composant dans une cellule stringGrid
    J'ai développé une petit appli y'a quelques années, permettant la création de tables ADO en dynamique.
    J'ai modifié le StringGrid de façon à pouvoir l'utiliser comme un éditeur.
    ça fait très longtemps tous ça.
    j'espère que ces quelques ligne t'aiderons.

    Nom : StringGrid.jpg
Affichages : 456
Taille : 212,1 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
      var
     t,t2,t3:Trect;
     
    begin
     
    //--------------Ajouter ComboBox---dans stringGrid-----------//
    if (ACol =2)and (ARow <> 0) then begin
    t := StringGrid1.CellRect(ACol, ARow);
    t.Left := t.Left + StringGrid1.Left;
    t.Right := t.Right + StringGrid1.Left;
    t.Top := t.Top + StringGrid1.Top;
    t.Bottom := t.Bottom + StringGrid1.Top;
     
    With ComboBox1 do begin
     Left := t.Left + 1;
     Top := t.Top + 2;
     Width := (t.Right + 1) - t.Left;
     Height := (t.Bottom +1) - t.Top;
     Visible := True;
     SetFocus;
    end;
    CanSelect := True;
     
    end else if (ACol <> 2)and (ARow <> 0) then
    ComboBox1.Visible:=false;

  14. #14
    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 Stevens.Georges Voir le message
    Bonjour,

    Non pas de match de rugby mais un de foot qui nous amène à un deuil national...!

    Oui j'ai testé votre code mais j'aimerais arriver à conserver le clBlue hors de Correction. C'est pourquoi je vais travailler sur votre suggestion de plaquer un TEdit sur la cellule à corriger. Il me semble que ça devrait marcher. Je vous tiendrai au courant.

    Merci.
    Bonjour Philippe,

    Je viens de terminer la modification pour plaquer un TEdit au dessus de la cellule à modifier, ça marche parfaitement bien.

    Encore un grand merci.

    Georges.

  15. #15
    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 94340DB Voir le message
    J'ai développé une petit appli y'a quelques années, permettant la création de tables ADO en dynamique.
    J'ai modifié le StringGrid de façon à pouvoir l'utiliser comme un éditeur.
    ça fait très longtemps tous ça.
    j'espère que ces quelques ligne t'aiderons.

    Nom : StringGrid.jpg
Affichages : 456
Taille : 212,1 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
      var
     t,t2,t3:Trect;
     
    begin
     
    //--------------Ajouter ComboBox---dans stringGrid-----------//
    if (ACol =2)and (ARow <> 0) then begin
    t := StringGrid1.CellRect(ACol, ARow);
    t.Left := t.Left + StringGrid1.Left;
    t.Right := t.Right + StringGrid1.Left;
    t.Top := t.Top + StringGrid1.Top;
    t.Bottom := t.Bottom + StringGrid1.Top;
     
    With ComboBox1 do begin
     Left := t.Left + 1;
     Top := t.Top + 2;
     Width := (t.Right + 1) - t.Left;
     Height := (t.Bottom +1) - t.Top;
     Visible := True;
     SetFocus;
    end;
    CanSelect := True;
     
    end else if (ACol <> 2)and (ARow <> 0) then
    ComboBox1.Visible:=false;
    Bonjour,

    Et merci pour ta contribution.

    Comme tu as pu le voir j'ai résolu mon problème très simplement comme indiqué ci-dessus.

    Merci beaucoup quand même.

    Georges.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 18/04/2010, 03h40
  2. [Spreadsheet Excel Writer] La gestion des couleurs
    Par marco10024 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 15/02/2010, 12h59
  3. Problème de couleur avec mes css
    Par thoughtless dans le forum Mise en page CSS
    Réponses: 20
    Dernier message: 13/08/2009, 14h45
  4. Problème de couleur avec xwd
    Par damdam78 dans le forum AIX
    Réponses: 1
    Dernier message: 24/10/2008, 18h02
  5. Réponses: 2
    Dernier message: 31/07/2006, 15h28

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