Seite 1 von 1
Tabellenereignis Doppelklick erweitern
Verfasst: Mi, 22.07.2015 11:13
von clag
Hallo Kenner und Könner,
in Calc kan man das Tabellenereignis Doppelklick auswerten was ich auch gern nutze, zB um mir aus Daten der jeweiligen Zeile einen Hyperlink zusammen zu setzen und das entsprechende Dokument zu öffnen.
Das möchte ich funktional erweitern, zB ctrl+Doppeklick oder alt+Doppelklick usw.
Meine Frage ist kann man das irgendwie hinbekommen, kann man nach dem erkennen vom Doppelklick, in dem dadurch gestarteten Makro die Tastatur abfragen und eventuell gedrückte Tasten erkennen ( Frage an Karolus: ginge das eventuell in Python, wenn ja wie

?
Oder auch gern irgendwie anders eine mehrfach Nutzung vom Doppelklick erreichen?
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Mi, 22.07.2015 22:49
von F3K Total
Hallo Clag,
ich habe zwar keine fertige Antwort, aber denke, was du möchtest, müsste mit einer Kombination aus
Keyhandler
und
Mouseclickhandler
möglich sein.
Anbei mal eine Datei mit Keyhandler.
Code: Alles auswählen
global oKeyHandler
Sub CreateKeyHandler
oKeyHandler = CreateUnoListener("KeyHandler_", "com.sun.star.awt.XKeyHandler" )
oController = ThisComponent.currentcontroller
oController.addKeyHandler(oKeyHandler)
End Sub
Sub RemoveKeyHandler
oController = ThisComponent.currentcontroller
oController.removeKeyHandler(oKeyHandler)
End Sub
function KeyHandler_keyPressed(oEv)
xray oEv
'print oEv.KeyCode
'print oEv.Modifiers
'If (oEv.KeyCode = 1024) AND (oEv.Modifiers = 4) Then
'msgbox "Alt+Arrow"
'endif
KeyHandler_keyPressed = false
End function
Function KeyHandler_KeyReleased(oEv) As Boolean
KeyHandler_KeyReleased = true
End Function
Sub KeyHandler_disposing()
End Sub
Gruß R
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Do, 23.07.2015 11:09
von clag
Hallo F3K Total,
danke für dein Code Beispiel, das funktioniert auch soweit gut, aber
genau bei den von mir angedachten Tasten ctrl, alt, alt gr, shift "is nix los".
Auf "alt" reagiert der Code zumindest solange wie nicht Autorepeat aktiv wird.
Aber auch da ist ein Haken, den das Autorepeat ist bestimmt immer aktiv
wenn man die Tasten zusätzlich während des Mausdoppelklick drückt.
Siehst du da eine Chance das man ctrl, alt, shift in den Griff bekommt ?
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Do, 23.07.2015 21:21
von F3K Total
Hallo Clag,
ich habe mich getäuscht, es ist viel einfacher.
Man benötigt ausschließlich einen Mouseclickhandler!
Code: Alles auswählen
Global oMouseClickHandler as object
Sub SetupMouseClickHandler
oController = thisComponent.currentController
oMouseClickHandler = CreateUnoListener("MouseClickHandler_","com.sun.star.awt.XMouseClickHandler")
oController.addMouseClickHandler(oMouseClickHandler)
End Sub
Sub RemoveMouseClickHandler
On Error Resume Next
ThisComponent.currentController.removeMouseClickHandler(oMouseClickHandler)
On Error Goto 0
End Sub
Sub MouseClickHandler_mousePressed(oMouseEvent) as boolean
MouseClickHandler_mousePressed = False
End Sub
Sub MouseClickHandler_mouseReleased(oMouseEvent) as boolean
if oMouseEvent.clickcount = 2 then
select case oMouseEvent.Modifiers
case 1
msgbox "SHIFT"
case 2
msgbox "CTRL"
case 4
msgbox "ALT"
case 6
msgbox "ALT GR"
end select
endif
MouseClickHandler_mouseReleased = False
End Sub
Sub MouseClickHandler_disposing(oMouseEvent)
End Sub
Anbei eine Beispieldatei.
Viel Erfolg
Gruß R
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Do, 23.07.2015 21:53
von ChristianAC
cooler Code
Info dazu:
auch unter Version 3.0.0 lauffähig
(obwohl es da noch keine Tabellenereignisse gibt)
Gruss Chris
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Do, 23.07.2015 21:54
von F3K Total
ChristianAC hat geschrieben:(obwohl es da noch keine Tabellenereignisse gibt)
eben!
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Sa, 25.07.2015 12:04
von clag
Hallo F3K Total,
ich musste erst mal etwas experimentieren bevor ich dir antworte und prinzipiell funktioniert dein Beispiel prima.
1. Jetzt habe ich aber ein paar kleine Probleme die scheinbar darin begündet sind, das du einen MouseDoppelklick separat erkennst und nicht über das Tabellenereignis Doppelklick, dadurch sind unterschiedlich Zellen markiert oder im editier modus je nachdem wo vorher der Cursor stand und welche Taste gedrückt war.
2. gelingt es mir nicht inerhalb deiner Ausgaberoutine
die angeklickte Zelle zu ermitteln (das liegt aber vermutlich an meinem Unwissen)
Ich habe mir jetzt erstmal damit beholfen, das ich zusätzlich das Tabellenereignis Doppelklick nutze um die angeklickte Zelle zu ermitteln und schreibe Table,Column,Row in ein Globale DblClick(2) as Integer und lese in deiner Ausgabe diese Werte.
Das funktioniert soweit, allerdings weiß ich nicht ob das wirklich eine gute Lösung ist.
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Sa, 25.07.2015 12:15
von F3K Total
Hallo clag,
clag hat geschrieben:2. gelingt es mir nicht inerhalb deiner Ausgaberoutine
sub MouseClickHandler_mouseReleased(oMouseEvent)
die angeklickte Zelle zu ermitteln
probiere mal
Code: Alles auswählen
Sub MouseClickHandler_mouseReleased(oMouseEvent) as boolean
if oMouseEvent.clickcount = 2 then
xray ThisComponent.CurrentSelection
select case oMouseEvent.Modifiers
case 1
msgbox "SHIFT"
case 2
msgbox "CTRL"
case 4
msgbox "ALT"
case 6
msgbox "ALT GR"
end select
endif
MouseClickHandler_mouseReleased = False
End Sub
Kommst Du damit weiter?
EDIT, zweite verbesserte Variante
Code: Alles auswählen
Sub MouseClickHandler_mouseReleased(oMouseEvent) as boolean
if oMouseEvent.clickcount = 2 then
oSel = Thiscomponent.currentselection
if not oSel.supportsservice("com.sun.star.sheet.SheetCell") then
if oSel.supportsservice("com.sun.star.sheet.SheetCellRange") then
msgbox ("Es ist der Zellbereich "+oSel.AbsoluteName+" selektiert",64,"Info von R")
else
exit sub 'keine Zelle und kein Zellbereich
endif
else
msgbox ("Es ist die Zelle "+oSel.AbsoluteName+" selektiert",64,"Info von R")
endif
select case oMouseEvent.Modifiers
case 1
msgbox "SHIFT"
case 2
msgbox "CTRL"
case 4
msgbox "ALT"
case 6
msgbox "ALT GR"
end select
endif
MouseClickHandler_mouseReleased = False
End Sub
Gruß R
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Sa, 25.07.2015 12:48
von clag
Hallo F3K Toatal,
hmmm verflixt aber auch... genau das war mein erster Versuch aber da hatte ich immer die ganze Tabelle,
jetzt bekomme ich sofort das Gewünschte, oh man das war bestimmt irgend ein blöder Tipfehler
aber noch eine ander Frage wie kann man alle Selectionen aufheben?
Da man mit ctrl + click oder shift + click ja mehrfach Selektion vornimmt, möchte ich gern
diese selektierten Bereich/e umgehend aufheben, nachdem ich die Zelladresse habe.
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Sa, 25.07.2015 13:17
von F3K Total
Na, der Cursor muss ja irgendwo stehen, vielleicht so?
Code: Alles auswählen
Sub MouseClickHandler_mouseReleased(oMouseEvent) as boolean
if oMouseEvent.clickcount = 2 then
oSel = Thiscomponent.currentselection
oController = thisComponent.Currentcontroller
oSheet = oController.activeSheet
oTargetCell = oSheet.getcellbyPosition(0,0)
if not oSel.supportsservice("com.sun.star.sheet.SheetCell") then
if oSel.supportsservice("com.sun.star.sheet.SheetCellRange") then
msgbox ("Es ist der Zellbereich "+oSel.AbsoluteName+" selektiert",64,"Info von R")
else
exit sub 'keine Zelle und kein Zellbereich
endif
else
msgbox ("Es ist die Zelle "+oSel.AbsoluteName+" selektiert",64,"Info von R")
endif
oController.select(oTargetCell)
select case oMouseEvent.Modifiers
case 1
msgbox "SHIFT"
case 2
msgbox "CTRL"
case 4
msgbox "ALT"
case 6
msgbox "ALT GR"
end select
endif
MouseClickHandler_mouseReleased = False
End Sub
Gruß R
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Sa, 25.07.2015 16:26
von clag
Hallo F3K Total
habe jetzt noch weiter getestet und bin jetzt bei dieser etwas abgeänderten Variante, nach wie vor unter Verwendung des Tabellenereignisses Doppeklick da ich die Funktion nur auf bestimmte Tabellen anwenden möchte.
Ich habe jetzt deinen Code dazu "degradiert" nur noch die "modifier" ID zu liefern bzw in eine globale Variable zu schreiben,
vielleicht kann du deinen Code noch etwas eindampfen, wenn nur der "modifier" abgefragt wird? (ich blick da leider noch nicht wirklich durch)
Die Auswertung geschieht in dem Makro welches durch das Tabellenereignis aufgerufen wird, hier bekomme ich immer sauber die angeklickte Zelle und kann dann auch ohne großes Theater diese eine Zelle selektieren und damit ggf die anderen Selektionen aufheben.
Ansonsten funktioniert es jetzt genau so wie ich mir das vorgestellt hatte.
Code: Alles auswählen
Global oMouseClickHandler as object , ModfiNr as integer
Sub SetupMouseClickHandler
oController = thisComponent.currentController
oMouseClickHandler = CreateUnoListener("MouseClickHandler_","com.sun.star.awt.XMouseClickHandler")
oController.addMouseClickHandler(oMouseClickHandler)
End Sub
Sub RemoveMouseClickHandler
On Error Resume Next
ThisComponent.currentController.removeMouseClickHandler(oMouseClickHandler)
On Error Goto 0
End Sub
Sub MouseClickHandler_mousePressed(oMouseEvent) as boolean
MouseClickHandler_mousePressed = False
End Sub
sub MouseClickHandler_mouseReleased(oMouseEvent) as boolean
if oMouseEvent.clickcount = 1 then
ModfiNr = oMouseEvent.Modifiers
endif
MouseClickHandler_mouseReleased = False
End sub
Sub MouseClickHandler_disposing(oMouseEvent)
End Sub
function ReadPosition(event)
oCell = event.getCellAddress
myView = thisComponent.CurrentController
iCol = oCell.Column
iRow = oCell.Row
select case ModfiNr
case 0
msgbox "NON" & " - " & iRow
case 1
msgbox "SHIFT" & " - " & iRow
case 2
msgbox "CTRL" & " - " & iRow
case 3
msgbox "CTRL+SHIFT" & " - " &iRow
case 4
msgbox "ALT" & " - " & iRow
case 5
msgbox "ALT+SHIFT" & " - " & iRow
case 6
msgbox "ALT GR" & " - " & iRow
end select
myView.Select(event.getCellRangeByName(event.AbsoluteName))
ReadPosition = true
end function
Re: Tabellenereignis Doppelklick erweitern
Verfasst: Sa, 25.07.2015 17:00
von F3K Total
Hallo clag,
leider nein, da ist nix einzudampfen, es werden bei einem Listener immer benötigt:
- Listener erzeugen
- Listener entfernen
- je eine Sub/Function pro mögliches Ereignis, hier
- _mousePressed(oMouseEvent)
- _mouseReleased(oMouseEvent)
- _disposing, ich glaube, um den Speicher wieder freizugeben
Gruß R