Seite 1 von 1

Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Di, 17.07.2007 13:59
von lupolupp1
Hallo zusammen,

ich möchte in einem Calc-Dokument den schwarzen Rahmen, der die ausgewählte Zelle anzeigt, per Makro verschieben.
Die Zelle soll jedoch nicht markiert, also nicht schwarz hinterlegt werden.

Ich weiß, dass ich die Markierung mit dem Select-Befehl verschieben kann. Dann ist jedoch die Zelle schwarz markiert. Um die Markierung wieder "loszuwerden" verwende ich:

oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges)

Jedoch arbeite ich mit einem SelectionChangeListener, der dann unnötig aufgerufen wird, wenn
ThisComponent.CurrentController.Select(oRanges) ausgeführt wird.

Gibt es nicht auch eine Möglichkeit, den Fokus zu verschieben, ohne dass die Zelle markiert wird?

Vielen Dank

Lupo

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Di, 17.07.2007 16:33
von komma4
hatten wir doch schonmal hier .....

Du musst -IIRC- nach der Selektion zum de-markieren eine Selektion mit einer ungültigen Range vornehmen....

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Di, 17.07.2007 18:27
von lupolupp1
Hi Winfried,

das mache ich doch auch mit

oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
ThisComponent.CurrentController.Select(oRanges)

Ich suche aber eine Möglichkeit zum Verschieben des Fokus, bei der die Zelle erst gar nicht markiert wird.

Vielen Dank und viele Grüße

Lupo

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Di, 17.07.2007 18:39
von Stephan
Jedoch arbeite ich mit einem SelectionChangeListener, der dann unnötig aufgerufen wird, wenn
ThisComponent.CurrentController.Select(oRanges) ausgeführt wird.
Kann sein, aber der Zeitverlust dafür ist doch vernachlässigbar.
Gibt es nicht auch eine Möglichkeit, den Fokus zu verschieben, ohne dass die Zelle markiert wird?
Du kannst das mittels dispatcher machen, z.B.:

Code: Alles auswählen

sub Main
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 = "$E$16"

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


Gruß
Stephan

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Di, 17.07.2007 20:57
von lupolupp1
Hallo Stephan,

grundsätzlich ist der Zeitverlust vernachlässigbar, da gebe ich dir Recht. Allerdings mache ich einige Operationen zwischendurch und da kommt das Basic schon mal nicht nach.

Das mit dem Dispatcher habe ich auch schon rausgefunden, prima Sache.

Mein Problem ist allerdings, dass ich die Zelle über die Zeilen- und Spaltennummern anspreche.
Welche Möglichkeit hätte ich denn bsw., um Zeile 1 Spalte 1 in "$B$2" zu konvertieren?
Oder gibt's ne Möglichkeit, args1(0).Value mit bsw. (1,1) zu "füttern"?

Vielen Dank und viele Grüße

Lupo

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Di, 17.07.2007 21:31
von Stephan
Allerdings mache ich einige Operationen zwischendurch und da kommt das Basic schon mal nicht nach.
Ich weiß nicht was Du da machst, nur das Ganze wäre doch wohl auch nicht anders mit der anderen Art der Markierung - oder doch?
Welche Möglichkeit hätte ich denn bsw., um Zeile 1 Spalte 1 in "$B$2" zu konvertieren?
Zeilenangabe ("$2") ist Zeile - 1 und Spaltenangabe kannst Du ausgehend von A = CHR(65) ausrechnen (also Spalte 1 ist gleich CHR(64 + 1) ) und dann Beides zusammenfügen.




Gruß
Stephan

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Mi, 18.07.2007 12:05
von lupolupp1
Hallo Stephan,

vielen Dank, das ist genau das, was ich gesucht habe.

Da ich OO-Neuling bin: was kann man mit einem Dispatcher sonst noch alles anfangen / programmieren?
Was macht der Dispatcher im Gegensatz zu einem "normalen" Befehl anders?

Noch zur Erläuterung, warum die Frage für mich so wichtig war:

Die Kombination aus Select-Befehl und SelectionChangeListener hat zu einer unendlich-Schleife geführt.
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. Das Programm läuft nun viel runder und gestaltet sich vom Aufbau her wesentlich einfacher.

Vielen Dank und viele Grüße

Lupo

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Mi, 18.07.2007 15:36
von Stephan
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

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Verfasst: Mi, 18.07.2007 21:20
von lupolupp1
Hi Stephan,

vielen Dank für deine Erläuterungen und den Link!

Viele Grüße

Lupo