Aktivitätsanzeige

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

Moderator: Moderatoren

wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Aktivitätsanzeige

Beitrag von wonk »

Hallo,
ich habe ein länger laufendes Script und würde gerne eine "Aktivitätsanzeige" einbauen, die zeigt, daß das Script noch arbeitet. Gibt es dazu eine einfache Idee? Irgendeine Ausgabe durch eine Msgbox würde reichen. Aber die bildet ja leider ein modales Fenster, das das Script unterbricht.
Gruss, wonk
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Aktivitätsanzeige

Beitrag von Stephan »

z.B. ein nicht-modales Fenster zur Laufzeit erzeugen:

Code: Alles auswählen

Dim warten_dialog As Object

Sub erzeuge_warten()
warten_model = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
warten_model.setPropertyValue("Width",  150) '343
warten_model.setPropertyValue("Height", 20)
warten_model.SetPropertyValue("Title","Bitte etwas Geduld")

oMod_warten = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod_warten
	.setPropertyValue("Name","warten1")
	.setPropertyValue("PositionX",5) '192
	.setPropertyValue("PositionY",5) 
	.setPropertyValue("Width",140)
	.setPropertyValue("Height",13)
	.setPropertyValue("Label","Formatierung wird gelesen ...")
	'.setPropertyValue("Align",1)
	'nicht verfügbar in OOo 1.x
	'.setPropertyValue("VerticalAlign",1)
End With
warten_model.insertByName("warten1", oMod_warten)
warten_dialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
warten_dialog.setModel(warten_model)

oWin2 = CreateUnoService("com.sun.star.awt.Toolkit")
warten_dialog.createPeer(oWin2, null)
warten_dialog.setVisible(True)

End Sub

stoppen mit:

Code: Alles auswählen

warten_dialog.setVisible(False)


Gruß
Stephan
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Aktivitätsanzeige

Beitrag von wonk »

Hallo,
danke, funktioniert so. Allerdings verstehe ich es trotz Doku-Studium nicht (dummy). Vielleicht kannst Du noch schreiben, wie ich das Fenster in der aufrufenden Prozedur wieder zu machen! Die Fenster von meinen Tests sind alle noch offen, ich kann sie auch mit dem Schließkästchen nicht zumachen.
Das Fenster ist auf dem BS oben in der Mitte. Wenn ich Positionx/y verändere verschiebt sich das Fenster aber nicht .
Vielleicht sollte ich noch sagen, daß mein Script gar kein eigenes sichtbares Fenster hat, nur zum Schluß rufe ich msgbox "Beendet!"auf.
Habe schon versucht ein Dialogfenster als Parent zu erzeugen:

Code: Alles auswählen

DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.DlgDef)
Dlg.Execute()
Dann bekomme ich aber "DlgDef nicht gefunden".

Gruss, wonk
Zuletzt geändert von wonk am Sa, 19.08.2017 21:17, insgesamt 1-mal geändert.
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Aktivitätsanzeige

Beitrag von Stephan »

Vielleicht kannst Du noch schreiben, wie ich das Fenster in der aufrufenden Prozedur wieder zu machen!
Das habe ich doch bereits extra hingeschrieben, Schreibe an de Stelle DEines Codes wo das Fenster wieder schliessen soll:

Code: Alles auswählen

warten_dialog.setVisible(False)
wichtig damit dass funktioniert ist die Verfügbarkeit des Dialogobjekts (warten_dialog), deshalb muss dieses wie im Beispiel außerhalb des Sub deklariert sein.

ich kann sie auch mit dem Schließkästchen nicht zumachen.
richtig, denn dazu müsste zusätzlich ein entsprechender sog. Listener registriert werden, aber für eine Fortschrtittsdialog ist das doch wohl unnötig.




Gruß
Stephan
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Aktivitätsanzeige

Beitrag von wonk »

Hallo,
sorry, jetzt hatte ich an meinem Beitrag darüber noch editiert. Wie auch immer:
Ich bekomme beim Schließen des Fensters einen Fehler, denn die Variable "warten_dialog" ist doch in der aufrufenden Prozedur nicht bekannt. Ich müßte sie wohl dort erzeugen!? Das "Dim" in der aufrufenden Prozedur hatte ich gemacht.

Und nochmal den Teil, den ich im letzten Post später eingefügt habe:
Das Fenster ist auf dem BS oben in der Mitte. Wenn ich Positionx/y verändere verschiebt sich das Fenster aber nicht .
Vielleicht sollte ich noch sagen, daß mein Script gar kein eigenes sichtbares Fenster hat, nur zum Schluß rufe ich msgbox "Beendet!"auf.
Habe schon versucht ein Dialogfenster als Parent zu erzeugen:

Code: Alles auswählen

DialogLibraries.LoadLibrary("Standard")
Dlg = CreateUnoDialog(DialogLibraries.Standard.DlgDef)
Dlg.Execute()
Dann bekomme ich aber "DlgDef nicht gefunden".
Gruss, wonk
Benutzeravatar
balu
********
Beiträge: 3810
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Aktivitätsanzeige

