Zamykanie arkusza po określonym czasie bezczynności

Makropolecenia i funkcje w języku Basic
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Zamykanie arkusza po określonym czasie bezczynności

Post autor: Jan_J »

(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

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 (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