MouseWheel-Event abfangen

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

Moderator: Moderatoren

marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

MouseWheel-Event abfangen

Beitrag von marcel_at_work »

test.jpg
test.jpg (33 KiB) 3486 mal betrachtet
Nabend Mädls, :D

ich habe mir ein eigenes Listenfeld generiert, da ich in den Zeilen dringend auch ein Checkbox-Element zum Auswählen brauchte.
Mein "Listenfeld" besteht aus 20 Checkbox-Elementen, die je nach "Adjustment" an der rechts angeordneten Bildlaufleiste, durch den wechselnden Index eines zugehörigen Arrays gefüllt werden. Das Ding gefällt mir jetzt wirklich super, nur hätte ich auch gern ein MouseWheel-Event über den Checkbox-"Zeilen"-Elementen und nicht nur per Tastendruck in der Bildlaufleiste selbst.

Weder in der OOo-Doku, noch in verschiedensten LibreOffice-Handbüchern ist dazu irgendetwas zu finden... :(
Hat vielleicht irgendjemand einen kleinen Gedankenanstoß für mich???

Hier auch mal noch ein Auszug des bisherigen Codes:

Code: Alles auswählen

Option Explicit

Public oQueryAdditives As Object
Public oQueryAdditiveGroups As Object
Public oQueryAdditiveGroupsRelations As Object
Public oQueryNutritionValues As Object
Public oQueryNutritionValuesRelations As Object
Public oQueryAllergens AS Object

Public arrAllergens(2, 0) As Variant
'*************************************************************************************************************************************************************
'#openDialogSubstances()
'Die Funktion wechselt zum Step "Zusatzstoffe, Allergene und Nährwertangaben".
'*************************************************************************************************************************************************************
Sub openDialogSubstances()
	'Prüffunktion, ob das Makro schon ausgeführt wird
	If bIsMakroStarted(oDialog.Model.Step = 6) Then Exit Sub
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	'Erzeugung und Initialisierung der Datenbankverbindungen
	call funcOpenDatabaseConnection(oQueryAdditives)
	call funcOpenDatabaseConnection(oQueryAdditiveGroups)
	call funcOpenDatabaseConnection(oQueryAdditiveGroupsRelations)
	call funcOpenDatabaseConnection(oQueryAllergens)
	call funcOpenDatabaseConnection(oQueryNutritionValues)
	call funcOpenDatabaseConnection(oQueryNutritionValuesRelations)
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	'Datenbankabfrage des "Artikelstamms"
	
	
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	'Datenbankabfrage der "Zusatzstoffe"
	call funcSetQuery(oQueryAllergens, "SELECT ID, name FROM SUBSTANCES_ALLERGENS ORDER BY name")

	Dim n As Integer
	
	n = 0
	oQueryAllergens.beforeFirst()
	Do While oQueryAllergens.Next()
		'Neudimensionierung des Arrays "arrAllergens" und Einlesen der Abfragedaten
		Redim Preserve arrAllergens(2, n)
		arrAllergens(0, n) = oQueryAllergens.getInt(1)
		arrAllergens(1, n) = " enthält " + oQueryAllergens.getString(2)
'		arrAllergens(2, n) = ...
		n = n + 1
	Loop

	'Dimensionierung der Checkbox-Ansicht
	For n = 1 To 20 'Durchlauf der Checkbox-Elemente
		'Falls der Index(n) des Checkbox-Elements auch in der Datenbankabfrage vorhanden ist,...
		If n <= oQueryAllergens.RowCount() Then
			'... Einlesen von Namen und Zustand
			oDialog.getControl("chb6Allergens" & CStr(n)).Model.Label = arrAllergens(1, n - 1)
			oDialog.getControl("chb6Allergens" & CStr(n)).Model.State = arrAllergens(2, n - 1)
			'und Einblendung der Checkbox
			oDialog.getControl("chb6Allergens" & CStr(n)).Model.enableVisible = True
		Else
			oDialog.getControl("chb6Allergens" & CStr(n)).Model.enableVisible = False			'... sonst Ausblendung der Checkbox
		End If
	Next n

	'Dimensionierung der Bildlaufleiste
	With oDialog.getControl("scr6Allergens").Model
		'Falls es mehr Abfrageergebnisse als Checkbox-Elemente gibt,...
		If oQueryAllergens.RowCount() > 20 Then
			'... Aktivierung der Bildlaufleiste
			.enableVisible = True
			.VisibleSize = 25
			.ScrollValueMin = 0
			.ScrollValueMax = oQueryAllergens.RowCount() - 19 + (.VisibleSize - 1)				'Anpassung der Laufschritte mittels Datenbankabfrage und der Größe der Leistenschaltfläche
			.ScrollValue = 0
		Else
			.enableVisible = False																'... sonst Ausblendung der Bildlaufleiste
		End If
	End With
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	'Wechsel der Ansicht
	oDialog.Title = sSYSTEM_NAME & " [Zusatzstoffe, Allergene und Nährwertangaben]"
	oDialog.Model.Step = 6
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	'Zurücksetzung der Prüfvariable
	bMakroStarted = False
End Sub
'*************************************************************************************************************************************************************
'#updateArrAllergens()
'Die Funktion aktualisiert bei Änderung eines Checkbox-Zustandes den zugehörigen Eintrag in "arrAllergens".
'Wichtig: Die Funktion ist sämtlichen Checkbox-Elementen unter dem Event "Status geändert" zugeordnet! 
'*************************************************************************************************************************************************************
Sub updateArrAllergens()
	'Setzen des Fokus auf das "Hidden-Object": Ausnahmsweise schon VOR der Makro-Prüffunktion, um den Fokuswechsel ohne Zeitverlust auszuführen!
	oDialog.getControl("lbl0HiddenFocus").setFocus()

	'Prüffunktion, ob das Makro schon ausgeführt wird
	If bIsMakroStarted(bMakroStarted) Then Exit Sub
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	ThisComponent.lockControllers()
	
	Dim nScrollValue As Integer
	Dim n As Integer

	nScrollValue = oDialog.getControl("scr6Allergens").Model.ScrollValue

	For n = 1 To 20
		If n <= oQueryAllergens.RowCount() Then
			arrAllergens(2, (nScrollValue + n - 1)) = oDialog.getControl("chb6Allergens" & CStr(n)).Model.State
		End If
	Next n

	ThisComponent.unlockControllers()
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	'Zurücksetzung der Prüfvariable
	bMakroStarted = False
End Sub
'*************************************************************************************************************************************************************
'#updateViewAllergens()
'Die Funktion aktualisiert bei Änderung der Bildlaufleiste sämtliche Checkbox-Elemente.
'Wichtig: Die Funktion ist der Bildlaufleiste unter den Events "Mausbewegung bei Tastendruck" und "Beim Justieren" zugeordnet!
'*************************************************************************************************************************************************************
Sub updateViewAllergens()
	'Setzen des Fokus auf das "Hidden-Object": Ausnahmsweise schon VOR der Makro-Prüffunktion, um den Fokuswechsel ohne Zeitverlust auszuführen!
	oDialog.getControl("lbl0HiddenFocus").setFocus()
	
	'Prüffunktion, ob das Makro schon ausgeführt wird
	If bIsMakroStarted(bMakroStarted) Then Exit Sub
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	ThisComponent.lockControllers()

	Dim nScrollValue As Integer, n As Integer

	nScrollValue = oDialog.getControl("scr6Allergens").Value

	For n = 1 To 20
		'Falls der durch die Bildlaufleiste generierte Index(n) des Checkbox-Elements auch in der Datenbankabfrage vorhanden ist,...
		If n <= oQueryAllergens.RowCount() Then
			'... Aktualisierung von Namen und Zustand in der Checkbox-Ansicht
			oDialog.getControl("chb6Allergens" & CStr(n)).Model.Label = arrAllergens(1, (nScrollValue + n - 1))
			oDialog.getControl("chb6Allergens" & CStr(n)).Model.State = arrAllergens(2, (nScrollValue + n - 1))
		End If
	Next n
	
	ThisComponent.unlockControllers()
	'---------------------------------------------------------------------------------------------------------------------------------------------------------
	'Zurücksetzung der Prüfvariable
	bMakroStarted = False
End Sub
Liebe Grüße,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: MouseWheel-Event abfangen

Beitrag von F3K Total »

Hallo Marcel,
weißt du, dass ein echtes Listenfeld auf Mehrfachselektion umgestellt werden kann? Siehe Bild:
Multiple_Listbox.PNG
Multiple_Listbox.PNG (73.27 KiB) 3470 mal betrachtet
Damit kannst du auch mehrere Zeilen per STRG und SHIFT auswählen/an-abschalten und dann die Selektion per Makro auslesen. Der Balken und das gewünschte Mausverhalten inklusive.

Sonst fällt mir noch ein: Es ist in einem Formular auch möglich ein Tabellenkontrollfeld zu verwenden, da kann man Checkboxen anzeigen lassen.
Gruß R
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: MouseWheel-Event abfangen

Beitrag von marcel_at_work »

Hallöchen R, :)

