Seite 1 von 1
[gelöst] Cursor klebt
Verfasst: Mo, 09.03.2015 20:40
von clag
Hallo Kenner und Könner,
mit diesen Makro habe ich ein kleines Problem und keine Idee wo oder wie man das lösen kann.
Alles Funktioniert soweit das eintragen des Text in eine Zelle der Spalte H nach Doppelklick oder auch nicht (Abruch).
Soweit so gut.
Aber danach klebt der Cursor irgend wie an der Tabelle fest, wenn man direkt nach Ende des Dialog
zB das Tabellenblatt wechseln möchte und mit der Maus auf einen RegisterReiter klickt,
wird nicht dieser Reiter angeklickt sondern die Zelle die darunter liegt der zweite klick geht dann auf den Reiter.
Das gilt für jeden ersten Klick egal worauf man klick, man trifft nicht die Schaltfläche sondern irgend etwas in der Tabelle
beim ersten klick nach Beendigung des Dialog.
hat jemand eine Idee wie man das abstellen kann, das ist ziemlich nervig.
Re: Cursor klebt
Verfasst: Di, 10.03.2015 00:29
von balu
Hallo clag,
der zweite klick geht dann auf den Reiter.
Nun ja, wenn das Makro an das Tabellenereignis "Doppelklick" gebunden ist, dann muss man halt doppelt klicken damit das Makro neu gestartet und neu initialisiert wird.
hat jemand eine Idee wie man das abstellen kann
Bleibt dir nix anderes übrig als das mit dem Tabellenereignis zu vergessen und stattdessen einen Listner zu programmieren. Das ist zumindest meine Empfehlung.
Gruß
balu
Re: Cursor klebt
Verfasst: Di, 10.03.2015 08:13
von Stephan
Ich kann das Problem nachvollziehen.
Das Verhalten des Programms ist hier wirklich ärgerlich und ich halte es für eine Programmfehler den Du melden solltest und dabei unbedingt Deine Beispieldatei anhängen.
Einen Workaround habe ich nicht. Ich hatte gehofft man könne im Makro am Ende eine Zelle explizit selektieren, das bringt aber nichts, ein nicht-modaler Dialog hilft ebenfalls nicht, vielleicht ist aber die Info von Nutzen das wen man den nicht-modalen Dialog nicht beendet man dann nebenwirkungsfrei zwischen den Tabellenblättern wechseln kann (was nun aber auch nur das Problem verschiebt, denn irgendwann muss man den Dialog beenden).
Balu hat recht mit dem Listener, nur kann ich Dir dafür 'aus dem Hut' kein Beispiel geben. Da es früher mit z.B. Selection-Change-Listener (der wegen des Doppelklicks noch nicht einmal wirklich geeignet wäre) Probleme gab bin ich bei solchen Listener-Implementierungen auf Tabellenblättern misstrauisch, weshalb ich empfehlen würde zu überlegen ob Du das Ganze nicht 'konventionell' implementieren willst, also so dass Du einen Eigebemasken-Dialog programmierst, so das jegliche Eingaben (also nicht nur Spalte H) nur in diesem Dialog erfolgen. Das wird in jedem FAll stabil laufen.
Ein sinngemäßes Beispiel ist das 'Fahrtenbuch' was Du hier unter "Beispiele" findest:
viewtopic.php?f=18&t=1553
Gruß
Stephan
Re: Cursor klebt
Verfasst: Di, 10.03.2015 09:19
von mikeleb
Hallo,
ich kann das Verhalten ebenfalls bestätigen. Es trat bei mir übrigens auch auf, wenn ich den Dialog gar nicht ausgeführt habe.
Re: Cursor klebt
Verfasst: Di, 10.03.2015 09:50
von clag
Hallo zusammen,
erst einmal Danke das ihr euch die Mühe gemacht habt das mal anzuschauen
@ Balu
ich hatte befürchtet so etwas zu lesen aber ganz kann ich deine Argumentation nicht folgen
denn der Doppelklick muss schließlich erkannt werden und in diesem Fall hätte ich erwartet,
das erst nach dem zweiten "left mouse button up" das Makro gezündet wird,
aber scheinbar geschieht das bereits nach dem zweiten "left mouse button down" und das vergessene
zweite "left mouse button up verursacht das Problem.
@ Stephan
Stephan hat geschrieben:Einen Workaround habe ich nicht.
schade
und Danke für deine Hinweise.
Es war der Versuch einem anderen Fragensteller in Calc etwas zu bieten.
ich hatte an andere Stelle schon einmal das Problem, darüber bin ich dann sogar mit Karolus aneinander geraten weil
da auch der Doppelklick ein Makro starten sollte und das klemmte dann vermutlich aus dem selben Grund.
@ mikeleb
mikeleb hat geschrieben:wenn ich den Dialog gar nicht ausgeführt habe
nach welcher Aktion sonst noch?
Wenn ich auf eine nicht überwachte Zelle doppelklicke komm ich normal in den Editiermodus
nach verlassen der Zelle durch Enter oder Esc reagieren die Tabellenblattregister hier sofort?
Re: Cursor klebt
Verfasst: So, 15.03.2015 13:01
von mikeleb
Hallo,
ich habe noch ein bisschen probiert:
Wenn ich die drei Code-Zeilen
Code: Alles auswählen
oDialog.Model.ControlModels(i).label = mChoices(i,0) & mChoices(i,1)
auskommentiere, wird der Rest ausgeführt und der Cursor landet in der Zelle (klass. Doppelklick-Verhalten).
Sobald der Dialog ausgeführt wird oder auch "nur" Dialogelemente geschrieben werden (nicht beim lesen!), bleibt der Cursor (unsichtbar) im Tabellenblattbereich hängen und wird erst nach einem Klick wieder frei.
Ich hatte schon die Idee, diesen Cursorklick per Makro auszulösen, allein ich scheiterte aufgrund Unwissenheit

