Tastatureingaben manipulieren?
Moderator: Moderatoren
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Tastatureingaben manipulieren?
Hallo,
folgendes Problem......
Ich möchte eine komplette Tastatursteuerung in der Anwendung ermöglichen. So soll mit Eingabe "Escape" (27) die Anwendung beendet werden.
Ist jedoch ein Eingabefeld aktiv soll nur die Eingabe beendet, nicht jedoch das Programm beendet werden.
Folgendes passiert momentan:
ESC bei normaler Programmsteuerung -> Programm wird beendet
ESC im Eingabefeld -> Eingabe wird abgebrochen (Änderungen werden nicht gespeichert) ist auch ok so. Aber: Die Tastatureingabe ESC wird weiter verarbeitet und das Programm ebenfalls beendet.
Wie kann ich das abfangen?
danke im voraus
Gruß Stefan
folgendes Problem......
Ich möchte eine komplette Tastatursteuerung in der Anwendung ermöglichen. So soll mit Eingabe "Escape" (27) die Anwendung beendet werden.
Ist jedoch ein Eingabefeld aktiv soll nur die Eingabe beendet, nicht jedoch das Programm beendet werden.
Folgendes passiert momentan:
ESC bei normaler Programmsteuerung -> Programm wird beendet
ESC im Eingabefeld -> Eingabe wird abgebrochen (Änderungen werden nicht gespeichert) ist auch ok so. Aber: Die Tastatureingabe ESC wird weiter verarbeitet und das Programm ebenfalls beendet.
Wie kann ich das abfangen?
danke im voraus
Gruß Stefan
- Bertram Hansen
- Foren-Moderator
- Beiträge: 1015
- Registriert: Di, 27. Sep 2005 8:55
- Wohnort: 51379 Leverkusen
- Hat sich bedankt: 28 Mal
- Danksagung erhalten: 20 Mal
- Kontaktdaten:
Hallo Stefan,
ich mach das so:
ich mach das so:
Code: Alles auswählen
// nach dem ESC im Eingabefeld
If LastKey() = K_ESC
SetLastKey(251) // der 251 ist zufällig gewählt
// Programm nicht beenden
Endif
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.
Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
Hallo Bertram,
wie funktioniert das? SetLastkey() ist ja keine Xbase-Funktion.
Ich habe schon etliches ausprobiert wie Keyboard, postappevent aber komme zu keinem Ergebnis
Hier der Quellcode:
Function EndEditField( nKey , oSle, oBrowse)
IF nKey == xbeK_RETURN .OR. nKey == xbeK_ENTER
dbrlock()
oSle:GetData ()
SetAppFocus ( oBrowse )
dbrunlock()
ELSEIF nKey == xbeK_ESC
SetAppFocus ( oBrowse )
ENDIF
RETURN NIL
Gruß Stefan
wie funktioniert das? SetLastkey() ist ja keine Xbase-Funktion.
Ich habe schon etliches ausprobiert wie Keyboard, postappevent aber komme zu keinem Ergebnis
Hier der Quellcode:
Function EndEditField( nKey , oSle, oBrowse)
IF nKey == xbeK_RETURN .OR. nKey == xbeK_ENTER
dbrlock()
oSle:GetData ()
SetAppFocus ( oBrowse )
dbrunlock()
ELSEIF nKey == xbeK_ESC
SetAppFocus ( oBrowse )
ENDIF
RETURN NIL
Gruß Stefan
- Bertram Hansen
- Foren-Moderator
- Beiträge: 1015
- Registriert: Di, 27. Sep 2005 8:55
- Wohnort: 51379 Leverkusen
- Hat sich bedankt: 28 Mal
- Danksagung erhalten: 20 Mal
- Kontaktdaten:
Hallo Stefan,
erst einmal vorneweg zur Aufklärung, unsere Applikation läuft im Hybrid-Modus. Die Funktion SetLastKey() habe ich folgendermassen umgeschrieben:
Ich nutze das in Verbindung mit dem alten db_edit(). Für den reinen GUI-Modus habe ich leider keine Lösung.
Ich habe für eine anderes Problem die Instanzvariable :exitState des aktuellen Get-Objektes überschrieben. Vielleicht ist das ein anderer Lösungsansatz.
erst einmal vorneweg zur Aufklärung, unsere Applikation läuft im Hybrid-Modus. Die Funktion SetLastKey() habe ich folgendermassen umgeschrieben:
Code: Alles auswählen
**********************************************
* Funktionsname: setlastkey()
* Verwendung : Die Standardfunktion SETLASTKEY() gibt es unter Alaska nicht mehr.
* Darum habe ich die nachgebildet
FUNCTION setlastkey(pan_keycode)
IF pan_keycode != NIL
KEYBOARD CHR(pan_keycode)
INKEY(0.1)
ENDIF
RETURN .T.
*
Ich habe für eine anderes Problem die Instanzvariable :exitState des aktuellen Get-Objektes überschrieben. Vielleicht ist das ein anderer Lösungsansatz.
Gruß Bertram
http://www.tobax.de
Mitglied der XUG Cologne
Mitglied der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e.V.
Solange Kakaobohnen an Bäumen wachsen ist Schokolade Obst!
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Stefan,
ich habe bei meinen GUI-Anwendungen die Tastenverarbeitung folgend gelösst:
Vielleicht hilft es dir weiter.
ich habe bei meinen GUI-Anwendungen die Tastenverarbeitung folgend gelösst:
Code: Alles auswählen
METHOD Init()
.
.
::keyboard := {|nKey| ::Tasten(nKey) }
RETURN self
METHOD Tasten(Taste)
local oObjekt:= setappfocus()
**msgbox(str(taste))
if taste == xbeK_ENTER
IF oObjekt == ::einLiefNr //Suchen
*::Suchen()
elseIF oObjekt == ::butFrachtSpeichern
::FrachtSpeichern()
else
PostAppEvent( xbeP_Keyboard, ( 9 ),, oObjekt ) //tab-taste
ENDIF
endif
**iif(taste == xbeK_ALT_E, FertigungMain() ,nil) //Fertigung
RETURN self
- mini990
- 1000 working lines a day
- Beiträge: 592
- Registriert: Sa, 28. Jan 2006 9:44
- Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
- Danksagung erhalten: 1 Mal
von den Tips hat leider keiner bei mir zum Erfolg geführt, trotzdem vielen Dank.....
Ich habe es nun wie folgt "gelöst"
wird eine Tastatureingabe getätigt und der Focus sitzt im Eingabefeld wird er "normal" abgearbeitet, ist der Focus nicht im Eingabefeld wird die do case abgearbeitet (z.B. ESC führt dann auch zum beenden der Prozedur.
Bestimmt nicht elegant und muß auch noch überarbeitet werden (z.B. daß die Eingabefelder automatisch abgefragt werden) aber zumindest funktionierts nun erstmal....
Gruß Stefan
PS: irgendwann raffe ich das auch mit dem ordentlichen Anzeigen des Codes......
Ich habe es nun wie folgt "gelöst"
wird eine Tastatureingabe getätigt und der Focus sitzt im Eingabefeld wird er "normal" abgearbeitet, ist der Focus nicht im Eingabefeld wird die do case abgearbeitet (z.B. ESC führt dann auch zum beenden der Prozedur.
Bestimmt nicht elegant und muß auch noch überarbeitet werden (z.B. daß die Eingabefelder automatisch abgefragt werden) aber zumindest funktionierts nun erstmal....
Code: Alles auswählen
DO WHILE nEvent <> xbeP_Close
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
IF nEvent == xbeP_Keyboard .and. upper(var2char(oXbp)) # "XBPSLE"
do case
case mp1 = asc("O") .or. mp1 = asc("o")
Gruß Stefan
PS: irgendwann raffe ich das auch mit dem ordentlichen Anzeigen des Codes......