Calc: Cursor in Zelle

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

Moderator: Moderatoren

urbarobe
**
Beiträge: 25
Registriert: Mi, 08.07.2015 14:30

Calc: Cursor in Zelle

Beitrag von urbarobe »

Hallo,

wie kann ich feststellen, dass sich der Cursor in einer Zelle befindet (Cursor blinkt)?

Gruß
Robert
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Cursor in Zelle

Beitrag von komma4 »

Ist mir in meiner Karriere als Programmierer noch nicht untergekommen, dass dieser Fall genutzt werden kann (oder: muss).

Wozu brauchst Du das?
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)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Cursor in Zelle

Beitrag von Stephan »

ich finde hier:
https://forum.openoffice.org/en/forum/v ... 18#p340196

einen Code der sich augenscheinlich eignet die gewünschte Info zu bekommen, mir ist das aber zu kompliziert das weiter zu verfolgen ehe nicht klar ist wofür das überhaupt benötigt wird.

Gruß
Stephan
urbarobe
**
Beiträge: 25
Registriert: Mi, 08.07.2015 14:30

Re: Calc: Cursor in Zelle

Beitrag von urbarobe »

Hallo,

ich habe einen Button in meiner Symbolleiste, der dazu führt, dass ein Makro ausgeführt wird, in dem Änderungen
nur gespeichert werden, wenn auch Änderungen an der Tabelle vorhanden sind. Solange aber die Eingabe in der
Zelle ist, gibt es keine Änderung (Flag isModified ist nicht gesetzt). Ich möchte verhindern, dass der Button gedrückt
werden kann, solange die Eingabe in der Zelle ist.

Die Anwendung gibt es auch in MS Excel. Wenn ich mich hier in der Zelle befinde und auf den Button drücke, dann
wird das Makro nicht ausgeführt solange sich die Eingabe in der Zelle befindet. Das musste ich nicht programmieren.

Gruß
Robert
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Cursor in Zelle

Beitrag von Stephan »

ich habe einen Button in meiner Symbolleiste [...]
[...]
Ich möchte verhindern, dass der Button gedrückt
werden kann, solange die Eingabe in der Zelle ist.
kann ich leider nicht weiterhelfen.
Die Anwendung gibt es auch in MS Excel. Wenn ich mich hier in der Zelle befinde und auf den Button drücke, dann
wird das Makro nicht ausgeführt
Was aber ein Unterschied (=Button gedrückt aber Makro wird nicht ausgeführt) zur obigen Frage (=Button darf nicht gedrückt werden können) ist.

Da es hier nur darauf ankäme das Makro (bzw. einen relevanten Teil des Makros) nicht auszuführen könnte man u.U. indirekt auf den Zustand des Cursors schließen weil der Zelleditmodus meiner Ansicht nach nur über Doppelklick oder Taste F2 erreichbar ist und Beides könnte man detektieren.


Gruß
Stephan
Dateianhänge
Demo-Tastatur-und-Doppelklick-überwachen.ods
(11.59 KiB) 187-mal heruntergeladen
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Cursor in Zelle

Beitrag von komma4 »

urbarobe hat geschrieben:dass ein Makro ausgeführt wird, in dem Änderungen
nur gespeichert werden, wenn auch Änderungen an der Tabelle vorhanden sind
Dann verstehe ich wohl den Sinn der Eigenschaft ThisComponent.Modified wohl nicht.
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)
urbarobe
**
Beiträge: 25
Registriert: Mi, 08.07.2015 14:30

Re: Calc: Cursor in Zelle

Beitrag von urbarobe »

@komma4
Meinst Du das Flag manuell setzen, um das Speichern auszulösen?
Nützt nichts. Solange der Cursor noch in der Zelle ist, gibt es die Änderung an der Tabelle nicht.

Gruß
Robert
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Cursor in Zelle

Beitrag von komma4 »

urbarobe hat geschrieben:Solange der Cursor noch in der Zelle ist, gibt es die Änderung an der Tabelle nicht.
Wenn es keine Änderung ist, dann gibt es auch nichts zu speichern (eine event. Eingabe/Änderung kann durch ESC ja verworfen werden.

Wurde die Zelle durch den gleichen Inhalt "überschrieben" ist das flag gesetzt.
Um diesen Fall abzufangen musst Du gegen eine Kopie vergleichen.

Mir ist der Anwendungsfall noch immer nicht klar.
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)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Cursor in Zelle

Beitrag von Stephan »

Meinst Du das Flag manuell setzen, um das Speichern auszulösen?
mutmaßlich doch wohl nein, da dieses Flag zum Speichern per Makro ganz ohne Bedeutung ist.
Nützt nichts. Solange der Cursor noch in der Zelle ist, gibt es die Änderung an der Tabelle nicht.
?
DU SELBST schreibst ein Makro zu dem Du sagst:

"dass ein Makro ausgeführt wird, in dem Änderungen
nur gespeichert werden, wenn auch Änderungen an der Tabelle vorhanden sind"


Wenn das nicht so sein soll, dann schreibe das Makro eben so das auch gespeichert wird wenn es keine Änderungen gibt.

Nö, ich weiß nicht ob das Sinn macht ich weiß nur das Du es augenscheinlich so haben willst, denn sonst würdest Du hier nicht die Eigenschaft "isModified " auswerten sondern ganz einfach speichern wenn Du denn speichern willst (oder nicht speichern wenn Du nicht speichern wilst).


