You are not logged in.

Dear visitor, welcome to Jabaco - Community. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

Peter

Trainee

  • "Peter" is male
  • "Peter" started this thread

Posts: 69

Date of registration: Nov 24th 2008

Location: Cologne, Germany

Occupation: Second Vice President of Distributed Junk and Trash Development

  • Send private message

1

Monday, July 26th 2010, 12:48pm

OK- und Cancel-Button eines Dialoges

Moinsen,

ich habe einen Dialog gebastelt. Auf diesem Dialog befindet sich ein OK- und ein Cancel-Button.

Nun möchte ich mit der Taste <Return> den OK-Button und mit <ESC> den Cancel-Button 'auslösen'.

Wenn ich mich richtig erinnere, dann gab es unter VB6 die Möglichkeit, das Keypress-Event der Form abzufragen und entsprechend zu reagieren. Allerdings wird das Keypress-Event nur dann gefeuert, wenn die Form den Focus hat. Eine (VB6-)KeyPreview-Eigenschaft (also, dass die Form in jedem Fall als erstes das Keypress-Event bekommt; unabhängig, welches Control den Focus besitzt) habe ich in Jabaco nicht gefunden.

Was tun?

Danke im voraus & Grüße ... Peter

OlimilO

Intermediate

  • "OlimilO" is male

Posts: 277

Date of registration: Jan 18th 2009

Location: Germany

Occupation: software engineer

  • Send private message

2

Monday, July 26th 2010, 4:43pm

Hallo,



Das ist in VB6 sogar noch einfacher. CommandButton haben für diesen Zweck die Properties

Default und Cancel

Bsp:

OK-Button: Default = True

Cancel-Button: Cancel=True



Idee für Lösung:

* im Form/Dialog das Interface java#awt#Event#KeyListener implementieren

* das Form/Dialog mit AddKeyEventListener auf alle Controls adden.



dann hast Du ein einziges KeyPressed-Event für alle Controls gleichzeitig



habs allerdings jetzt noch nicht probiert.



Gruß

OlimilO

Peter

Trainee

  • "Peter" is male
  • "Peter" started this thread

Posts: 69

Date of registration: Nov 24th 2008

Location: Cologne, Germany

Occupation: Second Vice President of Distributed Junk and Trash Development

  • Send private message

3

Monday, July 26th 2010, 5:20pm

Hallo OlimilO,

danke (wie immer) für Deine schnelle Antwort!

Quoted from "OlimilO"

Das ist in VB6 sogar noch einfacher.

ja, stimmt. War mir nicht sicher, ob das in VB6 so ging oder ob ich das nicht mit (VB).Net verwechsle (da geht's ja noch ein Stück komfortabler).

Quoted from "OlimilO"

* im Form/Dialog das Interface java#awt#Event#KeyListener implementieren

[X] Done

Quoted from "OlimilO"

* das Form/Dialog mit AddKeyEventListener auf alle Controls adden.

[X] Done

Das funktioniert auch nun für alle auf dem Dialog befindlichen Controls. :) Nur nicht für den Dialog selber... :(

Jabaco Source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Implements java#awt#Event#KeyListener

Public Sub cmdCancel_Click()
   
   Me.Close
   
End Sub

Public Sub cmdOK_Click()

	' [Stuff]
   
   Me.Close
   
End Sub

Public Sub Form_Load()

   cmdOK.Parent.addKeyListener(Me) ' funktioniert
   cmdCancel.Parent.addKeyListener(Me) ' funktioniert
   lblDescription.Parent.addKeyListener(Me) ' funktioniert
   txtDescription.Parent.addKeyListener(Me) ' funktioniert
   Me.Parent.addKeyListener(Me) ' funktioniert nicht :(
   
End Sub

Public Sub keyTyped(arg2 As KeyEvent)
End Sub

Public Sub keyPressed(arg2 As KeyEvent)
   
   Debug.Print arg2
   
End Sub

Public Sub keyReleased(arg2 As KeyEvent)
End Sub


Danke & Grüße ... Peter

OlimilO

Intermediate

  • "OlimilO" is male

Posts: 277

Date of registration: Jan 18th 2009

Location: Germany

Occupation: software engineer

  • Send private message

4

Monday, July 26th 2010, 7:00pm

ja super genauso hab ich das gemeint!

aber statt

Jabaco Source

1
Me.Parent.addKeyListener(Me)


musst du machen:

Jabaco Source

1
Me.ContentFrame.Parent.addKeyListener(Me)


da sitzt dummerweise noch was auf dem Form drauf das alle Controls enthält, und das dann den Focus erhält wenn du den Form/Dialog anklickst



Gruß

OlimilO

Peter

Trainee

  • "Peter" is male
  • "Peter" started this thread

Posts: 69

Date of registration: Nov 24th 2008

Location: Cologne, Germany

Occupation: Second Vice President of Distributed Junk and Trash Development

  • Send private message

5

Monday, July 26th 2010, 9:20pm

Quoted from "OlimilO"

Jabaco Source

1
Me.ContentFrame.Parent.addKeyListener(Me)

prima! So klappt es :) Danke für den Tipp! :thumbup:

