🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Befehl für Scrollen gesucht

Alles zur Programmierung im LibreOffice.
mikele
* LO-Experte *
Beiträge: 1932
Registriert: Mo 1. Aug 2011, 20:51

Re: Befehl für Scrollen gesucht

Beitrag von mikele » Fr 6. Feb 2015, 13:05

Hallo,

soweit ich bisher fündig geworden bin, gibt es für deinen Wunsch i. A. keine einfache Lösung.

Fall1) du willst eine Seite hoch-/herunterscrolllen

Code: Alles auswählen

ThisComponent.CurrentController.ViewCursor.screenDown() 'bzw. .screenUp()
Fall2) du willst um einen bestimmenten Wert hoch-/herunterscrolllen
Dazu gibt es (meines Wissen) keinen einfachen Zugang.
Hier http://www.oooforum.org/forum/viewtopic.phtml?t=28594
habe ich einen Variante gefunden, um per Makro Zugriff auf die Scrollbar zu bekommen - aber das ist schon ganz schön heftig.

Der Hintergrund scheint mir zu sein, dass das Scrollen (die Scrollbar) davon abhängig ist, inwieweit der Inhalt eines Fensters in das Fenster passt. Es kann durchaus sein, dass gar keine oder eine horizontale und vertikale Scrollbar da ist. Insofern muss das Makro erst einmal suchen, ob eine horizontale Scrollbar da ist, und sie dann verschieben.

Kurz: Es geht, aber ...

Aber vielleicht gibt es ja auch noch einen eleganteren Weg.
Gruß,
mikele

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Befehl für Scrollen gesucht

Beitrag von karolus » Fr 6. Feb 2015, 13:48

Hallo

..screenDown() bewegt zunächst nur den Viewcursor um ~einen Bildschirminhalt nach unten, das Scrollen beruht auf dem Nebeneffekt das der Cursor weiterhin im sichtbaren Bereich bleibt.

Vielleicht so:

Code: Alles auswählen

def scrolldown(*_):
    doc = XSCRIPTCONTEXT.getDocument()
    ctrl =doc.CurrentController
    cursor = ctrl.ViewCursor    
    a = cursor.Position.Y
    cursor.goDown(1,False)
    b = cursor.Position.Y
    height = b-a
    cursor.goUp(1, False)
    viewdata = ctrl.ViewData
    data = [int(sval) for sval in viewdata.split(';')]
    data[4] += height
    data[6] += height
    sdata = ';'.join('%s' % val for val in data)
    ctrl.restoreViewData(sdata) 
Da wird etwas umständlich ``der Abstand in pixeln`` zwischen zwei Zeilen ermittelt ( height hier bei mir für normale Standard -zeilen ~490)
je nach System und Bildschirmauflösung kommen da vmtl. sehr unterschiedliche Werte raus, wenn wir aber zur Vereinfachung mal pauschal den Wert 1000 eintragen, vereinfacht das obiges zu:

Code: Alles auswählen

def scrolldown(*_):
    height = 1000 #pauschal ca. 2 Zeilen
    doc = XSCRIPTCONTEXT.getDocument()
    ctrl =doc.CurrentController
    viewdata = ctrl.ViewData
    data = [int(sval) for sval in viewdata.split(';')]
    data[4] += height
    data[6] += height
    sdata = ';'.join('%s' % val for val in data)
    ctrl.restoreViewData(sdata) 
scroll_Test.odt
testdatei mit Pythonscript
(86.11 KiB) 232-mal heruntergeladen
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

mikele
* LO-Experte *
Beiträge: 1932
Registriert: Mo 1. Aug 2011, 20:51

Re: Befehl für Scrollen gesucht

Beitrag von mikele » Fr 6. Feb 2015, 15:20

Hallo,

@Karolus: irgendwie hatte ich viewdata im Verdacht, scheiterte aber an fehlendem Wissen über den Aufbau

Auf meinem Link habe ich mal eine Varinate über den Zugriff auf die Scrollbar gebastelt (nur an einem einfachen Text getestet). Vielleicht kann es ja mal jemand gebrauchen.

Code: Alles auswählen

sub scrollen(n as long)
	'n>0 bedeutet nach unten scrollen
	'n<0 bedeutet nach oben scrollen	
	oBar=getscrollbar()
	modus=1 'nach unten scrollen
	if not(isempty(oBar)) then
		if n<0 then modus=0 'nach oben scrollen
		for k=0 to abs(n)
			oBar.doAccessibleAction(modus)
		next
	end if
end sub