Gruß
Stephan
urbarobe
**
Beiträge: 25
Registriert: Mi, 08.07.2015 14:30

Re: Calc: Cursor in Zelle

Beitrag von urbarobe »

Anwendungsfall:

1. Anwender öffnet eine Tabelle
2. Anwender ändert den Wert einer Zelle und schließt dies nicht mit ENTER ab
3. Anwender drückt Button
4. Dialog zum Drucken und Speichern/Schließen der Tabelle erscheint
5. Dokument wird gedruckt und geschlossen
--> Ausdruck ohne Änderung, Tabelle ohne Änderung gespeichert
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Cursor in Zelle

Beitrag von Stephan »

z.b. das Folgende tut die relevanten Schritte, Drucken ohne Änderungen und Schliessen, die Tatsache das eine Zelle im Edit-Modus ist wird dabei ignoriert, also auch keine Änderung am Zellinhalt gedruckt:

Code: Alles auswählen

sub Main
Dim printProp(0) as New com.sun.star.beans.PropertyValue
printProp(0).Name = "Wait"
printProp(0).Value = true
ThisComponent.Print(printProp())
ThisComponent.Close(True)
end sub
Gruß
Stephan
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Calc: Cursor in Zelle

Beitrag von clag »

Hallo urbarobe,

irgendwie kann ich dein Vorhaben nicht vestehen bringt es doch einige Gefahren mit sich,
(wenn die User nicht in der lage sind Enter zu drücken, weiß man wohl auch nicht vorher ob die Eingaben und somit das Ergebnis korrekt ist)
mit so unsicheren Daten die mehr oder weniger zufällig entstehen würde ich nicht arbeiten wollen oder sinnlos Papier bedrucken.

Erziehe den/die User dazu auf Enter zu drücken, dann kann das Ergeniss geprüft und ggf korrigiert werden.


PS
es kann sich ja nur um einen Zelleninhalt handeln da gibt es doch andere Wege eine korrekte
und vollständige Eingabe in die Tabelle zu übernehmen, zB über Gültigkeit oder einen Dialog!?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
F3K Total
********
Beiträge: 3723
Registriert: Mo, 28.02.2011 17:49

Re: Calc: Cursor in Zelle

Beitrag von F3K Total »

Hallo zusammen,
ich könnte mir vorstellen, dass urbarobe genau dass Gegenteil meint, dass eben der eingetippte Wert, wenn vergessen wird, die Eingabetaste zu drücken, trotzdem mit ausgedruckt werden soll.
Das geht, indem man den Cursor z.B. in Zelle A1 zwingt:

Code: Alles auswählen

Sub Drucken
    oSheet = thiscomponent.CurrentController.activeSheet
    oCell = oSheet.getcellbyposition(0,0)
    thiscomponent.CurrentController.select(ocell)
    Dim printProp(0) as New com.sun.star.beans.PropertyValue
    printProp(0).Name = "Wait"
    printProp(0).Value = true
    ThisComponent.Print(printProp())
End Sub
EDIT
Oder besser, zunächst in die Nachbarzelle und dann zurück in die ursprüngliche Zelle:

Code: Alles auswählen

Sub Drucken
    oSheet = thiscomponent.CurrentController.activeSheet
    osel = Thiscomponent.currentselection
    oController = thiscomponent.CurrentController
    if osel.supportsservice("com.sun.star.sheet.SheetCell") then
        nrow = osel.CellAddress.Row
        nColumn = osel.CellAddress.Column
        oCell = oSheet.getcellbyposition(nrow,nColumn + 1)
        oController.select(ocell)
        oController.select(osel)
    endif    
    Dim printProp(0) as New com.sun.star.beans.PropertyValue
    printProp(0).Name = "Wait"
    printProp(0).Value = true
    ThisComponent.Print(printProp())
End Sub
Gruß R
Karolus
********
Beiträge: 7532
Registriert: Mo, 02.01.2006 19:48

Re: Calc: Cursor in Zelle

Beitrag von Karolus »

Hallo
...genau dass Gegenteil meint...
das könnte ich mir auch vorstellen, als Lösung reicht dann die Aufzeichnung des Tastendrucks auf F9

Code: Alles auswählen

....
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Calculate", "", 0, Array())

....
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
urbarobe
**
Beiträge: 25
Registriert: Mi, 08.07.2015 14:30

Re: Calc: Cursor in Zelle

Beitrag von urbarobe »

Hallo,

es soll das gedruckt und gespeichert werden, was der Anwender sieht. Der Idealfall wäre gewesen, dass er den Button zwar drücken kann, aber nichts passiert, solange er die Eingabe nicht abgeschlossen hat.

Mittlerweile bin ich auch auf die Commands gestoßen. Hier hatte ich es mit "Deselect" probiert. War aber nicht das Richtige. Der Anwender hat im Druckdialog unter anderem die Möglichkeit, nur die Auswahl zu drucken.

Aber das hier ist der Command, den ich gesucht hatte:
Karolus hat geschrieben:

Code: Alles auswählen

dispatcher.executeDispatch(document, ".uno:Calculate", "", 0, Array())
Danke an alle Beteiligten für die Vorschläge und Denkanstöße :D .

Gruß
Robert
Antworten