Zamykanie arkusza po określonym czasie bezczynności

Makropolecenia i funkcje w języku Basic

Zamykanie arkusza po określonym czasie bezczynności

Postprzez Jan_J » Wt lip 03, 2012 12:20 pm

(W związku z http://openoffice.pl/forum.php?a=tree&id=6149)

Jeżeli potrafimy powiedzieć, co rozumiemy przez “bezczynność” sesji dokumentu, to da się wymusić jej zamknięcie po upływie określonego czasu “bezczynności”.

W poniższym studium bezczynność oznacza brak aktywności klawiatury (naciskanie/zwalnianie klawiszy) oraz myszki (naciskanie/zwalnianie przycisków). Nie obejmuje natomiast innych zdarzeń, takich jak: poruszanie myszką (niezależnie od stanu klawiszy), przytrzymywanie wciśniętego klawisza, operacji na menu i oknach dialogowych, a także pracy na dokumentach wykorzystujących bieżący dokument. Ani też działalności nieinteraktywnej (dostęp zdalny albo działanie makra na dokumencie). Część tego wszystkiego da się dość łatwo określić i dokonfigurować, część wymaga namysłu.

Czas życia sesji dokumentu (w sekundach) jest zadany w stałej maxTime.
Dla celów demonstracyjnych w komórce A1 pierwszego arkusza wyświetlany jest czas, jaki pozostał do zamknięcia sesji. Zakomentowanie lub usunięcie tej instrukcji jest wskazane.

Aktywne śledzenie czasu rozpoczyna się z chwilą uruchomienia procedury nazwanej start(). Z poziomu zarządzania dokumentem można zlecić jej automatyczne uruchomienie w chwili załadowania dokumentu: Narzędzia→Dostosuj→Zdarzenia→Otwórz dokument→Makro→.... start()

Kod: Zaznacz cały   Rozszerz widokZwiń widok
global idleTime
const maxTime = 60

sub start()
  idleTime = 0
  c = thisComponent.CurrentController
  c.addKeyHandler(CreateUnoListener("reset_", "com.sun.star.awt.XKeyHandler") )
  c.addMouseClickHandler(CreateUnoListener("reset_", "com.sun.star.awt.XMouseClickHandler"))
  run_timer(maxTime)
end sub

sub run_timer(dt)
  do
    thisComponent.Sheets.getByIndex(0).getCellbyposition(0,0).Value = dt - idleTime
    idleTime = idleTime + 1
    wait 1000
    if idleTime >= dt then
       finalize()
       exit do
    end if
  loop while 1
end sub

sub finalize()
  thisComponent.store()
  thisComponent.close(true)
end sub

function reset_keyPressed(event) as boolean
  idleTime = 0
  reset_keyPressed = false
end function

function reset_keyReleased(event) as boolean
  idleTime = 0
  reset_keyReleased = false
end function

function reset_mousePressed(event) as boolean
  idleTime = 0
  reset_mousePressed = false
end function

function reset_mouseReleased(event) as boolean
  idleTime = 0
  reset_mousePressed = false
end function


Całość, z wyjątkiem wizualizacji w komórce, da się wprost zastosować w innych typach dokumentów (Open|Libre)Office'a.

Funkcja Wait gwarantuje wstrzymanie pracy na określony czas, ale cała procedura nie gwarantuje synchronizacji wywołań z zegarem. Tak że dokładność pomiaru upływu czasu jest problematyczna.

Większą precyzję (choć nie regularność wywołań) uzyskamy, wykorzystując odczyt zegara systemowego -- w Basicu funkcja timevalue(time()) zwraca czas w dobach -- zamiast powiększania stanu zmiennej o 1.
JJ
LO Still (6.2) ∙ AOO 4.1.7 ∙ Python (3.7|2.7) ∙ Unicode 12 ∙ LATEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Fedora|CentOS|SUSE)
Jan_J
 
Posty: 3975
Dołączył(a): Pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Powrót do Basic

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość