Seite 1 von 1

MouseWheel-Event abfangen

Verfasst: Di, 03.01.2017 21:32
von marcel_at_work
test.jpg
test.jpg (33 KiB) 3489 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

Re: MouseWheel-Event abfangen

Verfasst: Di, 03.01.2017 23:28
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) 3473 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

Re: MouseWheel-Event abfangen

Verfasst: Mi, 04.01.2017 00:18
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

Re: MouseWheel-Event abfangen

Verfasst: Mi, 04.01.2017 00:42
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

Re: MouseWheel-Event abfangen

Verfasst: Mi, 04.01.2017 01:56
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

Re: MouseWheel-Event abfangen

Verfasst: Do, 05.01.2017 23:11
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