Toon posts:

[DELPHI] alle toetsaanslagen afvangen in een TCustomControl

Pagina: 1
Acties:
  • 146 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
môgguh,

ik heb een probleem: ik ben een eigen control aan het maken in Delphi, die van TCustomControl erft, en ik wil toetsen af kunnen vangen als mijn control focus heeft... dat lukt ook, MAAR... als er op de form waar mijn control op staat ook nog bijvoorbeeld een button staat, met een Acceleratorstreepje eronder, dan voert hij de onclick-event uit als ik die toets indruk (dus ook als mijn control focus heeft, en ik hoef er niet eens alt bij in te drukken)

weet iemand waar dit aan kan liggen? ik vang de toetsen af met een WM_CHAR messagehandler, en ik heb al veel dingen geprobeerd (inherited weg/niet weg, Msg.result = 0/onveranderd, etc) maar ik kom er niet uit

bij voorbaat dank,
Theodoor

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik begrijp dat je nu alle toetsen op het hele form afvang, ook als je geen focus hebt en dat dat niet gewenst is.

Meestal doe je dat door
procedure KeyDown(var Key: Word; Shift: TShiftState); dynamic;
procedure KeyUp(var Key: Word; Shift: TShiftState); dynamic;
procedure KeyPress(var Key: Char); dynamic;
te overriden en dan Key = 0 te returnen als je zelf al de toets afgehandeld hebt

Minder mooi, maar het zou technisch geen probleem moeten zijn als je de WM_KEYDOWN, WM_KEYUP of WM_CHAR messages zou afvangen. Mits het maar via soortgelijke methodes is:
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
procedure WMKeyUp(var Message: TWMKeyUp); message WM_KEYUP;
procedure WMChar(var Message: TWMChar); message WM_CHAR;
Je moet dan 0/False returnen als je de toets afgehandeld hebt.

Lastiger wordt het als je op een andere manier die WM_CHAR afvangt, door bijvoorbeeld direct in te message queue te gaan kijken, want daar kunnen messages in zitten die niet voor jouw zijn.

Het lijkt me beter als je de eerste functies die ik beschreef even gebruikt en dan kijkt of je het nogsteeds hebt.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
helaas :? nog steeds het zelfde probleem

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Maar kan je je probleem nog 1x omschrijven?

Is het dat je alle toetsen op het form met jouw control afvangt?
of
Is het dat andere jouw toetsen afvangen ook als je focus hebt?

We adore chaos because we like to restore order - M.C. Escher


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Kijk eens naar de property KeyPreview (van de form).

Never underestimate the power of


  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

Dit is wel een erg vreemd probleem, ik heb laatst iets soorgelijks gedaan maar dat ging gewoon goed. Dus gewoon de events van je control gebruiken...

If you are not wiping out you are nog pushing enough...


Verwijderd

Topicstarter
ik vang alleen alle toetsen af als mijn control focus heeft... en als mijn control focus heeft, en ik druk de B-toets in, dan wordt de OnClick event van mijn &Back-toets uitgevoerd, zonder dat de KeyPress van mijn eigen control wordt uitgevoerd

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kijk eens naar de property KeyPreview (van de form).
Dat zou alleen de events van het form aanroepen, maar niet het event weer doorsturen naar componenten op dat form.

[ Voor 0% gewijzigd door LordLarry op 14-10-2002 12:07 . Reden: quote ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
cameodski schreef op 14 oktober 2002 @ 12:02:
Kijk eens naar de property KeyPreview (van de form).
als ik die aanzet dan gebeurt het nog steeds... en bij een gewone TMemo ofzo, dan heb ik het probleem ook niet, ookal staat KeyPreview op de form uit

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 14 oktober 2002 @ 12:05:
ik vang alleen alle toetsen af als mijn control focus heeft... en als mijn control focus heeft, en ik druk de B-toets in, dan wordt de OnClick event van mijn &Back-toets uitgevoerd, zonder dat de KeyPress van mijn eigen control wordt uitgevoerd
Weet je wel zeker dat je de focus hebt? Dat gaat niet altijd automatisch bij TCustomControls.

Gebruik daarvoor SetFocus

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
yep, mijn caret knippert, en ik kan gewoon alle andere toetsen afvangen via KeyPress

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je bent dit vergeten:

code:
1
2
3
4
5
6
procedure TTest.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
  inherited;

  Message.Result := Message.Result or DLGC_WANTCHARS;
end;


Je moet nog meer codes toevoegen als je ook andere speciale toetsen wil afvangen. Zoals enter, tab en pijltjes toetsen.

(DLGC_WANTALLKEYS is in tegenstelling wat de naam doet vermoeden alleen voor enter en escape toetsen)

[ Voor 0% gewijzigd door LordLarry op 14-10-2002 13:38 . Reden: DLGC_WANTALLKEYS toevoeging ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
ah ok thnx! ik ga het gelijk proberen

Verwijderd

Topicstarter
jah mooi man! it works deliciously!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

btw. om nu de accelerator keypresses vanuit andere controls ook nog af te kunnen vangen moet je CM_DIALOGCHAR en/of CM_DIALOGKEY afvangen, 2 interne VCL messages. Mocht je accelerators in je control nodig hebben kan ik wel ff doorsturen hoe je dit hiermee moet bereiken.

Professionele website nodig?

Pagina: 1