Ergebnis 1 bis 15 von 15

Thema: Tastendruck von Strg, Shift, Alt usw. feststellen in Pascal

  1. #1

    Tastendruck von Strg, Shift, Alt usw. feststellen in Pascal

    Hallo, ich hoffe mal hier gibt es welche, die sich mit Pascal auskennen.

    Also ich habe erst dieses Jahr mit Informatik angefangen und bin noch ein ziemlicher Anfänger. Wir haben nun eine Hausaufgabe aufbekommen, in der wir Die ASCII-Tabelle darstellen und den ASCII-Code einer gedrückten Taste darstellen sollen. Die ASCII-Tabelle darstellen ist kein Problem, habe ich alles schon gemacht. Auch die normalen ASCIIs (z.B. Buchstaben und Zahlen) und Spezial-ASCIIs (z.B. Pfeiltasten, Entf, F-Tasten usw.) habe ich schon implementiert und sind kein Problem. Das einzige Problem sind jetzt noch die Funktionstasten wie z.B. Strg, Shift, Alt usw. Ich habe leider keine Ahnung, wie ich diese abfragen soll. Mein Informatiklehrer meinte dazu nur "Der Sinn der Aufgabe besteht auch darin, zu lernen, wie man mit der Pascal-Hilfe arbeitet oder Informationen im Internet findet". Tja, die Pascal-Hilfe war mir hier nicht wirklich hilfreich. Und das Internet eigentlich auch nicht. Hier habe ich zwar sehr viele Ergebnisse gefunden, aber keines von ihnen hat mir irgendwie weitergeholfen, da sie entweder fortgeschrittene Kentnisse erforderten oder sogar ein ganz anderes Problem behandelten.

    Also kann mir jemand helfen? Ich benutze Turbo Pascal 6.0. Und sagen wir einfach mal wenn eine Taste gedrückt wird, z.B. "STRG" soll entweder der ASCII-Code (haben Funktionstasten überhaupt ASCII-Codes?) oder eine Nachricht, die besagt, welche Taste zuletzt gedrückt wurde angezeigt werden. Ich hoffe mal hier kann mir jemand helfen.

    Geändert von RPG Hacker (22.02.2009 um 12:33 Uhr)

  2. #2
    Die Funktionstasten liefern zwei Werte zurück. Also musst du mittels readkey zweimal den Tastaturpuffer auslesen.
    Der erste Wert ist immer 0 und dann kommt der eigentliche ASCII Wert.
    z.B. 13 ist Enter und 8 ist Delete
    Also musst du zuerst mit einer If-Abfrage nach readkey = 0 abfragen und danach nochmal nach readkey abfragen.

    Über den readkey-Wert kannst du an z.B. sagen, dass er dann beim Wert 13 "Enter" auf dem Bildschirm anzeigen soll.
    Die ersten 32 ASCII sind Steuerzeichen und können nicht auf dem Bildschirm ausgegeben werden.
    Wenn du den Wert 13 auf dem Bildschirm anzeigen willst, macht er nichts weiter, als den Cursor in die nächste Zeile zu setzen, was er eben bei Enter-Drücken macht.

    Geändert von Whiz-zarD (22.02.2009 um 13:29 Uhr)

  3. #3
    Schau dir mal http://archives.devshed.com/forums/m...er-324149.html an, ist Frage 65
    Die Datei ist unter ftp://garbo.uwasa.fi/pc/link/tsfaqp.zip verfügbar.

    Edit: Ich kopiers dir kurz raus:

    Zitat Zitat
    Q: How can I detect if the shift/ctrl/alt etc key is pressed? I
    know how to get the scan codes with the ReadKey function, but I
    can't find the procedure for detecting these keys.

    A: Detecting pressing the special keys or getting the toggle status
    cannot be done with ReadKey. You'll need to access the Keyboard
    Flags Byte at $0040:$0017. You can do this either by a direct "Mem"
    access, or using interrupt $16 function $02. For more details
    including the bitfields for the shift flags see in Ralf Brown's
    interrupt list ftp://garbo.uwasa.fi/pc/programming/inter61a.zip (or
    whatever is the current version). For example to see if the alt key
    is pressed you can use
    uses Dos;
    function ALTDOWN : boolean;
    var regs : registers;
    begin
    FillChar (regs, SizeOf(regs), 0);
    regs.ah := $02;
    Intr ($16, regs);
    altdown := (regs.al and $08) = $08;
    end;
    For the enhanced keyboard flags see interrupt $16 function $12. It
    can distinguish also between the right and the left alt and ctrl
    keys.
    A tip from Martijn Leisink. Be careful [if you use the
    $0040:$0017 memory position to set a toggle]: On several computers
    you have to call int 16h after the new setting is shown by the LED's
    on the keyboard. Not doing so might give the user wrong information.
    Horst Kraemer adds: This is not true merely for several computers
    but for _every_ computer.
    A tip from Dr John Stockton. Going via a BytePointer set to
    Ptr(Seg0040, $0017) is almost as easy as "Mem", and also works in
    Protected mode (for TP version 7.0).

    Geändert von Drakes (22.02.2009 um 13:28 Uhr)

  4. #4
    mmh, interessant.
    Tatsächlich funktioniert meine Methode mit STRG, Alt, ... Tasten nicht.
    Weil es für diese Tasten kein einzelnen ASCII Wert gibt, sondern nur in Kombination mit anderen Tasten.
    http://www.mathelehrer-reinold.de/ASCII.htm
    Daher glaub ich auch nicht, dass euer Lehrer von euch verlangt, diese Tasten auszulesen.

    (Hab mich nie wirklich mit den Steuerzeichen beschäftigt. Die einzigen Steuerzeichen, die ich jemals angesprochen habe, sind Escape, Enter und Delete und diese Tasten funktionieren mit meiner Methode)

  5. #5
    @ Drakes: Ah, danke! Das sieht sehr hiflreich aus. Ich habe es noch nicht probiert, aber ich bin mir fast sicher, dass es klappt. Ich probiere es jetzt sofort mal und schreibe hier rein, fals es immer noch Probleme geben sollte.

    @ Whiz-zarD: Jab, diese Methode, die du mir beschrieben hast, war nämlich genau das, was ich jetzt schon in meinem Programm drin habe. Wie gesagt: Pfeiltasten, Entf, Einfg usw. und natürlich auch die normalen Tasten klappen alle perfekt. Nur Strg, Shift usw. eben noch nicht.

  6. #6
    Zitat Zitat von RPG Hacker Beitrag anzeigen
    @ Whiz-zarD: Jab, diese Methode, die du mir beschrieben hast, war nämlich genau das, was ich jetzt schon in meinem Programm drin habe. Wie gesagt: Pfeiltasten, Entf, Einfg usw. und natürlich auch die normalen Tasten klappen alle perfekt. Nur Strg, Shift usw. eben noch nicht.
    Wie gesagt, weil es dazu keinen ASCII-Wert gibt. Sondern nur in Kombination mit anderen Tasten.
    z.B. STRG-A wäre der ASCII Wert 1.

  7. #7
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Wie gesagt, weil es dazu keinen ASCII-Wert gibt. Sondern nur in Kombination mit anderen Tasten.
    z.B. STRG-A wäre der ASCII Wert 1.
    Ja, ich weiß. Das hat auch alles geklappt. Nur alleine leider nicht.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Daher glaub ich auch nicht, dass euer Lehrer von euch verlangt, diese Tasten auszulesen
    Doch, in der Aufgabe stand noch extra groß dabei, dass auch STRG, SHIFT, ALT usw. überprüft werden sollen.

    So. Ich habe die angegebene Methode jetzt ausprobiert. Und es klappt perfekt! Allerdings natürlich nur für Alt. Kann mir jemand sagen, was ich ändern muss, um auf diese Methode auch die anderen Funktionstasten abzufragen? Also z.B. Strg, Shift usw.? Gibt es vielleicht irgendwo eine Liste, wo die Werte alle stehen?

  8. #8
    Falls ich den Code richtig verstehe, müsste es etwas wie
    Code:
    ctrldown:= (regs.al and $kk) = $kk;
    sein. Jedoch kann ich dir nicht sagen, was du bei kk einfüllen musst und bin mir auch nicht sicher ob das so geht, zumindest hab ich noch das gefunden, passt gut zu dieser Funktion: http://www.arl.wustl.edu/~lockwood/c...20/CH20-3.html (Es wird die 16te Instr beschrieben, genau die, die in der Funktion verwendet wird)
    Bin's gerade am durchlesen, vielleicht kann ich dann noch etwas konkreteres sagen.

    Edit: Control könnte $04 sein. (Wobei das, das 3te Bit wäre, was nach dieser Seite Alt wäre ???)

    Edit2: $04 ist das 2. Bit, wenn man es anders nummeriert ^^ also, nach der Seite sollte (regs.al and $04) = $04; Ctrl sein und (regs.al and $02) = $02; linke Shift Taste und (regs.al and $01) = $01; die rechte Shift Taste

    Aber trotzdem, Whiz-zarD hat eigentlich schon recht, welcher Lehrer setzt voraus, dass die Schüler im normalen Informatikunterricht auf BIOS Funktionen zurückgreifen? Naja, wär mir eigentlich lieb gewesen, hätt ich bei so einem Lehrer Info Unterricht gehabt.

    Geändert von Drakes (22.02.2009 um 15:04 Uhr)

  9. #9
    Zitat Zitat von RPG Hacker Beitrag anzeigen
    So. Ich habe die angegebene Methode jetzt ausprobiert. Und es klappt perfekt! Allerdings natürlich nur für Alt. Kann mir jemand sagen, was ich ändern muss, um auf diese Methode auch die anderen Funktionstasten abzufragen? Also z.B. Strg, Shift usw.? Gibt es vielleicht irgendwo eine Liste, wo die Werte alle stehen?
    Mal eine blöde Frage: Verstehst du überhaupt im geringsten, was der Quelltext überhaupt macht?
    Es bringt nichts, einfach irgendwelchen Code aus dem Internet zu kopieren, wenn man überhaupt keine Ahnung hat, was er macht.
    Und ich glaub nicht, dass ihr schon im ersten Jahr mit irgendwelchen Flags der Tastatur und Register-Adressen rumhantiert.

    Wenn ihr tatsächlich sowas machen müsst und euer Lehrer hat noch nie sowas im Unterricht erwähnt, dann hat er schlichtweg versagt, denn wenn ihr sowieso Informatik/Pascal mittels Internet lernen sollt, dann braucht ihr den Unterricht nicht.
    Bei Programmierübungen geht es in erster Linie um das Anwenden des im Unterricht erlernten Stoffes und nicht blind Quellcodes aus dem Internet zu kopieren oder zu hoffen, dass man aus purem Zufall die gewünschte Hilfe unter Turbo Pascal findet.
    Man sollte schon wissen, was man da macht.

    Es soll jetzt nichts gegen dich sein aber ich zweifel die Lernmethoden deines Lehrers an, falls er das tatsächlich von euch verlangt.

    Geändert von Whiz-zarD (22.02.2009 um 15:07 Uhr)

  10. #10
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Mal eine blöde Frage: Verstehst du überhaupt im geringsten, was der Quelltext überhaupt macht?
    Wenn ich es verstehen würde, müsste ich ja nicht fragen.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Es bringt nichts, einfach irgendwelchen Code aus dem Internet zu kopieren, wenn man überhaupt keine Ahnung hat, was er macht.
    Genau deswegen frage ich doch. DAMIT ich weiß, was er macht.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Wenn ihr tatsächlich sowas machen müsst und euer Lehrer hat noch nie sowas im Unterricht erwähnt, dann hat er schlichtweg versagt, denn wenn ihr sowieso Informatik/Pascal mittels Internet lernen sollt, dann braucht ihr den Unterricht nicht.
    Tun wir ja nicht. Erstens sind das alles nur Zusatsaufgaben, für die es Extrapunkte gibt. Und zweitens ist der Sinn der Aufgabe auch nicht zu lernen, wie man programmiert. In unserem Informatikunterricht geht es nämlich eher um Theorie und wir beschäftigen uns nur anfangs mit Programmierung. Der Sinn der Aufgabe besteht darin, zu wissen, wo man im Notfall selbst Hilfe zu seinem Programm bekommen kann.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Bei Programmierübungen geht es in erster Linie um das Anwenden des im Unterricht erlernten Stoffes und nicht blind Quellcodes aus dem Internet zu kopieren oder zu hoffen, dass man aus purem Zufall die gewünschte Hilfe unter Turbo Pascal findet.
    Man sollte schon wissen, was man da macht.
    Wie gesagt: Das ist nur eine Zusatsaufgabe. Der größte Teil der Hausaufgabe bestehst aus Sachen, die wir im Unterricht schon gemacht haben oder die im Buch drin stehen.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Es soll jetzt nichts gegen dich sein aber ich zweifel die Lernmethoden deines Lehrers an, falls er das tatsächlich von euch verlangt.
    Das glaube ich nicht. Wenn überhaupt könnte ich mir vorstellen, dass er die Aufgabe nicht selbst programmiert hat und deshalb nicht bedacht hat, dass die Funktionstasten so schwer sind. Oder eben er hat als er die Tasten Strg, Shift usw. erwähnt hat tatsächlich die Kombinationen dieser Tasten mit normalen Tasten gemeint. Allerdings sind seine Aufgaben sehr oft ziemlich unverständlich formuliert, deswegen kann ich das nicht genau sagen. Und wie gesagt: Es ist nur eine Zusatsaufgabe. Man kann auch ohne diese Aufgabe 15 Punkte bekommen. Es ist nicht so, dass er Unmögliches von uns verlangt.

    Zitat Zitat von Drakes Beitrag anzeigen
    Falls ich den Code richtig verstehe, müsste es etwas wie
    Code:
    ctrldown:= (regs.al and $kk) = $kk;
    sein. Jedoch kann ich dir nicht sagen, was du bei kk einfüllen musst und bin mir auch nicht sicher ob das so geht, zumindest hab ich noch das gefunden, passt gut zu dieser Funktion: http://www.arl.wustl.edu/~lockwood/c...20/CH20-3.html (Es wird die 16te Instr beschrieben, genau die, die in der Funktion verwendet wird)
    Bin's gerade am durchlesen, vielleicht kann ich dann noch etwas konkreteres sagen.

    Edit: Control könnte $04 sein. (Wobei das, das 3te Bit wäre, was nach dieser Seite Alt wäre ???)

    Edit2: $04 ist das 2. Bit, wenn man es anders nummeriert ^^ also, nach der Seite sollte (regs.al and $04) = $04; Ctrl sein und (regs.al and $02) = $02; linke Shift Taste und (regs.al and $01) = $01; die rechte Shift Taste

    Aber trotzdem, Whiz-zarD hat eigentlich schon recht, welcher Lehrer setzt voraus, dass die Schüler im normalen Informatikunterricht auf BIOS Funktionen zurückgreifen? Naja, wär mir eigentlich lieb gewesen, hätt ich bei so einem Lehrer Info Unterricht gehabt.
    Danke! Ich werde mich mal durcharbeiten und gucken, ob ich etwas brauchbares finde.

  11. #11
    Zitat Zitat von RPG Hacker Beitrag anzeigen
    Danke! Ich werde mich mal durcharbeiten und gucken, ob ich etwas brauchbares finde.
    Ich hab es doch schon geschrieben, wie die Lösung ist, der Rest ist genau der gleiche, einfach das zurückgeben des Wertes anders.

    Code:
    function ALTDOWN : boolean;
    var regs : registers;
    begin
    FillChar (regs, SizeOf(regs), 0);
    regs.ah := $02;
    Intr ($16, regs);
    altdown := (regs.al and $08) = $08;
    end;
    
    function CTRLDOWN : boolean;
    var regs : registers;
    begin
    FillChar (regs, SizeOf(regs), 0);
    regs.ah := $02;
    Intr ($16, regs);
    ctrldown := (regs.al and $04) = $04;
    end;
    
    function SHIFTDOWN : boolean;
    var regs : registers;
    begin
    FillChar (regs, SizeOf(regs), 0);
    regs.ah := $02;
    Intr ($16, regs);
    shiftdown := ((regs.al and $02) = $02) or ((regs.al and $01) = $01);
    end;
    (kleiner Unterschied bei Shift am Schluss)
    Wobei man das ganze wahrscheinlich anders machen sollte, damit man die Funktionen nicht 3 mal aufrufen muss.

    Edit: Okay, sry. ^^"

    Geändert von Drakes (22.02.2009 um 15:35 Uhr)

  12. #12
    Zitat Zitat von Drakes Beitrag anzeigen
    Ich hab es doch schon geschrieben, wie die Lösung ist, der Rest ist genau der gleiche, einfach das zurückgeben des Wertes anders.
    Das sollte soviel heißen wie "Danke, ich gucke ob das klappt"

    EDIT:
    Und das tut es natürlich

    Geändert von RPG Hacker (22.02.2009 um 15:40 Uhr)

  13. #13
    Zitat Zitat von RPG Hacker Beitrag anzeigen
    Tun wir ja nicht. Erstens sind das alles nur Zusatsaufgaben, für die es Extrapunkte gibt. Und zweitens ist der Sinn der Aufgabe auch nicht zu lernen, wie man programmiert. In unserem Informatikunterricht geht es nämlich eher um Theorie und wir beschäftigen uns nur anfangs mit Programmierung. Der Sinn der Aufgabe besteht darin, zu wissen, wo man im Notfall selbst Hilfe zu seinem Programm bekommen kann.
    Und wieso programmiert ihr dann, wenn dies nicht der Sinn des Unterrichts ist? O_o
    Ausserdem ist das doch ziemlich dämlich Zusatzaufgaben zu schreiben, die Funktionen beinhalten, die ihr überhaupt nicht kennt.
    Wie gesagt, der Sinn ist es nicht, einfach Quelltexte zu kopieren, sondern Quelltexte selbst zu erschaffen und für sowas brauch ich keine Zusatzaufgaben, die überhaupt kein Lernerfolg erzielen, ausser, dass ich weiss, wie die Internetadresse eines Programmierforums heisst, wo ich nachfragen kann.
    Da gibt es soviele schöne Aufgaben, die man stattdessen machen könnte. z.B. das Errechnen von Pi (Dafür gibt einige Methoden) oder das Basteln eines primitiven Taschenrechners mit primitiver GUI oder das Ausrechnen des Wochentages zu einem bestimmten Datum usw.
    Dafür könnte man ebenfalls google, Wikipedia und Co. befragen und lassen sich mit den simpelsten Befehlen unter Pascal realisieren.

    Ich frag mich auch, wie der Theorieunterricht aussehen soll, den ihr anscheinend wohl noch machen wollt.
    Anscheinend geht es wohl im Unterricht nur darum, wie ihr mit Suchmaschinen arbeitet. Dazu geb ich euch mal einen Tipp: Kauft euch das Buch "google für Dummies". Dann seid ihr genauso schlau, wie bei diesem Unterricht und warscheinlich noch schlauer.

    Sorry, dass ich mich darüber so aufrege aber ich kann solche Lehrer einfach nicht verstehen, die so einen Murks als Unterricht bezeichnen.

  14. #14
    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    ...
    Nein, nein, nein, nein, nein! Du kannst nicht einfach irgendetwas behaupten, von dem du gar nicht weißt, ob es stimmt.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Und wieso programmiert ihr dann, wenn dies nicht der Sinn des Unterrichts ist? O_o
    Wie soll ich das noch anders sagen, ohne, dass du mit einer Gegenfrage antwortest... Wir sollen nur einen groben Einblick in die Programmierung bekommen. Ab der 12. Klasse (vielleicht sogar schon früher) machen wir nur noch Theorie.

    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Da gibt es soviele schöne Aufgaben, die man stattdessen machen könnte. z.B. das Errechnen von Pi (Dafür gibt einige Methoden) oder das Basteln eines primitiven Taschenrechners mit primitiver GUI oder das Ausrechnen des Wochentages zu einem bestimmten Datum usw.
    Hier, DAS z.B. Du behauptest einfach was, von dem du gar nicht weißt, ob das nicht vielleicht sogar zutrifft. Unsere Hausaufgabe bestand aus drei Teilen. Der eine Teil war die ASCII-Tabelle. Aber neben der ASCII-Tabelle müssen wir eben auch noch einen Taschenrechner programmieren und eben so ein Programm zur Berechnung eines Datums schreiben. Glaubst du mir nicht? Ich kann sogar das Aufgabenblatt kopieren.



    Zitat Zitat von Whiz-zarD Beitrag anzeigen
    Sorry, dass ich mich darüber so aufrege aber ich kann solche Lehrer einfach nicht verstehen, die so einen Murks als Unterricht bezeichnen.
    Natürlich kannst du meinen Lehrer nicht verstehen. Man kann ihn nicht verstehen, ohne bei ihm im Unterricht zu sein. Ich bin bei ihm im Unterricht und weiß das seine Lernmethoden sich sehr von denen anderer Lehrer unterscheiden. Ich weiß aber auch, dass sie durchaus ihren Zweck erfüllen. Und es bringt sowieso nichts, darüber zu diskutieren. Wie gesagt: Sowas KANN man nicht verstehen ohne meinen Lehrer in Informatik zu haben . Und das spielt sowieso keine Rolle, ob seine Lernmethoden Sinn machen oder nicht. Ich habe den Thread nicht aufgemacht um darüber zu diskutieren.

  15. #15
    So .. nun beruhigen wir uns bitte alle wieder ...

    Dies ist keine Diskussionsplattforum, um ueber Sinn und Unsinn von Lehrmethoden zu diskutieren. Wenn es RPG Hacker etwas bringt, dann ist ja alles in Ordnung.

    Anstatt noch weiter ueber seinen Lehrer zu diskutieren waere es vielleicht ganz Schick, wenn man den Code noch ein wenig auseinander nehmen wuerde. Dann haben sogar alle was dabei gelernt. Auch ich habe viele Jahre in Turbo Pascal programmiert, aber in die Verlegenheit den Status von Shift und STRG Taste abzufragen, bin ich nie gekommen. Insofern sind diese Codeexcerpte durchaus interessant und hilfreich.

    Letztlich ist es doch egal, aus welchem Grund man etwas lernt, hauptsache man lernt etwas aus der Sache.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •