Listener ukrywania wierszy

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
s1w_
Posty: 7
Rejestracja: śr mar 22, 2017 6:27 pm

Listener ukrywania wierszy

Post autor: s1w_ »

Potrzebuję oprogramować Listener do wykrywania zmian właściwości isVisible dla wierszy skoroszytu calc.

XEventListener ani XModifyListener nie wykrywają tych zmian

Kod: Zaznacz cały

Sub add_eventsListener
	Dim ePrefix As String, eService As String
	'oMouseCurrCont = ThisComponent.CurrentController
	
	ePrefix = "event_"
	eService = "com.sun.star.document.XEventListener"
	
	If IsNull(mEventHandler) Then
		mEventHandler = CreateUnoListener(ePrefix, eService)
		ThisComponent.addEventListener(mEventHandler)
	EndIf
End Sub

Sub event_notifyEvent(oEvent)
msgbox "event: " & oEvent.EventName 

End Sub
LibreOffice 5.0.4.2 na Windows 7
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Listener ukrywania wierszy

Post autor: belstar »

Krótkie śledztwo wykazało że może być problem, choć gwarancji nie daję.
Jedyne co mogę ci zaproponować to rozwiązanie problemu na około.
Gdzieś na forum (poszukaj sobie) wstawiłem plik z przykładem "suma_wg_koloru_komórki". Jest tam wśród wielu funkcji też funkcja UDF o nazwie CELL_VISIBLE(), zaimplementuj sobie ją gdzieś w głębokich otchłaniach arkusz, a listener dodaj na te komórki gdzie zwraca ona wynik swojego działania. Wynikiem jest 1 gdy komórka jest widoczna, także gdy wynik funkcji się zmieni, listener to wychwyci i uruchomi twoją procedurę. W przykładzie wywołanie funkcji jest otoczone funkcją JEŻELI() a to po to bo Calc sam z siebie nie przelicza funkcji CELL_XXX automatycznie.
I mała uwaga, w przykładzie funkcja JEŻELI() sprawdza czy TERAZ() = TERAZ(), kiedyś po dyskusji z Jan_J doszliśmy do bezpieczniejszego rozwiązania, mianowicie TERAZ() > 0. Także zastosuj poniższą formułę:

Kod: Zaznacz cały

=JEŻELI(TERAZ()>0;CELL_VISIBLE(ARKUSZ();WIERSZ(A1);KOLUMNA(A1));"")
LibreOffice 5.1.2.2 Ubuntu 16 LTS
s1w_
Posty: 7
Rejestracja: śr mar 22, 2017 6:27 pm

Re: Listener ukrywania wierszy

Post autor: s1w_ »

Jest to jakieś rozwiązanie, nie wiem czy kosztowo opłacalne (obliczanie funkcji basic z komórki robiło widoczne spowolnienie)

Hmm potrzebowałem tego do notyfikacji, czy wbudowany autofiltr został użyty <- korzystanie z niego nie robi eventow, też nie doszukałem się adekwatnego Listenera :/

ps. świetny pomysł z tą formułą, przyda się w wielu innych rzeczach
LibreOffice 5.0.4.2 na Windows 7
s1w_
Posty: 7
Rejestracja: śr mar 22, 2017 6:27 pm

Re: Listener ukrywania wierszy

Post autor: s1w_ »

Eureka! Mimo że nie osiągnąłem rezultatu z czystego BASIC'a, znalazłem genialną formułę, która się odnosi bezpośrednio do autofiltra!! i updateuje bez obejścia:

Kod: Zaznacz cały

"=SUBTOTAL(3;A2:A" & getLastRow(Sheet) + 1 & ")"
gdyby nie podpowiedź nie znalazłbym tego rozwiązania, także dzięki!

PL:

Kod: Zaznacz cały

=SUMY.CZĘŚCIOWE(3;A2:A100)
https://wiki.openoffice.org/wiki/Docume ... L_function
LibreOffice 5.0.4.2 na Windows 7
ODPOWIEDZ