Re: Cursor klebt
Verfasst: So, 15.03.2015 17:22
von clag
hallo mikeleb,
danke das du dich noch einmal mit dem "bockigen" Cursor beschäftigt hast,
allerdings habe ich wenig Hoffnung das man das innerhalb des Makros lösen kann,
da der Doppelklick ja nicht zum Makro gehört.
Darum war ich jetzt auch bei "Bugzilla" petzen, und hoffe es wird ernst genommen.
Eventuelle Reaktionen/Lösungen werde ich hier kund tun,
oder hier
Issue 126177 zum selber prüfen
wer mag kann das ja mit einem Klick auf vote etwas pushen

Re: Cursor klebt
Verfasst: Mo, 23.03.2015 10:57
von clag
Hallo zusammen,
es gibt eine Lösung für das Problem, allerdings verstehe ich nicht wirklich wie das wirkt.
Der/die Gute hat das Makro als Funktion deklariert und eine Zeile eingefügt,
kann mir jemand erklären was hier der Unterschied zwischen
Sub und
Function ist?

- the_solution.png (20.02 KiB) 3785 mal betrachtet
der Übersicht wegen als screenshot aus einem compare zur vorher Version
und hier der korrigierte Code
Code: Alles auswählen
Function TopicsChoice(oEvent)
odoc=thisComponent
iStartCol = oEvent.RangeAddress.StartColumn
iStartRow = oEvent.RangeAddress.StartRow
iStartShe = oEvent.RangeAddress.Sheet
if iStartCol = 7 then
if iStartRow > 3 and iStartRow < 1000 then
Dim oDialog as object, oCkeckBox as object
Dim i as integer, iDlgOK as integer, iX as Integer, iCount as Integer
Dim mChoices(9,1) as String
Dim mLongtext(9) as String
DialogLibraries.loadLibrary( "Standard")
oDialogLib = DialogLibraries.getByName("Standard")
oDialog = CreateUnoDialog(oDialogLib.getByName("Dialog1"))
mySheet = oDoc.Sheets().getByName("Auswahl")
iX = val(right(oDoc.sheets(iStartShe).getCellByPosition(7,3).string,1))
for i=1 to 10
mChoices(i-1,0) = mysheet.getCellByPosition(0,i).string & " "
mChoices(i-1,1) = mysheet.getCellByPosition(iX,i).string
next
for i=0 to 9
oDialog.Model.ControlModels(i).label = mChoices(i,0) & mChoices(i,1)
next
TopicsChoice = True
iDlgOK = oDialog.Execute()
if iDlgOK = 1 then
iCount = 0
for i = 0 to 9
if oDialog.Model.ControlModels(i).state = 1 then
mLongtext(iCount) = mChoices(i,1)
iCount=iCount+1
end if
next
if iCount > 0 then ReDim Preserve mLongtext(iCount-1)
oDoc.getCurrentSelection().string = join(mLongtext,", ")
end if
oDialog.dispose()
end if
end if
End Function
Re: Cursor klebt
Verfasst: Mo, 23.03.2015 11:13
von Karolus
Hallo
Genau das ist der Unterschied - Function's können etwas an den Aufrufer zurückgeben, so wie es in Zeile 24 gemacht wird.
Wobei mir auch nicht im konkreten Fall klar ist was|wer der Aufrufer ist.
Karolus
Re: Cursor klebt
Verfasst: Mo, 23.03.2015 13:16
von mikeleb
Hallo,
klasse, dass das gelöst ist. Interessanterweise klappt es auch als Sub:
Code: Alles auswählen
Sub TopicsChoice(oEvent) as boolean
...
topicschoice=true
End Sub
So ein ähnliches Verhalten hatte ich auch mit einem Makro, dass bei einer Gültigkeit ausgelöst wird. Dort hatte die Belegung mit "true" die Wirkung, dass die (ungültige) Eingabe in die Zelle übernommen wurde, bei "false" wurde sie verworfen.
Re: Cursor klebt
Verfasst: Di, 24.03.2015 16:15
von TrueColor
Ich hab zwar nix zum Doppelklickproblem beizutragen. Aber beim Benutzen des Abbrechen-Buttons des Dialogs werden die Änderungen auch übernommen. Weiß nicht, ob das inzwischen schon aufgefallen ist.
Re: Cursor klebt
Verfasst: Mi, 25.03.2015 05:26
von clag
Moin TrueColor,
danke für den Hinweis,
irgendwie war für den [ Abbrechen ] Button in den Makro-Dialog Button Eigenschaften noch die OK Funktionalität eingestellt,
dann reagiert er natürlich auch als OK, jetzt ist es korrigiert und auf Abbrechen eingestellt und tut auch so.