Datei nach Inaktivität des Benutzers/Timeout schließen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Jester
Beiträge: 8
Registriert: Mo, 27.12.2010 10:14

Datei nach Inaktivität des Benutzers/Timeout schließen

Beitrag von Jester »

(das Thema kommt aus viewtopic.php?f=2&t=45592 und sollte wohl besser hierhin)

Hallo, sollte mein Post wegen der vielen Makroquotes zu lang sein, bitte ich um Entschuldigung. Vllt kann mir ja jemand erklären wie man so ne Art Baumstruktur in so ein Posting rein bringt oder sowas wie ein "spoiler-versteck". EDIT: Button "Code" entdeckt! :)

TASK 1:
ich möchte per Makro eine Calc-Datei (mit n Tabellenblättern) automatisch speichern und schließen.
Das ganze soll nach Ablauf eines Timers geschehen.
Der Timeout soll 2 Minuten betragen. Die zwei Minuten sollen jedesmal neu starten wenn etwas im Dokument verändert wird.
Das Makro muss mit öffnen der Datei automatisch starten.
Makrosicherheit "mittel" bzw "niedrig" wird vorrausgesetzt.
Ein kurzer Dialog "Die Anwendung wird in 30 Sekunden beendet." mit einem "Abbrechen" oder "Sitzung verlängern" Button, welcher den Timer neustartet, wäre natürlich super.

Ich habe da was im Officeforum gefunden, vllt gibt das den ein oder anderen Denkanstoß:

Code: Alles auswählen

diesen Code unter DieseArbeitsmappe

Code:

Option Explicit

Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:05"), "Hinweis" ' auf 10 Minuten ändern 00:10:00

End Sub


diese Codes alle in eine (das) UserForm
Code:

Option Explicit

Private Declare Function GetAsyncKeyState Lib "user32" _
(ByVal vKey As Long) As Integer
Private Sub CommandButton1_Click()

UF_Hinweis.Hide

  Application.OnTime Now + TimeValue("00:00:05"), "Hinweis" ' auf 10 Minuten ändern 00:10:00
 
' Schleife wird unterbrochen
  Do
   DoEvents
    If (GetAsyncKeyState(&H1B)) <> 0 Then Exit Do
  Loop Until 1 = 2
 

End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Schließkreuz wird deaktiviert
If CloseMode = 0 Then Cancel = True
 
End Sub

Private Sub Userform_Activate()
'Nach 30 Sekunden wird die Userform geschlossen
    Dim i As Integer
         
    For i = 30 To 0 Step -1
        Application.Wait Now + TimeValue("0:00:01")
        UF_Hinweis.Label2 = i
        DoEvents
    Next
 
   Unload Me
   
Call Schließen
 
End Sub


und diese Codes in ein normales Modul
Code:

Sub Schließen()
Msg = "Diese Datei wird geschlossen"
 ActiveWorkbook.Close savechanges:=True

End Sub

Sub Hinweis()
  UF_Hinweis.Show

End Sub

TASK 2:

Hat jemand Zeit und Lust mir meine Makros mal in "schön" umzuschreiben! :) Dann könnte man das eine oder andere auch dem Forum zugänglich machen.

Code: Alles auswählen

REM  *****  BASIC  *****

Sub checkin
	oDoc = thisComponent
	odoc.store
	
	dim a as double
		oCellCursor = ThisComponent.Sheets().getByName("Stempeluhr").createCursor()
		oCellCursor.GotoEndOfUsedArea(True)
		i = 0
	Do
   		a = ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i).value
   			if i > oCellCursor.getRangeAddress.EndRow then
    			msgbox "Das aktuelle Datum wurde nicht gefunden"
      			exit sub
   			end if
   		i=i+1
		Loop while a <> Fix(DateValue(date))
			oCell =  ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i-1)
			ThisComponent.GetCurrentController.select(oCell)

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 ----------------------------------------------------------------------
	dim args1(1) as new com.sun.star.beans.PropertyValue
		args1(0).Name = "By"
		args1(0).Value = 1
		args1(1).Name = "Sel"
		args1(1).Value = false

		dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args1())

rem ----------------------------------------------------------------------
	dim args2(1) as new com.sun.star.beans.PropertyValue
		args2(0).Name = "By"
		args2(0).Value = 1
		args2(1).Name = "Sel"
		args2(1).Value = false

		dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args2())

   		oZell = thisComponent.getcurrentSelection()
   if not oZell.supportsService("com.sun.star.sheet.SheetCell") then
       msgbox "Bitte nur eine Zelle markieren (aktivieren)!", 48, "Fehler!"
       exit sub
   end if
   oZell.value = now()
   oZell.NumberFormat = 40
   msgbox "Ihre CheckIn-Zeit wurde registriert. Einen schönen Arbeitstag!", 48, "Info!"

End Sub

Sub pausestart
	oDoc = thisComponent
	odoc.store

	dim a as double
		oCellCursor = ThisComponent.Sheets().getByName("Stempeluhr").createCursor()
		oCellCursor.GotoEndOfUsedArea(True)
		i = 0
	Do
  		 a = ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i).value
  	 if i > oCellCursor.getRangeAddress.EndRow then
      msgbox "Das aktuelle Datum wurde nicht gefunden"
      exit sub
   end if
   i=i+1
Loop while a <> Fix(DateValue(date))
oCell =  ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i-1)
ThisComponent.GetCurrentController.select(oCell)

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 ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(1) as new com.sun.star.beans.PropertyValue
args3(0).Name = "By"
args3(0).Value = 1
args3(1).Name = "Sel"
args3(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args3())

   oZell = thisComponent.getcurrentSelection()
   if not oZell.supportsService("com.sun.star.sheet.SheetCell") then
       msgbox "Bitte nur eine Zelle markieren (aktivieren)!", 48, "Fehler!"
       exit sub
   end if
   oZell.value = now()
   oZell.NumberFormat = 40
   msgbox "Ihr Pausenstart wurde registriert. Guten Appetit! ", 48, "Info!"

End Sub

Sub pauseend
	oDoc = thisComponent
	odoc.store
dim a as double
oCellCursor = ThisComponent.Sheets().getByName("Stempeluhr").createCursor()
oCellCursor.GotoEndOfUsedArea(True)
i = 0
Do
   a = ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i).value
   if i > oCellCursor.getRangeAddress.EndRow then
      msgbox "Das aktuelle Datum wurde nicht gefunden"
      exit sub
   end if
   i=i+1
Loop while a <> Fix(DateValue(date))
oCell =  ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i-1)
ThisComponent.GetCurrentController.select(oCell)

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 ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(1) as new com.sun.star.beans.PropertyValue
args3(0).Name = "By"
args3(0).Value = 1
args3(1).Name = "Sel"
args3(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(1) as new com.sun.star.beans.PropertyValue
args4(0).Name = "By"
args4(0).Value = 1
args4(1).Name = "Sel"
args4(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args4())

   oZell = thisComponent.getcurrentSelection()
   if not oZell.supportsService("com.sun.star.sheet.SheetCell") then
       msgbox "Bitte nur eine Zelle markieren (aktivieren)!", 48, "Fehler!"
       exit sub
   end if
   oZell.value = now()
   oZell.NumberFormat = 40
   msgbox "Ihr Pausenende wurde registriert. Weiterhin viel Erfolg! ", 48, "Info!"

End Sub

Sub checkout
	oDoc = thisComponent
	odoc.store
dim a as double
oCellCursor = ThisComponent.Sheets().getByName("Stempeluhr").createCursor()
oCellCursor.GotoEndOfUsedArea(True)
i = 0
Do
   a = ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i).value
   if i > oCellCursor.getRangeAddress.EndRow then
      msgbox "Das aktuelle Datum wurde nicht gefunden"
      exit sub
   end if
   i=i+1
