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

Delphi Discussion :

[d7] comment empecher le curseur de passer dans une cellule de stringgrid


Sujet :

Delphi

  1. #1
    iam
    iam est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 197
    Points : 72
    Points
    72
    Par défaut [d7] comment empecher le curseur de passer dans une cellule de stringgrid
    salut les amis(e)
    j'ai tout un petit pb, et franchment je n'ai pas chercher dans le forum, parceque je dois rendre mon travail demain:
    concernant le composant stringgrid : comment empecher le curseur de passer dans certaines cellules en tabulant ou en appuyant sur entrer, je ne veux pas que certaine cellules de la ligne courante seront selectionnée en tabulant
    merci

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut,

    Utilise l'evenement OnSelectCell et renseigne la variable CanSelect à True ou False suivant que tu veux autoriser la sélection ou non de la cellule.

    @+ Claudius

  3. #3
    iam
    iam est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 197
    Points : 72
    Points
    72
    Par défaut
    salut merci pour ta réponse, j'ai fais ce code comme vous m'avez dis mais ça n'a pas marché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (Acol=1) or (Acol=2) or (Acol=3) or (Acol=4) or (Acol=5) or (Acol=7) then CanSelect:=false
      else canselect:=true;
    quand je rentre dans le stringgrid avec entrer, le curseur ne bouge pas de la
    1ere cellule

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    Fais attention les colonnes commencent par l'indice 0. Si tu as 7 colonnes ACol te renverra des valeurs de 0 à 6. Mais ça peut-être que tu le savais déjà

    Le fait de mettre CanSelect à False interdit simplement la sélection de la nouvelle cellule, donc ta sélection ne bouge pas. Il va falloir que tu gères toi-même ce comportement.

    @+

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Pour l'élégance de ton code, ceci serait plus agréable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ((Acol>=1) and (Acol<=7)) 
    then CanSelect:=false
    else canselect:=true;
    ou bien encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (Acol in [1,2,3,4,5,6,7]) 
    then CanSelect:=false
    else canselect:=true;
    Ou bien encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CanSelect:=not  (Acol in [1,2,3,4,5,6,7]);
    Sinon, n'oublie pas que la numérotation des colonnes s'effectue de 0 à N-1.
    Donc celà suppose dans ton code que :
    - tu as 8 colonnes
    - et que l'on peut sélectionner la première colonne.

    Sinon, pour en revenir à ta première question : comment empêcher le curseur de passer dans certaines cellules en tabulant ?
    Dans la propriété Options, tu mets goTabs à false

    Pour activer le passage d'une cellule à une autre avec la touche de Tabulation tu mets la propriété à true.

    Ou sinon, si tu veux que ça tabule que sur la première colonne, tu code l'évènement du OnKeyDown comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (key=VK_TAB)  then
      begin
        StringGrid1.row:=(StringGrid1.row+1) mod (StringGrid1.RowCount);
        StringGrid1.col:=0;
      end;
    end;
    Et le code qui t'as été donné pour OnSelectCell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
       CanSelect:=not  (Acol in [1,2,3,4,5,6,7]);
    end;
    Bidouilleuse Delphi

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,

    Bon je viens de coder ça, j'espère que ça t'aideras.

    L'exemple suivant autorise la sélection des colonnes 2, 3, 5 et 6 (3°, 4°, 6 et 7° colonnes).
    Ensuite au niveau du KeyDown je traitre l'appui sur les touches TAB, HOME et END.
    TAB passe à la colonne suivante, Shift+TAB la colonne précédente.
    HOME passe à la 1° colonne de la ligne, Ctrl+HOME la 1° colonne de la grille.
    END passe à la dernière colonne de la ligne, Ctrl+END la dernière colonne de la grille.

    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
     
    var
      Form1: TForm1;
    const
      ColonnesOK = [2,3,5,6];
      FirstCol = 2;
      LastCol = 6;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
      CanSelect := ACol in ColonnesOK;
    end;
     
    procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      nCol, nRow: Integer;
     
      //----------------------------
      procedure SearchForNextCell;
      begin
        with TStringGrid(Sender) do begin
          repeat
            Inc(nCol);
            if (nCol > ColCount - 1) then begin
              nRow := (nRow + 1) mod RowCount;
              nCol := FixedCols;
            end;
          until (nCol in ColonnesOK);
        end;
      end;
      //----------------------------
      procedure SearchForPrevCell;
      begin
        with TStringGrid(Sender) do begin
          repeat
            Dec(nCol);
            if (nCol < 0) then begin
              Dec(nRow);
              nCol := ColCount - 1;
            end;
            if nRow < FixedRows  then nRow := RowCount - 1;
          until (nCol in ColonnesOK);
        end;
      end;
      //----------------------------
    begin
     
      // Stocker la position actuelle dans nCol et nRow
      with TStringGrid(Sender) do
      begin
        nCol := Col;
        nRow := Row;
     
        // Réagir suivant touche
        if (Key = VK_TAB) then
          begin
            // Touche Tabulation
            if (ssShift in Shift) then
              begin
                // Shift + TAB: Cellule précedente
                SearchForPrevCell;
                Row := nRow;
                Col := nCol;
              end
            else
              begin
                // TAB: Cellule suivante
                SearchForNextCell;
                Col := nCol;
                Row := nRow;
              end;
            Key := 0;
          end
        else if (Key = VK_HOME) then
          // HOME: 1° cellule de la ligne
          begin
            Col := FirstCol;
            if (ssCtrl in Shift) then begin
              // Ctrl + HOME: 1° cellule de la grille
              TopRow := FixedRows;
              Row := FixedRows;
            end;
          end
        else if (Key = VK_END) then
          // END: Dernière cellule de la ligne
          begin
            nCol := LastCol;
            nRow := Row;
            if (ssCtrl in Shift) then
              // Ctrl + END: dernière cellule de la grille
              nRow := RowCount - 1;
            Row := nRow;
            Col := nCol;
          end;
      end;
    end;
    end.
    Voilà
    @+ Claudius.

  7. #7
    iam
    iam est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 197
    Points : 72
    Points
    72
    Par défaut
    merci waskol et Claudius40 pour la richesse de vos réponses et exemples de code, c'est vraiment génial je vais les essayer et normalement ça va me resoudre mes problemes de manipulation du tstringgrid, en faite je n'ai pas utilisé le tstringgrid standard, j'ai utilisé celui de tms tadvstringgrid, j'avais une difficulté à programmer la tabulation par la touche enter dans tstringgrid standard, le tadvstringgrid a beaucoup de propriétés et evenements, et la tabulation par la touche entrer est prete à utiliser directement, tadvstringgrid a une propriété AdvanceOnEnter à mettre à true seulement, mais malgré qu'il est riche de propriétés, il a beaucoup en faite et je n'arrive pas à exploiter toutes ses fonctionnalités et son help est en anglais et la compilation de mon projet pas à pas me pose problème quand j'ai utilisé ce composant car le compilateur commense à compiler le code du composant, je m'excuse de tout ce bavarde, merci pour tout messieurs
    ciao

Discussions similaires

  1. Plusieurs cellules dans une cellule de StringGrid
    Par fthdz dans le forum Delphi
    Réponses: 3
    Dernier message: 18/04/2015, 17h51
  2. [XL-2003] Comment éviter la saisie de doublon dans une cellule
    Par MichaSarah dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/09/2010, 11h01
  3. Réponses: 4
    Dernier message: 11/09/2009, 15h07
  4. [CSS] Empecher le retour à la ligne dans une cellule
    Par pekka77 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 26/02/2009, 16h50
  5. comment en VBA mettre les mots dans une cellule en oblique
    Par antoine.dandois dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/02/2007, 17h10

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