Beitrag von balu »

Hallo wonk,

Du beschreibst hier irgendetwas, was wir nicht nachvollziehen können. Und wenn man mit selbsterstellten Dialogen arbeitet, und ich spreche hier jetzt nicht von einer Messagebox oder ähnliche, dann gibt es reichlich Stolperfallen.
Das "Dim" in der aufrufenden Prozedur hatte ich gemacht.
Hast Du wirklich die Variablendeklaration (Dim) für den Dialog IN einer Sub geschrieben, oder außerhalb der Sub ganz zu Anfang des dementsprechendem Modul? Und nein! Das ist keine blöde Haarspalterei, sondern extrem wichtig zu wissen wie Du wo was machst.

Mit deinen 3 Zeiler-Code können wir hier nix anfangen, dazu wäre eine Beispieldatei wirklich von Vorteil.

Vielleicht sollte ich noch sagen, daß mein Script gar kein eigenes sichtbares Fenster hat, nur zum Schluß rufe ich msgbox "Beendet!"auf.
Tja, und eine MsgBox kannst Du nicht so einfach handeln wie ein selbst erstellten Dialog, denn das sind zwei verschiedene Paar Schuhe.


Habe schon versucht ein Dialogfenster als Parent zu erzeugen:
Wie gesagt, ohne Beispieldatei wirds extrem schwer irgendwie zu helfen, bis hin zu unmöglich.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Aktivitätsanzeige

Beitrag von Stephan »

Das "Dim" in der aufrufenden Prozedur hatte ich gemacht.
Ich hatte AUSDRÜCKLICH darauf hingewiesen das das AUSSERHALB der Prozedur geschehen muss!

Nebenher ist wohl mein Dim nicht ausreichend sondern es muss ein Global sein.


Hier ist ein vollständiger Code wo auch das [x] im Dialog funktioniert. Dein Code zum Arbeiten müsste in Sub hier_wird_gearbeitet() stehen und die Variable "ende" ist hier nur nötig, um für die Spielerei mit dem Schliessenkreuz das andere Makro sofort (10ms) zu beenden.

Code: Alles auswählen

Global warten_dialog As Object
Dim ende


Sub erzeuge_warten()
warten_model = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
warten_model.setPropertyValue("Width",  150) '343
warten_model.setPropertyValue("Height", 20)
warten_model.SetPropertyValue("Title","Dialog schliesst nach 10 Sekunden ...")

oMod_warten = warten_model.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
With oMod_warten
	.setPropertyValue("Name","warten1")
	.setPropertyValue("PositionX",5) '192
	.setPropertyValue("PositionY",5) 
	.setPropertyValue("Width",140)
	.setPropertyValue("Height",13)
	.setPropertyValue("Label","... oder klicken Sie auf [x]")
End With
warten_model.insertByName("warten1", oMod_warten)
warten_dialog = CreateUnoService("com.sun.star.awt.UnoControlDialog")
warten_dialog.setModel(warten_model)

warten_dialog.addTopWindowListener(CreateUnoListener("WindowListener_", "com.sun.star.awt.XTopWindowListener"))

oWin2 = CreateUnoService("com.sun.star.awt.Toolkit")
warten_dialog.createPeer(oWin2, null)

warten_dialog.setVisible(True)

hier_wird_gearbeitet()

warten_dialog.setVisible(false)

End Sub


Sub hier_wird_gearbeitet()
	For i = 1 To 1000
		Wait 10
		If ende = 1 Then Exit Sub
	Next i
End Sub

Sub WindowListener_disposing(event)
End Sub
Sub WindowListener_windowOpened(event)
End Sub
Sub WindowListener_windowClosing(event)
  warten_dialog.setVisible(false)
  ende = 1
End Sub
Sub WindowListener_windowClosed(event)
End Sub
Sub WindowListener_windowMinimized(event)
End Sub
Sub WindowListener_windowNormalized(event)
End Sub
Sub WindowListener_windowActivated(event)
End Sub
Sub WindowListener_windowDeactivated(event)
End Sub
Gruß
Stephan
wonk
**
Beiträge: 26
Registriert: Di, 15.11.2016 15:18

Re: Aktivitätsanzeige

Beitrag von wonk »

Hallo,
vielen Dank für den Service. Mit

Code: Alles auswählen

Global warten_dialog As Object
funktioniert es. Mein Script braucht dazu auch kein eigenes Fenster. Den Listener habe ich jetzt weggelassen, da das Fenster mit dem Beenden des Scripts auch geschlossen wird. Das Problem der nicht schliessbaren Fenster ist nur vorher aufgetaucht, wenn das Script abgestürzt ist.
Außerdem kann ich mit z.B.

Code: Alles auswählen

warten_model.setPropertyValue("PositionX",100) 
warten_model.setPropertyValue("PositionY",100) 
das Fenster noch positionieren.
Gruss, wonk
Antworten