PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastendruck von Strg, Shift, Alt usw. feststellen in Pascal



RPG Hacker
22.02.2009, 12:29
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.

Whiz-zarD
22.02.2009, 13:21
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.

Drakes
22.02.2009, 13:23
Schau dir mal http://archives.devshed.com/forums/ms-dos-127/turbo-pascal-frequently-asked-questions-a-monthly-pointer-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:


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

Whiz-zarD
22.02.2009, 13:48
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)

RPG Hacker
22.02.2009, 13:55
@ 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.

Whiz-zarD
22.02.2009, 13:58
@ 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.

RPG Hacker
22.02.2009, 14:35
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.


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?

Drakes
22.02.2009, 14:52
Falls ich den Code richtig verstehe, müsste es etwas wie

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/class/cs306/books/artofasm/Chapter_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. http://www.multimediaxis.de/images/smilies/old/1/link_smile.gif

Whiz-zarD
22.02.2009, 15:04
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.

RPG Hacker
22.02.2009, 15:20
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.


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.


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.


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.


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.


Falls ich den Code richtig verstehe, müsste es etwas wie

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/class/cs306/books/artofasm/Chapter_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. http://www.multimediaxis.de/images/smilies/old/1/link_smile.gif

Danke! Ich werde mich mal durcharbeiten und gucken, ob ich etwas brauchbares finde.

Drakes
22.02.2009, 15:27
Danke! Ich werde mich mal durcharbeiten und gucken, ob ich etwas brauchbares finde.

:confused: Ich hab es doch schon geschrieben, wie die Lösung ist, der Rest ist genau der gleiche, einfach das zurückgeben des Wertes anders.



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

RPG Hacker
22.02.2009, 15:33
:confused: 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 :)

Whiz-zarD
22.02.2009, 15:38
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.

RPG Hacker
22.02.2009, 15:52
...

Nein, nein, nein, nein, nein! Du kannst nicht einfach irgendetwas behaupten, von dem du gar nicht weißt, ob es stimmt.


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.



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.

2.1a Programmiere einen Taschenrechner ohne Globale Variablen, der mit real-Zahlen die 4 Grundrechenarten beherrscht und das Ergebnis ordentlich darstellt. Großzügiger Einsatz von Procedures und Functions.
[1+1]
2.1b Wie 1a mit Potenz, Logarithmus, sinus, cosinus, tangens
[3+1]
2.1c Wie 1a mit "Sicherer Eingabe", das heißt, daß ein Benutzer das Programm nicht durch Fehleingaben zum Absturz bringen kann.
[3+1]
2.1d Wie 1b mit "Sicherer Eingabe"
[5+2]
2.1e Wie 1d mit freier Eingabe von Formeln also zum Beispiel
(4+6,3)2 * 7 oder sin((5 + 2,2)2)2
[7+3]

2.2a Programmiere die ASCII-Tabelle so, daß sie komplett auf einem Bildschirm dargestellt wird.
[1+1]
2.2b Wie 2a und zusätzlich der Tastencode einer gerade gedrückten beliebigen Taste
[2+1]
2.2c Wie 2a mit Darstellung der Funktions- und Pfeiltasten – auch mit Shift, Ctrl, ... auf 2 Bildschirmen
[4+2]

2.3a Schreibe ein Programm, das bei Eingabe zweier Datümer die Differenz in JMT und TT berechnet.
[1+1]
2.3b Wie 3a unter Berücksichtigung von Schaltjahren.
[2+1]
2.3c Wie 3b unter Berücksichtigung von 100er und 400er .... Schaltjahren
[3+1]
2.3d Wie 3c mit "sicherer Eingabe".
[5+2]
2.3e Wie 3d mit Berechnung des Wochentages
[6+2]
2.3f Wie 3e mit Berechnung aller beweglichen Feiertage
[7+3]



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.

Ineluki
22.02.2009, 16:40
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.