Allerdings: Wenn viele Controls auf dem Dialog sitzen kann das 'adden' ja richtig in Arbeit ausufern. Die Gefahr, dass man dann ein Control vergisst ist auch nicht grade zu unterschätzen. :S

Es gibt nicht zufälligerweise eine Controls-Auflistung, über die man iterieren kann, oder?

Jabaco Source

1
2
3
For Each C As Control In Me.Controls
  C.Parent.addKeyListener(Me)
Next


:whistling:


Grüße ... Peter

OlimilO

Intermediate

  • "OlimilO" is male

Posts: 277

Date of registration: Jan 18th 2009

Location: Germany

Occupation: software engineer

  • Send private message

6

Tuesday, July 27th 2010, 9:59am

Achja...

Me.Parent.addKeyListener(Me)
...ist trotzdem erforderlich, also beides

Jabaco Source

1
2
3
Me.Parent.addKeyListener(Me) 
'und
Me.ContentFrame.Parent.addKeyListener(Me)


Quoted

Es gibt nicht zufälligerweise eine Controls-Auflistung, über die man iterieren kann, oder
die gibt es schon siehe ContentFrame.Parent.getComponentCount, und ContentFrame.Parent.getComponent(i)
Aber dummerweise gibt es (immer noch) keine gemeinsame Schnittstelle für "Parent" für das einzelne Control.
Vielleicht müßte man die Schnittstelle IJabacoControl einfach um ein ReadOnly Property Parent erweitern.
(btw den Namen "Parent" find ich etwas unglücklich, besser wäre vielleicht "Control" gewesen, aber naja was solls das hat sich eben so eingebürgert)
Gruß
OlimilO

Peter

Trainee

  • "Peter" is male
  • "Peter" started this thread

Posts: 69

Date of registration: Nov 24th 2008

Location: Cologne, Germany

Occupation: Second Vice President of Distributed Junk and Trash Development

  • Send private message

7

Monday, August 2nd 2010, 10:24am

ich kriege es noch nicht ganz hin...

Check-, Radio- und CommandButtons, Comboboxen und die Form selber reagieren wie erwartet. :)

Aber die Textboxen melden noch kein keyPressed(). Ich vermute, dass da ein eigener KeyEventhandler dazwischenfunkt. :huh:

Jabaco Source

1
2
3
4
5
6
7
8
Me.Parent.addKeyListener(Me) 
Me.ContentFrame.Parent.addKeyListener(Me)

For Counter = 0 To Me.ContentFrame.Parent.getComponentCount - 1
 Dim myComponent As Component = Me.ContentFrame.Parent.getComponent(Counter)
 Debug.Print myComponent.getClass.toString
 myComponent.addKeyListener(Me)
Next

Puh, ganz schön viel Aufwand für so wenig 'Benefit'. ;(

Grüße ... Peter
Peter has attached the following file:

A1880

Intermediate

  • "A1880" is male

Posts: 500

Date of registration: Jan 1st 2009

Location: Hanover, Germany

Occupation: Software Engineer

Hobbies: Hilbert Curves

  • Send private message

8

Monday, August 2nd 2010, 5:13pm

Vielleicht hilft ein Blick in den Quellcode von TextBox im Framework.

Danach hat TextBox verständlicherweise einen eigenen Handler für Tastendrücke:

Jabaco Source

1
2
3
4
5
6
7
8
Public Sub keyPressed(e As KeyEvent)
   If Me.MultiLine = False Then
      If e.getKeyCode = KeyEvent.VK_ENTER Then
         e.consume 
      End If
   End If
   RaiseEvent KeyDown(KeyEventToKeyCode(e), KeyEventToShiftConstant(e))
End Sub


Generell gebe ich Dir recht: Wenn die vordefinierten Controls im Framework nicht ausreichen,
wird's in Jabaco regelmäßig bitter.

Gruß!

A1880

OlimilO

Intermediate

  • "OlimilO" is male

Posts: 277

Date of registration: Jan 18th 2009

Location: Germany

Occupation: software engineer

  • Send private message

9

Tuesday, August 3rd 2010, 8:58am

Hallo,

da habt ihr ganz recht. Das ist wahrscheinlich auch der Grund warum das Framework Opensource ist, dann kann jeder seinen Teil dazu beitragen und die Menge an Arbeit könnte sich für alle in einem erträglichen Rahmen halten.

Gruß

OlimilO

Rate this thread
WoltLab Burning Board