Tastatureingaben manipulieren?

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
mini990
1000 working lines a day
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?

Beitrag von mini990 »

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
Benutzeravatar
Bertram Hansen
Foren-Moderator
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:

Beitrag von Bertram Hansen »

Hallo Stefan,

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
:wave:
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!
Benutzeravatar
mini990
1000 working lines a day
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

Beitrag von mini990 »

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
Benutzeravatar
Bertram Hansen
Foren-Moderator
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:

Beitrag von Bertram Hansen »

Hallo Stefan,

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 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.
:wave:
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!
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Stefan,

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
Vielleicht hilft es dir weiter.
Gruß,

Andreas
VIP der XUG Osnabrück
michael_wetterhahn

Lastkey()

Beitrag von michael_wetterhahn »

Es geht noch einfacher!
Public n_lastkey
function setlastkey(nkey)
n_lastkey:=nkey
return ""
function Lastkey()
return n_lastkey

Gruß Michael
Benutzeravatar
mini990
1000 working lines a day
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

Beitrag von mini990 »

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

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