Tastatur einlesen funktioniert nicht, warum?



  • Hallo.
    Ich muss leider wegen dieses eigentlich einfachen Themas, doch mal hier im Forum anfragen. Denn ich komme einfach nicht weiter...
    Habe Borland Builder Version 4.
    Habe mir ein "Label" in mein Programm implementiert (keine Konsolenanwendung!), um ein Zeichen, welches von der Tastatur kommt darstellen zu können.
    Habe schon folgenden Programmcode verwendet:

    int e;
    cin >> e;
    Label1->Caption = e;

    Aber die Variable "e" wird bei Tastendruck auf dem Keyboard, egal ob mit oder ohne Enter Taste niemals verändert.
    Dann habe ich dieses versucht:

    int e;
    e = getchar();
    Label1->Caption = e;

    Aber auch hierbei keine Änderung des Wertes der Variable "e" bei Tastendruck auf das Keyboard.
    Ich habe dann auch mit "getch()" probiert aber auch hier das gleiche...
    Dann habe ich mit "scanf" versucht:

    int e;
    scanf("%i", &e);
    Label1->Caption = e;

    Aber auch hier keine Änderung von "e" bei Tastdruck auf das Keyboard.
    Wenn ich aber ein Objekt wie z.B. ein "Edit" in das Programm implementiere, kann ich sehr wohl Tastatureingaben in "Edit" einfügen. Nur möchte ich kein Edit-Objekt verwenden.
    Was ich benötige, ist der Wert der Zahl oder Buchstaben, welcher auf der Tastatur gedrückt wird. Also z.B. für ein "A" wäre dezimal 65, für eine "1" wäre dezimal 49 usw. Diesen Wert der Tasteneingabe möchte ich gerne in meiner Variablen "e" haben. Aber bis jetzt funktioniert das alles nicht. Was mache ich falsch?



  • Dieser Beitrag wurde gelöscht!


  • @Eric sagte in Tastatur einlesen funktioniert nicht, warum?:

    Was ich benötige, ist der Wert der Zahl oder Buchstaben, welcher auf der Tastatur gedrückt wird. Also z.B. für ein "A" wäre dezimal 65, für eine "1" wäre dezimal 49 usw.

    Dann solltest du ein char einlesen (kein int)

    Da du aber keine Konsole hast, sind Eingaben von der Konsole schwierig.



  • Wenn Du eine GUI hast, wird i. d. R. bei einer Tastatureingabe vom Betriebssystem eine Message an Dein Programm übergeben (in einer Queue), Dein GUI Programm arbeitet in einer Schleife alle ankommenden Messages ab. Unter Windows wäre das z. B. WM_KEYDOWN.
    Ich weiß jetzt nicht, wie das mit dem Borland Kram genau funktioniert (TMessage?), musst Du halt schauen. Mit dem console standard input (std::cin) etc. wird es hier aber schwierig.



  • Hallo HarteWare
    Deine Antwort hat mich erst einmal auf die richtige Spur gebracht und ich habe die Lösung selber finden können.
    Wie meist immer, ist die Lösung dann doch einfacher wie man gedacht hatte. Aber man muss es halt erst einmal wissen...
    Also hier die Lösung:
    In Borland Builder wird jedes Objekt durch den "Objektinspektor" dargestellt und verwaltet. Für Objekte, die eine Eingabe zulassen, gibt es unter der Rubrik "Ereignisse" im Objektinspektor ein Ereignis namens "OnKeyDown". Hier kann man durch Doppelklick auf die Freie Fläche hinter dem Ereignis diese Ereignisfunktion in den Quellcode einbinden. Danach muss man nur noch den Programmcode eingeben, was mit der gedrückten Taste passieren soll. Also in meinem Falle war das dann nur noch die Zeile:

    Label1->Caption = Key;

    Key ist der Rückgabewert der Ereignisfunktion "OnKeyDown" und beinhaltet den ASCII Wert der gedrückten Taste, deren dezimaler Wert mir nun im Label angezeigt wird. Das war schon die Ganze Lösung...

    Man kann hier natürlich auch mit if (...) oder Switch - Case Anweisungen einzelne Tasten herausfiltern und diesen dann entsprechende Funktionen hinterlegen. Auch kann man beim "Ausfiltern" die virtuellen Bezeichner verwenden. Beispiel F1 Taste = VK_F1, oder Escape Taste = VK_ESCAPE usw.. Findet man leicht im Netz.

    Allerdings habe ich noch etwas wichtiges herausgefunden. Die Ereignisfunktion funktioniert ohne weiteres bei jedem Objekt, das eine Eingabe zulässt. In der Mainform, also im "Hauptprogramm" wie ich das mal unqualifiziert bezeichne, gibt es zwar diese Ereignisfunktion auch, aber dort funktioniert diese erst, wenn man mit

    KeyPreview = true;

    das annehmen einer Tastatureingabe auch aktiviert.
    Also, auch wenn ich kein Programmierprofi bin und nur sehr selten etwas programmiere, konnte doch das Problem sehr gut gelöst werden.
    Danke und Gruß



  • Interessant! Ich kenne Delphi von der Schule und schreibe auch manchmal gerne Tools in Lazarus, war mir aber eben nicht sicher, wie das ganze bei Borland mit C++ aufgebaut ist.
    Schön, dass Du das Problem lösen konntest, und auch so ausführlich deine Lösung beschrieben hast.



  • und auch so ausführlich deine Lösung beschrieben hast.

    Japp. Das machen nämlich die meisten nicht. 👍

    ps: Für's nächste mal: Bitte setze Code in Code-Tags, also

    ```C++
    hier
    der
    code
    ```
    

    bzw. statt "C++" kannst du natürlich auch andere Sprachen hinschreiben wenn es nicht C++ ist (müsste aber ehrlich gesagt selbst nachsehen welche Sprachen da unterstützt werden und wie man sie schreiben muss). Auch wenn es nur 3 Zeilen sind. Ist einfach angenehmer zu lesen.


Anmelden zum Antworten