Czy istnieje opcja automatycznego przewijania tekstu [SOLVED

Użytkowanie edytora dokumentów
namini
Posty: 151
Rejestracja: czw lut 16, 2012 10:50 pm

Czy istnieje opcja automatycznego przewijania tekstu [SOLVED

Post autor: namini »

Chciałem nagrać na kamerę film a podczas nagrywania chciałem z ekranu czytać tekst, jednak w tracie nagrywania nie mogę podchodzić do komputera aby myszką przesuwać tekst, dlatego chciałem zapytać czy jest opcja abym nastawił sobie jakąś szybkość i tekst sam przesuwałby się, pokazując kolejne zdania i kolejne strony tekstu. Korzystam z LibreOffice. Wielkie dzięki.
Ostatnio zmieniony czw gru 19, 2019 2:49 pm przez namini, łącznie zmieniany 1 raz.
OpenOffice.org. 3.3.0. Apple - OS X
Jan_J
Posty: 4579
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Czy istnieje opcja automatycznego przewijania tekstu?

Post autor: Jan_J »

Gotowego nie ma, ale można napisać makro.
Albo czytać z innego źródła ;|

Przykład jest dość prymitywny i pewnością powinien zostać dostosowany do potrzeb, ale w tym kierunku warto dalej iść:

Kod: Zaznacz cały

sub przewijaj()
	dt = 20 ' czas w tysięcznych częściach sekundy
	d = thisComponent
	c = d.getCurrentController()
	v = c.getViewCursor()
	v.GoToStart(0)
	res = true
	do while (res = true)
		res = v.goRight(1, 0)
		rem albo res = v.goDown(1, 0)
		wait(dt)
	loop
end sub
Wstaw ten kod do narzędzia/Makro/Basic/Zarządzaj
Otwórz dokument i wywołaj Narzędzia/Makro/Basic/Uruchom/ ten właśnie kod

Więcej o ViewCursor:
https://www.openoffice.org/api/docs/com ... ursor.html
https://wiki.openoffice.org/wiki/Writer/API/View_cursor
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
namini
Posty: 151
Rejestracja: czw lut 16, 2012 10:50 pm

Re: Czy istnieje opcja automatycznego przewijania tekstu?

Post autor: namini »

Dziękuję Jan. Znalazłem juz inny sposób. Ciekaw byłem też czy po latach nadal forum to jest najlepsze jeśli chodzi o pomoc na jaką można liczyć. Znów mile się zaskoczyłem. Dziękuję.
OpenOffice.org. 3.3.0. Apple - OS X
Awatar użytkownika
Jermor
Posty: 2352
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy istnieje opcja automatycznego przewijania tekstu?

Post autor: Jermor »

Byłoby fajnie, gdybyś napisał jaki to sposób.
Nie mam Maca, ale być może jest to coś analogicznego do tego co funkcjonuje w oprogramowaniu myszy w Windows. Kliknięcie kółka na myszy (tak, można to zrobić, choć wiele osób o tym nie wie) wyzwala charakterystyczny symbol w miejscu kliknięcia, zawierający strzałki, przesunięcie myszki w wybranym kierunku rozpoczyna samodzielny proces przewijania ekranu. Odległość przesunięcia myszki decyduje o szybkości przewijania.
Co do makra zaproponowanego przez @Jan_J napisałem także takowe. Działa jednak inaczej. Zaczynając od początku dokumentu zmienia na określony czas style kolejnych akapitów . Po upływie tego czasu akapity mają przywrócony swój poprzedni styl.
Po uruchomieniu użytkownik jest proszony o podanie nazwy stylu jaki ma zostać zastosowany do prezentowania tekstu. Musi to być styl z dostępnych w Writerze np. "Nagłówek 4" albo utworzony własny. Dwa następne parametry to wartości liczbowe określające jak długo ma być wyświetlany wyróżniany tekst. Pierwszy dotyczy zmiennej długości tego czasu. Należy podać czas jaki w przybliżeniu potrzebny jest na odczytanie 10 znaków. Jeśli zostanie podany to akapit jest wyróżniany przez czas zależny od jego długości. Drugi parametr to możliwość podania stałej liczby sekund przez jaką będzie wyróżniany każdy akapit. Po podaniu parametrów przez 5 sekund nie jest wykonywana żadna akcja. Makro składa się z dwóch podprogramów "Przewijaj2" (to ten należy uruchomić) i "NextPar". Ten drugi to nagrane przeniesienie kursora do następnego akapitu. Nie potrafiłem sam tego napisać.
Aby najlepiej wykorzystać możliwości makra, warto wywoływać je przy zastosowanym widoku "Sieć Web" gdyż wtedy nie pojawiają się podziały stron oraz marginesy. Warto też przywrócić akapitom standardowe parametry. Makro nie radzi sobie z wstawionymi tabelkami, nie wyświetla ich oraz -- jeśli są -- może nie pokazać na ekranie części dokumentu, gdyż kursor "widzialny" przechodzi przez pozycje tabelki, natomiast kursor tekstowy ją pomija. Program jest trudny do zatrzymania, gdyż wykonuje się w pętli. Aby przetestować działanie warto najpierw uruchomić program ze stałym czasem np 0,5 sek. A parametr zmiennego czasu wypróbować na jakimś krótszym dokumencie.
Na sobie wypróbowałem połączenie obu parametrów, czas zmienny 0,4 oraz czas stały 2.
Oto te makra:

Kod: Zaznacz cały

Sub Przewijaj2
Dim s As String, sStyl as String
Dim oCurs as Variant, vCurs as Variant
Dim sCurStyle As String 
Dim t1 as double, t2 as double
sStyl=InputBox ("Podaj nazwę stylu" , "Przewijanie", "Nagłówek 3")
t1= Cdbl(InputBox("Podaj w sekundach czas potrzebny na przeczytanie dziesięciu znaków", "Zmienny czas wyświetlania",0))
t2= Cdbl(InputBox("Podaj w sekundach wymagany czas wyświetlania akapitu", "Stały czas wyświetlania",0))
Wait(5000)
oCurs = ThisComponent.Text.CreateTextCursor()
vCurs= ThisComponent.getCurrentController.getViewCursor()
oCurs.GoToStart(False)
vCurs.GoToStart(0)
Do
	If NOT oCurs.gotoEndOfParagraph(True) Then Exit Do
	sCurStyle = oCurs.ParaStyleName
	oCurs.ParaStyleName=sStyl
	i = Len(oCurs.getstart().TextParagraph().string)
	Wait((i/10*t1+t2)*1000)
	oCurs.ParaStyleName=sCurStyle
	NextPar() : NextPar() :vCurs.goUp(1,0)
Loop Until NOT oCurs.gotoNextParagraph(False)
End Sub

sub NextPar()
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:GoToNextPara", "", 0, Array())
end sub
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2352
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Czy istnieje opcja automatycznego przewijania tekstu?

Post autor: Jermor »

Zmodyfikowałem makro Przewijaj2 (nazwałem je Prompter) w taki sposób, że tabela występująca w tekście jest ignorowana. Jej zawartość jest tylko przewijana aż do najbliższego akapitu, od którego rozpoczyna się dalsze działanie procedury. Poprawiona wersja nadal korzysta z procedury NextPar() występującej w poprzedniej wersji.
Wystarczy w module biblioteki zastąpić makro Przewijaj2 makrem Prompter.
Dnia 19.12.2019 wstawiłem kolejną poprawioną wersję. Poprawki dotyczą wykrywania błędów, np. niepodania wartości liczbowej, albo podania nazwy stylu, który nie istnieje. Ponadto zmieniłem sposób określania tempa wyróżniania akapitów. Obecnie jest ono określane na podstawie czasu w jakim użytkownik przeczyta testowy tekst. Czas należy zmierzyć samodzielnie.
Z zaskoczeniem też przyjąłem fakt, że jedna z właściwości kursora tekstowego, Text.Paragraph(), nie jest obsługiwana w Basicu Apache OpenOffice w związku z czym to makro wywala się w tej aplikacji.
Poniżej kompletny, poprawiony zestaw makr.

Kod: Zaznacz cały

Sub Prompter
REM Procedura wyróżnia przez określony czas kolejne akapity dokumentu 
REM wyświetlając je w wybranym stylu. Czas wyświetlania zależy od długości akapitu
REM i czasu stałego, określonego przez użytkownika.
REM Autor: Jermor, polskie forum Apache OpenOffice i LibreOffice (2019)
Dim s As String, sStyl as String
Dim oCurs as Variant, vCurs as Variant
Dim sCurStyle As String 
Dim t1 as double, t2 as double
On Local Error GoTo Styles
Const test="Samolot sił powietrznych USA obserwował Koreę Północną z ogromnej wysokości." &_
" Obecność maszyny szpiegowskiej EP-3E nad Półwyspem Koreańskim została potwierdzona." & _
" Media donoszą, że armia USA obserwowała działania wojsk Kim Dzong Una."
Const komunikat1 = "Za chwilę zostanie wyświetlony przykład tekstowy złożony z 231 znaków. Przeczytaj go w tempie, w jakim " &_
"chcesz czytać swój dokument i zanotuj czas trwania tego eksperymentu."
Const Komunikat2="Ten czas, wyrażony w sekundach, podaj jako parametr do obliczenia tempa czytania w kolejnym parametrze. " &_
"Na tej podstawie program obliczy jak długo powinien wyróżniać kolejne akapity czytanego tekstu."
Const komunikat3="Pamiętaj, że jest to czas szacowany. Rzeczywisty czas potrzebny na czytanie" &_
" zależy także od składni tekstu, złożoności zdań czy stosowanej intonacji. " &_
"Dlatego będziesz mógł określić dodatkowy stały czas, który będzie dodawany do czasu zmiennego."
MsgBox (komunikat1 &chr(10) & komunikat2 & chr(10) & chr(10) & komunikat3,,"Prompt: Komunikat")
MsgBox (test,,"Prompt: Tekst przykładowy") 

s = InputBox("Podaj w sekundach czas potrzebny do określenia tempa czytania", "Prompter: Zmienny czas wyświetlania",0)
If len(s)=0 Then Exit Sub
t1 = Cdbl(s)
s = InputBox("Podaj w sekundach wymagany czas wyświetlania akapitu", "Prompter: Stały czas wyświetlania",0)
If len(s)=0 Then Exit Sub
t2=Cdbl(s)
sStyl=InputBox ("Podaj nazwę stylu (rozróżniana jest wielkość liter)" & chr(10) & chr(10) &_
 "Po zatwierdzeniu nazwy nastąpi 5 sekund zwłoki przed rozpoczęciem działania." , "Prompter: Sposób wyróżniania", "Nagłówek 3")
If len(sStyl)=0 Then
	MsgBox ("Nie podano nazwy stylu." & chr(10) & "Działanie zostanie zakończone.",16,"Prompter: Styl wyróżnienia")
	Exit Sub
End If
Wait(5000)
oCurs = ThisComponent.Text.CreateTextCursor()
vCurs= ThisComponent.getCurrentController.getViewCursor()
oCurs.GoToStart(False)
vCurs.GoToStart(0)
Do
	If NOT oCurs.gotoEndOfParagraph(True) Then Exit Do 
	sCurStyle = oCurs.ParaStyleName 
	oCurs.ParaStyleName=sStyl 
	i = Len(oCurs.getstart().TextParagraph().string) 'Właściwość TextParagraph nie występuje w Basicu Apache OpenOffice 4.1.7
	Wait((i/len(test)*t1+t2)*1000)
	oCurs.ParaStyleName=sCurStyle 
	NextPar()
	Do While NOT IsEmpty(vCurs.TextTable)
		NextPar()
	Loop
	NextPar()
	vCurs.goUp(1,0)
Loop Until NOT oCurs.gotoNextParagraph(False) 
Exit Sub
Styles:
If NOT IsNumeric(s) Then
	MsgBox ("Czas w sekundach." & chr(10) & "Nie wpisałeś liczby!",16,"Błąd parametrów.")
	Exit Sub
End If

MsgBox ("Nie ma w systemie stylu " & sStyl,16, "Błąd parametrów.")
End Sub
sub NextPar()
rem Makro zarajestrowane przez nagrywanie
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:GoToNextPara", "", 0, Array())
end sub
Ostatnio zmieniony pt gru 20, 2019 4:21 pm przez Jermor, łącznie zmieniany 2 razy.
Powód: Poprawiłem i rozbudowałem algorytm.
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
namini
Posty: 151
Rejestracja: czw lut 16, 2012 10:50 pm

Re: Czy istnieje opcja automatycznego przewijania tekstu?

Post autor: namini »

Dziękuję Jan. Podziwiam Twoją wiedzę.
OpenOffice.org. 3.3.0. Apple - OS X
Jan_J
Posty: 4579
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Czy istnieje opcja automatycznego przewijania tekstu?

Post autor: Jan_J »

namini pisze:Dziękuję Jan
@Jan_J != @Jermor
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