KeyCode bei AppEvent

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

Moderator: Moderatoren

Antworten
michael_wetterhahn

KeyCode bei AppEvent

Beitrag von michael_wetterhahn »

Weil mein Program manchmal gehangen hat bei meiner eingen inkey-Funktion, habe ich die Keycodes protokolliert.
KleinBuchstaben a=65601 b=65602 ....z=65626
GroßBuchstaben A=196673 B=196674 ....Z=196698
Ziffern über Tasten 0=65584 1=65585 .....9=65593
Ziffern Numerikblock 0=65632 1=65633 .....9=65641
Sonderzeichen lasse ich mal aus.

In keiner Includedatei habe ich diese Codes gefunden!

Hat einer eine Idee wo die herkommen? Natürlich könnte ich mir eine eigene Übersetzungstabelle schreiben, aber sind denn diese Codes normal?!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
willkommen im Klub :D
Unter Windows wird ja nur mittels "Events" gesprochen - und da Events sowohl von der Tastatur als auch der Maus (und natürlich noch von wesentlich mehr, aber die beiden sollen hier mal reichen) ausgelöst werden und man dies im Programm unterscheiden können muss, werden die Events in Kategorien eingeteilt (also in diesem Beispiel "Mausevent" und "Tastaturevent").
Am besten schaust Du mal in der Hilfe unter dem Stichpunkt "Tastatur und Maus" nach - dort findest Du zwar keinen Verweis auf Includedateien, aber das ganze an sich ein wenig erklärt.
Die Codes sind so normal und sollten Standardwindowscodes sein!

Viele Grüße,
Martin
michael_wetterhahn

Beitrag von michael_wetterhahn »

Hallo Martin,
erst einmal Danke. Das ist mir im Prinzip alles klar. Doch das Problem ist, ich will die Ereignisse auswerten und wenn ich Tastencodes bekomme, die nirgendwo erklärt werden und ich nur durch Probieren die Bedeutung herausbekomme, dann fühl ich mich doch etwas verunsichert.
Bei diesen von mir genannten Codes bekam ich eine Rückmeldung über den Lautsprecher des PC doch mein Programm konnte mit ihnen nichts anfangen.

Nach einer Ruhepause bekam ich wieder ganz normale Tastaturcodes, die mein Programm verarbeiten kann. Wie schon ausgeführt, außer dem Brummen des Lautsprechers beim Tastenanschlag, hing das Programm. Meine Frage nach Include-Dateien betrifft ja nur eine vollständige Auflistung dieser aus meiner Sicht sonderbaren Codes, damit ich sie der normelen Auswertung zuführen kann.

Gruß Michael
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
da das (meiner Meinung nach) Standardwindowscodes sind, wirst Du die auch in keiner Alaska-eigenen include-Datei finden.
Es gibt eine windows.h, die bei diversen (C-)Programmiersprachen mitgeliefert wird. In dieser solltest Du die Standardevents finden.
Du kannst Dir z.B. von Microsoft das Visual C++ Toolkit 2003 herunterladen.

Viele Grüße,
Martin
michael_wetterhahn

Beitrag von michael_wetterhahn »

Hallo Martin,

ich bin anscheinend zu blöd. Auf dieser Seite, die Du mir genannt hast, wird mir alles mögliche angeboten, teils gegen "low cost" aber, die windows.h
konnte ich nicht zum herunterladen finden!

MfG

Michael
michael_wetterhahn

Beitrag von michael_wetterhahn »

Hallo Martin;

nochmal ich. Beim serven im Internet habe ich natürlich verschiedenen Windows.h-Dateien gefunden, aber diese enthalten wieder andere include-Dateien, die sie aufrufen. Ich suche ganz einfach nach einer allgemeinen Übersetzungstabelle für die von mir zuerst genannten Key-Codes. Natürlich könnte ich weiter probieren. Aber dazu muß ich warten bis mein Programm wieder "hängt" und über die doppelte Protokollierung der von mir gedrückten Tasten die Codes herausbekommen. D.h. ich muß mir jede Taste, die ich gedrückt habe aufschreiben und danach sie meiner vom Programm erstellten Protokolldatei zuordnen. Ziemlich mühseelig!
Ich hoffte einen einfacheren und sicheren Weg zu finden.

