Focus

Résolu
nemo216 Messages postés 8 Date d'inscription mardi 26 septembre 2006 Statut Membre Dernière intervention 9 octobre 2006 - 26 sept. 2006 à 16:02
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 2 oct. 2006 à 12:04
 Hello.

Je viens de commencer la programation delphi dans le cadre du boulot.

Je fais une calculatrice, et j'ai mis des boutons auquel je peu accèder grace au clavier. et j'aimerai que lorsque


j'apui sur la touche, par exemple la touche 1, on voit le bouton 1
s'enfoncer et se remmettre a l'etat initial. en plus j'aimerai

que la touche enter représente la touche egal. donc si quelquun peut m'aider sa serai cool. merci 

12 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 sept. 2006 à 15:04
elle ne peut pas encore convenir ... mais ça ne devrait pas tarder


en effet le code donné par Guillemouze ne fonctionne pas ... désolé

voici un essais fonctionnel avec 12 TSpeedButton avec les Caption de "0" à "9" + "." + "= "
tout les GroupIndex à 1 et
tout les AllowAllUp à True et
tout les OnClick à SpeedButton1Click



procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  With (Sender as TSpeedButton) do
  Begin
    Edit1.Text : = Edit1.Text + Caption;
  End;
end;



procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Var I : Integer;
begin
  For I := 1 to 12 do
    With TSpeedButton(FindComponent('SpeedButton' + IntToStr(I))) do
      If Key = Ord(Caption[1]) Then
      Begin
        Down := True;
        Invalidate;
        click;
      End ;
end;



procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Var I : Integer;
begin
  For I : = 1 to 12 do
    With TSpeedButton(FindComponent('SpeedButton' + IntToStr(I))) do
      Begin
      If Down = True Then
        Down : = False;
        Invalidate;
      End;
end;


il y a certainement possibilité de faire mieux mais ce code produit l'effet souhaité ...
pour le reste c'est à toi de gèrer














@+
Cirec
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
26 sept. 2006 à 17:13
Salut,

Si tu poses un TButton, Windows gère lui-même l'"enfoncement" du bouton donc pas de problèmes de prog.

Pour l'histoire de "enter" pour la touche "Egal", joue sur Evènement "OnKeyDown" de ton bouton. Tu as un mémo ici avec un exemple.

@+
 Matt

La paresse est la mère du génie...
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
26 sept. 2006 à 21:54
tu peu utiliser la propriete keyPreview de la frame contenant tes boutons.
ensuite, tu n'a plus qu'a mettre le code d'interception dans cette frame.

tu peu essayer le code suivant:

calculette.pas
unit calculette;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    btn9: TButton;
    btn4: TButton;
    btn6: TButton;
    btn5: TButton;
    btn7: TButton;
    btn8: TButton;
    btn0: TButton;
    btnEgal: TButton;
    Edit1: TEdit;
    btnClear: TButton;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure btnClick(Sender: TObject);
    procedure btnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  //simule l'appui sur une touche
  case Key of
    '1' : btn1.Click;
    '2' : btn2.Click;
    '3' : btn3.Click;
    '4' : btn4.Click;
    '5' : btn5.Click;
    '6' : btn6.Click;
    '7' : btn7.Click;
    '8' : btn8.Click;
    '9' : btn9.Click;
    '0' : btn0.Click;
  end;
  //remplace la touche pressée par 'espace'
  Key := ' ';
end;

procedure TForm1.btnClick(Sender: TObject);
begin
  edit1.Color := clWhite;
  //ajoute le texte à l'edit en fonction du boutton
  if Sender = btn0 then edit1.Text := edit1.Text + '0'
  else if Sender = btn1 then edit1.Text := edit1.Text + '1'
  else if Sender = btn2 then edit1.Text := edit1.Text + '2'
  else if Sender = btn3 then edit1.Text := edit1.Text + '3'
  else if Sender = btn4 then edit1.Text := edit1.Text + '4'
  else if Sender = btn5 then edit1.Text := edit1.Text + '5'
  else if Sender = btn6 then edit1.Text := edit1.Text + '6'
  else if Sender = btn7 then edit1.Text := edit1.Text + '7'
  else if Sender = btn8 then edit1.Text := edit1.Text + '8'
  else if Sender = btn9 then edit1.Text := edit1.Text + '9'
  else if Sender = btnClear then edit1.Text := ''
  else if Sender = btnEgal then edit1.Color := clSkyBlue;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  // Utile seulement si c'est l'edit qui à le focus.
  // Il n'est pas possible d'intercepter la touche entré lorsqu'un bouton a le focus.
  if key = VK_RETURN then
  begin
    btnEgal.Click;
    key := 0; // on annule la valeur de la touche
  end;
