Entertaste wie Tabtaste benutzen
Moderator: Moderatoren
Entertaste wie Tabtaste benutzen
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
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
Hey Vanished,
Bei Tab ist das anders - die ist vordefiniert.
Gruss
Thomas
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?Wie bringe ich einen Dialog ...
Bei Tab ist das anders - die ist vordefiniert.
Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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...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.
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
Hey Vanished,
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
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.Leider haben Textfelder im Gegensatz zu Comboboxen oder Schaltflächen kein Ereignis "Beim Auslösen"
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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):
Aber wie kann ich die Listener vorm Beenden des Dialoges wieder entfernen?
funktioniert nicht...
Viele Grüße,
Vanished
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
Code: Alles auswählen
Sub UnregisterKeyListener
for i=1 to 17
oListenerObject = oDialog.AccessibleContext.getAccessibleChild(i)
oListenerObject.removeKeyListener(oKeyListener)
next i
End Sub
Viele Grüße,
Vanished
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
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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
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:
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".
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
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".
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.
Viele Grüße,
Vanished
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
Vanished