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

Lazarus Pascal Discussion :

Problème de récupération de valeur d'un composant que j'ai créé [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Problème de récupération de valeur d'un composant que j'ai créé
    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.

  2. #2
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Bon, comme bien souvent, le fait d'essayer d'écrire clairement mon problème m'amène à trouver une solution.

    J'ai modifié la procédure "ToucheClick" comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TClavierNum.ToucheClick(Sender: TObject);
    begin
      ValTouche:= TBoutonCoinRond(Sender).Titre;
      OnClick(Sender); // Déclenche la procédure générale du composant
      ValTouche:= ''; // Un click sur l'espace inter-touche générant l'évènement, je mets ValTouche à '' pour que cela n'envoie pas de valeur.
    end;
    Cordialement.

    Pierre.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 930
    Par défaut
    Quelques illogismes :

    • pourquoi le fond est-il un TBoutonCoinRond puisqu'il ne doit pas être réactif ?
    • ValTouche éventuellement en lecture seule mais en tout cas pas en écriture ;
    • il n'y a aucune raison pour appeler ToucheClick depuis la fiche. Cette méthode devrait au minimum être protected ;
    • pourquoi forcer le parent identique au propriétaire ? A part à créer le clavier par code, la fiche sera toujours le parent puisqu'elle est systématiquement propriétaire au design. Impossible de poser le clavier sur un TPanel par exemple ;
    • TClavierNum est parent des boutons, les positions sont donc relatives à sa zone cliente et peuvent être fixées directement à la création. Pitié ! Arrête d'utiliser Paint pour du positionnement ;
    • pour la même raison les boutons seront automatiquement détruits à la destruction du clavier. Même si ça ne dérange pas, il est inutile de surcharger Destroy pour ça.


    Et sur le principe, tu n'as pas réagis à ma dernière intervention mais il est vrai qu'elle était orientée Windows API. Le pendant FreePascal existe cependant : MouseAndKeyInput.

    Mais si tu veux rester par événement, pourquoi ne pas générer le tiens avec la valeur (ou la touche) en paramètre ? Ici c'est "Hey! Une touche a été pressée, viens récupérer la valeur." ; pas top à mon sens !

  4. #4
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Quelques illogismes :[*]pourquoi le fond est-il un TBoutonCoinRond puisqu'il ne doit pas être réactif ?
    Au départ, j'avais besoin d'un bouton avec un peu de décor. Je me suis servi de ce composant pour créer mon TEditeurCoinRond et mon TClavierNum.

    En fait, j'aurai dû créer un composant "TDecor" puis de ce composant créer le TBoutonCoinRond d'une part et le TEditeurCoinRond d'autre part. Le ClavierNUm aurait dû aussi descendre de TDecor sur lequel j'aurais mis des TBoutnCoinRond.

    Citation Envoyé par Andnotor Voir le message
    ...[*]ValTouche éventuellement en lecture seule mais en tout cas pas en écriture ; ...
    C'est vrai.

    Citation Envoyé par Andnotor Voir le message
    ...[*]il n'y a aucune raison pour appeler ToucheClick depuis la fiche. Cette méthode devrait au minimum être protected ; ...
    Bien sûr.

    Citation Envoyé par Andnotor Voir le message
    ...[*]pourquoi forcer le parent identique au propriétaire ? A part à créer le clavier par code, la fiche sera toujours le parent puisqu'elle est systématiquement propriétaire au design. Impossible de poser le clavier sur un TPanel par exemple ; ...
    Pas compris, il faut que j'approfondisse mes connaissances sur la question de propriétaire et de parent.

    Citation Envoyé par Andnotor Voir le message
    ...[*]TClavierNum est parent des boutons, les positions sont donc relatives à sa zone cliente et peuvent être fixées directement à la création. Pitié ! Arrête d'utiliser Paint pour du positionnement ; ...
    Qu'y a-t-il de mal à utiliser la procédure Paint ?

    Citation Envoyé par Andnotor Voir le message
    ...[*]pour la même raison les boutons seront automatiquement détruits à la destruction du clavier. Même si ça ne dérange pas, il est inutile de surcharger Destroy pour ça. ...
    Bien.

    Citation Envoyé par Andnotor Voir le message
    ... Et sur le principe, tu n'as pas réagis à ma dernière intervention mais il est vrai qu'elle était orientée Windows API. Le pendant FreePascal existe cependant : MouseAndKeyInput. ...
    Je n'ai pas réagi à cela car avec le Rapbberry, je n'utiliserai pas de clavier physique, donc je ne vois pas pourquoi j'utiliserais ces spécificités.

    C'est vrai, je manque de rigueur. Il faut que je m'y remette.

    Cordialement.

    Pierre.

  5. #5
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    L'écriture de TClavierNUm te paraît-elle correct comme suit :

    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
    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
        procedure ToucheClick(Sender: TObject); // Etait public avant
      public
        property ValTouche: String read FValTouche;
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      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;
        Touche[i].Left:= 12+88*(i mod 3); // Etait dans Paint avant
        Touche[i].Top:= 12+88*(i mod 4); // Etait dans Paint avant
      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.ToucheClick(Sender: TObject);
    begin
      FValTouche:= TBoutonCoinRond(Sender).Titre;
      OnClick(Sender);
      FValTouche:= '';
    end;
     
    destructor TClavierNum.Destroy;
    var
      i: Integer;
    begin
    {  for i:= 0 to 11 do
        Touche[i].Free;}
      inherited Destroy;
    end;
     
    end.
    Cordialement.

    Pierre.

  6. #6
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut pour mois le parent ne devrait pas être "TBoutCoinsRond", c'est comme si tu disais que "TBoutCoinsRond contient plusieurs autres TBoutCoinsRond"
    Ce n'est pas le métier de ton composant final. Par contre si ton parent serait un "TPanel" par exemple, cela serait plus logique à mon sens.

    Puis dans ton composant TBoutCoinsRond, il te manques un "truc" pour faire remonter les events de tes boutons à ta classe parente (TClavierNum), pour moi

    Pour t'aider à la création de composant, je te suggères un peu de lecture sur les principes SOLID / STUPID (je laisse le reste pour plus tard^^)

    Ces articles, ne sont pas orientés "Pascal" mais cela n'a pas d'importance, ces principes sont à adapter pour tout langage orienté objet.

    Très schématisé, mais je ferais plus un truc dans ce gout là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      type
        TDesignCoinsRond =  class; // sert juste à dessiner donc, même une simple fonction "DrawCoinsRond(canvasDest : TCanvas)" dans un fichier commun suffirait
     
        TBoutonCoinsRond = class(TDesignCoinsRond); // ou juste class^^
     
        TTouchePressedEvent =  procedure (sender : TObject, var touche:char) of object;
        TClavierNum = class(TPanel)
        private
           FTouche: array[0..11] of TBoutCoinsRond;
           FOnTouchePressed: TTouchePressedEvent;
        published
          property OnTouchePressed : TTouchePressedEvent  read  FOnTouchePressed write  FOnTouchePressed;
       end;
    A+
    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 930
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Pas compris, il faut que j'approfondisse mes connaissances sur la question de propriétaire et de parent.
    Au chargement de la fiche la construction des composants posés au design est implicite, tu ne la maitrises pas et le propriétaire assigné est systématiquement la fiche. Si tu crées toi-même ces composants en runtime, là oui tu invoques toi-même les constructeurs et leur passes le propriétaire de ton choix.

    Toujours au design, le parent est le composant sur lequel tu as posé le tiens ; la fiche, un panel ou tout autre composant conteneur. Forcer le parent des boutons est tout à fait juste et logique puisqu'ils sont intrinsèquement liés au clavier mais le parent du clavier dépend de la conception de la fiche et sera lui lu depuis le lfm, tu ne dois pas y toucher.

    Citation Envoyé par ChPr Voir le message
    Qu'y a-t-il de mal à utiliser la procédure Paint ?
    Tu peux passer par le fenêtre pour rentrer chez toi, à l'arrivée c'est ce que tu veux : être chez toi. Mais est-ce logique ?

    Ici c'est sûr qu'il n'y aura pas vraiment d'effet de bord néfastes. Tout au plus la première fois Paint sera appelé inutilement une deuxième fois puisque l'ancien emplacement des boutons devra bien être rafraichi. Heureusement que la repeinture n'est pas un événement prioritaire et que les demandes sont concaténées sinon ce serait un appel Paint par bouton. Par la suite, ben tu vas lancer inutilement cette boucle de positionnement alors que les touches ne bougeront jamais ; du temps perdu.

    Citation Envoyé par ChPr Voir le message
    Je n'ai pas réagi à cela car avec le Rapbberry, je n'utiliserai pas de clavier physique, donc je ne vois pas pourquoi j'utiliserais ces spécificités.
    Je le répète, le principe est identique entre un clavier physique et un clavier tactile, il n'y a pas de différence question OS. Mais si tu veux garder cette façon de procéder par événement, ce sera à toi de refaire toute la logique derrière ; tu devras trouver la cible et déterminer sa classe. Si c'est un edit, agir sur la propriété Text, si c'est un mémo sur Lines, etc. Prendre en compte le texte éventuellement sélectionné et le remplacer le cas échéant, gérer les retours arrières...

    Et pour l'instant c'est un simple clavier numérique sans grande complication mais par la suite tu vas te dire pourquoi pas un clavier alphanumérique ? Et là tu commenceras à comprendre la complexité. Compare simplement les événements OnKeyDown et OnKeyPressed. OnKeyDown nous passe le VK brut (en fonction du layout) alors que OnKeyPressed renvoie le caractère interprété. OnKeyDown correspond au message WM_KEYDOWN alors que OnKeyPressed est le message WM_CHAR généré par TranslateMessage dans la boucle de messages (désolé si je me réfère trop souvent à Windows mais je ne connais pas Linux).

    Alors oui c'est faisable et sous Windows (désolé encore) ça passe par déterminer le scancode correspondant au VK (ou inversément suivant lequel on connait), récupérer l'état des touches, principalement les touches de contrôle (shift, ctrl, etc.) et passer le tout à la moulinette ToUnicode. Ca n'sera cependant pas encore suffisant pour traiter les touches mortes (apostrophe, umlaut, etc.). Pfff...

    Si tu passais par le remplissage du buffer, tu n'aurais qu'à injecter les codes comme si tu tapais sur un clavier physique et l'OS se chargerait du reste. Ne serait-ce pas plus simple ? Deux lignes par touche (pressé/relâché) à la place d'une usine à gaz

  8. #8
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Au chargement de la fiche la construction des composants posés au design est implicite, tu ne la maitrises pas et le propriétaire assigné est systématiquement la fiche. Si tu crées toi-même ces composants en runtime, là oui tu invoques toi-même les constructeurs et leur passes le propriétaire de ton choix.

    Toujours au design, le parent est le composant sur lequel tu as posé le tiens ; la fiche, un panel ou tout autre composant conteneur. Forcer le parent des boutons est tout à fait juste et logique puisqu'ils sont intrinsèquement liés au clavier mais le parent du clavier dépend de la conception de la fiche et sera lui lu depuis le lfm, tu ne dois pas y toucher. ...
    Ok.Merci, vu. Dans le cas où on instancie un composant au "runtime", le parent est celui par rapport auquel le composant va se placer. Quid du propriétaire ? Si le parent est l'accroche géographique du composant, à quoi sert le propriétaire pour le composant ? Quel est l'avantage/inconvénient que ce soit le parent ou autre chose ?

    Citation Envoyé par Andnotor Voir le message
    ...Et pour l'instant c'est un simple clavier numérique sans grande complication mais par la suite tu vas te dire pourquoi pas un clavier alphanumérique ? Et là tu commenceras à comprendre la complexité. ...
    Il y a quelques années de cela, toujours pour une application (GPS) avec mon Raspberry et son écran tactile de 7", j'avais créé un tel composant. Comme mon clavier numérique, il s'utilisait "à la place d'un clavier physique".

    Sa taille est telle qu'il ne m'était pas possible qu'à un moment, il ne recouvre le TEdit qui en servait de récepteur. En conclusion, ce clavier numérique comportait sa propre ligne d'édition qui, au final était transférée au TEdit récepteur. Le code d'utilisation est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Edit1.Text:= MonClavierTactile.ModifTexte(Edit1.Text);
    Les voyelles accentuées s'obtenaient par un click long sur la voyelle considérée.

    Il peut être aussi utilisé avec un PC avec Lazarus sous Windows et Linux.

    Si cela vous intéresse, il est en fichier joint.

    Cordialement.

    Pierre.
    Fichiers attachés Fichiers attachés

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 930
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Si le parent est l'accroche géographique du composant, à quoi sert le propriétaire pour le composant ? Quel est l'avantage/inconvénient que ce soit le parent ou autre chose ?
    Il n'y a pas d'avantage particulier si ce n'est peut-être au niveau de l'énumération (Components ou Controls).

    Citation Envoyé par ChPr Voir le message
    j'avais créé un tel composant. Comme mon clavier numérique, il s'utilisait "à la place d'un clavier physique".
    J'ai également une certaine expérience en la matière. Au début du siècle j'avais flairé l'arrivée et la démocratisation des écrans tactiles mais l'OSK sous XP n'était pas vraiment adapté à l'utilisation au doigt. J'avais dès lors créer un clavier "standalone", multilingue, devenu multi-touch par la suite avec l'arrivée des écrans inductifs multipoints, entièrement personnalisable et à ouverture automatique. En gros ce qui est apparu sous Windows 8 10 ans plus tard avec quelques notions en plus

    J'en ai vendu un bon paquet et en vends toujours aujourd'hui ! Même la NASA m'en a acheté quelques licences

    Citation Envoyé par ChPr Voir le message
    Sa taille est telle qu'il ne m'était pas possible qu'à un moment, il ne recouvre le TEdit qui en servait de récepteur.
    J'avais moi-même résolu ce problème en faisant défiler le contenu (un document Word par exemple) ou carrément en déplaçant la fenêtre cible à l'écran. Avec la détection du focus system-wide pour l'ouverture automatique, c'était la partie la plus fun à réaliser.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/07/2011, 16h20
  2. [SQL] Problème de récupération des valeurs d'une liste multiple en php
    Par BOLARD dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/05/2006, 00h29
  3. Problème de récupération de valeurs
    Par T'chab dans le forum Access
    Réponses: 3
    Dernier message: 24/04/2006, 10h37
  4. Problème de récupération de valeur de radio button...
    Par Empty_body dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/03/2006, 14h19
  5. Nouveau problème de récupération de valeurs.
    Par pmboutteau dans le forum ASP
    Réponses: 4
    Dernier message: 09/03/2005, 10h48

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