Scrollbar (Bildlaufleiste) bei Dialogen

Im Handbuch LibreOffice 6.1, Kapitel Base,  wird das Beispiel "Scrollbar" behandelt, siehe Beispieldatenbank «Beispiel_Datensatz_scrollbar.odb.
(Vielen Dank den Autoren dafür!)

Die Beispieldatenbank "Beispiel_Datensatz_scrollbar.odb" stellt die Scrollbar für Formulare dar.
Wie lauten die Befehle für Dialogboxen?

1. Methode zum Anzeigen der EXAKTEN POSITIONIERUNG des Scroll-Buttons

IM FORMULAR

oForm = oEvent.Source
    oScrollField = oForm.getByName("Bildlaufleiste")
    oScrollField.ScrollValueMax = loMax
    oScrollField.ScrollValue = loPos

IM DIALOG

oDialog.getControl("Bildlaufleiste").Model.ScrollValueMax = loMax
    oDialog.getControl("Bildlaufleiste").Model.ScrollValue = loPos

(soweit so gut)

2. Methode zum  AUSLÖSEN DURCH DIE BILDLAUFLEISTE "Beim Justieren"

(a) IM FORMULAR

oScrollAction = oEvent.Source
    oForm = oScrollAction.Model.Parent
    loPos = oScrollAction.getValue()

(b) IM DIALOG ???

Verwendet man  loPos = oDialog.getControl("Bildlaufleiste").Model.ScrollValue,
dann wird der Wert loPos der Position des Scroll-Button nach Loslassen der Mouse-Taste angezeigt.

Gibt es eine "oScrollAction" analoge Methode für Dialogboxen, so dass die einzelnen Datensätze angezeigt werden beim Durchlaufen der Scrollbar und nicht (nur) der Datensatz beim Beenden des Durchlaufens?

Hallo Gerhard,

ich benutze für die Scrollbar im Dialog die Ereignisse "Taste losgelassen", "Maustaste losgelassen" und "Mausbewegung bei Tastendruck", alle mit dem selben Makro verknüpft, das den Value des Controls (nicht des Models!, aber ich kann dir jetzt nicht sagen, ob das etwas bedeutet) verwendet. Ich zeige nicht Datensätze an, sondern berechne mehrere Werte. Die Anzeige dieser Werte läuft jedenfalls beim Verschieben des Anfassers schön durch.
Du kannst das sehen, wenn du die Extension DCM installierst und den Scrollbar für die Sättigung mit der Maus bedienst.

Gruß

Gerhard

Hallo Gerhard,

bei der Dialog-Scrollbar mit der Verknüpfung des Makros mit den Ereignissen "Maustaste losgelassen" und "Mausbewegung bei Tastendruck" wird auch nur der Zielwert angezeigt (genauso wie "bei justieren"). "Taste losgelassen" funktioniert nicht. Auch die Verknüpfung aller 3 Ereignissen mit dem gleichen Makro führt nur zur Anzeige des Zielwerts/Endwert.

Kannst Du mir die relevanten Befehlszeilen schicken, damit ich mir eine Vorstellung davon machen kann, wie Deine Lösung aussieht?

Grüße
Gerhard

Hallo Gerhard,

diese Antwort geht an die Liste, direkt schicke ich dir zusätzlich den Screenshot des Dialogs, damit du besser siehst, auf was sich de Code bezieht. Wenn jemand anders den dialog sehen will, kann er/sie die Extension DCM installieren.

Hier zunächst der Code, der von den drei genannten Ereignissen des Rollbalkens "ScrollSatur" (im Bild der senkrechte balken in der Mitte) aufgerufen wird:

    sub scrollSatur(evt as object)

    dim scrollSat as object, dlgm as object, nSat as object

    dlgm = dlg.model
    scrollSat = dlg.getControl("ScrollSatur")
    nSat = dlgm.getByName("nSat")
    nSat.value = Int(100 - scrollSat.value)
    HSV2RGB
    setNew

    End Sub

Wie schon gesagt: ich lese den Wert des Controls und nicht seines Models aus, aber ob das bewusst so gemacht ist, kann ich dir nicht mehr sagen, das ist schon einige jahre her.
Ich fülle dann das Feld Sättigung ("nSat", rechts das zweite von oben), hier nun das Model, mit dem zugehörigen Wert und rufe dann die sub HSV2RGB auf, die aus den HSV-Werten die letztlich benötigten RGB-Werte berechnet und in die zugehörigen Felder schreibt, und dann setNew, das das Feld "neu" mit der neuen Farbe füllt.

Natürlich liefert das Ereignis nur den neuen Value zurück, aber es wird eben beim Verschieben des Anfassers mit der Maus immer wieder ausgelöst. Dadurch werden auch immer wieder die subs aufgerufen und die RGB-Werte und das "neu"-Feld verändert. (Beim Aufruf steht das kleine weiße Quadrat im großen Farbfeld in der Mitte, da tut sich bei Grün und Blau praktisch nichts, aber wenn man das Quadrat durch Klicken anderswo positioniert, ändern sich beim Verschieben alle drei Werte.)
Beim Rollen durch Klicken in den Rollbalken oder auf die Dreiecke an den Enden oder mit den nachOben- bzw. nachUnten-Tasten kommt natürlich nur immer ein Ereignis pro Klick oder tastendruck.