MfG


Michael
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
das ist nicht nur die windows.h sondern das komplette Visual C++ Toolkit!
Du hast auf der Seite (oben, Mitte) einen Knopf "Download" - da rauf klicken, runterladen und installieren!!
Nach der Installation findest Du auch (nicht nur) die windows.h-Datei.
Xbase++ ist ja in C (oder C++?) entwickelt.

Viele Grüße,
Martin
michael_wetterhahn

Toolkit

Beitrag von michael_wetterhahn »

Hallo Martin,
bin anscheinend doch zu blöd. Habe das komplette Toolkit heruntergeladen.
Was ich damit soll ist mir allerdings nicht klar, da ich nicht in C++ programiere. Habe auch die Include-Dateien des Toolkit durchgescannt aber keine mit einer entsprechenden Übersetzungstabelle gefunden!

Was mir immer noch nicht klar ist warum mir XBase++ bei meinen Tastatureingaben in der Eventloop meistens ganz normale Antworten gibt, also ASCII-Zeichencodes und dann plötzlich diese sonderbaren Codes. und nach einer Pause wieder ASCII. Da scheint doch irgend etwas nicht in Ordnung zu sein!

MfG

Michael
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
sorry - ich hätte gedacht, dass in der windows.h die entsprechenden Codes stünden!
wie sieht denn Deine Eventloop aus? Filterst Du explizit die Tastaturevents aus (xBeP_keyboard) - wenn nicht, hast Du dort auch Deine Maus-Events, Resize-Events und sonstige Events...

Viele Grüße,
Martin
michael_wetterhahn

Programm beispiel zur Eventloop

Beitrag von michael_wetterhahn »

Hallo Martin,

würde Dir gern Codebeispiel schicken. Komme jedoch mit dem neuen Forum noch nicht zurecht. Eine kleine Gebrauchsanleitung/ Einführung wäre hilfreich.

Wenn ich meinen Quellcode mit Strg-V in dieses Fenster übernehme, wird er umformatiert und ich weiß nicht, wie ich ihn wieder in Form bringe und ggf,. Kommentare hinzufüge.

MfG

Michael[/img][/list][/list]
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
füge Deinen Quellcode ein, markiere ihn und drücke anschließend auf den Knopf (Code), dann steht das entsprechende Tag vor und hinter Deinem Quellcode und dieser müßte unformatiert (aber farbig) eingefügt werden.

Viele Grüße,
Martin
michael_wetterhahn

Beitrag von michael_wetterhahn »

Hallo Martin,
anbei mein Code.

MfG

Michael

Code: Alles auswählen


/*Neben dem in myinkey gestarteten Thread läuft noch ein DruckerThread, der Intervallgesteuert ist, zur Ausgabe von Druckfiles auf Bondrucker mit anschließender Löschung der Files. Später soll noch ein BackupThread zur automatischen Sicherung relevanter Kassenfiles auf  Sicherungslaufwerk und optional ein Zapfthread ebenfalls intervallgesteuert zur Bedienung der Ventile an den Bierhähnen laufen.
Der okeythread überwacht einen ComPort an dem ein Kellnerschloß angeschlossen ist. Er stellt nur fest, dass da was passiert ist. Die Behandlung erfolgt dann im HauptThread.

*/


function myinkey(nwait,lnoeval)
   local nstart:=seconds(),nende,nevent,mp1,mp2,o2win,l_ever:=.f.,l_focus:=.t.
   local oXbp,winarea,loldcomtrap
   local ctemp:=""
   memvar n_lastkey,owin,okeytread,key_lock
   set typeahead to 100   //dachte das hilft
   lnoeval:= IIF(lnoeval=NIL, .T.  ,lnoeval )

   l_ever:= IIF(nwait=0, .T.  , l_ever)
   nevent := 0
   o2win:=setappwindow()
   setappwindow(owin)
   winarea:=owin:calcClientRect({owin:currentpos()[1],;
      owin:currentpos()[2],;
      owin:currentsize()[1],;
      owin:currentsize()[2]})
   oXbp:=owin
   nwait:= IIF(nwait=NIL,0.1 ,nwait )
   nende:= IIF(nstart+nwait>=86400,nstart+nwait-86400 ,nstart+nwait )
   loldcomtrap:= lcomtrap
   lcomtrap:= iif(loldcomtrap,.f.,lcomtrap)
   DO WHILE .T.
      if !empty(okeytread) .and. okeytread:active  //Thread zur Überwachung der COM-schnittstelle
         millisec(10)
      endif
      if key_lock .and. !empty(okeytread)  /Nur wenn Kellnerschloss angeschlossen bei meinen Versuchen lief dieser Thread nicht.
         okeytread:start("com_key",key_com)
      endif
      nevent := AppEvent(@mp1,@mp2,@o2win,1)
                 // xbeM_LbClick
      if !loldcomtrap .and. lcomtrap  //Meldung dass an COM was passiert
         mp1:=K_ALT_K
         if okeytread:active
            millisec(10)
         endif
         desk_bon()  //Behandlung 
         n_kassnr:=0
         setlastkey(K_ALT_K)
         exit
      endif
      IF nEvent = 1048589 .OR. nEvent = xbeM_LbClick .OR.  nEvent = xbeM_LbDblClick   //Mausevent = Touch
         if valtype(mp1)="A"
            IF mp1[2]>winarea[4] //außerhalb des Hauptfensters
               loop
            ENDIF
         endif
         mp1:=o2win:setowner():currentpos()[1]*1000 //Position wo Touch

         IF mp1=0
            mp1:=o2win:setowner():setowner():currentpos()[1]*1000+o2win:setowner():setowner():currentpos()[2]
         else
            mp1+=o2win:setowner():currentpos()[2]
         ENDIF
         if !empty(okeytread) .and. okeytread:active
            millisec(10)
         endif

         mp1:= seekascr(mp1,lnoeval)  //Behandlung des Touch mit  //Codeblock - Suchen von mp1 in einem array und danach ausführen des //Codeblocks  der ebenfalls im array steht wenn lnoeval = .f. ansonsten //Rückgabe eines im array gespeicherten Tastenwerts.
         exit
      ELSEIF nEvent = xbeP_Keyboard
         IF mp1#0
            mp1:=n_lastkey := DC_KeyTRAN(mp1,1)  //Rogers //Umwandlungsroutine
            if mp1>65000
               ctemp:=iif(valtype(mp1)="N",str(mp1,7),"")+"/"   //Testprotokoll
               n_lastkey :=keyconvert(@mp1) //eigene Konvertierung der  //Werte in ASCII
               ctemp+=str(mp1,7)+str(seconds(),8,1)+chr(13)+chr(10)
               strfile(ctemp,"Myevent",.t.)
            endif
            mp1:= seekascr(mp1,lnoeval) //Behandlung des Tastendrucks //analog oben
            exit
         ENDIF
      ENDIF
      IF !l_ever .AND. nende<nstart .AND. seconds()-nstart<0 .AND. seconds()>nende
         mp1:=0
         exit
      elseif !l_ever .AND. seconds()>nende
         mp1:=0
         exit
      ENDIF
   ENDDO
   owin:=oXbp
   if !empty(okeytread) .and. okeytread:active
      millisec(10)
   endif
   lcomtrap:= iif(loldcomtrap,.t.,lcomtrap) 
   setappwindow(owin)
   if procname(1)="TOUCHEVENT" .and. (lastkey()=K_ESC .or. mp1=K_ESC)
      mp1=-1
   elseif lastkey()=K_ESC
      mp1=K_ESC
   endif
