Tabellenereignis Doppelklick erweitern

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

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Tabellenereignis Doppelklick erweitern

Beitrag 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?
LG
clag

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

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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
Dateianhänge
Keyhandler.ods
(9.56 KiB) 80-mal heruntergeladen
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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 ?
LG
clag

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

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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
Dateianhänge
Mouseclickhandler.ods
(10.02 KiB) 68-mal heruntergeladen
Benutzeravatar
ChristianAC
***
Beiträge: 91
Registriert: So, 30.11.2014 23:59

Re: Tabellenereignis Doppelklick erweitern

Beitrag von ChristianAC »

cooler Code

Info dazu:
auch unter Version 3.0.0 lauffähig
(obwohl es da noch keine Tabellenereignisse gibt)

Gruss Chris
Internetrechner mit Win 7 OO 3.0.0 sowie Notebook mit XP und AOO 4.1.1
VideoPoker-Spiel
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Tabellenereignis Doppelklick erweitern

Beitrag von F3K Total »

ChristianAC hat geschrieben:(obwohl es da noch keine Tabellenereignisse gibt)
eben!
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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

Code: Alles auswählen

sub MouseClickHandler_mouseReleased(oMouseEvent)
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.

Code: Alles auswählen

    msgbox "CTRL" & " - " & join(DblClick(), " - ")
Das funktioniert soweit, allerdings weiß ich nicht ob das wirklich eine gute Lösung ist.
LG
clag

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

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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 :oops:

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.
LG
clag

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

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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 
Doubleclickhandler2.ods
(10.85 KiB) 55-mal heruntergeladen
LG
clag

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

Re: Tabellenereignis Doppelklick erweitern

Beitrag 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
Antworten