Frage zu Markierungsrahmen / Fokus / Zellmarkierung
Moderator: Moderatoren
Frage zu Markierungsrahmen / Fokus / Zellmarkierung
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
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
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung
hatten wir doch schonmal hier .....
Du musst -IIRC- nach der Selektion zum de-markieren eine Selektion mit einer ungültigen Range vornehmen....
Du musst -IIRC- nach der Selektion zum de-markieren eine Selektion mit einer ungültigen Range vornehmen....
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung
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
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
Kann sein, aber der Zeitverlust dafür ist doch vernachlässigbar.Jedoch arbeite ich mit einem SelectionChangeListener, der dann unnötig aufgerufen wird, wenn
ThisComponent.CurrentController.Select(oRanges) ausgeführt wird.
Du kannst das mittels dispatcher machen, z.B.:Gibt es nicht auch eine Möglichkeit, den Fokus zu verschieben, ohne dass die Zelle markiert wird?
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
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
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
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?Allerdings mache ich einige Operationen zwischendurch und da kommt das Basic schon mal nicht nach.
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.Welche Möglichkeit hätte ich denn bsw., um Zeile 1 Spalte 1 in "$B$2" zu konvertieren?
Gruß
Stephan
Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung
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
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
Alles was dessen Befehlsvorat zulässt. Eine Zusammenstellung der dispatch-Befehle ist hier:Da ich OO-Neuling bin: was kann man mit einem Dispatcher sonst noch alles anfangen / programmieren?
http://www.openoffice.org/files/documen ... rence.html
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.Was macht der Dispatcher im Gegensatz zu einem "normalen" Befehl anders?
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)
Dann war aber Dein Code nicht in Ordnung.Die Kombination aus Select-Befehl und SelectionChangeListener hat zu einer unendlich-Schleife geführt.
im Summe: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.
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
Hi Stephan,
vielen Dank für deine Erläuterungen und den Link!
Viele Grüße
Lupo
vielen Dank für deine Erläuterungen und den Link!
Viele Grüße
Lupo