Results 1 to 11 of 11

Thread: Alleen met KeyUp de letter (van het toetsenbord) weergeven

  1. #1

    Alleen met KeyUp de letter (van het toetsenbord) weergeven

    Hallo allemaal,

    Hoe kan ik de lettertoetsen van een toetsenbord zodanig laten werken dat
    een KeyDown geen invloed heeft (repeat is dan niet meer mogelijk) en bij KeyUp
    de letter wel in een Memo wordt weergegeven?

    H.G. Frans

  2. #2
    In OnKeyDown doe Key := 0 als Key een printable character is.
    Dan in OnKeyUp plaats je alsnog dat character in je memo.
    Nogal omslachtig als je het mij vraagt, en behoorlijk contra-intuïtief voor de gebruiker.

    Wat wil je eigenlijk precies bereiken?

    Bart

  3. #3
    Bart,

    Dit werkt niet. Het is ook niet mogelijk om in OnKeyDown een waarde aan Key mee te geven. Dat is naar mijn idee wel vreemd omdat er in de procedure
    staat ...; Var Key : Word,... Geld ook voor OnKeyUp.

    Ik zoek een manier om herhaling bij het te lang indrukken van een karakter te voorkomen. Is er een manier om dat te doen?

    H.G. Frans

  4. #4
    Als het is voor de toegankelijkheid (iemand die moeite heeft met kort aanslaan), dan zou ik het gewoon bij de toegankelijkheidsopties van Windows instellen.
    "Toegankelijkheidsopties voor toetsenbord" -> Filtertoetsen -> en dan Herhaalde toetsen aan zetten.
    1+1=b

  5. #5
    Quote Originally Posted by Dubbeld View Post
    Bart,Het is ook niet mogelijk om in OnKeyDown een waarde aan Key mee te geven.
    Dat is nonsense.

    Bart

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Quote Originally Posted by Bart B View Post
    Dat is nonsense.
    Jullie hebben (onder Delphi 10.4, althans) allebei gelijk: de key in OnKeyPressed moet ook op #0 worden gezet, anders zorgt deze ervoor dat er alsnog een karakter geplaatst wordt.
    TMemoryLeak.Create(Nil);

  7. #7
    Quote Originally Posted by VideoRipper View Post
    Jullie hebben (onder Delphi 10.4, althans) allebei gelijk
    Nee, de opmerking van Dubbeld is incorrect.
    Je kunt Key op een willekeurige waarde zetten (echter om het effect te bereiken dat Dubbeld wil, moet je hem op 0 zetten).
    Dat was al zo in Delphi 1.0.

    Bart

  8. #8
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    En dat zeg ik dus: als je dat doet (tenminste in Delphi), dan krijg je alsnog een karakter in de memo, omdat de OnKeyPress wordt afgevuurd.
    Wanneer je ook in OnKeyPress de key op #0 zet, dan kun je "Handmatig" de gewenste functionaliteit implementeren in de OnKeyUp
    Last edited by VideoRipper; 21-Feb-23 at 15:48.

  9. #9
    Senior Member Thaddy's Avatar
    Join Date
    Dec 2004
    Location
    Amsterdam
    Posts
    2,211
    Je kan beter de OnKeyPress event tijdelijk op nil zetten als je echt alleen OnKeyUp wil.
    Werken aan Ansi support voor Windows is verspilde tijd, behalve voor historici.

  10. #10
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Default staan alle events al op nil natuurlijk, dat probeer ik nou juist duidelijk te maken.

    Wanneer je alleen OnKeyDown() afhandelt, waarin je de Key op 0 zet, dan krijg je toch nog een karakter in de meno
    Zet je daarnaast ook nog de OnKeyPress(), en zet je daarin de key op #0 (want een char var), dan krijg je geen karakter meer en heb je de mogelijkheid om je ding te doen in de OnKeyUp event (de betreffende key in de memo zetten).

    Probeer maar eens in een testprojectje (of ik moet jullie verkeerd begrijpen).
    Delphi Code:
    1. procedure TForm2.Memo1KeyDown(Sender: TObject; var Key: Word;
    2.   Shift: TShiftState);
    3. begin
    4.   if Key in [32..255] then
    5.     Key := 0;
    6. end;
    7.  
    8. procedure TForm2.Memo1KeyPress(Sender: TObject; var Key: Char);
    9. begin
    10.   Key := #0;
    11. end;
    12.  
    13. procedure TForm2.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    14. begin
    15.   if Key in [32..255] then
    16.     Memo1.Text := Memo1.Text + Char(Key);
    17. end;
    (Oké, oplossing is niet perfect, maar is enkel om het aan te geven)

    En ja, ook ik vind het contra-intuïtief, maar dat is hier nu even niet de discussie.
    TMemoryLeak.Create(Nil);

  11. #11
    Quote Originally Posted by VideoRipper View Post
    Default staan alle events al op nil natuurlijk, dat probeer ik nou juist duidelijk te maken.
    Wanneer je alleen OnKeyDown() afhandelt, waarin je de Key op 0 zet, dan krijg je toch nog een karakter in de meno
    In Lazarus krijg je geen karakter in je memo op die manier.
    Hetgeen uiteraard ook veel logischer is, maar wel weer een incompatibiliteit.

    Bart

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •