Merkwürdiges Verhalten von KeyboardInKey

Für allgemeine Fragen zur Programmierung mit PureBasic.
Hypersoft
Beiträge: 22
Registriert: 04.10.2004 16:14

Merkwürdiges Verhalten von KeyboardInKey

Beitrag von Hypersoft »

Hallo alle zusammen,
ich habe bei Tastaturabfragen ein komisches Verhalten festgestellt. Vielleicht kann mir das ja einer von euch mal etwas genauer erklären.
Es geht um folgenden Code:

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenWindow(1,20,80,400,600,"hallo")
OpenWindowedScreen(WindowID(1),0,0,1,1,1,0,0)
Repeat
x = WindowEvent()
If x = 256
ExamineKeyboard()
string$ +KeyboardInkey()
StartDrawing(WindowOutput(1))
DrawText(20, 20, string$)
StopDrawing()
x = 0
EndIf
ForEver
Die Tastendrücke werden bei mir am Anfang erst gar nicht, dann immer um eine Taste nach hinten versetzt erkannt. Drücke ich ein A wird nichts hingeschrieben. Wenn ich dann auf einen anderen Buchstaben drücke, kommt dann das a. Beim nächsten Druck auf eine Taste würde dann wieder der Buchstabe geschrieben werden, den ich eigentlich vorher gedrückt hatte.
Über eine Erklärung hierzu würde ich mich sehr freuen :-)

Edit by NicTheQuick: Code-Tags gesetzt
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Re: Merkwürdiges Verhalten von KeyboardInKey

Beitrag von coder »

Ich hab deinen Code mal etwas verbessert:

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenWindow(1,20,80,400,600,"hallo")
OpenWindowedScreen(WindowID(1),0,0,400,600,1,0,0)
Repeat
  ClearScreen(#White)    ;den Hintergrund von Screen weiß zeichnen
  
  Repeat    ;Event-Schleife um alle Window-Events abzufangen
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow    ;Fenster wurde geschlossen
      Break 2   ;Beide Schleifen verlassen
    EndIf
  Until Event = 0

  If ExamineKeyboard()    ;Keyboard abfragen
    string$ + KeyboardInkey()
    StartDrawing(ScreenOutput())
      DrawText(20, 20, string$, #Red)    ;den Text rot zeichnen
    StopDrawing()  
  EndIf
  
  FlipBuffers()
ForEver
End
Du solltest folgende Dinge beachten:
  • Wenn du WindowedScreens verwendest musst du alle WindowEvents innerhalb der Hauptschleife abfragen
  • Wenn du generell Screens benutzt solltest du ClearScreen() und FlipBuffers() verwenden, sonst flackert das wie Puma
  • außerdem bitte dann auch ScreenOutput() nehmen, sonst bringt dir der Screen überhaupt nix...
  • Schwarzer Text auf schwarzen Grund sieht man für gewöhnlich nicht...
  • Verwende bitte Code-Tags, wenn du ein Snippet postest, das erhöht die Übersichtlichkeit
mfg

//Edit:
Komisch mit ScreenOutput() zeigt er im WindowedScreen nichts an, nur im FullScreen....
Jetzt bin ich auch ratlos. Es liegt aber definitiv am 2D-Drawing, nicht an KeyboardInkey()

//Edit2:
Hab den Code berichtigt, so das es geht
Zuletzt geändert von coder am 08.11.2009 20:09, insgesamt 1-mal geändert.
Windows 7 x64 | PureBasic 4.60 4.50 4.02
Ja verdammt, meine Eltern wohnen immer noch bei mir!
Hypersoft
Beiträge: 22
Registriert: 04.10.2004 16:14

Re: Merkwürdiges Verhalten von KeyboardInKey

Beitrag von Hypersoft »

Danke schonmal für die Antwort. Wenn ich allerdings einen MessageRequester anstatt des Drawings verwende, bekomme ich die gleichen Ergebnise.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Merkwürdiges Verhalten von KeyboardInKey

Beitrag von Kaeru Gaman »

@Hypersoft
ist das alte fehlerhafte Beispiel imm noch nicht korrigiert oder wo hast du das her?
eine 1x1 pixel großen screen erstellen zu wollen ist Unfug, den kannst du Autostretchen soviel du willst.
da ist beim Erstellen des Beispiels die Bedeutung von "Autostretch" schlicht fehlinterpretiert worden.
benutzt du keine aktuelle Version...?
... und was für ein Event soll "256" sein?
so ergibt das wirklich gar keinen Sinn, sorry.

mit den Events hat coder recht, nur hat er sich von dem 1x1screen aufs Glatteis führen lassen.

so gehts:

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenWindow(0 ,#PB_Ignore,0, 400,600,"hallo")
OpenWindowedScreen(WindowID(0), 0,0, 400,600, 0,0,0)
Repeat
  ClearScreen($201008)    ; nachtblau
 
  Repeat    ;Event-Schleife um alle Window-Events abzufangen
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow    ;Fenster wurde geschlossen
      EXIT = 1
    EndIf
  Until Event = 0

  ExamineKeyboard()    ;Keyboard abfragen
  string$ + KeyboardInkey()
  StartDrawing(ScreenOutput())
    DrawingMode( #PB_2DDrawing_Transparent )
    DrawText(20, 20, string$, $0FF0FF)    ; sattgelb
  StopDrawing() 
 
  FlipBuffers()
Until EXIT
End
und hier stimmt auch die Buchstabenabfolge.

dein seltsames Event "256" trat wohl immer beim Drücken der Taste aber vor der Verarbeitung durch DX auf.



.... beim Weiterentwickeln muss man jetzt latürnich drauf achten, erst den Inkey in einen temporären String zu holen,
um zu interpretieren ob es sich um ein Zeichen oder einen Steuercode handelt.
und für mehr Text ist es sinnvoll, sich eine Matrix anzulegen.
man beachte bitte wohlwollend dieses alte Beispiel:
http://www.purebasic.fr/english/viewtopic.php?t=28597
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
coder
Beiträge: 204
Registriert: 25.09.2005 17:53
Computerausstattung: Intel Core2Quad Q8200 @ 2.33GHz
ASUS P5Q3, 2GB DDR3-1066 RAM, ATi Raedeon HD 4850
Wohnort: Deutschland
Kontaktdaten:

Re: Merkwürdiges Verhalten von KeyboardInKey

Beitrag von coder »

Ich sah wohl den Wald vor lauter Bäumen nicht... :freak:
Windows 7 x64 | PureBasic 4.60 4.50 4.02
Ja verdammt, meine Eltern wohnen immer noch bei mir!
Hypersoft
Beiträge: 22
Registriert: 04.10.2004 16:14

Re: Merkwürdiges Verhalten von KeyboardInKey

Beitrag von Hypersoft »

Was den kleinen Screen betrifft, gibts eine erklärung.
Da ich einen Screenreader verwende (Sprachausgabe usw) und diese keine Inhalte auf Screens mitteilen kann, musste ich schauen, dass ich den Drawtext auf mein Window bekomme. Der Screen muss nur deshalb sein, da sonst KeyboardinKey nicht funktioniert. Das ist keine schöne Lösung, aber mir ist keine andere Möglichkeit bekannt, Tastaturabfragen auch in einem Window vorzunehmen.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Merkwürdiges Verhalten von KeyboardInKey

Beitrag von PureLust »

Hallo Hypersoft, ...

wenn ich Dich richtig verstanden habe macht Du diesen ganzen umständlichen Screen-Krempel eigentlich nur um einen einzelnen Tastendruck in Deinem Window abfragen zu können.

Schau doch evtl. mal in dieser Thread rein - hier hatte DarkSoul ein ähnliches Anliegen.
Besonders der von DarkDragon gepostete LINK zu einem Code im PureArea.net-CodeArchiv dürfte Dir recht nützlich sein.

Gruß und viel Erfolg, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Antworten