Loop while a <> Fix(DateValue(date))
oCell =  ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i-1)
ThisComponent.GetCurrentController.select(oCell)

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 ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(1) as new com.sun.star.beans.PropertyValue
args3(0).Name = "By"
args3(0).Value = 1
args3(1).Name = "Sel"
args3(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(1) as new com.sun.star.beans.PropertyValue
args4(0).Name = "By"
args4(0).Value = 1
args4(1).Name = "Sel"
args4(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(1) as new com.sun.star.beans.PropertyValue
args5(0).Name = "By"
args5(0).Value = 1
args5(1).Name = "Sel"
args5(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args5())

   oZell = thisComponent.getcurrentSelection()
   if not oZell.supportsService("com.sun.star.sheet.SheetCell") then
       msgbox "Bitte nur eine Zelle markieren (aktivieren)!", 48, "Fehler!"
       exit sub
   end if
   oZell.value = now()
   oZell.NumberFormat = 40
   msgbox "Ihr Checkout wurde registriert. Vielen Dank und einen schönen Feierabend! ", 48, "Info!"

End Sub

sub deletselected
	oDoc = thisComponent
	odoc.store
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 ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "Flags"
	args1(0).Value = "SVDFN"

		dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args1())

	msgbox "Die Löschung wird unter Angabe Ihrer Personal ID an den Administrator gemeldet!", 48, "Zeit wurde gelöscht!"

end sub

sub resetsaveexit
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 ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "ToPoint"
	args1(0).Value = "$A$12"

		dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

	oDoc = thisComponent
	odoc.store
	odoc.close(true)

end sub

Sub ProtectCurrentSheets()
	oDoc = thisComponent
	odoc.store
	Dim oDocument as Object
	Dim sDocType as String
	Dim iResult as Integer
	Dim oSheets as Object
	Dim i as Integer
	Dim bDoProtect as Boolean
		oDocument = StarDesktop.ActiveFrame.Controller.Model
		sDocType = GetDocumentType(oDocument)
		If sDocType = "scalc" Then
			oSheets = oDocument.Sheets
			bDoProtect = False
			For i = 0 To oSheets.Count-1
				If Not oSheets(i).IsProtected Then
					bDoProtect = True
		End If
		Next i
		If bDoProtect Then
			iResult = Msgbox( "Sollen alle Arbeitsblätter geschützt werden?",35, GetProductName())
			If iResult = 6 Then
				ProtectSheets(oDocument.Sheets)
			End If
		End If
	End If
End Sub

Sub Save

	oDoc = thisComponent
	odoc.store
	
End Sub

sub undo
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:Reload", "", 0, Array())


end sub

Sub gototoday
dim a as double
oCellCursor = ThisComponent.Sheets().getByName("Stempeluhr").createCursor()
oCellCursor.GotoEndOfUsedArea(True)
i = 0
Do
   a = ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i).value
   if i > oCellCursor.getRangeAddress.EndRow then
      msgbox "Das aktuelle Datum wurde nicht gefunden"
      exit sub
   end if
   i=i+1
Loop while a <> Fix(DateValue(date))
oCell =  ThisComponent.Sheets().getByName("Stempeluhr").getCellByPosition(0,i-1)
ThisComponent.GetCurrentController.select(oCell)

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 ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "By"
args1(0).Value = 1
args1(1).Name = "Sel"
args1(1).Value = false

dispatcher.executeDispatch(document, ".uno:GoRight", "", 0, args1())

end sub

Danke und Gruß, Jester
Jester
Beiträge: 8
Registriert: Mo, 27.12.2010 10:14

Re: Datei nach Inaktivität des Benutzers/Timeout schließen

Beitrag von Jester »

TASK 3

Schade dass die Suche nicht funtzt, allerdings brachte google für Calc auch kein Ergebnis. Daher mein Anliegen wie folgt:

1. Ich habe eine Zelle ausgewählt. Der Zellwert x (x ist Element von Z) soll dann um 1 erhöht werden.
2. Ich habe eine Zelle ausgewählt. Der Zellwert x (x ist Element von Z) soll dann um 1 vermindert werden.

Beides als Makro zum auf Button packen! :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Datei nach Inaktivität des Benutzers/Timeout schließen

Beitrag von DPunch »

Aloha
Jester hat geschrieben:TASK 1:
(...)
Der Timeout soll 2 Minuten betragen. Die zwei Minuten sollen jedesmal neu starten wenn etwas im Dokument verändert wird.
(...)
Ein kurzer Dialog "Die Anwendung wird in 30 Sekunden beendet." mit einem "Abbrechen" oder "Sitzung verlängern" Button, welcher den Timer neustartet, wäre natürlich super.
(...)
Siehe Beispiel
Jester hat geschrieben:TASK 2:
Hat jemand Zeit und Lust mir meine Makros mal in "schön" umzuschreiben! :)
Ich gehe einfach mal davon aus, dass diese Frage (mit Ausrufezeichen) nicht ernst gemeint ist. 8)
Jester hat geschrieben:TASK 3:
1. Ich habe eine Zelle ausgewählt. Der Zellwert x (x ist Element von Z) soll dann um 1 erhöht werden.
2. Ich habe eine Zelle ausgewählt. Der Zellwert x (x ist Element von Z) soll dann um 1 vermindert werden.
Ich weiss zwar nicht, was genau Du jetzt mit "x ist Element von Z" meinst, aber prinzipiell geht das so

