Seite 1 von 1

Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Do, 28.06.2007 15:32
von lupolupp1
Hallo, ich bin OO-Neuling, kenne mich aber relativ gut in Visual Basic (Excel 2003) aus.

Ich möchte nun ein Excel-Programm von VB nach OO übertragen.

Dabei bin ich auf das Problem gestoßen, dass ich beim Drücken der POS1-Taste, der Kombinationen Strg+DOWN etc. Entf./Einfg andere Aktionen durchführen möchte, als von Calc vorgesehen.

Beispielsweise soll der Fokus beim Drücken von POS1 nicht zur Zelle (0,0) sondern zu einer anderen, beispielsweise (2,2) springen.
Außerdem möchte ich eine eigene Kopieren/Einfügen-Routine schreiben und dazu muss die übliche Funktion abgefangen und durch die Aktionen meines Makros ersetzt werden.

Ich habe bereits einen SelectionChangeListener ans Laufen bekommen, weiß nun jedoch nicht, wie ich aus diesem heraus den Tastendruck abfangen, geschweige denn die letzte gedrückte Taste ermitteln könnte.Zu diesem Thema habe ich nur sehr wenig in den Foren gefunden. Unter anderem habe ich auch von einem KeyListener und einem KeyHandler gelesen. Diese Möglichkeit habe ich auch schon getestet.

Ich habe den dazu veröffentlichten Code bei Tabelle1 einer Arbeitsmappe eingetragen, da ich auch genauso beim SelectionChangeListener vorgegangen bin. Aber im Gegensatz zum ChangeListener hat sich hierbei nix getan. Ich habe zur Kontrolle, ob die Sub angesprochen wird, eine Msgbox eigefügt. Es tut sich jedoch nichts. Die Sub (weder KeyHandler noch KeyListener) wird bei einem Tastendruck nicht angesprochen. Ich weiß, dass der Listener zunächst erst initialisiert werden muss. Habe dazu auch die Initialisierungs-Sub mit dem Ereignis "Dokument öffnen" verknüpft.

Muss ich bestimmte Programmteile woanders speichern (in "meine Makros" oder "Standard"). Oder funktioniert ein KeyHandler / Listener nur in Writer?

Welche Möglichkeiten habe ich in Calc, um den Tastendruck auszuwerten. Wenn ihr mir (hoffentlich) Code-Vorschläge macht, könntet ihr dann bitte auch dazu schreiben, an welcher Stelle (Tabelle1, meine Makros etc.) ich den Code eintragen und ob ich noch bestimmte Ereignisse (Dokument öffnen etc.) damit verknüpfen muss?

Dann habe ich noch ein weiteres Problem: ich habe herausgefunden, wie ich den Fokus auf eine bestimmte Zelle lenken kann. Wenn ich den Befehl ausführe, wird die gewünschte Zelle auch angesprochen, sie ist dann allerdings schwarz hinterlegt (selektiert). Wie kriege ich es nun hin, dass der Fokus auf eine gewünschte Zelle gesetzt wird, diese jedoch nur mit dem Fokus umrandet, nicht aber schwarz unterlegt ist?

Ich suche nun schon seit Tagen in vielen Foren nach Lösungen und bin bisher leider nicht viel weiter gekommen.

Viele Grüße und vielen Dank für eure Hilfe im Voraus!

Lupo

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Do, 28.06.2007 16:08
von komma4
Du möchtest ein Abfangen der Tasten programmieren? Oder kannst Du der POS1-Tasten (und anderen) auch ein Makro (manuell) zuordnen (über Extras>Anpassen>Tastatur)?
ist dann allerdings schwarz hinterlegt (selektiert). Wie kriege ich es nun hin, dass der Fokus...
MUSST Du den Fokus (ohne "Selektion") setzen - oder reicht Dir die Positionierung auf der Ziel-Zelle?

ansonsten:
Andrews Macro Document hat geschrieben:If you do want the entire cell to be dark, but rather selected with the dark outline around it, select an empty range AFTER moving the cursor to the desired cell.
Hilft das weiter?

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Do, 28.06.2007 20:28
von komma4
Lupo,
bei der Sache mit der KeyHandler kann ich Dir leider nicht helfen - noch keine Erfahrung.

Für das zweite Problem habe ich bei Andrew nachgeschlagen:

Code: Alles auswählen

Sub MoveCursorToCell
  Dim oCell
  Dim oSheet
  Dim oRanges

  REM Get the first sheet.
  oSheet = ThisComponent.getSheets().getByIndex(0)
  REM Get cell A2
  oCell = oSheet.GetCellbyPosition( 0, 1 )
  REM Move the selection to cell A2
  ThisComponent.CurrentController.Select(oCell)
  
  REM Select an empty range..
  oRanges = ThisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
  ThisComponent.CurrentController.Select(oRanges)
End Sub
In Andrews Dokument findest Du auch ein Beispiel für Problem1 ;-)

Viel Erfolg!

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Fr, 29.06.2007 23:44
von lupolupp1
Habe nach langem Suchen nun selbst etwas Brauchbares gefunden!!!
Der KeyHandler funktioniert in Calc!
Er muss einfach nur in ein Modul der Arbeitsmappe kopiert werden und die Sub "RegisterKeyHandler" mit dem Ereignis "Dokument öffnen" verknüpft werden!

Was ich noch nciht herausgefinden habe ist, welchem Code die POS1-Taste, die Pfeil-Tasten und die ENTF/EINFG-Tasten entsprechen.
Außerdem muss ich noch rausfinden, wie Tastenkombinationen abgefragt werden können.

Vielleicht kann mir dabei jemand helfen?

Viele Grüße

Lupo

Sub RegisterKeyHandler
Doc = ThisComponent.getCurrentController
oKeyHandler = createUnoListener("MyApp_", "com.sun.star.awt.XKeyHandler")

Doc.addKeyHandler(oKeyHandler)

End Sub

Sub UnregisterKeyHandler

Doc.removeKeyHandler(oKeyHandler)

End Sub

Sub MyApp_disposing(oEvt)

End Sub

Function MyApp_KeyPressed(oEvt) As Boolean

Doc = ThisComponent.getCurrentController
Cell = Doc.getselection()

if((oEvt.Keycode >= 257) and (oEvt.Keycode <= 260))then
if( oEvt.Keycode = 257)then
msgbox ("1 was pressed")
MyApp_KeyPressed = True
end if
if( oEvt.Keycode = 258)then
msgbox ("2 was pressed")
MyApp_KeyPressed = True
end if
if( oEvt.Keycode = 259)then
msgbox ("3 was pressed")
MyApp_KeyPressed = True
end if
if( oEvt.Keycode = 260)then
msgbox ("4 was pressed")
MyApp_KeyPressed = True
end if
else
MyApp_KeyPressed = False
end if

End Function

Function MyApp_KeyReleased(oEvt) As Boolean

MyApp_KeyReleased = False

End Function

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Sa, 30.06.2007 00:18
von komma4
...prima: jetzt noch mit xray das oEvt untersuchen, dann bekommst Du auch noch die Modifiers mit...

Viel Erfolg!

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Sa, 30.06.2007 10:27
von lupolupp1
Was muss ich mit xray machen? Hab's mir runtergeladen. Wo muss ich die Dateien speichern bzw. installieren?

Und mit welchem Befehl muss ich dann arbeiten, um die Modifiers auswerten zu können?

Vielen Dank und viele Grüße

Lupo

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Sa, 30.06.2007 18:00
von komma4
Xray von Bernard Marcelly - das sollte jeder kennen und nutzen, der Basic programmieren will....

Nach dem Herunterladen, Entpacken und Installieren (Dokument öffnen und die Schaltfläche nutzen) müssen die Bibliotheken geladen werden.

Code: Alles auswählen

Sub XRayLaden
GlobalScope.BasicLibraries.Loadlibrary("XrayTool")
msgbox "Xray geladen / Xray loaded"
End Sub

Nun kann innerhalb der eigenen Programmierung die Funktion eingesetzt werden, bspw. hier

Code: Alles auswählen

Function MyApp_KeyPressed(oEvt) As Boolean

Doc = ThisComponent.getCurrentController
Cell = Doc.getselection()
xray oEvt
[...]
Nun "durchleutet" xray das Objekt....

Das ist Spitze, oder?!

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Sa, 30.06.2007 21:25
von lupolupp1
Hallo Winfried,

vielen Dank erstmal für deine Geduld.
Ich hab die Datei entpackt und nun viele xml.-Einzeldateien.

Was mach ich denn damit. In Calc hab ich nix gefunden, womit ich die Dateien installieren kann und wenn ich die Dateien selbst mit OO öffne bekomme ich zwar den Code angezeigt, kann ihn aber auch nicht installieren.

Welche der Dateien benötige ich denn überhaupt? Es gibt eine Datei Xrayinstallieren.xml, aber auch einen Ordner "Xray Tool", der wiederum xml-Dateien enthält.

Wenn ich die Dateien mit dem xml-Editor öffnen möchte, bekomme ich folgenden Fehlerhinweis:

Die XML-Seite kann nicht angezeigt werden
Die XML-Eingabe kann nicht angezeigt werden, wenn Stylesheet verwendet wird. Beheben Sie den Fehler und klicken Sie dann auf Aktualisieren, oder wiederholen Sie den Vorgang später.
--------------------------------------------------------------------------------

The system cannot locate the resource specified. Fehler beim Bearbeiten der Ressource 'module.dtd'. Fehler beim Bearbeiten...

<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">

Bitte hilf mir nochmal, ich denke ich stehe jetzt kurz vor dem Ziel.

Vielen Dank und viele Grüße

Lupo

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Sa, 30.06.2007 21:46
von hawkhunter2002
Hallo Lupo
du warst wohl etwas übereifrig mit dem Entpacken
1. Heruntergeladene XRayTool52_en.zip entpacken
2. heraus kommt nur eine Datei XRayTool52_en.sxw (wenn du die auch noch entpackst bekommst du deine xml Datein - wollen wir aber nicht ;) )
3. XRayTool52_en.sxw mit OOO öffnen und auf der 4. Seite den Button Install Xray drücken
4. weiter mit Winfried's Erklärung
5. Strike ;)

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Sa, 30.06.2007 21:53
von komma4
Wenn Du Xray von der Sourceforge Website heruntergeladen hast, entpackst Du die *.zip-Datei und erhälst eine *.sxw
Diese Öffnen mit OOo. Makro-Ausführung erlauben. Du findest eine Schaltfläche "Install Xray" im Dokument: drücken.

Es werden zwei Bibliotheken installiert.
XrayDyn und XrayTool

Mit dem kleinen XRayLaden [vorige Nachricht] kannst Du vor einer Debug-Sitzung (zum Ausprobieren Deiner Makros) nun diese zwei B. laden.

In Deinem Code rufst Du Xray auf und gibst ihm das Objekt zur Untersuchung mit.

Klappt's nun?

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Mo, 09.07.2007 22:56
von lupolupp1
Hallo Winfried,

ich habe mittlerweile zwar eine Möglichkeit gefunden, wie ich den ALT-Key auswerten kann:

If oEvt.Keychar = "z" AND oEvt.MODIFIERS = com.sun.star.awt.KeyModifier.MOD2 Then
MsgBox "z+Alt ist nicht erlaubt!"
MyApp_KeyPressed = True
Exit Function
End If
Wenn ich dann MOD2 in MOD1 ändere, um den CTRL-Key auszuwerten funktioniert's aber nicht. Klappt bei mir nur mit ALT (MOD2).
Wo liegt der Fehler? Oder funktioniert diese Methode mit CTRL einfach nicht?

Das Installieren des X-Ray-Tools hat nun geklappt. Falls es also nur damit möglich sein sollte, CTRL auszuwerten, kanns hier weitergehen.

Aber wie werte ich nun aus, ob beispielsweise CTRL + DOWN gedrückt wurde?

Könntest du mir hierzu noch einen kurzen Beispielcode schicken?

Vielen Dank und viele Grüße

Lupo

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Di, 10.07.2007 19:24
von komma4
lupolupp1 hat geschrieben:Wo liegt der Fehler? Oder funktioniert diese Methode mit CTRL einfach nicht?
ich nehme hier mal an, dass die Kombination CTRL+Z vom Betriebssystem ("rückgängig") abgefangen wird....

Andere Tasten findest Du im SDK

HTH

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Di, 10.07.2007 21:16
von lupolupp1
Hi Winfried,

okay da habe ich zufällig eine belegte Kombination erwischt.
Aber auch mit anderen Tasten, insbesondere den Pfeiltasten funktioniert's bei mir nicht.

Welchen Code muss ich denn verwenden, um mit dem xray-Tool festzustellen, ob beispielsweise CTRL+DOWN gedrückt wurde?

Vielen Dank und viele Grüße

Lupo

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Di, 10.07.2007 21:54
von komma4

Code: Alles auswählen

Function MyApp_KeyPressed(oEvt) As Boolean

Doc = ThisComponent.getCurrentController
Cell = Doc.getselection()
xray oEvt
[...]
damit zeigt Dir xray immer an, was gerade gedrückt wurde.
CTRL+Down KeyCode 1024 KeyFunc 0 Modifiers 2

Auch CTRL+z funktioniert hier (demnach nehme ich das obige zurück):
KeyCode 537 KeyFunc 11 Modifiers 2

Re: Tastendruck in Calc abfangen und auswerten / zu Zelle spring

Verfasst: Di, 10.07.2007 22:53
von lupolupp1
Hi Winfried,

prima! Vielen Dank.

Mittlerweile habe ich mir die neue Version 2.10 von der Novell Edition für Windows runtergeladen und
ES FUNKTIONIERT!

Hier nun mal der Gesamtcode für evtl. andere User mit dem gleichen Problem:

Option Explicit
Global ObjZelle
Global oKeyHandler
Global oDocController

Sub Main
UnregisterKeyHandler
End Sub

Sub RegisterKeyHandler
oDocController = ThisComponent.getCurrentController
oKeyHandler = createUnoListener("MyApp_", "com.sun.star.awt.XKeyHandler")
oDocController.addKeyHandler(oKeyHandler)
End Sub

Sub UnregisterKeyHandler
If Not IsNull(oDocController) AND NOT IsEmpty(oDocController) Then
oDocController.removeKeyHandler(oKeyHandler)
oDocController = NULL
EndIf
End Sub

Sub MyApp_disposing(oEvt)
End Sub

Function MyApp_KeyPressed(oEvt) As Boolean
Dim Cell
oDocController = ThisComponent.getCurrentController
Cell = oDocController.getselection()

ObjZelle=ThisComponent.Sheets(0).getCellByPosition(2,2)
ObjZelle.Value=oEvt.Keycode

If oEvt.KeyCode = com.sun.star.awt.Key.F1 AND oEvt.MODIFIERS = 0 Then
MsgBox "Ha ha, I will NOT allow you to use F1 today!"
MyApp_KeyPressed = True
Exit Function
End If
If oEvt.Keychar = "z" AND oEvt.MODIFIERS = com.sun.star.awt.KeyModifier.MOD2 Then
MsgBox "z+Alt ist nicht erlaubt!"
MyApp_KeyPressed = True
Exit Function
End If

If oEvt.Keycode=1024 AND oEvt.MODIFIERS =2 Then
msgbox("Du hast CTRL+DOWN gedrückt!")
End if

If oEvt.Keycode=1025 AND oEvt.MODIFIERS =2 Then
msgbox("Du hast CTRL+UP gedrückt!")
End if


If((oEvt.Keycode >= 257) and (oEvt.Keycode <= 260)) AND oEvt.MODIFIERS =2 Then

If ( oEvt.Keycode = 257) Then
msgbox ("1 was pressed")
MyApp_KeyPressed = True
EndIf
If ( oEvt.Keycode = 258) Then
msgbox ("2 was pressed")
MyApp_KeyPressed = True
EndIf
If ( oEvt.Keycode = 259) Then
msgbox ("3 was pressed")
MyApp_KeyPressed = True
EndIf
If ( oEvt.Keycode = 260) Then
msgbox ("4 was pressed")
MyApp_KeyPressed = True
EndIf
Else
'Print "Something else"
MyApp_KeyPressed = False
EndIf
End Function

Function MyApp_KeyReleased(oEvt) As Boolean
MyApp_KeyReleased = False
End Function

Vielen vielen Dank nochmal allen, die mir geholfen haben.

Lupo