return mp1










Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
ich habe nur kurz mal rübergeschaut - folgendes ist mir aufgefallen:
  • Deine Variable okeytread wird nie mit irgendwas belegt!
  • Die Variablen lcomtrap ist nicht definiert (oder ist es eine globale?)
  • Die Variable owin ist definiert, wird aber nie mit einem Wert belegt!
Viele Grüße,
Martin
michael_wetterhahn

Beitrag von michael_wetterhahn »

Hallo Martin,

danke,dass Du Dir das Programm mal angeschaut hast.
owin ist das Hauptfenster. Es wird benötigt zur Berechnung der Fläche, auf der Touchevents (Maus) zulässig sind.
lcomtrap ist eine Publicvariable (memvar vergessen) die vom okthread auf .T. gesetzt wird, wenn an der beobachteten COM etwas passiert.
okeythread selbst wird in Abhängigkeit davon ob in der Inidatei mitgeteilt wurde, dass ein Kellnerschloss an irgendeinem COM-Port angeschlossen ist, in der main-Funktion als thread initialisiert.

Mit Ausnahme des vergessenen memvar, ist schon so alles richtig.

MfG

Michael
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Michael,
Du schreibst in Deinem Text von okaythread (mit h!!), im Source steht aber immer oktread (ohne h!!).
Was ist K_ALT_K?? Hast Du die mit demselben Wert belegt wie xbeK_ALT_K?
Benutze doch mal lieber PostAppEvent, statt mp1 den Wert K_ALT_K zuzuweisen.
Viel weiter kann ich Dir leider auch nicht helfen - ich habe bei mir nur "normales" Eventhandling und manipuliere die Queue nicht dermaßen.

Viele Grüße,
Martin
michael_wetterhahn

Beitrag von michael_wetterhahn »

Hallo Martin,

Die Funktion myinkey wird an verschiedensten Stellen des Programms aufgerufen. Das Programm ist die Konvertierung eines CLipper-Programms.
Auf der einen Seite erspart das viel Arbeit auf der anderen werden Kompromisse eingegangen, die bei einer völligen Neuprogrammierung vielleicht nicht nötig wären. Ich habe ja bewußt deshalb XBasse++ gewählt.
Von der Programmlogik gibt es verschiedene Grundzustände, die oberhalb der Eventloop ausgewertet werden. Andererseits innerhalb der Eventloop werden Unterprogramme über Codesblöcke aufgerufen, die wiederum auf Tastendrücke oder Touches warten und dann weiter nach unten verzweigen.
Gleichzeitig muss ständig das Kellnerschloss überwacht werden, da das Stecken oder Ziehen eines Schlüssels sofort eine andere Programmebene bedeudet. Dafür ist das zentrale Event der Druck der Taste ALT_K. Alt_K auch deshalb, weil ohnen Kellnerschloss das über diese Tastenkombination erreicht wird. Ich konvertiere xbe_ALT_K in K_ALT_K (Clipper-Inkey.CH)=291. Alle Tastendrücke werden bei mir in Clipper-Inkeys konvertiert. Siehe oben.
Okeytread ist ja nur eine Bezeichnung für einen vorher mit :new angelegten Thread. Mit der Einschränkung, der von mir anfangs gar nicht und jetzt nur teilweise interpretierbaren Windows-Tastenevents, funktioniert mein Programm.
In der entscheidenden Sache den Windowseventcodes für Tasten sind wir allerdings nicht weitergekommen. Ich habe diesbezüglich ein Anfrage an "winboard.org" gerichtet, die haben mir eine Antwort in 24 Stunden versprochen, doch ist bisher nach 3 Tagen noch nicht eingetroffen.
Ich halte Dich auf dem Laufenden.

MfG


Michael
Antworten