Da ich OO-Neuling bin: was kann man mit einem Dispatcher sonst noch alles anfangen / programmieren?
Alles was dessen Befehlsvorat zulässt. Eine Zusammenstellung der dispatch-Befehle ist hier:
http://www.openoffice.org/files/documen ... rence.html
Was macht der Dispatcher im Gegensatz zu einem "normalen" Befehl anders?
Was soll denn ein 'normaler Befehl' sein - anders gesagt hat der Dispatcher mit 'normalen Befehlen' nichts zu tun, so nämlich beispielsweise .Select(oRanges) kein Befehl sondern eine Methode ist. Befehle im Wortsinn findest Du in der OOo-Hilfe zu StarBasic.
Der Dispatcher ist ein Service der das Manipulieren von UNO-Objekten vereinfacht indem er bei Übergabe eines Kommandos in Form ".uno:xyz" (ggf. mit Parameter-Array) notwendige Aktionen komplett durchführt ohne das Du Dich um die Details kümmern mußt.
Also meinethalben ist der Unterschied zu normalem Code der wie zwischen Auto fahren und Taxi fahren. Wenn Du von A nach B willst, heißt Autofahren:
*steige ins Auto
*starte den Motor, lege Gang ein
*fahre los
*halte wenn rote Ampel
*fahre weiter wenn grün
*...
und Taxifahren heißt:
steige ins Taxi und sage dem Fahrer (='Dispatcher') das Du nach B willst und sage ihm ggf. er soll über C fahren, das Radio einschalten und das Fenster runterlassen (=Parameter)
Die Kombination aus Select-Befehl und SelectionChangeListener hat zu einer unendlich-Schleife geführt.
Dann war aber Dein Code nicht in Ordnung.
Zumal ich bisher zunächst die auszuwählende Zelle selektiert habe und dann zum "De-Markieren" mit
oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges)
nochmals einen Select-Befehl ausführen musste.
Der SelectionChangeListener wurde also zweimal ungewünscht aufgerufen und hat sich dann auch noch selbst immer wieder gestartet.
Das entfällt nun mit dem Dispatcher und ich kann mir eine komplizierte Programmierung des Abbruchs eines ungewünschten Aufrufs
des SelectionChangeListeners sparen.
im Summe:
ich weiß nicht warum der Listener sich immer wieder selbst starten sollte, es sei denn Dein Code wäre entsprechend formuliert.
Ich gehe nicht davon aus das ein zweimaliger unerwünschter Aufruf stattfindet, sondern nur davon das der zweite Aufruf unerwünscht ist. Richtig ist das Du den zweiten Aufruf nicht unterdrücken kannst, nur ihn abzubrechen erfordert nun keine komplizierte Programmierung, es reicht beispielsweise auf Änderung der Koordinaten der selektierten Zelle zu prüfen - das Du das tust(*), davon bin ich allerdings ausgegangen, und das eine solche Prüfung tatsächlich notwendig ist war für mich mit dem "Zeitverlust" umschrieben.
(*)
Gemeint ist einfach (beispielsweise) die Zeile und Spalte der jeweils aktuell ausgewählten und/oder markierten Zelle in einer Variable zwischenzuspeichern und bei jedem Auslösen des Listeners zu prüfen ob sich entsprechende Werte geändert haben, falls ja, dann den vorgesehehenen Code ausführen, falls nein, abbrechen.
Gruß
Stephan
[quote]Da ich OO-Neuling bin: was kann man mit einem Dispatcher sonst noch alles anfangen / programmieren?[/quote]
Alles was dessen Befehlsvorat zulässt. Eine Zusammenstellung der dispatch-Befehle ist hier:
http://www.openoffice.org/files/documents/25/2570/commandsReference.html
[quote]Was macht der Dispatcher im Gegensatz zu einem "normalen" Befehl anders?[/quote]
[i]Was soll denn ein 'normaler Befehl' sein - anders gesagt hat der Dispatcher mit 'normalen Befehlen' nichts zu tun, so nämlich beispielsweise .Select(oRanges) kein Befehl sondern eine Methode ist. Befehle im Wortsinn findest Du in der OOo-Hilfe zu StarBasic.[/i]
Der Dispatcher ist ein Service der das Manipulieren von UNO-Objekten vereinfacht indem er bei Übergabe eines Kommandos in Form ".uno:xyz" (ggf. mit Parameter-Array) notwendige Aktionen komplett durchführt ohne das Du Dich um die Details kümmern mußt.
[i]Also meinethalben ist der Unterschied zu normalem Code der wie zwischen Auto fahren und Taxi fahren. Wenn Du von A nach B willst, heißt Autofahren:
*steige ins Auto
*starte den Motor, lege Gang ein
*fahre los
*halte wenn rote Ampel
*fahre weiter wenn grün
*...
und Taxifahren heißt:
steige ins Taxi und sage dem Fahrer (='Dispatcher') das Du nach B willst und sage ihm ggf. er soll über C fahren, das Radio einschalten und das Fenster runterlassen (=Parameter)[/i]
[quote]Die Kombination aus Select-Befehl und SelectionChangeListener hat zu einer unendlich-Schleife geführt.[/quote]
Dann war aber Dein Code nicht in Ordnung.
[quote]Zumal ich bisher zunächst die auszuwählende Zelle selektiert habe und dann zum "De-Markieren" mit
oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges)
nochmals einen Select-Befehl ausführen musste.
Der SelectionChangeListener wurde also zweimal ungewünscht aufgerufen und hat sich dann auch noch selbst immer wieder gestartet.
Das entfällt nun mit dem Dispatcher und ich kann mir eine komplizierte Programmierung des Abbruchs eines ungewünschten Aufrufs
des SelectionChangeListeners sparen.[/quote]
im Summe:
ich weiß nicht warum der Listener sich immer wieder selbst starten sollte, es sei denn Dein Code wäre entsprechend formuliert.
Ich gehe nicht davon aus das ein zweimaliger unerwünschter Aufruf stattfindet, sondern nur davon das der zweite Aufruf unerwünscht ist. Richtig ist das Du den zweiten Aufruf nicht unterdrücken kannst, nur ihn abzubrechen erfordert nun keine komplizierte Programmierung, es reicht beispielsweise auf Änderung der Koordinaten der selektierten Zelle zu prüfen - das Du das tust(*), davon bin ich allerdings ausgegangen, und das eine solche Prüfung tatsächlich notwendig ist war für mich mit dem "Zeitverlust" umschrieben.
(*)
Gemeint ist einfach (beispielsweise) die Zeile und Spalte der jeweils aktuell ausgewählten und/oder markierten Zelle in einer Variable zwischenzuspeichern und bei jedem Auslösen des Listeners zu prüfen ob sich entsprechende Werte geändert haben, falls ja, dann den vorgesehehenen Code ausführen, falls nein, abbrechen.
Gruß
Stephan