Bonjour à toutes et à tous,

A partir d'un composant TBoutonCoinRond que j'ai créé, je réalise un autre composant qui est un clavier numérique. Ce nouveau composant est en lui même un TBoutonCoinRond dans lequel je dépose d'autres TBoutonCoinRond représentant chaque touche numérique.

Dans la procédure "OnClick" de la fiche relative à ce composant, je souhaite récupérer la valeur "Titre" (représentant la valeur numérique) de la touche sur laquelle je clique. Mais cela ne fonctionne pas. Quand je clique sur une touche, la procédure "OnClick" ne se déclenche pas. Par contre, la procédure interne "ToucheClick" de mon composant est bien activée et récupère bien la valeur "Titre" de la touche cliquée.

Voici le code de mon composant :

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
unit ClavierN;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, BoutonArrondi;
 
type
  TClavierNum = class(TBoutonCoinRond)
  private
    Touche: array[0..11] of TBoutonCoinRond;
    FValTouche: String;
  protected
 
  public
    property ValTouche: String read FValTouche write FValTouche;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Paint; override;
    procedure ToucheClick(Sender: TObject);
  published
 
  end;
 
procedure Register;
 
implementation
 
procedure Register;
begin
  {$I claviern_icon.lrs}
  RegisterComponents('ChP',[TClavierNum]);
end;
 
constructor TClavierNum.Create(AOwner: TComponent);
var
  i: Integer;
begin
  inherited Create(AOwner);
  Parent:= TWinControl(AOwner);
  Actif:= False;
  CouleurCoin:= clForm;
  Width:= 280;
  Height:= 368;
  for i:= 0 to 11 do
  begin
    Touche[i]:= TBoutonCoinRond.Create(Self);
    Touche[i].Parent:= TWinControl(Self);
    Touche[i].Actif:= True;
    Touche[i].CouleurCoin:= clWhite;
    Touche[i].Width:= 80;
    Touche[i].Height:= 80;
    Touche[i].OnClick:= @ToucheClick;
  end;
  Touche[0].Titre:= '7';
  Touche[1].Titre:= '5';
  Touche[2].Titre:= '3';
  Touche[3].Titre:= '*';
  Touche[4].Titre:= '8';
  Touche[5].Titre:= '6';
  Touche[6].Titre:= '1';
  Touche[7].Titre:= '0';
  Touche[8].Titre:= '9';
  Touche[9].Titre:= '4';
  Touche[10].Titre:= '2';
  Touche[11].Titre:= '#';
end;
 
procedure TClavierNum.Paint;
var
  i: Integer;
begin
  inherited Paint;
  for i:= 0 to 11 do
    begin
      Touche[i].Left:= 12+88*(i mod 3);
      Touche[i].Top:= 12+88*(i mod 4);
    end;
end;
 
procedure TClavierNum.ToucheClick(Sender: TObject);
begin
  ValTouche:= TBoutonCoinRond(Sender).Titre; //Récupère bien la valeur "Titre" de la touche cliquée.
end;
 
destructor TClavierNum.Destroy;
var
  i: Integer;
begin
  for i:= 0 to 11 do
    Touche[i].Free;
  inherited Destroy;
end;
 
end.
et le code de l'unité sur laquelle j'ai déposé mon composant clavier ainsi qu'un TBoutonCoinRond seul :

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
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ClavierN,
  BoutonArrondi;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    BoutonCoinRond1: TBoutonCoinRond;
    ClavierNum1: TClavierNum;
    Edit1: TEdit;
    procedure BoutonCoinRond1Click(Sender: TObject);
    procedure ClavierNum1Click(Sender: TObject);
  private
 
  public
 
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.ClavierNum1Click(Sender: TObject); // Cet évènement ne se déclenche pas lors de l'appui sur une des touches du clavier, mais se déclenche lorsque je je clique entre les touches, c'est-à-dire sur le composant TBoutonCoinRond support des touches.
begin
  Edit1.Text:= TClavierNum(Sender).ValTouche;
end;
 
procedure TForm1.BoutonCoinRond1Click(Sender: TObject); //
begin
  Edit1.Text:= BoutonCoinRond1.Titre; // Récupère bien la valeur "Titre" de BoutonCoinRond1
end;
 
end.
Que faut-il ajouter à mon composant Clavier pour qu'un click sur chacune des touches déclenche un évènement dans ma fiche ?

Cordialement.

Pierre.