Seite 1 von 1
Entertaste wie Tabtaste benutzen
Verfasst: Do, 20.01.2005 07:50
von Vanished
Das folgende Problem wurde unter Writer bereits diskutiert:
viewtopic.php?t=182; für mich dann allerdings im falschen Forum wie sich herausstellte.
Zusammengefaßt: Wie bringe ich einen Dialog dazu zum Durchlaufen der Felder bei der Eingabe von Werten neben der Tab-Taste auch die Enter-Taste des Ziffernblocks zu aktzeptieren?
Viele Grüße,
Vanished
Verfasst: Do, 20.01.2005 11:00
von Toxitom
Hey Vanished,
Wie bringe ich einen Dialog ...
Im Dialog? automatisch gar nicht. Enter löst das Ereignis "Beim Auslösen" aus, für alle Kontrollfelder. Dieses Ereignis kannst du mit einem Makro verknüpfen - und wenn du wirklich zum nächsten Feld sprigen willst - dann musst du es programmieren. Enter wirkt wie ein Mausklick, und da soll ja auch nicht zum nächsten Feld gespungen werden - oder?
Bei Tab ist das anders - die ist vordefiniert.
Gruss
Thomas
Verfasst: Do, 20.01.2005 11:23
von Vanished
Toxitom hat geschrieben:
Im Dialog? automatisch gar nicht. Enter löst das Ereignis "Beim Auslösen" aus, für alle Kontrollfelder. Dieses Ereignis kannst du mit einem Makro verknüpfen - und wenn du wirklich zum nächsten Feld sprigen willst - dann musst du es programmieren.
Leider haben Textfelder im Gegensatz zu Comboboxen oder Schaltflächen kein Ereignis "Beim Auslösen". Genauergenommen steht bei Textfeldern gar kein brauchbares Ereignis zur Verfügung...
Ich habe auch mal bei einer Combobox versucht, das Ereignis "Beim Auslösen" zu verwenden - es reagiert aber nicht auf die Eingabetaste!
Vielleicht gibt es noch eine andere Lösung?
Viele Grüße,
Vanished
Verfasst: Do, 20.01.2005 12:58
von Toxitom
Hey Vanished,
Leider haben Textfelder im Gegensatz zu Comboboxen oder Schaltflächen kein Ereignis "Beim Auslösen"
Ja, da hast du natürlich recht. Die brauchbaren Eventhandler bei sochen Boxen sind entweder "taste gedrückt" oder "Text modifiziert", reagieren aber bei jedem Tastendruck und müssen daher sorgfältig ausgewertet werden.
Die andere Alternative: Du schreibst einen Listener, der "horcht" dann zum Beispiel an der Tastatur und reagiert auf das drücken der "Enter" Taste. Ist aber nicht so ganz ohne.
Gruss
Thomas
Verfasst: Do, 20.01.2005 16:30
von Vanished
Im Moment verfolge ich folgenden Ansatz:
...ursprünglichen Text wegen Erfolglosigkeit gelöscht.
Viele Grüße,
Vanished
Verfasst: Di, 25.01.2005 14:58
von Vanished
Hallo,
Ich habe mir die Listener mal näher angeschaut. Ich kann auch auf jedes Control innerhalb des Dialoges einen Listener registrieren (wenn _ein_ Listener auf den Dialog registriert wird, funktioniert es leider nicht):
Code: Alles auswählen
Private oListenerObject as Object
Private oKeyListener as Object
Sub RegisterKeyListener
for i=1 to 17
oListenerObject = oDialog.AccessibleContext.getAccessibleChild(i)
oKeyListener = createUnoListener oKey_", "com.sun.star.awt.XKeyListener")
oListenerObject.addKeyListener(oKeyListener)
next i
End Sub
Aber wie kann ich die Listener vorm Beenden des Dialoges wieder entfernen?
Code: Alles auswählen
Sub UnregisterKeyListener
for i=1 to 17
oListenerObject = oDialog.AccessibleContext.getAccessibleChild(i)
oListenerObject.removeKeyListener(oKeyListener)
next i
End Sub
funktioniert nicht...
Viele Grüße,
Vanished
Verfasst: Di, 25.01.2005 15:46
von Toxitom
Hallo Vanished,
Hmm, flüchtiger Blick über den Code....
Musst du sie überhaupt wieder entfernen? Wenn du die Maske zerstörst, sollten die Lisener doch auch weg sein?
Na egal, wieso erstellt du das Listener Objekt innerhalb der Schleife? dadurch werden 17 Objekte erstellt, nur das letzte bleibt in der Variablen gespeichert. Un das wird dann versucht, aus allen Controls entfernt zu werden? Ich nehme an, hier kommt der interen Programminterpreter ins "straucheln".
Setz mal da an.
Gruß
Thomas
Verfasst: Di, 25.01.2005 15:56
von Vanished
Hallo Thomas,
ich kann nicht begründen, warum, aber das Registrieren der Listener funktioniert so. Jedes einzelne Control reagiert jetzt auf die Enter-Taste so, wie ich das haben möchte. (siehe Edit)
Den Fehler habe ich an einer anderen Stelle ausgemacht. Ein dämlicher Schreibfehler. Um einen Listener zu benutzen müssen ja bekanntlich alle seine Methoden im Basiccode hinterlegt sein. Beim KeyListener (wie bei den anderen Listenern auch) gehört ein Sub für das disposing dazu. So sah das bei mir aus:
Code: Alles auswählen
Sub oKey_disposng(oEvt)
'Muß nur vorhanden sein, keine weiter Funktion auslösen
End Sub
Am "i" in disposing ist es gescheitert. Dumm nur, dass beim Laufzeitfehler keine Zeile im IDE als fehlerhaft markiert wurde.
Also das Problem hätte sich erledigt. Jetzt brauche ich nur noch eine Lösung dafür, wie ich den Index des aktuellen Controls bekomme, um ihn um eins zu erhöhen, damit ich den Focus auf das nächsthöhere Control setzen kann.
Vielen Dank für Deine Anregungen,
Vanished
Edit: Ich vermute (naja so habe ich es mir zumindest vorgestellt), dass der Listener direkt auf das Control registriert wird und nicht auf seine temporäre Beschreibung "oListenerObject".
Verfasst: Do, 27.01.2005 11:43
von Vanished
So, die Aufgabenstellung ist jetzt vollständig gelöst. Falls jemand anderes auf diesen Thread stößt und nach einer Lösung sucht, hier das Ergebnis, das sich sicherlich verbessern läßt. Daher bin ich natürlich für jeden Vorschlag dankbar.
Code: Alles auswählen
Sub RegisterKeyListener
for i=1 to 17
mControls=oDialog.tabControllers(0).controls
oKeyListener = createUnoListener("oKey_", "com.sun.star.awt.XKeyListener")
mControls(i).addKeyListener(oKeyListener)
next i
End Sub
Sub UnregisterKeyListener
for i=1 to 17
mControls=oDialog.tabControllers(0).controls
mControls(i).removeKeyListener(oKeyListener)
next i
End Sub
Function oKey_KeyPressed(oEvt) As Boolean
select case oEvt.KeyChar
case chr(13)
oKey_KeyPressed = True
Dim actControl as Integer
actControl = oEvt.Source.getModel().TabIndex
if actControl < 17 Then
Do while oDialog.AccessibleContext.getAccessibleChild(actControl+1).isEditable = "False"
actControl = actControl + 1
if actControl > 17 then actControl = 0
Loop
End If
oDialog.AccessibleContext.getAccessibleChild(actControl+1).setFocus()
case else
oKey_KeyPressed = False
end select
End Function
Function oKey_KeyReleased(oEvt) As Boolean
oKey_KeyReleased = False
End Function
Sub oKey_disposing(oEvt)
'Muß nur vorhanden sein, keine weiter Funktion auslösen
End Sub
Viele Grüße,
Vanished