[VB.NET] Geen KeyPreview bij Form?

Pagina: 1
Acties:

  • Paul
  • Registratie: September 2000
  • Laatst online: 17:39
Ik ben bezig een applicatie te maken voor een PDA.

In dit specifieke geval probeer ik een (ingebouwde) barcodescanner aan te roepen. Op een UniTech PA960 is dat via de Scanner-API de scanner aanzetten en wachten op het event, daadwerkelijk het lasertje aanzetten enzo doe je hardwarematig door op een knopje te drukken.
Op een Mobile Compia M3 echter moet je in software de laser aanzetten. Dit kan ook met een knopje, maar dat levert een KeyDown (en Up) event op op Keys.F22. En daar zit het probleem.

Zodra de gebruiker in het schermpje komt waar hij moet scannen gaat het goed. Drukt hij echter eerst op een knopje, dan heeft het form geen focus meer en krijgt deze dus ook geen Key*-events meer.
Ik zie dat mijn collega's dat al eerder zijn tegengekomen en dus maar bij ieder control een eventhandler hebben gemaakt die de eventhandler van het form aanroept |:( 300 eventhandlers die dus alleen maar frm*_Key*(sender, e) aanroepen.

Dat moet makkelijker kunnen. Delphi heeft er een KeyPreview voor, en zowaar, MSDN en Google vinden dat VB.net dat ook moet kunnen.

Visual Studio 2003 met Compact Framework 1.5 (2.0 is helaas (md5 :( zie daar maar een werkende implementatie van te vinden onder VB.net, zelfs zonder option strict of option explicit, iedereen roept dat je de CryptoProvider moet gebruiken) niet mogelijk omdat de PDA's dat niet snappen) vind echter van niet. System.Windows.Forms.Form heeft geen KeyPreview-property. Me niet, frm* niet, niks. Ook in de object-inspector, of properties-panel of net hoe dat ding in VS2003 mag heten staat hij er niet tussen. Op alfabet gesorteerd springt hij van Icon naar Language.
Visual Basic .NET:
1
2
Me.keypreview = True
' 'keypreview' is not a member of 'AFSS.frmLogin'
MSDN noemt echter nergens versienummers van (al dan niet compact-) frameworks waarin deze property voor het eerst geintroduceerd wordt. Omdat het ook al in VB6 zat neem ik eigenlijk aan dat deze property er al in het eerste framework bijzat.

Waarom kan ik hem dan niet aanroepen / op true zetten?

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:26
Een gewone windows form heeft in .NET iig een KeyPreview property; echter je hebt het over het compact framework. Daar zal je dus je forms laten inheriten van een andere base class... wellicht dat deze dan die property niet heeft.

https://fgheysels.github.io/


  • Paul
  • Registratie: September 2000
  • Laatst online: 17:39
Meer info dan MSDN heb ik niet, dus of System.Windows.Forms.Form intern in het Compact Framework ergens anders van inherit zou ik niet weten, maar dat is (net als in het gewone framework) in ieder geval de klasse die ik instantieer.

Ik ga eens zoeken naar een verschillenlijst oid tussen het Compact en het gewone framework, maar als het inderdaad in die hoek te vinden is snap ik niet waarom ze dat dan niet (bijvoorbeeld) System.WindowsCE.Forms.Form hadden genoemd ofzo.

Edit:
Op Controls in the .NET Compact Framework wijst "Form" naar .NET Framework Class Library Form Class (System.Windows.Forms), waar bijstaat dat dit is supported in CF 1.0.
Klik je daar vervolgens op Form Members dan staat KeyPreview ertussen. Op die pagina staat geen Supported By-informatie.
Klik je daar op KeyPreview dan kom je op Form.KeyPreview Property (System.Windows.Forms) en pas DAAR blijkt dat dit wederom een hele makkelijke feature is die pas in CF 2.0 beschikbaar komt :'( Waarom kan MS nou nooit eens iets de eerste keer meteen goed doen? Of, waarom ondersteunen geen van die profi pda's met barcodescanner nu CF2.0? CF2.0 is ten slotte pas 2 jaar oud...

Goed, ik heb mijn antwoord :( Dan maar weer een berg eventhandlers toevoegen die de uitvoer doorsluizen naar de handler van het form.

[ Voor 52% gewijzigd door Paul op 21-08-2006 14:01 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Paul Nieuwkamp schreef op maandag 21 augustus 2006 @ 13:47:
Goed, ik heb mijn antwoord :( Dan maar weer een berg eventhandlers toevoegen die de uitvoer doorsluizen naar de handler van het form.
Je kan toch gewoon 1 event handler aan meerdere controls hangen? Netjes is het nog niet maar het is al beter als een hele hoop verschillende event handlers.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Paul
  • Registratie: September 2000
  • Laatst online: 17:39
Dat is inderdaad ook nog een optie, daar had ik nog helemaal niet aan gedacht, met name omdat de GUI me die optie niet bied (zoals Borland Delphi dat wel doet).

Schijnbaar kun je achter het Handles statement meerdere events plakken. Eens kijken of dat odoet wat ik denk dat het doet :P

Edit: En dat doet het \o/

Het levert hele lange regels op :+ maar het werkt :) Jaja, je kunt op de volgende regel verder met _, even kijken hoe ik ze netjes afbreek :P

Dank u :)

[ Voor 24% gewijzigd door Paul op 21-08-2006 14:42 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan ook nog Met de AddHandler functie handlers toevoegen. Dan hoef je het niet perse bij de functie zelf te defineren. Ik weet niet precies Hoe het in VB.NET werkt maar in c# kan je gewoon zo doen

C#:
1
2
3
4
public void MyEventHandler( object source, EventArgs e)
{...}
control.MyEvent += MyEventHandler;
control2.MyEvent += MyEventHandler;


In VB.NET Kan iets dergelijks met AddHandler

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Paul
  • Registratie: September 2000
  • Laatst online: 17:39
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs
    'blabla
End Sub

Public Sub New()
    'blalbla

    AddHandler btnOK.Click, AddressOf Me.btnOK_Click
End Sub

Of ergens anders dan in de ctor, aangezien het helemaal dynamisch is zodat je on-the-fly eventhandlers kunt toevoegen, weghalen, etc, etc :)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock

Pagina: 1