La barre de défilement est l'une des Controls
disponibles via l'éditeur de boîte de dialogue. C'est le moyen le plus simple de mettre un ScrollBar
dans une boîte de dialogue. Insérez-le comme n'importe quel autre contrôle. Il y a un moyen plus difficile via DialogModel.addControl
mais cela semble non-essentiel pour répondre à cette question.
Si vous ajoutez une barre de défilement à la boîte de dialogue et exécutez la boîte de dialogue, vous constaterez qu'elle ne fait rien par défaut. La fonctionnalité (apparemment) doit être écrite dans une macro. L'événement déclencheur approprié est l'événement While Adjusting
sur l'objet ScrollBar
, bien qu'il ne déclenche pas la macro simplement avec la fonction "Mode Test" dans l'éditeur de dialogue. L'exécution de la boîte de dialogue via une macro déclenche l'événement While Adjusting
lorsque les flèches de défilement sont déclenchées, lorsque vous cliquez sur la zone de curseur pour déplacer le curseur et lorsque le curseur est lui-même déplacé. La variable Object
renvoyée par l'événement scrollbar contient une propriété .Value
qui est une valeur absolue comprise entre 0 et EventObject.Model.ScrollValueMax
, ce qui vous permet de manipuler manuellement les autres objets de la page en fonction de la position du curseur.
Oui, c'est vrai, manipulez les objets manuellement. Le seul exemple que j'ai trouvé, à partir du LibreOffice 4.5 SDK, fait précisément cela. Bien sûr, ce n'est pas aussi grave que ça en a l'air, car on peut parcourir tous les objets de la page en lisant le tableau Dialog.getControls()
. En tout cas, la sauce secrète de l'exemple fourni dans le SDK est de définir Static
variables pour sauvegarder les positions initiales de tous les objets que vous manipulez avec la barre de défilement puis simplement indexer ces positions initiales en fonction d'un ratio dérivé de la barre de défilement Value
divisé par le ScrollValueMax
.
Voici un exemple de travail très simple sur la façon de faire défiler. Cela nécessite un Dialog1
enregistré dans la bibliothèque Standard
de votre document, qui contient un objet ScrollBar1
(une barre de défilement verticale) et Label1
n'importe où dans la boîte de dialogue. Le ScrollBar1
doit être configuré pour exécuter le sous-programme de la macro ScrBar
(ci-dessous) sur l'événement While Adjusting
. Ouvrez la boîte de dialogue en exécutant la macro OpenDialog
et la barre de défilement déplacera le contrôle Label1
de haut en bas proportionnellement à la page.
Sub OpenDialog
DialogLibraries.LoadLibrary("Standard")
oVariable = DialogLibraries.Standard.Dialog1
oDialog1 = CreateUnoDialog(oVariable)
oDialog1.Execute()
End Sub
Sub ScrBar (oEventObj As Object)
Static bInit As Boolean
Static PositionLbl1Y0 As Long
oSrc = oEventObj.Source
oSrcModel = oSrc.Model
scrollRatio = oEventObj.Value/oSrcModel.ScrollValueMax
oContx = oSrc.Context
oContxModl = oContx.Model
oLbl1 = oContx.getControl("Label1")
oLbl1Model = oLbl1.Model
REM on initialization remember the position of the label
If bInit = False Then
bInit = True
PositionLbl1Y0 = oLbl1Model.PositionY
End If
oLbl1Model.PositionY = PositionLbl1Y0 - (scrollRatio * oContx.Size.Height)
End Sub
L'exemple fourni par le SDK ne s'exécute pas sur ma configuration, mais les principes sont sains.
Il semble y avoir une deuxième méthode improvisée plus proche de la fonctionnalité que l'on pourrait attendre. Cette méthode utilise la propriété DialogModel.scrollTop
. La propriété semble parcourir la totalité de la boîte vers le haut ou vers le bas comme un défilement basé sur l'entrée de l'utilisateur. Cependant, il existe deux problèmes d'utilisation de cette méthodologie. Tout d'abord, sauf si vous placez la barre de défilement à un autre endroit, la barre de défilement défile avec le reste de la page. Vous devrez ajuster l'emplacement de la barre de défilement précisément pour compenser/annuler le défilement de la page entière.Dans l'exemple ci-dessous j'ai essayé mais je n'ai pas perfectionné ceci. Deuxièmement, la propriété semble manquer des entrées avec la fréquence et sort facilement de l'alignement/entre dans un état inadapté. Peut-être que vous pouvez surmonter ces limitations. Voici l'exemple, en s'appuyant sur la même configuration décrite ci-dessus. Ce (sorte de) fera défiler le contenu de la boîte de dialogue entière, dans les limites et avec les mises en garde notées ci-dessus.
> "Il semble y avoir des propriétés sur l'objet de dialogue" Où se trouvent ces propriétés? En regardant dedans je n'en trouve aucun dans l'éditeur de dialogue de base ou dans la documentation de l'API. Peut-être que vous le confondez avec les propriétés d'un formulaire? – ngulam
@ngulam Je ne sais pas pourquoi vous ne pouvez pas le voir. Je peux voir ceux-ci dans l'éditeur de dialogue. J'utilise LO 5.0.0.5 (x64) – Beemen
Mon mauvais - regardé à la mauvaise version. LO l'a dans la version 4.3 et 5.0.0.5, désolé pour la perturbation. – ngulam