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 :

[Delphi6] - Problème TStringGrid et utilisation flèches directionnelles


Sujet :

Delphi

  1. #1
    Candidat au Club
    Femme Profil pro
    Ingénieur R&D en informatique
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D en informatique

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut [Delphi6] - Problème TStringGrid et utilisation flèches directionnelles
    Bonjour à tous,

    Dans le cadre d'une montée en compétences sur Delphi 6, j'ai entrepris de développer un 2048.
    Je suis à peu près satisfaite du fonctionnement du jeu à un ou deux détails près, mais ce n'est pas ce qui m'intéresse ici.

    Pour planter le décor, j'ai utilisé un TStringGrid pour afficher ma grille et mes chiffres, et des TSpeedButton pour les déplacements dans les quatre directions. Si tout cela fonctionne, j'ai décidé de passer à l'étape supérieure et de prendre aussi en compte les flèches directionnelles du clavier en plus des TSpeedButton... et c'est là que le bât blesse.

    En effet, j'ai eu beau utiliser un grand nombre de solutions différentes, je n'arrive pas à entrer dans une procédure de récupération d'une touche du clavier. Les seules touches à réagir sont les flèches directionnelles, qui permettent à un fin cadre en pointillé de passer d'une case à l'autre de mon TStringGrid, ce dont je me moque éperdument. Cela vient sans doute de mon TabStop à True (que j'ai mis ainsi pour éviter d'avoir une case surlignée de bleu) car quand je le passe à False les flèches directionnelles n'ont plus aucun effet sur mon TStringGrid.

    J'ai utilisé les options suivantes pour essayer de capturer la saisie clavier pour lancer les procédures de mouvement des chiffres :

    Tenter d'appeler OnKeyDown sur ma TStringGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.GrilleKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
           showmessage('spLeftClick');
           If ord(Key) = VK_LEFT   then begin
                              spLeft.Click;
                              end;
    end;
    Tenter d'appeler OnKeyUp sur ma TStringGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.GrilleKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
           showmessage('spLeftClick');
           If ord(Key) = VK_LEFT   then begin
                              spLeft.Click;
                              end;
    end;
    Tenter d'appeler OnKeyDown / OnKeyUp sur le Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
           showmessage('spLeftClick');
           If ord(Key) = VK_LEFT   then begin
                              spLeft.Click;
                              end;
    end;
    Tenter d'utiliser un OnPressKey sur mon Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char)  ;
    begin
     
      if Key=chr(25) then begin
            showmessage('spLeftClick');
            spLeft.Click;
      end;
     
    end;
    Tenter de ruser en utilisant un TEdit pour capter les touches (solution proposée ici) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      case Key of
        VK_Left: begin
                  showmessage('spLeftClick');
                  spLeft.Click;
            end;
      end;
    end;
    J'ai aussi essayé de tenter de capturer la saisie sur un projet vierge, avec juste un ShowMessage pour voir si je rentrais dedans, sans succès.
    Si quelqu'un a des idées sur la raison pour laquelle je ne parviens pas à capturer mes saisies clavier, je suis toute ouïe.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pour que TForm capture un Event lorsque le Focus est sur la grille ou sur un Bouton, il faut mettre KeyPreview à True
    Seul un controle qui a le focus reçoit le clavier

    Sinon, voir aussi pour utiliser des ShortCut, TAction pour affecter une touche du clavier directement à une action
    Effectivement, bloquer aussi les autres controles qui n'ont pas besoin du focus serait à étudier, par exemple, la Grille dans un Panel, le panel en Enabled False, cela laissera l’apparence normale de la grille

    Aussi, affecter 0 ou #0 à Key, cela inhibe le comportement par défaut
    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

  3. #3
    Candidat au Club
    Femme Profil pro
    Ingénieur R&D en informatique
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D en informatique

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord bonjour et merci !

    J'ai déjà mis KeyPreview à True dans le OnCreate de mon Form. Néanmoins, je vais essayer les autres pistes que tu m'as données.
    Merci !

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    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 674
    Points : 5 259
    Points
    5 259
    Par défaut
    La question à se poser est pourquoi Delphi 6 ?
    Est-ce qu'on te l'impose ?
    Est-ce un choix personnel ?

    C'est une techno qui a plus de 20 ans.
    Delphi a beaucoup évolué depuis.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    Citation Envoyé par Meryt Voir le message
    Cela vient sans doute de mon TabStop à True (...) car quand je le passe à False les flèches directionnelles n'ont plus aucun effet sur mon TStringGrid.
    Ça n'a pas vraiment de rapport, TabStop concerne la navigation entre composants à l'aide de la touche TAB.

    Citation Envoyé par Meryt Voir le message
    .. TabStop à True (que j'ai mis ainsi pour éviter d'avoir une case surlignée de bleu)...
    Décoche l'option goDrawFocusSelected.

    Sinon :

    - Dans les événements OnKeyDown/Up Key est un entier, ord() est inutile.
    - Si ces événements ne sont pas générés c'est que la grille n'a pas le focus.
    - OnKeyPress n'est pas invoqué par les touches de direction. Cet événement correspond au message WM_CHAR.
    - Et même si OnKeyPress survenait, VK_LEFT vaut 37 (0x25).


    Cela dit OnSelectCell est invoqué après déplacement, pourquoi n'utilises-tu pas cet événement ?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Je ne connaissais pas les règles du jeu, c'est surement tout buggé, pas du tout efficace comme algo mais l'on voit que le clavier ne pose aucun problème avec des TSpeedButton sur D7 PE



    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
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    unit Game2048_MainForm;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids, Buttons;
     
    type
      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        btnUp: TSpeedButton;
        btnRight: TSpeedButton;
        btnDown: TSpeedButton;
        btnLeft: TSpeedButton;
        btnReset: TSpeedButton;
        procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
        procedure btnUpClick(Sender: TObject);
        procedure btnDownClick(Sender: TObject);
        procedure btnRightClick(Sender: TObject);
        procedure btnLeftClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btnResetClick(Sender: TObject);
      private
        { Déclarations privées }
        procedure Pop();
        procedure Combine(ADirection: Word);
        procedure CombineCol(AStart, AEnd: Integer; AStep: Integer);
        procedure CombineLine(AStart, AEnd: Integer; AStep: Integer);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses Math;
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if System.DebugHook = 0 then
        Randomize();
     
      Pop();
    end;
     
    procedure TForm1.Pop();
    var
      Coords: array of TPoint;
     
      procedure AddPoint(const p: TPoint);
      var
        l: Integer;
      begin
        l := Length(Coords);
        SetLength(Coords, l + 1);
        Coords[l] := p;
      end;
    var
      c, r, i: Integer;
     
    begin
      for c := 0 to StringGrid1.ColCount - 1 do
        for r := 0 to StringGrid1.RowCount - 1 do
          if StringGrid1.Cells[c, r] = '' then
            AddPoint(Point(r, c));
     
      if Length(Coords) > 0 then 
      begin
        i := RandomRange(0, Length(Coords));
        StringGrid1.Cells[Coords[i].Y, Coords[i].X] := IntToStr(2 + (RandomRange(0, 1) * 2));
      end
      else
      begin
        ShowMessage('You LOOSE !');
     
        for c := 0 to StringGrid1.ColCount - 1 do
          for r := 0 to StringGrid1.RowCount - 1 do
            StringGrid1.Cells[c, r] := '';
        Pop();
     
      end;
    end;
     
    procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      Combine(Key);
    end;
     
    procedure TForm1.btnUpClick(Sender: TObject);
    begin
      Combine(VK_UP);
    end;
     
    procedure TForm1.btnDownClick(Sender: TObject);
    begin
      Combine(VK_DOWN);
    end;
     
    procedure TForm1.btnRightClick(Sender: TObject);
    begin
      Combine(VK_RIGHT);
    end;
     
    procedure TForm1.btnLeftClick(Sender: TObject);
    begin
      Combine(VK_LEFT);
    end;
     
    procedure TForm1.Combine(ADirection: Word);
    begin
      case ADirection of
        VK_UP: CombineCol(StringGrid1.RowCount - 1, 0, -1);
        VK_DOWN: CombineCol(0, StringGrid1.RowCount - 1, +1);
        VK_RIGHT: CombineLine(0, StringGrid1.ColCount - 1, +1);
        VK_LEFT: CombineLine(StringGrid1.ColCount - 1, 0, -1);
      end;
    end;
     
    procedure TForm1.CombineCol(AStart, AEnd: Integer; AStep: Integer);
    var
      c, r: Integer;
      s, d: Integer;
      k: Integer;
    begin
      for c := 0 to StringGrid1.ColCount - 1 do
      begin
        r := AStart;
     
        while ((AStep > 0) and (r < AEnd)) or ((AStep < 0) and (r > AEnd)) do
        begin
          s := StrToIntDef(StringGrid1.Cells[c, r], 0);
          d := StrToIntDef(StringGrid1.Cells[c, r + AStep], 0);
     
          if (d = 0) and (s > 0) then
          begin
            StringGrid1.Cells[c, r] := '';
            StringGrid1.Cells[c, r + AStep] := IntToStr(s);
          end
          else if (d > 0) and (s = d) then
          begin
            StringGrid1.Cells[c, r] := '';
            StringGrid1.Cells[c, r + AStep] := IntToStr(s + d);
            // Break; // ??? ça je sais pas la règle si c'est ça se propage tout seul
          end
          else if (d > 0) and (s > 0) and (d <> s) then
            Break;
     
          Inc(r, AStep);
        end;
     
        repeat
          k := 0;
     
          r := AEnd;
          while ((-AStep > 0) and (r < AStart)) or ((-AStep < 0) and (r > AStart)) do
          begin
            s := StrToIntDef(StringGrid1.Cells[c, r - AStep], 0);
            d := StrToIntDef(StringGrid1.Cells[c, r], 0);
     
            if (d = 0) and (s > 0) then
            begin
              StringGrid1.Cells[c, r - AStep] := '';
              StringGrid1.Cells[c, r] := IntToStr(s);
              Inc(k);
            end;
     
            Inc(r, -AStep);
          end;
        until k = 0;
      end;
     
      Pop();
    end;
     
    procedure TForm1.CombineLine(AStart, AEnd: Integer; AStep: Integer);
    var
      c, r: Integer;
      s, d: Integer;
      k: Integer;
    begin
      for r := 0 to StringGrid1.RowCount - 1 do
      begin
        c := AStart;
     
        while ((AStep > 0) and (c < AEnd)) or ((AStep < 0) and (c > AEnd)) do
        begin
          s := StrToIntDef(StringGrid1.Cells[c, r], 0);
          d := StrToIntDef(StringGrid1.Cells[c + AStep, r], 0);
     
          if (d = 0) and (s > 0) then
          begin
            StringGrid1.Cells[c, r] := '';
            StringGrid1.Cells[c + AStep, r] := IntToStr(s);
          end
          else if (d > 0) and (s = d) then
          begin
            StringGrid1.Cells[c, r] := '';
            StringGrid1.Cells[c + AStep, r] := IntToStr(s + d);
            // Break; // ??? ça je sais pas la règle si c'est ça se propage tout seul
          end
          else if (d > 0) and (s > 0) and (d <> s) then
            Break;
     
          Inc(c, AStep);
        end;
     
        repeat
          k := 0;
     
          c := AEnd;
          while ((-AStep > 0) and (c < AStart)) or ((-AStep < 0) and (c > AStart)) do
          begin
            s := StrToIntDef(StringGrid1.Cells[c - AStep, r], 0);
            d := StrToIntDef(StringGrid1.Cells[c, r], 0);
     
            if (d = 0) and (s > 0) then
            begin
              StringGrid1.Cells[c - AStep, r] := '';
              StringGrid1.Cells[c, r] := IntToStr(s);
              Inc(k);
            end;
     
            Inc(c, -AStep);
          end;
        until k = 0;
      end;
     
      Pop();
    end;
     
     
    procedure TForm1.btnResetClick(Sender: TObject);
    var
      c, r: Integer;
    begin
        for c := 0 to StringGrid1.ColCount - 1 do
          for r := 0 to StringGrid1.RowCount - 1 do
            StringGrid1.Cells[c, r] := '';
        Pop();
     
    end;
     
    end.
    Code dfm : 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
    object Form1: TForm1
      Left = 389
      Top = 226
      Width = 1305
      Height = 675
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      KeyPreview = True
      OldCreateOrder = False
      OnCreate = FormCreate
      OnKeyUp = FormKeyUp
      PixelsPerInch = 96
      TextHeight = 13
      object btnUp: TSpeedButton
        Left = 160
        Top = 16
        Width = 23
        Height = 22
        OnClick = btnUpClick
      end
      object btnRight: TSpeedButton
        Left = 248
        Top = 112
        Width = 23
        Height = 22
        OnClick = btnRightClick
      end
      object btnDown: TSpeedButton
        Left = 152
        Top = 192
        Width = 23
        Height = 22
        OnClick = btnDownClick
      end
      object btnLeft: TSpeedButton
        Left = 64
        Top = 104
        Width = 23
        Height = 22
        OnClick = btnLeftClick
      end
      object btnReset: TSpeedButton
        Left = 24
        Top = 208
        Width = 23
        Height = 22
        OnClick = btnResetClick
      end
      object StringGrid1: TStringGrid
        Left = 104
        Top = 40
        Width = 137
        Height = 137
        TabStop = False
        ColCount = 4
        DefaultColWidth = 32
        DefaultRowHeight = 32
        Enabled = False
        FixedCols = 0
        RowCount = 4
        FixedRows = 0
        Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine]
        ScrollBars = ssNone
        TabOrder = 0
      end
    end
    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

  7. #7
    Candidat au Club
    Femme Profil pro
    Ingénieur R&D en informatique
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D en informatique

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre aide à tous !

    La question à se poser est pourquoi Delphi 6 ?
    Pour commencer, si je suis avec Delphi6, c'est tout simplement parce que c'est ce qu'utilise mon entreprise (ha, ha... ha.) et qu'on me demande de me former (seule) au Pascal et à Delphi 6 pour faire notamment de la maintenance. Comme je ne veux pas me cantonner à la base et juste savoir rajouter deux boutons et modifier trois lignes de codes, j'ai pensé au 2048 comme entraînement.


    Décoche l'option goDrawFocusSelected.
    Je viens de regarder, c'était déjà le cas.


    la Grille dans un Panel, le panel en Enabled False, cela laissera l’apparence normale de la grille
    Je viens d'essayer, ça ne change rien :/ (enfin, sauf que j'ai cette case bleue de sélection dont je ne veux pas qui apparaît à l'écran !)

    Je ne connaissais pas les règles du jeu, c'est surement tout buggé, pas du tout efficace comme algo mais l'on voit que le clavier ne pose aucun problème avec des TSpeedButton sur D7 PE
    Je viens d'essayer ton code en incorporant les procédures FormKeyUp et Combine dans mon projet, je ne rentre jamais dedans. Je vais essayer en recréant un projet de zéro.

    Sinon, concernant mes TSpeedButton, ils fonctionnent tous parfaitement.
    Mon problème vient vraiment de la reconnaissance des touches du clavier.

    - Dans les événements OnKeyDown/Up Key est un entier, ord() est inutile.
    - Si ces événements ne sont pas générés c'est que la grille n'a pas le focus.
    - OnKeyPress n'est pas invoqué par les touches de direction. Cet événement correspond au message WM_CHAR.
    - Et même si OnKeyPress survenait, VK_LEFT vaut 37 (0x25).


    Cela dit OnSelectCell est invoqué après déplacement, pourquoi n'utilises-tu pas cet événement ?
    J'ai utilisé ord() parce que je l'avais vu dans un forum (je ne sais plus lequel, car j'en ai déjà visité un certain nombre), mais j'ai testé avec et sans, sans changement notable.
    Pour la valeur de Vk_Left, je l'avais trouvé en suivant un lien depuis un forum vers ce site

    Je ne connaissais pas OnSelectCell, je vais essayer de me renseigner.

  8. #8
    Candidat au Club
    Femme Profil pro
    Ingénieur R&D en informatique
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D en informatique

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    ça y est, j'ai résolu mon problème !!!

    En fait, c'est à la fois très simple et très bête (de ma part).
    Si j'ai bien déclaré les procédures TForm1.FormKeyUp dans mon code, j'ai complètement oublié une chose : de les indiquer dans le panneau de l'inspecteur d'objets, dans l'onglet évènements.
    Donc, si jamais quelqu'un avait le même souci, voilà tout ce qu'il faut faire :

    1. Alimenter KeyPreview := True
    2. Dans l'Inspecteur d'objets, dans l'onglet Evénements, saisir FormKeyUp dans le champ en face de OnKeyUp
    3. Double-cliquer dessus pour générer la procédure dans l'Unit (ou l'écrire à la main)
    4. Entrer le code régissant les actions des touches


    En adaptant ton code ShaiLeTroll pour les procédures FormKeyUp et Combine tout fonctionne parfaitement, je me branche sans plus aucun problème au reste de mon programme.

    Merci à tous, j'ai l'impression d'avoir appris plein de choses grâce à vous !

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Meryt Voir le message
    Si j'ai bien déclaré les procédures TForm1.FormKeyUp dans mon code, j'ai complètement oublié une chose : de les indiquer dans le panneau de l'inspecteur d'objets, dans l'onglet évènements.
    Citation Envoyé par Meryt Voir le message
    Je viens d'essayer ton code en incorporant les procédures FormKeyUp et Combine dans mon projet, je ne rentre jamais dedans. Je vais essayer en recréant un projet de zéro.
    C'est effectivement pour cela que j'ai fourni la DFM, pour montrer le contenu et qu'il est nécessaire au bon fonctionnement


    Citation Envoyé par Meryt Voir le message
    Dans l'Inspecteur d'objets, dans l'onglet Evénements, saisir FormKeyUp dans le champ en face de OnKeyUp
    Double-cliquer dessus pour générer la procédure dans l'Unit (ou l'écrire à la main)
    Remarquez que la plupart du temps, même pas besoin de saisir, vous double-cliquer directement, cela génère le nom automatiquement sous la forme Name + Event (sans le On) ainsi que la structure de code, pas besoin de le saisir, déclarer manuellement un gestionnaire d'évènement est assez rare et souvent strictement tout en code, assignation au RunTime, dans 99.9% des cas, le double-clic sur l'inspecteur de propriété dans l’événement choisi suffit largement.
    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

  10. #10
    Candidat au Club
    Femme Profil pro
    Ingénieur R&D en informatique
    Inscrit en
    Août 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D en informatique

    Informations forums :
    Inscription : Août 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    C'est effectivement pour cela que j'ai fourni la DFM, pour montrer le contenu et qu'il est nécessaire au bon fonctionnement



    Remarquez que la plupart du temps, même pas besoin de saisir, vous double-cliquer directement, cela génère le nom automatiquement sous la forme Name + Event (sans le On) ainsi que la structure de code, pas besoin de le saisir, déclarer manuellement un gestionnaire d'évènement est assez rare et souvent strictement tout en code, assignation au RunTime, dans 99.9% des cas, le double-clic sur l'inspecteur de propriété dans l’événement choisi suffit largement.
    Ahahah, certes oui, mais comme je développe en COBOL, on va dire que j'ai l'habitude de devoir tout écrire à la main... donc si j'ai bien intégré le fait que pour l'évènement OnCreate d'un Form ou les procédures "classiques" des autres composants je peux double-cliquer dessus pour générer la procédure, pour le reste c'est un peu moins ancré. Mais étant donné le temps que j'ai passé sur ce problème, maintenant je pense que je m'en souviendrai !

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

Discussions similaires

  1. [XL-2013] Problème fonctionnement des flèches directionnelles du clavier
    Par Rachellll dans le forum Excel
    Réponses: 6
    Dernier message: 28/03/2017, 17h33
  2. Réponses: 7
    Dernier message: 18/07/2009, 01h28
  3. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  4. Problème avec l'utilisation de la fonction clock
    Par Matgic95 dans le forum C++Builder
    Réponses: 13
    Dernier message: 09/05/2005, 19h27
  5. Codes étendus des flèches directionnelles
    Par coca dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 11/12/2002, 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