Autor |
Beitrag |
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 09.05.18 13:12
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Mi 09.05.18 13:43
Hier mal mein Beispiel mit Integer(Bit)-Flags:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85:
| unit Unit1;
interface
uses Windows, SysUtils, Classes, Graphics, Controls, Forms, StdCtrls;
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormPaint(Sender: TObject); end;
const KLef: integer = 1 shl 0; KRig: integer = 1 shl 1; KFwd: integer = 1 shl 2; KBwd: integer = 1 shl 3;
var Form1: TForm1; keys: Byte; running: boolean;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin keys := 0; running := false; end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of 37: keys := keys or KLef; 38: keys := keys or KFwd; 39: keys := keys or KRig; 40: keys := keys or KBwd; end; end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin case Key of 37: keys := keys and not KLef; 38: keys := keys and not KFwd; 39: keys := keys and not KRig; 40: keys := keys and not KBwd; end; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin running := false; end;
procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if running then begin running := false; Canvas.TextOut(0, 0, 'Click to Start '); end else begin running := true; Canvas.TextOut(0, 0, 'Click to Stop ');
while running do begin if keys and KLef > 0 then Left := Left - 1; if keys and KRig > 0 then Left := Left + 1; if keys and KFwd > 0 then Top := Top - 1; if keys and KBwd > 0 then Top := Top + 1; Application.ProcessMessages; end; end; end;
procedure TForm1.FormPaint(Sender: TObject); begin Canvas.TextOut(0, 0, 'Click to toggle key listener '); end;
end. |
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.05.18 18:49
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 10.05.18 19:00
Hast du den Code schon ausprobiert? Ich kann keine Verzögerung feststellen. Das KeyDown Event sollte keine Verzögerung verursachen, da es ja sofort ausgelöst wird, sobald die Taste gedrückt wurde.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.05.18 20:15
Symbroson hat folgendes geschrieben : | Das KeyDown Event sollte keine Verzögerung verursachen, da es ja sofort ausgelöst wird, sobald die Taste gedrückt wurde. |
Nein, ausprobiert nicht, aber was ich meine, ist: Halte mal in irgendeiner Textverarbeitung eine Taste gedrückt, meinetwegen "a". Da kommt dann:
a
Nun kommt eine Pause
dann kommt:
aaaaaaaaaaaaaaaaaaa
Das meine ich!
//Edit:
Ok, ich habe ihn in einer zusätzlichen Form zu meinem Projekt getestet, aber da tut sich gar nichts, einzig Mausklicks bewirken eine Änderung des dargestellten Textes. Also habe ich ein TEdit eingefügt, und im OI KeyPreview := True gesetzt. Deinen Code habe ich wie folgt abgeändert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| case Key of 37: begin keys := keys or KLef; Edit1.Text := Edit1.text+'a'; end; |
Und es passiert, was da immer passiert (ausser, man hat keine Tastaturverzögerung eingestellt): Es folgt ein "a", dann die Pause, dann "aaaaaa". Und die Pause will ich nicht!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Zuletzt bearbeitet von galagher am Do 10.05.18 20:28, insgesamt 2-mal bearbeitet
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 10.05.18 20:17
Wie gesagt, mit Flags sollte das nicht passieren. Probiers einfach aus!
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.05.18 20:31
Symbroson hat folgendes geschrieben : | Wie gesagt, mit Flags sollte das nicht passieren. Probiers einfach aus! |
Das mache ich die ganze Zeit! Wo setze ich die Flags denn? Denn immer, wenn ich eine Taste drücke, "gibt Windows an mein Programm die eingestellte Verzögerung weiter" - das soll ja normalerweise auch so sein!
Also, wo setze ich ein Flag?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 10.05.18 20:35
Was hast du denn bisher probiert? Kannst du mal deinen cide schicken?
Flags kannst du als einfache Booleans ausdrücken oder wie in meinem Beispiel als Bits von einem Integer-Typ. Da du nur 4 Tasten hast, reicht ein Byte (bis maximal 8 Tasten) aus
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.05.18 20:44
Symbroson hat folgendes geschrieben : | Was hast du denn bisher probiert? Kannst du mal deinen cide schicken? |
Den habe ich wieder gelöscht. Wo ausser in KeyDown setze ich ein Boolean auf True, das angibt, dass eine Pfeiltaste gedrückt wurde? Wenn ich das erstmal weiss, kann ich die Prozedur aufrufen, die die Spielfigur steuert.
Symbroson hat folgendes geschrieben : | Flags kannst du als einfache Booleans ausdrücken oder wie in meinem Beispiel als Bits von einem Integer-Typ. Da du nur 4 Tasten hast, reicht ein Byte (bis maximal 8 Tasten) aus |
Das weiss ich, das ist aber nicht das Problem!
Vielleicht reden wir aneinander vorbei:
Ich möchte, dass mein Programm einen Pfeiltastendruck (die Pfeiltasten werden meistens gedrückt gehalten) verarbeitet, ohne dass dabei die übliche Verzögerung auftritt.
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 10.05.18 20:48
dein eigenes Programm muss dann irgendwo anders (entweder mit Application.ProcessMessages oder besser als separaten Thread) eigenständig laufen und die Flags abfragen, um etwas zu bewegen. Nur per Event das Spiel zu aktualisieren wird nicht funktionieren, wenn sich zB. etwas von allein bewegen soll.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 10.05.18 21:38
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 10.05.18 21:52
Dann nimm Timer, wenn es dir gefällt
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 10.05.18 22:15
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher
Beiträge: 2534
Erhaltene Danke: 44
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 14.05.18 11:01
Frühlingsrolle hat folgendes geschrieben : | Wie schon mehrmals erwähnt und zitiert, mit dem Timer bekommst du es gelöst. |
Ja, aber der Timer stoppt die Spielfigur nicht exakt dann, wenn ich die Taste loslasse. Kann man aber sicher optimieren!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 14.05.18 23:32
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
|