{"id":769,"date":"2009-11-06T00:30:14","date_gmt":"2009-11-05T23:30:14","guid":{"rendered":"http:\/\/blogs.wittwer.fr\/whiler\/?p=769"},"modified":"2023-03-12T15:07:37","modified_gmt":"2023-03-12T14:07:37","slug":"delphi-custom-clavier-visuel","status":"publish","type":"post","link":"https:\/\/blogs.wittwer.fr\/whiler\/2009\/11\/06\/delphi-custom-clavier-visuel\/","title":{"rendered":"Personnalisation d\u2019un clavier visuel dans Delphi"},"content":{"rendered":"<p><a href=\"http:\/\/fr.wikipedia.org\/wiki\/Delphi_(informatique)\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: Delphi\" style=\"\" >Delphi<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup> 2010 ajoute encore de nouveaux composants \u00e0 la <a href=\"http:\/\/fr.wikipedia.org\/wiki\/VCL\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: VCL\" style=\"\" >VCL<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup>&#8230;<\/p>\n<p>Parmi ceux-ci, on trouve un clavier visuel, permettant d&rsquo;\u00e9tendre les capacit\u00e9s de ses applications en ayant la possibilit\u00e9 de le proposer dans son interface, tr\u00e8s pratique sur des p\u00e9riph\u00e9riques \u00e0 <a href=\"http:\/\/fr.wikipedia.org\/wiki\/\u00c9cran_tactile\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: \u00e9crans tactiles\" style=\"\" >\u00e9crans tactiles<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup> <img src=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-includes\/images\/smilies\/skype\/\/yes.gif\" alt=\"(y)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> <\/p>\n<p>Depuis la palette d&rsquo;outils de l&rsquo;environnement de conception de Delphi, dans la cat\u00e9gorie <em>Tactile<\/em>, on trouve le composant <a title=\"Cliquer pour voir la documentation du composant\" target=\"_blank\" href=\"https:\/\/docwiki.embarcadero.com\/VCL\/en\/Keyboard.TTouchKeyboard\" rel=\"noopener\"><code class=\"codecolorer delphi dawn\"><span class=\"delphi\">TTouchKeyboard<\/span><\/code><\/a>. Il suffit simplement de l&rsquo;ajouter dans la fiche de son choix.<br \/>\nVoici son aspect par d\u00e9faut, avec un <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Syst\u00e8me_d&rsquo;exploitation\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: OS\" style=\"\" >OS<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup> en fran\u00e7ais&nbsp;:<br \/>\n<div id=\"attachment_770\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a title=\"Delphi : Clavier tactile\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-delphi-2010.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-770\" src=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-delphi-2010-300x176.jpg\" alt=\"Delphi : Clavier tactile\" title=\"Cliquer pour agrandir\" width=\"300\" height=\"176\" class=\"size-medium wp-image-770\" srcset=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-delphi-2010-300x176.jpg 300w, https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-delphi-2010.jpg 800w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-770\" class=\"wp-caption-text\">Delphi : Clavier tactile<\/p><\/div><\/p>\n<p>Le clavier tactile s&rsquo;adapte automatiquement \u00e0 celui du syst\u00e8me d&rsquo;exploitation&nbsp;: On utilise un Windows en fran\u00e7ais, on a un clavier <a href=\"http:\/\/fr.wikipedia.org\/wiki\/AZERTY\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: AZERTY\" style=\"\" >AZERTY<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup>. On est sous un Windows anglais, on a un <a href=\"http:\/\/fr.wikipedia.org\/wiki\/QWERTY\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: QWERTY\" style=\"\" >QWERTY<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup>.<\/p>\n<p>On peut personnaliser le clavier en modifiant ses propri\u00e9t\u00e9s directement depuis l&rsquo;inspecteur d&rsquo;objets. Mais trouvant le design par d\u00e9faut trop joli, je vais dans le code ci-dessous, montrer comment surcharger une m\u00e9thode de ce clavier pour red\u00e9finir l&rsquo;apparence des diff\u00e9rentes touches.<br \/>\n<!--more--><br \/>\nPour cela, j&rsquo;ai besoin de Delphi 2010, actuellement <a title=\"Visiter la page de t\u00e9l\u00e9chargement de Delphi\" target=\"_blank\" href=\"https:\/\/downloads.embarcadero.com\/free\/delphi\" rel=\"noopener\">t\u00e9l\u00e9chargeable<\/a> depuis le site d&rsquo;<a title=\"Cliquer pour visiter le site d'Embarcadero\" target=\"_blank\" href=\"https:\/\/www.embarcadero.com\/\" rel=\"noopener\">Embarcadero<\/a>.<br \/>\n<center><a title=\"Visiter le site Web de Delphi\" href=\"https:\/\/www.embarcadero.com\/products\/delphi\"><img loading=\"lazy\" decoding=\"async\" src=\"\/whiler\/wp-content\/uploads\/2009\/11\/logo-delphi.png\" alt=\"Delphi\" width=\"114\" height=\"114\" class=\"size-full wp-image-776\" \/><\/a><\/center><\/p>\n<p>\n&nbsp;<\/p\n\nOn cr\u00e9e une nouvelle <em>Application Fiches VCL &#8211; Delphi<\/em>.<br \/>\nPuis on place un composant <code class=\"codecolorer delphi dawn\"><span class=\"delphi\">TTouchKeyboard<\/span><\/code> sur la fiche.<\/p>\n<p>On peut ensuite aller dans le code afin d&rsquo;ajouter les types et fonctions n\u00e9cessaires.<br \/>\nJ&rsquo;ai trouv\u00e9 un code sur un <a title=\"Aller voir le blog japonais\" target=\"_blank\" href=\"https:\/\/d.hatena.ne.jp\/tales\/20090926\" rel=\"noopener\">blog japonais<\/a> qui m&rsquo;a servi de base pour l&rsquo;impl\u00e9mentation et comprendre le fonctionnement.<br \/>\nLe principe est simple, on va h\u00e9riter de la classe repr\u00e9sentant une touche du clavier, afin de pouvoir surcharger sa proc\u00e9dure Paint. On peut ainsi la redessiner \u00e0 sa guise.<\/p>\n<p>Voici la premi\u00e8re version&nbsp;:<\/p>\n<div class=\"codecolorer-container delphi dawn\" style=\"overflow:auto;white-space:nowrap;width:480px;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/><\/div><\/td><td><div class=\"delphi codecolorer\"><span class=\"kw1\">unit<\/span> main<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">interface<\/span><br \/>\n<br \/>\n<span class=\"kw1\">uses<\/span><br \/>\n&nbsp; Windows<span class=\"sy1\">,<\/span> Messages<span class=\"sy1\">,<\/span> SysUtils<span class=\"sy1\">,<\/span> Variants<span class=\"sy1\">,<\/span> Classes<span class=\"sy1\">,<\/span> Graphics<span class=\"sy1\">,<\/span> Controls<span class=\"sy1\">,<\/span> Forms<span class=\"sy1\">,<\/span><br \/>\n&nbsp; Dialogs<span class=\"sy1\">,<\/span> Keyboard<span class=\"sy1\">,<\/span> KeyboardTypes<span class=\"sy1\">,<\/span> Math<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">type<\/span><br \/>\n&nbsp; TTempTouchKeyboard <span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><span class=\"br0\">&#40;<\/span>TCustomTouchKeyboard<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; TMyKeyboardButton &nbsp;<span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><span class=\"br0\">&#40;<\/span>TCustomKeyboardButton<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"kw1\">public<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> Paint<span class=\"br0\">&#40;<\/span>Canvas<span class=\"sy1\">:<\/span> TCustomCanvas <span class=\"sy3\">=<\/span> <span class=\"kw1\">nil<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">override<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">type<\/span><br \/>\n&nbsp; TfrmMain <span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><span class=\"br0\">&#40;<\/span>TForm<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">:<\/span> TTouchKeyboard<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">procedure<\/span> FormCreate<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; frmMain<span class=\"sy1\">:<\/span> TfrmMain<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">implementation<\/span><br \/>\n<br \/>\n<span class=\"co2\">{$R *.dfm}<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TMyKeyboardButton<span class=\"sy1\">.<\/span><span class=\"me1\">Paint<\/span><span class=\"br0\">&#40;<\/span>Canvas<span class=\"sy1\">:<\/span> TCustomCanvas<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; LRect<span class=\"sy1\">:<\/span> &nbsp; &nbsp;TRect<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">:<\/span> &nbsp;TCanvas<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCaption<span class=\"sy1\">:<\/span> <span class=\"kw4\">String<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/TDrawState = (dsNormal, dsPressed, dsDisabled);<\/span><br \/>\n&nbsp; acKeyColors<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span>TDrawState<span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> TColor <span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span>clWhite<span class=\"sy1\">,<\/span> clYellow<span class=\"sy1\">,<\/span> clGray<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">procedure<\/span> DrawOneChar<span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">:<\/span> TRect<span class=\"sy1\">;<\/span> cWhere<span class=\"sy1\">:<\/span> TCanvas<span class=\"sy1\">;<\/span> sWhat<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Right<\/span><span class=\"sy3\">-<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">-<\/span> cWhere<span class=\"sy1\">.<\/span><span class=\"me1\">TextWidth<\/span><span class=\"br0\">&#40;<\/span>sWhat<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Bottom<\/span><span class=\"sy3\">-<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">-<\/span> cWhere<span class=\"sy1\">.<\/span><span class=\"me1\">TextHeight<\/span><span class=\"br0\">&#40;<\/span>sWhat<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; cWhere<span class=\"sy1\">.<\/span><span class=\"me1\">TextOut<\/span><span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span><span class=\"sy1\">,<\/span> rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span><span class=\"sy1\">,<\/span> sWhat<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">function<\/span> GetOverrideCaption<span class=\"br0\">&#40;<\/span>Keyboard<span class=\"sy1\">:<\/span> TCustomTouchKeyboard<span class=\"sy1\">;<\/span> <span class=\"kw1\">const<\/span> Key<span class=\"sy1\">:<\/span> TVirtualKey<span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> Caption<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Boolean<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">HasCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Caption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">GetCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">Exit<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">True<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">HasCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Caption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">GetCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">Exit<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">True<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw2\">False<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> Canvas &lt;&gt; <span class=\"kw1\">nil<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; LCanvas <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Canvas <span class=\"kw1\">as<\/span> TCanvas<br \/>\n&nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; LCanvas <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TTempTouchKeyboard<span class=\"br0\">&#40;<\/span>Parent<span class=\"br0\">&#41;<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Canvas<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; LRect <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> ClientRect<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Font<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Name<\/span> &nbsp; <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'Arial'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Pen<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> &nbsp; <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> clBlack<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Font<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> clBlack<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Font<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Style<\/span> &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"br0\">&#91;<\/span>fsBold<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Brush<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> acKeyColors<span class=\"br0\">&#91;<\/span>State<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Rectangle<\/span><span class=\"br0\">&#40;<\/span>LRect<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">case<\/span> KeyImage <span class=\"kw1\">of<\/span><br \/>\n&nbsp; &nbsp; kiOverride<span class=\"sy1\">:<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw1\">not<\/span> GetOverrideCaption<span class=\"br0\">&#40;<\/span>Parent<span class=\"sy1\">,<\/span> Key<span class=\"sy1\">,<\/span> LCaption<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; LCaption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Caption<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> LCaption<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiText<span class=\"sy1\">:<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">Length<\/span><span class=\"br0\">&#40;<\/span>Caption<span class=\"br0\">&#41;<\/span> &gt; <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>Caption<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"st0\">'^'<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span> <span class=\"br0\">&#40;<\/span>Caption<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"st0\">'\u00a8'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Caption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Caption<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> Caption<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiTab<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Tabulation'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiShift<span class=\"sy1\">:<\/span> &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Majuscule'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiEnter<span class=\"sy1\">:<\/span> &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Entr\u00e9e'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiBackspace<span class=\"sy1\">:<\/span> DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2190'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiUp<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp; &nbsp;DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2191'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiDown<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp;DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2193'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiLeft<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp;DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2190'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiRight<span class=\"sy1\">:<\/span> &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2192'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiTallEnter<span class=\"sy1\">:<\/span> DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Entr\u00e9e'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">FormCreate<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">.<\/span><span class=\"me1\">DefaultButtonClass<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TMyKeyboardButton<span class=\"sy1\">;<\/span><br \/>\n&nbsp; TTempTouchKeyboard<span class=\"br0\">&#40;<\/span>TouchKeyboard1<span class=\"br0\">&#41;<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">CreateKeyboard<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">.<\/span><span class=\"me1\">Redraw<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">.<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>(idea) On remarquera l&rsquo;utilisation de cha\u00eenes <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Unicode\" rel=\"glossary\" target=\"_blank\" title=\"Wikipedia, D&eacute;finition de&nbsp;: Unicode\" style=\"\" >Unicode<\/a><sup style=\"font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA\" ><em>W<\/em><\/sup>, \u2190 \u2191 \u2193 \u2190 \u2192, afin de dessiner les touches pour d\u00e9placer le curseur et le retour-arri\u00e8re. Mon fichier source a par cons\u00e9quent \u00e9t\u00e9 sauvegard\u00e9 au format Unicode.<\/p>\n<p>On obtient ainsi ce splendide clavier  <img src=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-includes\/images\/smilies\/skype\/\/happy.gif\" alt=\"(lol)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><br \/>\n<div id=\"attachment_781\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a title=\"Apparence personnalis\u00e9e du clavier\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-white.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-781\" src=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-white-300x114.jpg\" alt=\"Apparence personnalis\u00e9e du clavier\" title=\"Cliquer pour agrandir\" width=\"300\" height=\"114\" class=\"size-medium wp-image-781\" srcset=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-white-300x114.jpg 300w, https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-white.jpg 566w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-781\" class=\"wp-caption-text\">Apparence personnalis\u00e9e du clavier<\/p><\/div><\/p>\n<p>Sur la page suivante, nous allons reprendre ce code pour ajouter un d\u00e9grad\u00e9 sur chaque touche&#8230; <img src=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-includes\/images\/smilies\/skype\/\/cool.gif\" alt=\"8-)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><br \/>\n<!--nextpage--><br \/>\nPour ajouter un d\u00e9grad\u00e9 sur mes touches, j&rsquo;ai r\u00e9cup\u00e9r\u00e9 un <a target=\"_blank\" title=\"Voir l'exemple d'origine\" href=\"https:\/\/delphi.about.com\/od\/adptips2006\/qt\/gradient_fill.htm\" rel=\"noopener\">bout de code<\/a> sur un site o\u00f9 je trouve \u00e9norm\u00e9ment de bons exemples.<\/p>\n<p>J&rsquo;ai modifi\u00e9 mon script ainsi :<\/p>\n<div class=\"codecolorer-container delphi dawn\" style=\"overflow:auto;white-space:nowrap;width:480px;height:300px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/>19<br \/>20<br \/>21<br \/>22<br \/>23<br \/>24<br \/>25<br \/>26<br \/>27<br \/>28<br \/>29<br \/>30<br \/>31<br \/>32<br \/>33<br \/>34<br \/>35<br \/>36<br \/>37<br \/>38<br \/>39<br \/>40<br \/>41<br \/>42<br \/>43<br \/>44<br \/>45<br \/>46<br \/>47<br \/>48<br \/>49<br \/>50<br \/>51<br \/>52<br \/>53<br \/>54<br \/>55<br \/>56<br \/>57<br \/>58<br \/>59<br \/>60<br \/>61<br \/>62<br \/>63<br \/>64<br \/>65<br \/>66<br \/>67<br \/>68<br \/>69<br \/>70<br \/>71<br \/>72<br \/>73<br \/>74<br \/>75<br \/>76<br \/>77<br \/>78<br \/>79<br \/>80<br \/>81<br \/>82<br \/>83<br \/>84<br \/>85<br \/>86<br \/>87<br \/>88<br \/>89<br \/>90<br \/>91<br \/>92<br \/>93<br \/>94<br \/>95<br \/>96<br \/>97<br \/>98<br \/>99<br \/>100<br \/>101<br \/>102<br \/>103<br \/>104<br \/>105<br \/>106<br \/>107<br \/>108<br \/>109<br \/>110<br \/>111<br \/>112<br \/>113<br \/>114<br \/>115<br \/>116<br \/>117<br \/>118<br \/>119<br \/>120<br \/>121<br \/>122<br \/>123<br \/>124<br \/>125<br \/>126<br \/>127<br \/>128<br \/>129<br \/>130<br \/>131<br \/>132<br \/>133<br \/>134<br \/>135<br \/>136<br \/>137<br \/>138<br \/>139<br \/>140<br \/>141<br \/>142<br \/>143<br \/>144<br \/>145<br \/>146<br \/><\/div><\/td><td><div class=\"delphi codecolorer\"><span class=\"kw1\">unit<\/span> main<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">interface<\/span><br \/>\n<br \/>\n<span class=\"kw1\">uses<\/span><br \/>\n&nbsp; Windows<span class=\"sy1\">,<\/span> Messages<span class=\"sy1\">,<\/span> SysUtils<span class=\"sy1\">,<\/span> Variants<span class=\"sy1\">,<\/span> Classes<span class=\"sy1\">,<\/span> Graphics<span class=\"sy1\">,<\/span> Controls<span class=\"sy1\">,<\/span> Forms<span class=\"sy1\">,<\/span><br \/>\n&nbsp; Dialogs<span class=\"sy1\">,<\/span> Keyboard<span class=\"sy1\">,<\/span> KeyboardTypes<span class=\"sy1\">,<\/span> Math<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">type<\/span><br \/>\n&nbsp; TTempTouchKeyboard <span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><span class=\"br0\">&#40;<\/span>TCustomTouchKeyboard<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; TMyKeyboardButton &nbsp;<span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><span class=\"br0\">&#40;<\/span>TCustomKeyboardButton<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; <span class=\"kw1\">public<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">procedure<\/span> Paint<span class=\"br0\">&#40;<\/span>Canvas<span class=\"sy1\">:<\/span> TCustomCanvas <span class=\"sy3\">=<\/span> <span class=\"kw1\">nil<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span> <span class=\"kw1\">override<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">type<\/span><br \/>\n&nbsp; TfrmMain <span class=\"sy3\">=<\/span> <span class=\"kw1\">class<\/span><span class=\"br0\">&#40;<\/span>TForm<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">:<\/span> TTouchKeyboard<span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">procedure<\/span> FormCreate<span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; frmMain<span class=\"sy1\">:<\/span> TfrmMain<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">implementation<\/span><br \/>\n<br \/>\n<span class=\"co2\">{$R *.dfm}<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> GradVertical<span class=\"br0\">&#40;<\/span>Canvas<span class=\"sy1\">:<\/span>TCanvas<span class=\"sy1\">;<\/span> Rect<span class=\"sy1\">:<\/span>TRect<span class=\"sy1\">;<\/span> FromColor<span class=\"sy1\">,<\/span> ToColor<span class=\"sy1\">:<\/span>TColor<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; Y<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; dr<span class=\"sy1\">,<\/span>dg<span class=\"sy1\">,<\/span>db<span class=\"sy1\">:<\/span> <span class=\"kw4\">Extended<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; C1<span class=\"sy1\">,<\/span>C2<span class=\"sy1\">:<\/span> &nbsp; &nbsp;TColor<span class=\"sy1\">;<\/span><br \/>\n&nbsp; r1<span class=\"sy1\">,<\/span>r2<span class=\"sy1\">,<\/span>g1<span class=\"sy1\">,<\/span>g2<span class=\"sy1\">,<\/span>b1<span class=\"sy1\">,<\/span>b2<span class=\"sy1\">:<\/span><span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; R<span class=\"sy1\">,<\/span>G<span class=\"sy1\">,<\/span>B<span class=\"sy1\">:<\/span><span class=\"kw4\">Byte<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; cnt<span class=\"sy1\">:<\/span><span class=\"kw4\">Integer<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; C1 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> FromColor<span class=\"sy1\">;<\/span><br \/>\n&nbsp; R1 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GetRValue<span class=\"br0\">&#40;<\/span>C1<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n&nbsp; G1 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GetGValue<span class=\"br0\">&#40;<\/span>C1<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n&nbsp; B1 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GetBValue<span class=\"br0\">&#40;<\/span>C1<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; C2 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> ToColor<span class=\"sy1\">;<\/span><br \/>\n&nbsp; R2 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GetRValue<span class=\"br0\">&#40;<\/span>C2<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n&nbsp; G2 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GetGValue<span class=\"br0\">&#40;<\/span>C2<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n&nbsp; B2 <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> GetBValue<span class=\"br0\">&#40;<\/span>C2<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; dr <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span>R2<span class=\"sy3\">-<\/span>R1<span class=\"br0\">&#41;<\/span> <span class=\"sy3\">\/<\/span> <span class=\"br0\">&#40;<\/span>Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Bottom<\/span> <span class=\"sy3\">-<\/span> Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; dg <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span>G2<span class=\"sy3\">-<\/span>G1<span class=\"br0\">&#41;<\/span> <span class=\"sy3\">\/<\/span> <span class=\"br0\">&#40;<\/span>Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Bottom<\/span> <span class=\"sy3\">-<\/span> Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; db <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span>B2<span class=\"sy3\">-<\/span>B1<span class=\"br0\">&#41;<\/span> <span class=\"sy3\">\/<\/span> <span class=\"br0\">&#40;<\/span>Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Bottom<\/span> <span class=\"sy3\">-<\/span> Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; cnt <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"nu0\">0<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">for<\/span> Y <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span> <span class=\"kw1\">to<\/span> Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Bottom<\/span><span class=\"sy3\">-<\/span><span class=\"nu0\">1<\/span> <span class=\"kw1\">do<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; R <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> R1 <span class=\"sy3\">+<\/span> <span class=\"kw3\">Ceil<\/span><span class=\"br0\">&#40;<\/span>dr<span class=\"sy3\">*<\/span>cnt<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; G <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> G1 <span class=\"sy3\">+<\/span> <span class=\"kw3\">Ceil<\/span><span class=\"br0\">&#40;<\/span>dg<span class=\"sy3\">*<\/span>cnt<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; B <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> B1 <span class=\"sy3\">+<\/span> <span class=\"kw3\">Ceil<\/span><span class=\"br0\">&#40;<\/span>db<span class=\"sy3\">*<\/span>cnt<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; Canvas<span class=\"sy1\">.<\/span><span class=\"me1\">Pen<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> RGB<span class=\"br0\">&#40;<\/span>R<span class=\"sy1\">,<\/span>G<span class=\"sy1\">,<\/span>B<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Canvas<span class=\"sy1\">.<\/span><span class=\"me1\">MoveTo<\/span><span class=\"br0\">&#40;<\/span>Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span><span class=\"sy1\">,<\/span> Y<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Canvas<span class=\"sy1\">.<\/span><span class=\"me1\">LineTo<\/span><span class=\"br0\">&#40;<\/span>Rect<span class=\"sy1\">.<\/span><span class=\"me1\">Right<\/span><span class=\"sy1\">,<\/span> Y<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw3\">Inc<\/span><span class=\"br0\">&#40;<\/span>cnt<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TMyKeyboardButton<span class=\"sy1\">.<\/span><span class=\"me1\">Paint<\/span><span class=\"br0\">&#40;<\/span>Canvas<span class=\"sy1\">:<\/span> TCustomCanvas<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">var<\/span><br \/>\n&nbsp; LRect<span class=\"sy1\">:<\/span> &nbsp; &nbsp;TRect<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">:<\/span> &nbsp;TCanvas<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCaption<span class=\"sy1\">:<\/span> <span class=\"kw4\">String<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">const<\/span><br \/>\n&nbsp; <span class=\"co1\">\/\/TDrawState = (dsNormal, dsPressed, dsDisabled);<\/span><br \/>\n&nbsp; acKeyColors<span class=\"sy1\">:<\/span> <span class=\"kw1\">array<\/span><span class=\"br0\">&#91;<\/span>TDrawState<span class=\"br0\">&#93;<\/span> <span class=\"kw1\">of<\/span> TColor <span class=\"sy3\">=<\/span> <span class=\"br0\">&#40;<\/span>clWhite<span class=\"sy1\">,<\/span> clYellow<span class=\"sy1\">,<\/span> clGray<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">procedure<\/span> DrawOneChar<span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">:<\/span> TRect<span class=\"sy1\">;<\/span> cWhere<span class=\"sy1\">:<\/span> TCanvas<span class=\"sy1\">;<\/span> sWhat<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Right<\/span><span class=\"sy3\">-<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">-<\/span> cWhere<span class=\"sy1\">.<\/span><span class=\"me1\">TextWidth<\/span><span class=\"br0\">&#40;<\/span>sWhat<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span> <span class=\"sy3\">+<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Bottom<\/span><span class=\"sy3\">-<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy3\">-<\/span> cWhere<span class=\"sy1\">.<\/span><span class=\"me1\">TextHeight<\/span><span class=\"br0\">&#40;<\/span>sWhat<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">div<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; cWhere<span class=\"sy1\">.<\/span><span class=\"me1\">TextOut<\/span><span class=\"br0\">&#40;<\/span>rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Left<\/span><span class=\"sy1\">,<\/span> rSize<span class=\"sy1\">.<\/span><span class=\"me1\">Top<\/span><span class=\"sy1\">,<\/span> sWhat<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">function<\/span> GetOverrideCaption<span class=\"br0\">&#40;<\/span>Keyboard<span class=\"sy1\">:<\/span> TCustomTouchKeyboard<span class=\"sy1\">;<\/span> <span class=\"kw1\">const<\/span> Key<span class=\"sy1\">:<\/span> TVirtualKey<span class=\"sy1\">;<\/span> <span class=\"kw1\">var<\/span> Caption<span class=\"sy1\">:<\/span> <span class=\"kw4\">string<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">:<\/span> <span class=\"kw4\">Boolean<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">HasCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Caption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">GetCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">Exit<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">True<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">else<\/span> <span class=\"kw1\">if<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">HasCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; Caption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Keyboard<span class=\"sy1\">.<\/span><span class=\"me1\">CaptionOverrides<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">GetCaption<\/span><span class=\"br0\">&#40;<\/span>Key<span class=\"sy1\">.<\/span><span class=\"me1\">PublishedName<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw3\">Exit<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">True<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; Result <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"kw2\">False<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> Canvas &lt;&gt; <span class=\"kw1\">nil<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; LCanvas <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Canvas <span class=\"kw1\">as<\/span> TCanvas<br \/>\n&nbsp; <span class=\"kw1\">else<\/span><br \/>\n&nbsp; &nbsp; LCanvas <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TTempTouchKeyboard<span class=\"br0\">&#40;<\/span>Parent<span class=\"br0\">&#41;<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Canvas<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; LRect <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> ClientRect<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Font<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Name<\/span> &nbsp; <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"st0\">'Arial'<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Pen<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> &nbsp; <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> clBlack<span class=\"sy1\">;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Font<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Color<\/span> &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> clYellow<span class=\"sy1\">;<\/span> <span class=\"co1\">\/\/clBlack;<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Font<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Style<\/span> &nbsp;<span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> <span class=\"br0\">&#91;<\/span>fsBold<span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; GradVertical<span class=\"br0\">&#40;<\/span>LCanvas<span class=\"sy1\">,<\/span> LRect<span class=\"sy1\">,<\/span> acKeyColors<span class=\"br0\">&#91;<\/span>State<span class=\"br0\">&#93;<\/span><span class=\"sy1\">,<\/span> clblack<span class=\"br0\">&#41;<\/span> <span class=\"sy1\">;<\/span><br \/>\n<span class=\"co1\">\/\/ &nbsp;LCanvas.Brush.Color := acKeyColors[State];<\/span><br \/>\n<span class=\"co1\">\/\/ &nbsp;LCanvas.Rectangle(LRect);<\/span><br \/>\n&nbsp; LCanvas<span class=\"sy1\">.<\/span><span class=\"me1\">Brush<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">Style<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> bsClear<span class=\"sy1\">;<\/span><br \/>\n<br \/>\n&nbsp; <span class=\"kw1\">case<\/span> KeyImage <span class=\"kw1\">of<\/span><br \/>\n&nbsp; &nbsp; kiOverride<span class=\"sy1\">:<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw1\">not<\/span> GetOverrideCaption<span class=\"br0\">&#40;<\/span>Parent<span class=\"sy1\">,<\/span> Key<span class=\"sy1\">,<\/span> LCaption<span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; LCaption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Caption<span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> LCaption<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiText<span class=\"sy1\">:<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">begin<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw3\">Length<\/span><span class=\"br0\">&#40;<\/span>Caption<span class=\"br0\">&#41;<\/span> &gt; <span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>Caption<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"st0\">'^'<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">or<\/span> <span class=\"br0\">&#40;<\/span>Caption<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy3\">=<\/span> <span class=\"st0\">'\u00a8'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; Caption <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> Caption<span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> Caption<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiTab<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Tabulation'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiShift<span class=\"sy1\">:<\/span> &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Majuscule'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiEnter<span class=\"sy1\">:<\/span> &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Entr\u00e9e'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiBackspace<span class=\"sy1\">:<\/span> DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2190'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiUp<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp; &nbsp;DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2191'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiDown<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp;DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2193'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiLeft<span class=\"sy1\">:<\/span> &nbsp; &nbsp; &nbsp;DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2190'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiRight<span class=\"sy1\">:<\/span> &nbsp; &nbsp; DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'\u2192'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; &nbsp; kiTallEnter<span class=\"sy1\">:<\/span> DrawOneChar<span class=\"br0\">&#40;<\/span>LRect<span class=\"sy1\">,<\/span> LCanvas<span class=\"sy1\">,<\/span> <span class=\"st0\">'Entr\u00e9e'<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; <span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">FormCreate<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">.<\/span><span class=\"me1\">DefaultButtonClass<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TMyKeyboardButton<span class=\"sy1\">;<\/span><br \/>\n&nbsp; TTempTouchKeyboard<span class=\"br0\">&#40;<\/span>TouchKeyboard1<span class=\"br0\">&#41;<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">CreateKeyboard<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">.<\/span><span class=\"me1\">Redraw<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">.<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>On a alors cette fois-ci un clavier comme cela&nbsp;:<br \/>\n<div id=\"attachment_783\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a title=\"Delphi : Clavier tactile avec touches d\u00e9grad\u00e9es\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-gradient.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-783\" src=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-gradient-300x114.jpg\" alt=\"Delphi : Clavier tactile avec touches d\u00e9grad\u00e9es\" title=\"Cliquer pour agrandir\" width=\"300\" height=\"114\" class=\"size-medium wp-image-783\" srcset=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-gradient-300x114.jpg 300w, https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-gradient.jpg 566w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-783\" class=\"wp-caption-text\">Delphi : Clavier tactile avec touches d\u00e9grad\u00e9es<\/p><\/div><\/p>\n<p> (!!) Attention, cette application n&rsquo;a pas vocation \u00e0 remplacer le Clavier visuel fourni avec Windows&nbsp;: lorsque l&rsquo;on clique sur une touche du clavier tactile, l&rsquo;\u00e9v\u00e9nement reste au sein de l&rsquo;application qui a le focus, donc celle qui poss\u00e8de le clavier.<br \/>\nCet exemple d\u00e9montre le changement d&rsquo;aspect du clavier, mais l&rsquo;application en elle-m\u00eame ne sert et ne fait rien <img src=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-includes\/images\/smilies\/skype\/\/tmi.gif\" alt=\"(tmi)\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/> <\/p>\n<p>Vous pouvez t\u00e9l\u00e9charger les <a title=\"Cliquer pour t\u00e9l\u00e9charger l'archive des sources d'un exemple de personnalisation du clavier tactile Delphi\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/mon-clavier.zip\">sources<\/a> de cet exemple ou l&rsquo;<a title=\"Cliquer pour t\u00e9l\u00e9charger l'application exemple compil\u00e9e du clavier tactile fourni par Delphi\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/MonClavier.exe\">application d\u00e9mo<\/a>. J&rsquo;ai \u00e9galement ajout\u00e9 le test sur un param\u00e8tre <em>\/qwerty<\/em>&nbsp;:<br \/>\nSi vous poss\u00e9dez un ordinateur avec un clavier en fran\u00e7ais, vous devriez voir un clavier AZERTY par d\u00e9faut au lancement de l&rsquo;application. Si vous appelez l&rsquo;application en ajoutant <em>\/qwerty<\/em>, le clavier sera ainsi en anglais.<\/p>\n<div class=\"codecolorer-container delphi dawn\" style=\"overflow:auto;white-space:nowrap;width:480px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/><\/div><\/td><td><div class=\"delphi codecolorer\"><span class=\"kw1\">procedure<\/span> TfrmMain<span class=\"sy1\">.<\/span><span class=\"me1\">FormCreate<\/span><span class=\"br0\">&#40;<\/span>Sender<span class=\"sy1\">:<\/span> <span class=\"kw4\">TObject<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">begin<\/span><br \/>\n&nbsp; <span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span>ParamCount <span class=\"sy3\">=<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">and<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw3\">ParamStr<\/span><span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy3\">=<\/span><span class=\"st0\">'\/qwerty'<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"kw1\">then<\/span><br \/>\n&nbsp; &nbsp; LoadKeyboardLayout<span class=\"br0\">&#40;<\/span><span class=\"st0\">'00000409'<\/span><span class=\"sy1\">,<\/span> KLF_ACTIVATE<span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span> <span class=\"co1\">\/\/ anglais<\/span><br \/>\n<br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">.<\/span><span class=\"me1\">DefaultButtonClass<\/span> <span class=\"sy1\">:<\/span><span class=\"sy3\">=<\/span> TMyKeyboardButton<span class=\"sy1\">;<\/span><br \/>\n&nbsp; TTempTouchKeyboard<span class=\"br0\">&#40;<\/span>TouchKeyboard1<span class=\"br0\">&#41;<\/span><span class=\"sy1\">.<\/span><span class=\"me1\">CreateKeyboard<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy1\">;<\/span><br \/>\n&nbsp; TouchKeyboard1<span class=\"sy1\">.<\/span><span class=\"me1\">Redraw<\/span><span class=\"sy1\">;<\/span><br \/>\n<span class=\"kw1\">end<\/span><span class=\"sy1\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<div id=\"attachment_787\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a title=\"Delphi : Clavier tactile QWERTY\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-qwerty.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-787\" src=\"\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-qwerty-300x114.jpg\" alt=\"Delphi : Clavier tactile QWERTY\" title=\"Cliquer pour agrandir\" width=\"300\" height=\"114\" class=\"size-medium wp-image-787\" srcset=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-qwerty-300x114.jpg 300w, https:\/\/blogs.wittwer.fr\/whiler\/wp-content\/uploads\/2009\/11\/keyboard-qwerty.jpg 566w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-787\" class=\"wp-caption-text\">Delphi : Clavier tactile QWERTY<\/p><\/div>\n<p> (idea) Je me suis content\u00e9 d&rsquo;\u00e9crire du texte sur chaque touche, mais on peut tr\u00e8s bien imaginer <a title=\"La version hardware ;o)\" target=\"_blank\" href=\"https:\/\/www.artlebedev.com\/everything\/optimus\/demo\/\" rel=\"noopener\">afficher des images \u00e0 la place des touches<\/a>.<br \/>\nDe m\u00eame, le <a title=\"Cliquer pour t\u00e9l\u00e9charger l'exemple du pav\u00e9 num\u00e9rique color\u00e9\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/pave.exe\">pav\u00e9 num\u00e9rique<\/a> est directement disponible en changeant une simple propri\u00e9t\u00e9 de l&rsquo;objet, <code class=\"codecolorer delphi dawn\"><span class=\"delphi\">Layout <span class=\"sy3\">=<\/span> <span class=\"st0\">'NumPad'<\/span><\/span><\/code>.<br \/>\n<div id=\"attachment_791\" style=\"width: 206px\" class=\"wp-caption aligncenter\"><a title=\"Pav\u00e9 color\u00e9\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/colored-numpad.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-791\" src=\"\/whiler\/wp-content\/uploads\/2009\/11\/colored-numpad.jpg\" alt=\"Delphi : Pav\u00e9 num\u00e9rique color\u00e9\" title=\"Delphi : Pav\u00e9 num\u00e9rique color\u00e9\" width=\"196\" height=\"221\" class=\"size-full wp-image-791\" \/><\/a><p id=\"caption-attachment-791\" class=\"wp-caption-text\">Delphi : Pav\u00e9 num\u00e9rique color\u00e9<\/p><\/div><\/p>\n<p><!--nextpage--><br \/>\nEt comment ne pas faire un exemple comme celui-ci&nbsp;: <img src=\"https:\/\/blogs.wittwer.fr\/whiler\/wp-includes\/images\/smilies\/skype\/\/blush.gif\" alt=\":$\" class=\"wp-smiley\" style=\"height: 1em; max-height: 1em;\" \/><br \/>\n<div id=\"attachment_804\" style=\"width: 206px\" class=\"wp-caption aligncenter\"><a title=\"Pav\u00e9 image\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/bellypad.zip\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-804\" src=\"\/whiler\/wp-content\/uploads\/2009\/11\/bellypad.jpg\" alt=\"Delphi : Pav\u00e9 num\u00e9rique avec Jpeg\" title=\"Cliquer pour t\u00e9l\u00e9charger l'archive de l'application compil\u00e9e\" width=\"196\" height=\"246\" class=\"size-full wp-image-804\" \/><\/a><p id=\"caption-attachment-804\" class=\"wp-caption-text\">Delphi : Pav\u00e9 num\u00e9rique avec Jpeg<\/p><\/div><\/p>\n<p>Vous pouvez l&rsquo;ex\u00e9cuter chez vous pour voir le comportement du pav\u00e9 et du champ d&rsquo;\u00e9dition en d\u00e9zippant l&rsquo;<a title=\"Cliquer pour t\u00e9l\u00e9charger l'archive de l'application compil\u00e9e du pav\u00e9 num\u00e9rique avec images\" href=\"\/whiler\/wp-content\/uploads\/2009\/11\/bellypad.zip\">archive<\/a> dans un r\u00e9pertoire.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Delphi 2010 ajoute encore de nouveaux composants \u00e0 la VCL\u2026 Parmi ceux-ci, on trouve un clavier visuel, permettant d\u2019\u00e9tendre les capacit\u00e9s de ses applications en ayant la possibilit\u00e9 de le proposer dans son interface, tr\u00e8s pratique sur des p\u00e9riph\u00e9riques \u00e0 \u00e9crans tactiles !<br \/>\nDepuis la palette d\u2019outils de l\u2019environnement de conception de Delphi, dans la cat\u00e9gorie Tactile, on trouve le composant TTouchKeyboard. Il suffit simplement de l\u2019ajouter dans la fiche de son choix.<br \/>\nLe clavier tactile s\u2019adapte automatiquement \u00e0 celui du syst\u00e8me d\u2019exploitation : On utilise un Windows en fran\u00e7ais, on a un clavier AZERTY. On est sous un Windows anglais, on a un QWERTY.<br \/>\nOn peut personnaliser le clavier en modifiant ses propri\u00e9t\u00e9s directement depuis l\u2019inspecteur d\u2019objets. Dans le code ci-dessous, je vais montrer comment surcharger une m\u00e9thode de ce clavier pour red\u00e9finir l\u2019apparence des diff\u00e9rentes touches\u2026<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[7,6],"tags":[125,122,14,27,154,120,108],"class_list":["post-769","post","type-post","status-publish","format-standard","hentry","category-delphi","category-dev","tag-b3lly","tag-122","tag-chat","tag-coloration-syntaxique","tag-delphi","tag-localisation","tag-script"],"_links":{"self":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/comments?post=769"}],"version-history":[{"count":1,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/769\/revisions"}],"predecessor-version":[{"id":6403,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/posts\/769\/revisions\/6403"}],"wp:attachment":[{"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/media?parent=769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/categories?post=769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.wittwer.fr\/whiler\/wp-json\/wp\/v2\/tags?post=769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}