Entertaste wie Tabtaste benutzen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Entertaste wie Tabtaste benutzen

Beitrag 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
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag 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
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag von Vanished »

Im Moment verfolge ich folgenden Ansatz:

...ursprünglichen Text wegen Erfolglosigkeit gelöscht.

Viele Grüße,
Vanished
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag 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
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag 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
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag 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".
Vanished
**
Beiträge: 35
Registriert: Do, 23.12.2004 12:38

Beitrag 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
Antworten