Seite 1 von 1
CALC: StatusIndicator ohne Progressbar
Verfasst: Fr, 27.09.2013 17:09
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.
Re: CALC: StatusIndicator ohne Progressbar
Verfasst: Fr, 27.09.2013 17:44
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
Re: CALC: StatusIndicator ohne Progressbar
Verfasst: Sa, 28.09.2013 08:06
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.
Re: CALC: StatusIndicator ohne Progressbar
Verfasst: Sa, 28.09.2013 13:58
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
Re: CALC: StatusIndicator ohne Progressbar
Verfasst: Sa, 28.09.2013 14:27
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.
Re: CALC: StatusIndicator ohne Progressbar
Verfasst: So, 29.09.2013 09:02
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.
Re: CALC: StatusIndicator ohne Progressbar
Verfasst: Mo, 30.09.2013 15:33
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?
Re: CALC: StatusIndicator ohne Progressbar
Verfasst: Mo, 30.09.2013 17:36
von Karolus
Hallo
Ich würde mir mal Gedanken darüber machen die *eigentliche* Aufgabenstellung schneller zu erledigen, statt an irgendwelchen Fortschrittsanzeigen ...
Karolus