end;

procedure TForm1.btnMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  //on passe le focus au bouton '=' lorsque le bouton est relaché.
  // Cela permet d'eviter l'appui de 'entree' sur le bouton
  btnEgal.SetFocus;
end;

end.

calculette.dpr
object Form1: TForm1
  Left = 380
  Top = 233
  Width = 138
  Height = 206
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Shell Dlg 2'
  Font.Style = []
  KeyPreview = True
  OldCreateOrder = False
  OnKeyDown = FormKeyDown
  OnKeyPress = FormKeyPress
  PixelsPerInch = 96
  TextHeight = 13
  object btn1: TButton
    Left = 8
    Top = 40
    Width = 33
    Height = 25
    Caption = '1'
    TabOrder = 0
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn2: TButton
    Left = 48
    Top = 40
    Width = 33
    Height = 25
    Caption = '2'
    TabOrder = 1
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn3: TButton
    Left = 88
    Top = 40
    Width = 33
    Height = 25
    Caption = '3'
    TabOrder = 2
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn9: TButton
    Left = 88
    Top = 104
    Width = 33
    Height = 25
    Caption = '9'
    TabOrder = 3
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn4: TButton
    Left = 8
    Top = 72
    Width = 33
    Height = 25
    Caption = '4'
    TabOrder = 4
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn6: TButton
    Left = 88
    Top = 72
    Width = 33
    Height = 25
    Caption = '6'
    TabOrder = 5
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn5: TButton
    Left = 48
    Top = 72
    Width = 33
    Height = 25
    Caption = '5'
    TabOrder = 6
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn7: TButton
    Left = 8
    Top = 104
    Width = 33
    Height = 25
    Caption = '7'
    TabOrder = 7
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn8: TButton
    Left = 48
    Top = 104
    Width = 33
    Height = 25
    Caption = '8'
    TabOrder = 8
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btn0: TButton
    Left = 8
    Top = 136
    Width = 33
    Height = 25
    Caption = '0'
    TabOrder = 9
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
  object btnEgal: TButton
    Left = 88
    Top = 136
    Width = 33
    Height = 25
    Caption = '='
    TabOrder = 10
    TabStop = False
    OnClick = btnClick
  end
  object Edit1: TEdit
    Left = 8
    Top = 8
    Width = 113
    Height = 21
    Font.Charset = DEFAULT_CHARSET
    Font.Color = clWindowText
    Font.Height = -11
    Font.Name = 'MS Shell Dlg 2'
    Font.Style = []
    ParentFont = False
    ReadOnly = True
    TabOrder = 11
  end
  object btnClear: TButton
    Left = 48
    Top = 136
    Width = 33
    Height = 25
    Caption = 'C'
    TabOrder = 12
    TabStop = False
    OnClick = btnClick
    OnMouseUp = btnMouseUp
  end
end
nemo216 Messages postés 8 Date d'inscription mardi 26 septembre 2006 Statut Membre Dernière intervention 9 octobre 2006
27 sept. 2006 à 08:37
ben le truc c'est que  windows il prend pas en charge l'enfoncement et le relachement des touches

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
27 sept. 2006 à 09:09
????????
nemo216 Messages postés 8 Date d'inscription mardi 26 septembre 2006 Statut Membre Dernière intervention 9 octobre 2006
27 sept. 2006 à 09:43
ben pour la touche égal ben c résolu merci bien a toi. mai par contre
j'aimerai que lorsque j appui sur une touche (exemple: la touche 1) du
clavier, on voit sur mon interface , la touche s'enfoncer et se
relacher. mais je sais pas comment faire donc si tu aurai une idée.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 sept. 2006 à 10:50
Salut,
change les TButton par des TSpeedButton
ils ont une propriété Down (Boolean) à partir de la c'est très simple à faire