Code: Alles auswählen

	oDoc = thisComponent
	oSel = oDoc.CurrentSelection
	If oSel.supportsService("com.sun.star.sheet.SheetCell") Then
		oSel.Value = oSel.Value + 1
	Else
		MsgBox "Bitte einzelne Zelle auswählen"
	End If
Dateianhänge
Timer.ods
(11.41 KiB) 263-mal heruntergeladen
Jester
Beiträge: 8
Registriert: Mo, 27.12.2010 10:14

Re: Datei nach Inaktivität des Benutzers/Timeout schließen

Beitrag von Jester »

DPunch, du bist mal sau gut! =)

Alles so wie ich mir das vorgestellt habe, SUUUPER! Vielen Dank.

Und die Sache mit dem "meine Makros schön schreiben" war mehr oder weniger ernst gemeint.
Mit dem Posting der Makros wollte ich meinen Teil zum Forum beitragen. Ich denke aber dass da das ein oder andere drin ist was man noch ordentlich schreiben könnte um es dann klar strukturiert an andere User weiter zu geben.
Ich bin ja froh das mein Makros laufen und da ich noch nicht so fit in dem Makrozeug bin als das ich das jetzt zerpflücken würde um es ordentlich zu schreiben. Dann läufts nämlich nicht mehr...habs getestet! ;)

Nochmal viiiiiiiel Danke! Gruß, Jester
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Datei nach Inaktivität des Benutzers/Timeout schließen

Beitrag von Stephan »

Ich bin ja froh das mein Makros laufen und da ich noch nicht so fit in dem Makrozeug bin als das ich das jetzt zerpflücken würde um es ordentlich zu schreiben.
Wenn das so ist syolltest Du einmal erklären wie Du überhaupt darauf kommst das etwas 'ordentlich geschrieben' werden müßte. Meiner Meinung nach wäre dafür nämlich Vorrausetzung die Makros zu verstehen um überhaupt erstmal zu wissen das etwas 'unordentlich' geschrieben ist.


Gruß
Stephan
Jester
Beiträge: 8
Registriert: Mo, 27.12.2010 10:14

Re: Datei nach Inaktivität des Benutzers/Timeout schließen

Beitrag von Jester »

Stephan hat geschrieben:
Wenn das so ist syolltest Du einmal erklären wie Du überhaupt darauf kommst das etwas 'ordentlich geschrieben' werden müßte. Meiner Meinung nach wäre dafür nämlich Vorrausetzung die Makros zu verstehen um überhaupt erstmal zu wissen das etwas 'unordentlich' geschrieben ist.
Einige Teile sind ja mit dem Makrorecorder entstanden. Den kann man wohl immer etwas kürzen wenn ich das richtig verstanden habe. Sowas meine ich mit "unordentlich". Ich weiß z.b. nicht was ich bei so nem Macrorecorder alles rauswerfen kann.
Weiterhin wander ich ja in einer Spalte um mehrere Zellen nach rechts. Das habe ich derzeit so gelöst, indem ich dem Proggy 8mal sage es soll bitte 1 mal nach rechts gehen. Sowas kann man ja vllt auch kürzen indem man sagt "gehe x zellen nach rechts".

Wie gesagt: Mir ist das so wie es ist recht, aber vllt für andere etwas unverständlich.
Jester
Beiträge: 8
Registriert: Mo, 27.12.2010 10:14

Re: Datei nach Inaktivität des Benutzers/Timeout schließen

Beitrag von Jester »

so, ich hab die Zeitsteuerung jetzt in meine Datei eingebaut und noch mit einem Zellschutz Code erweitert.

Meine Datei hat derzeit 8 Tabellenblätter. Auf jedem Tabellenblatt gibt es den Button "Dokument zur Ansicht/Bearbeitung freigeben".
Dieser Button aktiviert dann den Timer und steuert den entsprechenden Blattschutz.

TASK 1:

Was muss ich machen, damit die Steuerung des Blattschutzes immer auf jedes Tabellenblatt angewandt wird?
Ich habe bereits

Code: Alles auswählen

dim aShops()
aShops = Array("Darmstadt", "Gießen", "usw")
oSheet = ThisComponent.Sheets().getByName(aShops)
probiert, da kommt aber nix bei rum.

