CALC: StatusIndicator ohne Progressbar

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

Moderator: Moderatoren

CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

CALC: StatusIndicator ohne Progressbar

Beitrag von CalcWeiss »

Ich habe ein Makro, dass ca. 10.000 Strings einliest, in einer Tabelle mit ca. 50.000 aktiven Zeilen nach diesem String sucht und dann in einer Zelle dieser Zeile einen Wert verändert. Diese Makro braucht sehr lange und ich benötige daher einen Indikator, wie weit das Makro schon ist. Der Einfachheit halber verwende ich die Progressbar in der Statuszeile, und habe folgenden Code dafür

Code: Alles auswählen

oProgressBar = oDoc.getFrame().createStatusIndicator()
oProgressBar.start( "", 10)
oProgressBar.setText("Reading ...")
Da ich nicht weiß, wieviele Strings ich bei jedem Aufruf vorfinde und mir den Luxus des doppelten Einlesens (erst Zählen, dann Verarbeiten) schenken möchte, würde es mir reichen, wenn ich z.B. in 100er Schritten eine Zahl als Text ausgebe und den Fortschrittsbalken gar nicht benutze. Gibt es dafür eine eigene Funktion oder ist createStatusIndicator grundsätzlich mit einer Progressbar verbunden? Mir ist schon klar, dass lediglich ein leerer Bereich angezeigt wird, wenn ich die Methode setValue nicht verwende.
Win-XP32, LO4.1.1.2 (en)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: CALC: StatusIndicator ohne Progressbar

Beitrag von Stephan »

Diese Makro braucht sehr lange


Du weist aber wie Du ein solches Makro effizient implementierst?

Das Folgende braucht bei mir 12 Sekunden:

Code: Alles auswählen

Sub langsam()
	for i = 0 To 49999
		If da =ThisComponent.Sheets(0).getCellByPosition(0,i).Value = 23.456 Then
			Msgbox "Wert gefunden in Zelle A" & (i+1)
			Exit Sub
		End If
	Next i
End Sub
die gleiche Aufgabe kann man aber auch in 1 Sekunde erledigen:

Code: Alles auswählen

Sub schnell()
	da =ThisComponent.Sheets(0).getCellRangeByName("A1:A50000").getDataArray()
	for i = Lbound(da()) To Ubound(da())
		db() = da(i)
		If db(0) = 23.456 Then
			Msgbox "Wert gefunden in Zelle A" & (i+1)
		End If
	next i
End Sub
Gibt es dafür eine eigene Funktion
Warum nutzt Du nicht einen nichtmodalen Dialog, z.B.:

Code: Alles auswählen

Sub status()
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 ...")
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)

for i = 0 To 50000 Step 10
	warten_dialog.Model.getByName("warten1").Label = i & " Werte verglichen"
next i

warten_dialog.setVisible(False)
End Sub

Gruß
Stephan
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: CALC: StatusIndicator ohne Progressbar

Beitrag von CalcWeiss »

Stephan hat geschrieben:Du weist aber wie Du ein solches Makro effizient implementierst?

Ich verwende dafür einen SearchDescriptor, da ich annehme, die interne Suchfunktion ist effektiver als eine Suchschleife in Basic.
Warum nutzt Du nicht einen nichtmodalen Dialog, z.B.:
Sieht interessant aus, zumal die Progressbar in der Statuszeile nicht sehr stabil läuft. Werde ich mal ausprobieren.
Win-XP32, LO4.1.1.2 (en)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: CALC: StatusIndicator ohne Progressbar

Beitrag von Stephan »

Ich verwende dafür einen SearchDescriptor
das ist dann völlig in Ordnung, einzig hatte ich das nicht erwartet, weil ich nicht wirklich verstehe wozu Du eine Fortschrittsanzeige brauchst, denn ich nehme an die Implementierung über Suchen ist ebenfalls sehr schnell, möglicherweise noch schneller als mein Vorschlag, Letzterer brauchte aber bei mir nur 1 Sekunde, auf eher älterer Hardware.

Aber, wie gesagt, es ist völlig OK das über Suche zu machen.


Gruß
Stephan
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: CALC: StatusIndicator ohne Progressbar

Beitrag von CalcWeiss »

Die ganze Aktion dauert bei mir im Extremfall eine halbe Stunde und daher brauche ich irgendeine Anzeige. Zudem ist die CPU bei diesem Makro am Anschlag und somit wird der PC während dieser Zeit blockiert. Ein Dialog könnte hier helfen, denn dann könnte ich auch einen Pause-Button einbauen, der das Makro entweder partiell stoppt oder zumindest ein paar Verzögerungen einbaut, um die CPU wieder auf Normalniveau zu bringen. Kann auch sein, dass beim Rechnerwechsel alles viel schneller wird, denn derzeit läuft alles auf einem 10 Jahre alten Windows-Rechner. Das soll sich aber spätestens im April nächsten Jahres ändern, denn dann wird XP eingestampft und es kommt ein Ubuntu o.Ä. ins Haus.
Win-XP32, LO4.1.1.2 (en)
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: CALC: StatusIndicator ohne Progressbar

Beitrag von CalcWeiss »

Stephan hat geschrieben:Warum nutzt Du nicht einen nichtmodalen Dialog, z.B.:
Stephan
Ich habe Deinen Dialog eingebaut und bin begeistert. Genau so hatte ich es mir vorgestellt. Vielen Dank.
Win-XP32, LO4.1.1.2 (en)
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: CALC: StatusIndicator ohne Progressbar

Beitrag von CalcWeiss »

Einen Schönheitsfehler würde ich gern noch beseitigen. Unter Windows wird mir der Dialog in der Mitte des CALC-Fensters angezeigt, unter Linux (Ubuntu) hängt der Dialog an der oberen linken Ecke von CALC. Wo muss ich drehen, damit der Dialog unter Linux auch in der Mitte angezeigt wird? Ist das eine Dialogeinstellung oder hängt das mit Ubuntu zusammen?
Win-XP32, LO4.1.1.2 (en)
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: CALC: StatusIndicator ohne Progressbar

Beitrag von Karolus »

Hallo

Ich würde mir mal Gedanken darüber machen die *eigentliche* Aufgabenstellung schneller zu erledigen, statt an irgendwelchen Fortschrittsanzeigen ...

Karolus
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Antworten