@+
Cirec
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
27 sept. 2006 à 11:08
heu ouais tu peu essayer de mettre
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if sender is TSPeedButton then
       TSpeedButton(Sender).Down := true;
  //simule l'appui sur une touche
  case Key of
    '1' : btn1.Click;
    '2' : btn2.Click;
    '3' : btn3.Click;
    '4' : btn4.Click;
    '5' : btn5.Click;
    '6' : btn6.Click;
    '7' : btn7.Click;
    '8' : btn8.Click;
    '9' : btn9.Click;
    '0' : btn0.Click;
  end;
  //remplace la touche pressée par 'espace'
  Key := ' ';
end;

procedure TForm1.btnClick(Sender: TObject);
begin
  edit1.Color := clWhite;
  //ajoute le texte à l'edit en fonction du boutton
  if Sender = btn0 then edit1.Text := edit1.Text + '0'
  else if Sender = btn1 then edit1.Text := edit1.Text + '1'
  else if Sender = btn2 then edit1.Text := edit1.Text + '2'
  else if Sender = btn3 then edit1.Text := edit1.Text + '3'
  else if Sender = btn4 then edit1.Text := edit1.Text + '4'
  else if Sender = btn5 then edit1.Text := edit1.Text + '5'
  else if Sender = btn6 then edit1.Text := edit1.Text + '6'
  else if Sender = btn7 then edit1.Text := edit1.Text + '7'
  else if Sender = btn8 then edit1.Text := edit1.Text + '8'
  else if Sender = btn9 then edit1.Text := edit1.Text + '9'
  else if Sender = btnClear then edit1.Text := ''
  else if Sender = btnEgal then edit1.Color := clSkyBlue;

  if sender is TSPeedButton then
      TSpeedButton(Sender).Down := false;
end;

mais je suis pas sur que ca soit visible!
nemo216 Messages postés 8 Date d'inscription mardi 26 septembre 2006 Statut Membre Dernière intervention 9 octobre 2006
27 sept. 2006 à 11:13
ok alors merci
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 sept. 2006 à 14:24
petite précision :


il faut la propriété GroupIndex de tous les TSpeedButton à une valeur non nul (par exemple 1)


ainsi que la propriété AllowAllUp à True





Extait de l'aide Delphi:




Spécifie si tous les boutons d'un groupe peuvent être simultanément non sélectionnés.



property AllowAllUp: Boolean;



Description


Utilisez la propriété AllowAllUp avec un groupe de boutons appartenant à un même groupe. Des turboboutons appartiennent à un même groupe s'ils ont la même valeur pour la propriété GroupIndex. Les boutons d'un même groupe sont mutuellement exclusifs : quand un bouton du groupe est sélectionné (enfoncé), tous les autres boutons du groupe sont désélectionnés (relevés). Si AllowAllUp a la valeur True, tous les turboboutons d'un groupe peuvent simultanément être désélectionnés. Si l'utilisateur clique sur le bouton sélectionné du groupe, ce bouton est désélectionné sans qu'un autre bouton soit sélectionné. Si AllowAllUp a la valeur False, il y a toujours exactement un bouton sélectionné dans le groupe. Cliquer sur un bouton enfoncé ne le fait pas passer à l'état haut.


La modification de la valeur de la propriété AllowAllUp d'un des boutons du groupe change la valeur de la propriété AllowAllUp de tous les boutons du groupe.



Remarque : Si GroupIndex est à zéro, AllowAllUp est sans effet.














@+
Cirec
Matt 261 Messages postés 1173 Date d'inscription mercredi 2 novembre 2005 Statut Membre Dernière intervention 10 septembre 2011 3
27 sept. 2006 à 14:25
N'oublie pas de cliquer sur "Réponse acceptée" lorsque la réponse te conviens stp. Merci.

@+
 Matt

La paresse est la mère du génie...
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
2 oct. 2006 à 12:04
par contre maintenant il serait bon de savoir si le code te convient

<hr />
@+

Cirec
Rejoignez-nous