Derzeit nutze ich folgenden code für den Blattschutz:

Code: Alles auswählen

osheet = thisComponent.getSheets().getByName("Darmstadt")  ' die Tabelle
oSheet.unprotect("meinPasswort")  'Tabellenschutz aufheben mit PW
oZelle = oSheet.getCellrangeByName("D8:AH265")   'Zellbereich
oCellSchutz = oZelle.CellProtection  'das Zellschutzobjekt
oCellSchutz.IsLocked = false   'Zellschutz aufheben
oCellSchutz.IsHidden = false   'Zellinhalt ausblenden
oZelle.CellProtection = oCellSchutz   'Zellschutzobjekt zurückschreiben
oSheet.protect("meinPasswort")   'Tabelle wieder schützen mit PW
TASK 2

Kann ich das Makro so einrichten dass es sich automatisch mit öffnen der Datei ausführt, also dass das Anklicken des Buttons "Dokument zur Ansicht/Bearbeitung freigeben" entfällt?
Alle meine Versuche betreffend Zuweisung des Makros zu Ereignissen wie Dokument geladen, offen etc. schlugen fehl.
Mache ich etwas falsch? Hier nochmal der komplette code:

Code: Alles auswählen

Private Const nTotalRuntime as Integer = 90
Private Const nWarningThreshold as Integer = 10
Private nRunTime as Integer
Private nTimeElapsed as Double
Private bAlreadyFinished as Boolean
Private oDlg as Object
Global oListener as Object

Sub Main
osheet = thisComponent.getSheets().getByName("Darmstadt")
oSheet.unprotect("meinPasswort")
oZelle = oSheet.getCellrangeByName("D8:AH265")
oCellSchutz = oZelle.CellProtection
oCellSchutz.IsLocked = false
oCellSchutz.IsHidden = false
oZelle.CellProtection = oCellSchutz
oSheet.protect("meinPasswort")

	oListener = CreateUnoListener("Modified_", "com.sun.star.util.XModifyListener")
	oDoc = thiscomponent
	oDoc.addModifyListener(oListener)
	StartTimer
End Sub

Sub StartTimer
	CreateDialog
	nRunTime = nTotalRuntime
	bAlreadyFinished = False
	nTimeElapsed = -1.0
	Do While nTimeElapsed < nRunTime	
		nTimeElapsed = nTimeElapsed + 0.5
		nRemaining = CInt(nRunTime - nTimeElapsed)
		If nRemaining < nWarningThreshold+1 Then
			oDlg.getControl("lblRemaining").Text = nRemaining
			oDlg.Visible = True
		Else
			oDlg.Visible = False
		End If
		Wait 500
	Loop
	If bAlreadyFinished Then Exit Sub
	ExitSession
End Sub

Sub CreateDialog
	If NOT isNull(oDlg) Then Exit Sub
	DialogLibraries.loadLibrary("Standard")
	oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)	
	oDlgModel = createUnoService("com.sun.star.awt.UnoControlDialogModel")
	oChk = oDlg.getControl("lblRemaining")
	oDlgModel.insertByName("lblRemaining", oChk.Model)
	oChk = oDlg.getControl("btnExit")
	oDlgModel.insertByName("btnExit", oChk.Model)
	oChk = oDlg.getControl("btnRenew")
	oDlgModel.insertByName("btnRenew", oChk.Model)
	oDlg.setModel(oDlgModel)
End Sub

Sub RenewSession
	nRunTime = nTotalRuntime
	nTimeElapsed = -1
End Sub

Sub ExitSession
	thisComponent.removeModifyListener(oListener)
	nRunTime = 0
	bAlreadyFinished = True
	oDlg.Visible = False
	oDlg.Dispose
	
osheet = thisComponent.getSheets().getByName("Darmstadt") 
oSheet.unprotect("meinPasswort") 
oZelle = oSheet.getCellrangeByName("D8:AH265") 
oCellSchutz = oZelle.CellProtection 
oCellSchutz.IsLocked = true
oCellSchutz.IsHidden = true
oZelle.CellProtection = oCellSchutz 
oSheet.protect("meinPasswort")

	oDoc = thisComponent
	odoc.store
	odoc.close(true)
End Sub

Sub Modified_modified
	RenewSession
End Sub

Sub Modified_disposing

End Sub
Beste Grüße, Jester
Antworten