Nachdem ich den etwas komplizierteren Weg über drei Ereignisse gewählt habe, könnte es sein, dass ich mit dem Ereignis "Beim Justieren" Probleme hatte, aber ich weiß es nicht mehr.

Viel Spaß beim Probieren!

Gerhard

1. Methode zum Anzeigen der EXAKTEN POSITIONIERUNG des Scroll-Buttons

IM FORMULAR

oForm = oEvent.Source

oScrollField = oForm.getByName("Bildlaufleiste")

oScrollField.ScrollValueMax = loMax

oScrollField.ScrollValue = loPos

IM DIALOG

oDialog.getControl("Bildlaufleiste").Model.ScrollValueMax = loMax

oDialog.getControl("Bildlaufleiste").Model.ScrollValue = loPos

2. Methode zum AUSLÖSEN DURCH DIE BILDLAUFLEISTE "Beim Justieren"

(a) IM FORMULAR

oScrollAction = oEvent.Source

oForm = oScrollAction.Model.Parent

loPos = oScrollAction.getValue()

(b) IM DIALOG

(aa) Object-Methode

DIM oScrolAction as OBJECT

oScrollAction = oDialog.getControl("Bildlaufleiste")

loPos = scrollAction.value

Bei der Object-Methode ist ein Durchlauf beim Verschiebebutton. Allerdings hat sich bei mir gezeigt, dass die zugrundeliegende MySQL-Datenbank (mit etlichen Abfragen) verzögert reagiert. Man darf also den Verschiebebutton nicht zu schnell bewegen. Mit Mouseklick auf die beiden Pfeiltasten der Bildlaufleiste klappt der Durchlauf wunderbar.

(bb) model-Methode

loPos = oDialog.getControl("Bildlaufleiste").Model.ScrollValue

Es wird nur der Zieldatensatz nach Beendigung der Verschiebebutton-Bewegung mit Loslassen der Mouse-Tasten angezeit. Bei den Pfeiltasten funktioniert der Durchlauf wunderbar.

Für meine Verhältnisse wende ich die model-Methode an, da die Verzögerung der MySQL-Datenbank irritierend ist. Mit dem Verschiebebutton ungefähr in den Bereich des relevanten Datensatzes klicken und dann die Feinjustierung per Pfeiltasten.

(Die Pfeiltasten scheinen nur bei Windows, unter Linux - ich benutze privat LinuxMint - nicht vorhanden zu sein!)

Ereignisse, die man mit dem Makro verknüpfen kann, muss man ausprobieren. Grundsätzlich funktionieren: "Maustaste losgelassen" und "Mausbewegung bei Tastendruck", beide mit dem selben Makro verknüpft

Auch „Beim justieren“ funktioniert, zumindest bei der model-Methode

1. Methode zum Anzeigen der EXAKTEN POSITIONIERUNG des Scroll-Buttons

IM FORMULAR

oForm = oEvent.Source

oScrollField = oForm.getByName("Bildlaufleiste")

oScrollField.ScrollValueMax = loMax

oScrollField.ScrollValue = loPos

IM DIALOG

oDialog.getControl("Bildlaufleiste").Model.ScrollValueMax = loMax

oDialog.getControl("Bildlaufleiste").Model.ScrollValue = loPos

2. Methode zum AUSLÖSEN DURCH DIE BILDLAUFLEISTE "Beim Justieren"

(a) IM FORMULAR

oScrollAction = oEvent.Source

oForm = oScrollAction.Model.Parent

loPos = oScrollAction.getValue()

(b) IM DIALOG

(aa) Object-Methode

DIM oScrollAction as OBJECT

oScrollAction = oDialog.getControl("Bildlaufleiste")

loPos = oScrollAction.value (Berichtigung: oScrollAction.value muss es natürlich heißen, zuvor hatte ich stehen: scrollAction.valu)

Bei der Object-Methode ist ein Durchlauf beim Verschiebebutton. Allerdings hat sich bei mir gezeigt, dass die zugrundeliegende MySQL-Datenbank (mit etlichen Abfragen) verzögert reagiert. Man darf also den Verschiebebutton nicht zu schnell bewegen. Mit Mouseklick auf die beiden Pfeiltasten der Bildlaufleiste klappt der Durchlauf wunderbar.

(bb) model-Methode

loPos = oDialog.getControl("Bildlaufleiste").Model.ScrollValue

Es wird nur der Zieldatensatz nach Beendigung der Verschiebebutton-Bewegung mit Loslassen der Mouse-Tasten angezeit. Bei den Pfeiltasten funktioniert der Durchlauf wunderbar.

Für meine Verhältnisse wende ich die model-Methode an, da die Verzögerung der MySQL-Datenbank irritierend ist. Mit dem Verschiebebutton ungefähr in den Bereich des relevanten Datensatzes klicken und dann die Feinjustierung per Pfeiltasten.

(Die Pfeiltasten scheinen nur bei Windows, unter Linux - ich benutze privat LinuxMint - nicht vorhanden zu sein!)

Ereignisse, die man mit dem Makro verknüpfen kann, muss man ausprobieren. Grundsätzlich funktionieren: "Maustaste losgelassen" und "Mausbewegung bei Tastendruck", beide mit dem selben Makro verknüpft

Auch „Beim justieren“ funktioniert, zumindest bei der model-Methode