danke für das Feedback...

1) das mit der Mehrfachselektion ist mir bereits bekannt. Ich fand aber erstens die Checkbox-Auswahl ästhetischer, zum anderen auch die Selektion per STRG+ von der Usability her nicht sehr effektiv. Desweiteren habe ich jetzt auf diese Weise auch schon eine weitere Listbox angelegt, die per "MouseOver", etc.-Events ein paar coole Effekte integriert hat. > Mein "Digitales Kochbuch" soll eben auch optisch ein wenig was "hermachen". :D

2) Mein Programm habe ich auf Basis von Dialogen aufgebaut und habe somit keinerlei Option zu Formular-Kontrollfeldern. Außerdem finde ich Tabellenkontrollfelder auch nicht ganz so ansprechend - da nicht modifizierbar?!

(M)Ein Dilemma? :D

Vor 10 Jahren habe ich mal ein umfangreicheres Buchhaltungsprogramm in MS Basic entwickelt - da war der Funktionsumfang aber nicht so eingeschränkt. Aber ich möchte eben grundlegend nur noch auf OpenSource zurückgreifen.

Es kann doch nicht sein, dass es nirgends ein MouseWheel-Handler gibt???

Liebe Grüße,

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: MouseWheel-Event abfangen

Beitrag von F3K Total »

