Avatar billede mindplay Nybegynder
30. december 2001 - 22:06 Der er 8 kommentarer og
1 løsning

DoKeyDown i min komponent...

Jeg har lavet en komponent, som skal modtage keyboard events - den er baseret på TCustomControl, så det burde vel bare se sådan her ud:

  TMinKomponent = class(TCustomControl)
    ...
  protected
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyUp(var Key: Word; Shift: TShiftState); override;
    ...

eller hvad?? ... det virker nemlig ikke - jeg modtager ingen keyboard events, de to procedurer bliver aldrig kaldt!
Avatar billede martinlind Nybegynder
30. december 2001 - 22:13 #1
Du skal bruge

procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN;
procedure CNKeyUp(var Message: TWMKeyUp); message CN_KEYUP;

istedet for KeyDown og Keyup kalder bare OnKeyUp og OnKeyDown eventen


/Martin
Avatar billede razersedge Nybegynder
30. december 2001 - 23:12 #2
er dit spørgsmål hvordan du kalder en Event til en komponent fra en anden komponent ?? hvis ja, så vil jeg gerne have svaret ( forstår ikke helt martins måde )
Avatar billede mindplay Nybegynder
31. december 2001 - 01:01 #3
razersedge: nej, jeg tror ikke det var det mit spørgsmål handlede om ...

martin: tak for svaret, men det var ikke lige det jeg ledte efter - selvfølgelig kan man fange en message, og så behanlde den selv, men så går alle keyboard events til min komponent - det er kun nogen enkelte taster jeg vil fange, andre taster skal fortsat gå videre til f.eks. den form, som jeg placerer min komponent på ... idéen med de to procedurer jeg har override\'et er (så vidt jeg har kunnet læse mig til i delphi\'s help) at man overrider dem, og så sætter man Key:=0 hvis man har behandlet tasten (det er derfor den er en Var parameter) - hvis man ikke sætter Key:=0, så går event\'en videre til instansen\'s parent (f.eks. en form) ... I TCustomControl er de to procedurer erklæret som Dynamic, netop fordi det er meningen at man skal kunne override\'e dem ... men det virker altså ikke??
Avatar billede martinlind Nybegynder
31. december 2001 - 11:16 #4
Netop derfor skal du bruge min metode, checke på det taster du interesere dig for, og kalde inherited ved alle andre.

det er muligt du skal vælge :

procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
procedure WMKeyUp(var Message: TWMKeyUp); message WM_KEYUP;

Avatar billede mindplay Nybegynder
31. december 2001 - 12:07 #5
skal de også ligge i protected? ... det virker nemlig HELLER ikke! :/ ... af en eller anden mærkelig grund bliver de aldrig kaldt. jeg har en ret simpel måde at teste det på - jeg har puttet en ShowMessage(\'Tast!\') i min implementation af begge procedurer ... men der sker ingenting! meget underligt ....
Avatar billede mindplay Nybegynder
31. december 2001 - 12:11 #6
Min CustomControl indeholder for resten en masse instanser af en anden custom komponent, som er baseret på TGraphicControl - men det burde vel ikke gøre nogen forskel? den type komponenter kan jo ikke få fokus, og skulle derfor ikke kunne \"stjæle\" tastatur-inputtet inden min custom control når at få fat i det??
Avatar billede mindplay Nybegynder
31. december 2001 - 12:26 #7
Øh .. nu opdagede jeg ved et tilfælde, at jeg kan få den til at blive kaldt, hvis jeg trykker venstre musseknap ned over min customcontrol og holder den nede, mens jeg trykker på en tast! men ellers ikke ... det må jo betyde at der er et eller andet fokus-problem, men jeg kan godt nok ikke regne ud hvad det så skulle være? ... de GraphicControls der ligger på min CustomControl kan jo ikke få fokus .. eller kan de??
Avatar billede mindplay Nybegynder
31. december 2001 - 12:45 #8
Jeg har løst problemet - the bruger CNKeyDown og CNKeyUp, som du sagde i din første besked - ikke WMKeyUp/WMKeyDown som du sagde her til sidst (var det en fejl?) ... nu virker det. Man skal åbenbart selv sætte fokus med kald til SetFocus, når komponenten får MouseDown - det troede jeg egentlig inherited proceduren tog sig af ... guess not :) ... anyways, tak for hjælpen, Martin - jeg lukker spørgsmålet.
Avatar billede martinlind Nybegynder
01. januar 2002 - 18:41 #9
Tjae, det har du ret i det er egentlig også mærkeligt at du selv skal det, men godt nok du fik det til at virke *S*
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester