Event-Code bei Tastenkombination

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Event-Code bei Tastenkombination

Beitrag von peternmb »

Hallo,

gibt es eine Möglichkeit, den Eventcode für eine Tasten-Kombination auszuwerten?

Ich würde gerne um die Programm-Steuerung auch über die Tastatur zu ermöglichen mit Tasten-Kombinationen arbeiten.

Beispiel: Strg+S+A um eine Datenbank nach Feldinhalt A zu sortieren

Wenn ich mir den Eventwert anzeigen lasse wird der aber für jeden Tastendruck einzeln angezeigt.
Für das Beispiel oben also erst 19 (=Strg+S) dann 1(=Strg+A).

Kann ich das irgendwie kombinieren, dass die Tasten gemeinsam ausgewertet werden?
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo,

verwende einen Keyboard-Handler, der sich intern merkt, dass (und zu welchem Zeitpunkt) Strg+S gedrückt worden ist. Wenn innerhalb kurzer Zeit eine bestimmte andere Strg-Tastenkombination folgt, löst du die gewünschte Aktion aus.

Viele Grüße
Günter

Code: Alles auswählen

oBrowse:keyboard := {|n,u,oBrowse|StrgKeyboardHandler( oBrowse, n )}

FUNCTION StrgKeyboardHandler( oXbp, nKey )

static Key19     := .F.
static key19time := 0

local lHandled   := .F.

if ! Key19 .and. nKey = 19    // Strg+S
   Key19     := .T.
   Key19Time := seconds()
   lHandled  := .T.
elseif Key19 .and. nKey = 1 .and. seconds() - key19time < 1 
   lHandled  := .T.
   Key19     := .F.
   key19time := 0
   MsgBox( "Sortieren nach Feld A" )
else
   Key19     := .F.
   key19time := 0
endif

return lHandled
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

Danke für die Antwort - nur, wo baue ich das ein?
Mein Event-Loop sieht z.Zt. so aus:

Code: Alles auswählen

DO WHILE .T.
   nEvent := AppEvent( @mp1, @mp2, @oXbp )
   oXbp:HandleEvent( nEvent, mp1, mp2 )
   if nEvent == xbeP_Keyboard          // nur wenn Taste gedrückt
      if mp1 == xbeK_P_CTRL_PLUS
         plus()
      elseif mp1 == xbeK_P_CTRL_MINUS
         minus()
      elseif mp1 == xbeK_CTRL_S
         msgbox( str(nEvent,10,0), str(mp1,10,0) )   // Test
      endif
   ENDIF
ENDDO
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo,
schau mal in appevent.ch, da stehen alle Keycodes drin.
lg
Rudolf
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14659
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hallo Rudolf,

aber leider nicht so exotische.

@ Peter: Frag doch mal bei Andreas an. Der hat soetwas bei sich eingebaut. Hat lange gekämpft, bis er das rausgefunden hat, und ist recht elegant geworden. Und sehr einfach.

Jan
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo Jan,
hast recht, sorry, hab nicht genau geschaut
Grüsse
Rudolf
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Peter,
nur, wo baue ich das ein?
Mein Event-Loop sieht z.Zt. so aus: ...
Wenn nur ein bestimmtes Xbp auf diese Tastenkombinationen reagieren soll, im Keyboardhandler-Slot des XBPs. In der Eventloop, wenn alle Xbps darauf reagieren sollen, vielleicht so wie unten.

Viele Grüße
Günter

Code: Alles auswählen

#include "appevent.ch"
#include "inkey.ch"

DO WHILE .T.
   nEvent := AppEvent( @mp1, @mp2, @oXbp )
   if nEvent == xbeP_Keyboard          // nur wenn Taste gedrückt
      lHandled := StrgKeyboardHandler( oXbp, mp1 )
   else
      lHandled := .F.
   endif
   
   if ! lHandled      
      oXbp:HandleEvent( nEvent, mp1, mp2 )
   endif
enddo

FUNCTION StrgKeyboardHandler( oXbp, nKey )

static CtrlS     := .F.
static CtrlSTime := 0

local lHandled   := .F.

if ! CtrlS .and. nKey = K_CTRL_S
   CtrlS     := .T.
   CtrlSTime := seconds()
   lHandled  := .T.
elseif CtrlS .and. nKey = K_CTRL_A .and. seconds() - CtrlSTime < 1
   lHandled  := .T.
   CtrlS     := .F.
   CtrlSTime := 0
   MsgBox( "Sortieren nach Feld A" )
else
   CtrlS     := .F.
   CtrlSTime := 0
   lHandled  := .T.

   if mp1 == xbeK_P_CTRL_PLUS
      plus()
   elseif mp1 == xbeK_P_CTRL_MINUS
      minus()
   else
      lHandled := .F.
   endif
endif

return lHandled
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

ja, so ähnlich habe ich es jetzt gelöst - funktioniert einwandfrei.

Das Einzige was mir aufgefallen ist: wenn ich die Taste Strg+i abfrage, funktioniert der Wechsel zwischen SLE`s mit der Tab-Taste nicht mehr :?:

Gut ist nicht so tragisch - ich habe eine andere Tastenkombination verwendet. Seltsam ist es aber trotzdem.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Peter,

Strg+I = 9 = TAB

Viele Grüße
Günter
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

Danke - jetzt habe ich es auch gefunden in der appevent.ch

Heißt also, man muß mit Strg+Tastenkombination vorsichtig sein, sonst erhält man durch die Doppelbelegung nicht unbedingt das gewünschte Ergebnis :?
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hi,

ja, es gibt ein paar Doppelbelegungen:
Strg-H = Backspace
Strg-I = Tab
Strg-M = Enter
Strg-J = Strg-Enter
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Antworten