Hallo Marcel
marcel_at_work hat geschrieben:zum anderen auch die Selektion per STRG+ von der Usability her nicht sehr effektiv.
jeder Dateiexplorer den ich kenne arbeitet so. Mit STRG an- und abschalten, aber mit SHIFT mehrere Zeilen, ganze Bereiche selektieren.
Gut ist Geschmackssache, ich finde es sogar most usable, besser als zig Kontrollkästchen einzeln anzuklicken :D
Beim Mousewheelhandler kann ich nicht helfen.
Gruß R
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: MouseWheel-Event abfangen

Beitrag von balu »

Moin moin Marcel,

ich hatte so meine Mühe gehabt zu verstehen was Du eigentlich willst. Aber jetzt weiß ich es, und kann trotzdem nicht helfen.

Für z.B. eine ListBox kann man wohl mittels Model.MouseWheelBehavior die Mausrad Unterstützung ein- oder ausschalten. Mehr aber auch nicht.

Für deine Bildlaufleiste gibt es keine direkte Aktivierung des Mausrades. Höchstwahrscheinlich müsste das über einen so genannten Listner irgendwie programmiert werden, womit ich mich aber überhaupt nicht auskenne. Ich weiß jedoch das ein MausListner für Bildlaufleiste möglich ist, dazu habe ich diese beiden Methoden gefunden; addMouseListener & addMouseMotionListener. Mehr kann ich auch nicht sagen und helfen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: MouseWheel-Event abfangen

Beitrag von marcel_at_work »

Hallöchen,

R:

Du sagst es "es ist Geschmackssache". :D
In meinem Fall werden in der Regel nur ein paar ganz wenige Einträge selektiert - es scheint effektiver, ohne den Mehraufwand der STRG-Taste. Zudem muß man in der Listbox-Ansicht auch aufpassen, dass man die STRG-Taste nicht unverhofft im falschen Moment loslässt und so die Mehrfachauswahl wieder verliert....

Balu:

Ich versuche mich eigentlich immer verständlich auszudrücken?! :lol:
Die XMouse...Listener habe ich mir schon in der Online-Doku angeschaut, konnte dort aber auch nur Tastenereignisse recherchieren, die mich nach einigen Tests leider auch kein Stück weitergebracht haben.
Die restliche Zeit, seit dem letzten Post, habe ich damit verbracht, eine MouseWheel-Implementierung per VisualBasic Code zu realisieren, aber laut Doku werden scheinbar weder die OOo-API noch der OOo-interne Dialogdesigner (mit dem ich arbeite) unterstützt.

(M)ein Dilemma...

Habt aber trotzallem Dank, ihr zwei.

Einen wundervollen Brückentag... 8)

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Antworten