function getScrollbar() as Any

	oAC = ThisComponent.CurrentController.Frame.ComponentWindow.AccessibleContext
	lRole=com.sun.star.accessibility.AccessibleRole.SCROLL_PANE 
	for k=0 to oAC.AccessibleChildCount-1 
		oACChild = oAC.getAccessibleChild(k).AccessibleContext 
		if oACChild.AccessibleRole = lRole then oACScrollPane = oACChild 
	next k 
	lRole=com.sun.star.accessibility.AccessibleRole.SCROLL_BAR
	lType=com.sun.star.accessibility.AccessibleStateType.VERTICAL 'com.sun.star.accessibility.AccessibleStateType.HORIZONTAL
	for k=0 to oACScrollPane.AccessibleChildCount-1 
		oACChild = oACScrollPane.getAccessibleChild(k) 
		if oACChild.AccessibleContext.AccessibleRole = lRole then 
			oSize = oACChild.Size 
			if oACChild.AccessibleContext.AccessibleStateSet.contains(lType) then
				getScrollbar = oACChild.AccessibleContext 
				exit function 
			endif 
		endif 
	next k  

end function 
Jeder "Scrollschritt" entspricht dabei (in etwa) einem Klick auf die Scrollpfeile.
Gruß,
mikele

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Befehl für Scrollen gesucht

Beitrag von karolus » Fr 6. Feb 2015, 18:22

Hallo

@mikele
Die API von Office ist manchmal grausam.

Ich hab mal versucht die metertiefe statische Verschachtelung in deinem Code mit Python-mitteln zu bändigen:

Code: Alles auswählen

from com.sun.star.accessibility.AccessibleRole import SCROLL_PANE, SCROLL_BAR
from com.sun.star.accessibility.AccessibleStateType import VERTICAL 


def access_context_by_role(parent , role, nrole=None):
    for i in range(parent.AccessibleChildCount):
        candidat = parent.getAccessibleChild(i).AccessibleContext
        if candidat.AccessibleRole != role:
            continue
        if nrole:
            return access_context_by_role(candidat, nrole)
        return candidat
    
def main(*_): 
    UP, DOWN = 0, 1
    COUNT = 5
    doc = XSCRIPTCONTEXT.getDocument()
    acc = doc.CurrentController.ComponentWindow.AccessibleContext
    scroll = access_context_by_role(acc, SCROLL_PANE, SCROLL_BAR)
    if scroll.AccessibleStateSet.contains(VERTICAL):
        for _ in range(COUNT):
            scroll.doAccessibleAction(DOWN) 
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Liblet
Beiträge: 6
Registriert: Di 3. Feb 2015, 01:47

Re: Befehl für Scrollen gesucht

Beitrag von Liblet » Di 10. Feb 2015, 23:42

Ich glaube mir fehlen da etwas die Makro-Programmier-Fähigkeiten.

Die beiden Skripte habe ich nicht zum Laufen gebracht (habe sie einfach in das Makro reinkopiert).

Habe ich da irgendwas falsch gemacht?

Freischreiber
* LO-Experte *
Beiträge: 834
Registriert: Fr 28. Mär 2014, 10:41

Re: Befehl für Scrollen gesucht

Beitrag von Freischreiber » Mi 11. Feb 2015, 16:22

Hallo Liblet,
ohne die Cursor-Position zu verändern
Also ich schreibe sehr viel im Writer, und dafür drehe ich einfach am Mausrad.
Oder soll das eine Automatik werden: Text wird weitergescrollt, wenn eine Zeile voll ist?

Gruß
Freischreiber
Freischreiber nutzt seit 1/2025 LibreOffice Version 7.2.7.2 unter Windows 11 und SplitDB mit HSQL 2.7.4.
Lesenswert: https://wiki.documentfoundation.org/ReleasePlan/de

Liblet
Beiträge: 6
Registriert: Di 3. Feb 2015, 01:47

Re: Befehl für Scrollen gesucht

Beitrag von Liblet » Mi 11. Feb 2015, 16:25

Hallo Freischreiber, vielen Dank für deine Antwort.

Ich würde das Scrollrad gerne auf einen Shortcut der Tastatur legen, weil das beim "Schreibmaschine-Schreiben" einfacher ist.

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2540
Registriert: Fr 10. Dez 2010, 10:01

Re: Befehl für Scrollen gesucht

Beitrag von karolus » Mi 11. Feb 2015, 16:55

Hallo
Die beiden Skripte habe ich nicht zum Laufen gebracht
Welche beiden - es gibt in diesem Thread nicht nur zwei zur Auswahl.

Bei dieser musst du zum testen selbst nur noch einen Shortcut zuweisen. →Extras→Anpassen→Tastatur...
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten