Frage zu Markierungsrahmen / Fokus / Zellmarkierung

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

Moderator: Moderatoren

lupolupp1
**
Beiträge: 32
Registriert: Do, 28.06.2007 14:51

Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag 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
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag von komma4 »

hatten wir doch schonmal hier .....

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)
lupolupp1
**
Beiträge: 32
Registriert: Do, 28.06.2007 14:51

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag 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
lupolupp1
**
Beiträge: 32
Registriert: Do, 28.06.2007 14:51

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag 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
lupolupp1
**
Beiträge: 32
Registriert: Do, 28.06.2007 14:51

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag 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
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag 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
lupolupp1
**
Beiträge: 32
Registriert: Do, 28.06.2007 14:51

Re: Frage zu Markierungsrahmen / Fokus / Zellmarkierung

Beitrag von lupolupp1 »

Hi Stephan,

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

Viele Grüße

Lupo
Antworten