![]() |
Das ist schon klar. Problem ist folgendes. Wenn Du das zweite mal die 5 drückst, wird der Anweisungsblock aber immer noch 8 mal durchlaufen (1-4 und 6-9)...
Aber wenn Du die gedrückten Tasten in einem Array halten willst, kannst Du auch folgendermassen vorgehen:
Code:
Du benötigst dann ein Array Keypressed, das ein array[1..9] of integer ist. Die einzelnen Felder werden mit 0 initialisiert. So kannst Du immer im ersten Feld, das eine Null beinhaltet, die aktuell gedrückte Taste speichern...
procedure Tform1.keyw(key: word);
var counter: integer; begin for counter := 1 to 9 do begin if Keypressed[counter] := 0 then begin Keypressed[counter] := Key; break; end; end; end; Und Deine Abfrage würden dann lauten:
Code:
:)
for i := 1 to 9 do
if Keypressed[i] = 0 then begin Matthias |
Ok das ganze leuchtet mir ein. Die keyw Procedere ist jetzt genau so wie ich das gedacht habe. Nur es funktioniert nicht die Tasten können immer noch gedrückt werden. Ich schick mal die ganze Procedure mit. Die „voll“ Variablen sind dafür das abwechselnd gespielt werden muss(ich weiß ist nicht die beste Lösung aber auf die schnelle ist mir jetzt nicht eingefallen).
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var i: integer; begin if (voll = 0) or (voll = 2) or (voll = 4) or (voll = 6) or (voll = 8) then begin for i := 1 to 9 do if Keypressed[i] = 0 then begin form1.posi(Geo1,key); Geo1.kreis(form1.Canvas, Geo1.farbe); end end else if (voll = 1) or (voll = 3) or (voll = 5) or (voll = 7) or (voll = 9) then begin for i := 0 to 9 do if Keypressed[i] = 0 then begin form1.posi(Geo2,key); Geo2.kreis(form1.Canvas, Geo2.farbe); end end; keyw(key); inc(voll); end; end. |
Dann versuch doch mal folgendes:
Code:
Hilft das weiter?
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var i: integer; begin // Prüfen, ob die Taste schonmal gedrückt wurde for i := 1 to 9 do begin if Keypressed[i] = Key then exit; // steigt aus, wenn die Taste schonmal gedrückt wurde... end; // Weiter im Text... if (voll = 0) or (voll = 2) or (voll = 4) or (voll = 6) or (voll = 8) then begin for i := 1 to 9 do if Keypressed[i] = 0 then begin :) Matthias |
Vielen Dank es Geht.
|
Hai,
nur mal als Tip: Anstelle deiner For do Schleife kannst Du auch einfach rechnen. Einfach ein Array [0..9] Of Boolean und beim Start alles auf False setzen.
Code:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); var i: integer; begin if (Keypressed[ORD (key) - 48)]) then begin exit; // steigt aus, wenn die end; Keypressed[ORD (key) - 48)] := True // als gedrückt kenzeichnen . . . . . . // Weiter im Code |
@Sharky
Man muss dabei nur bedenken, dass die 1 im Nummernblock nicht den Wert 49 besitzt, sondern 97. Also:
Delphi-Quellcode:
:)
Keypressed[ORD (key) - 96)]
Matthias [edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit] |
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz