![]() |
taste abfragen ohne onkeypress etc und label sichtbar machen
hallo
ich will ein prog schreiben was eig zimlich simpel sein müsste: durch zufalls soll eine pfeiltaste ausgewählt werden und über sichtbar werden eines labels soll die taste angezeigt werden. anschließend soll gewartet werden bis eine taste gedrückt wurde, wenn es die richtige war soll soll ein zähler erhöt werden und die nächste taste ausgewählt werden. vorher soll jedoch das alte label wieder unsichbar werden. mein prob is jetzt : das prog is extrem absturzgefährded (nehm an es ligt an der schleife die zimlich oft wiederholt wird) und er zeigt das label nicht an, wenn ich jedoch das wieder unsichtbar und die tastenabfrage ausschalte/einklamer wird das label angezeigt, wenn ich die tastenabfrage drine hab dann zeigt er mir das label erst an wenn ich eine taste(die die schleife beended) gedrückt hab. die tastenabfrage hab ich aus den tread ![]() wie kriege ich das program so hin, das es funcs und das es nicht mehr so leicht abstürtz.
Delphi-Quellcode:
var
score : integer; function IsKeyDown(vk : Integer) : Boolean; begin Result:=(GetAsyncKeyState(vk)<0); end; function keydow : integer; begin if isKeyDown(vk_up) then result := 0 ; if isKeyDown(vk_down) then result :=1; if isKeyDown(vk_left) then result :=2; if isKeyDown(vk_right) then result :=3; if iskeydown(vk_end) then result := 4; if not sKeyDown(vk_up) or sKeyDown(vk_down) or sKeyDown(vk_left) or sKeyDown(vk_right) or skeydown(vk_end) then result := 5; end; procedure TForm2.butstartClick(Sender: TObject); var rich,taste:integer; begin butstart.Enabled := false; score := 0; label5.Caption := '0'; timer1.Enabled := true; taste := 5; rich := random(4); label6.Caption := inttostr(rich); case rich of 0 : form2.Label1.Visible := true; 1 : form2.Label2.Visible := true; 2 : form2.Label3.Visible := true; 3 : form2.Label4.Visible := true; end; while taste> 3 do begin taste := keydow; label7.Caption := inttostr(taste); if rich = taste then inc(score); end; butstart.Enabled := true; form2.Label5.Caption := inttostr(score); form2.Label1.Visible := false; form2.Label2.Visible := false; form2.Label3.Visible := false; form2.Label4.Visible := false; end; end. ps ich hab kaum ahnung von delphi^^ |
Re: taste abfragen ohne onkeypress etc und label sichtbar ma
Ist das in Zeile 16 ein Copy&Paste - Fehler oder gibt es noch eine Funktion mit dem Namen 'sKeyDown'?
|
Re: taste abfragen ohne onkeypress etc und label sichtbar ma
Liste der Anhänge anzeigen (Anzahl: 1)
Hab dir mal schnell was geschrieben, dass dir mal zeigen soll, wie man das ohne lästige Schleifen, die die Prformance deines Programmes in die Knie gehen lässt, sowas programmiert. Das habe ich schnell in 5min und ist ein erster Vorschlag, an dem sicherlich noch einiges verbessert werden kann. Hab aber nicht deine gewollte Funktion einprogrammiert, weil ich das glaube ich noch nicht richtig verstanden habe und damit du mit meinen Funktionen noch etwas spielen kannst.
Hier mal der Quelltext und unten ist auch das gepackte Programm:
Delphi-Quellcode:
MfG BAMatze
unit Tastendruck;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const WMKeyDown = WM_KEYDOWN; WMKeyUp = WM_KEYUP; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; private procedure WMKeyDown(var Msn: TMessage); message WMKeyDown; procedure WMKeyUp(var Msn: TMessage); message WMKeyUp; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WMKeyDown(var Msn: TMessage); var Index: integer; begin Index := 36; repeat Index := Index+1; until (GetasyncKeyState(Index) <> 0) or (Index >=41); if Index < 41 then begin case Index of 37: Label2.visible := true; 38: Label1.Visible := true; 39: Label4.Visible := true; 40: Label3.Visible := true; end; end else Label5.Visible := true; end; procedure TForm1.WMKeyUp(var Msn: TMessage); begin LAbel1.Visible := false; LAbel2.Visible := false; LAbel3.Visible := false; LAbel4.Visible := false; LAbel5.Visible := false; end; end. Edit: Anpassung des Quelltextest auf Hybrid666 Hinweis hin in #6 |
Re: taste abfragen ohne onkeypress etc und label sichtbar ma
@ OG Karotte
ja in zeile 16 is noch en fehler, dass muss iskeydown heisen. @ BAMatze danke für deinen vorschlag, aba ich blicke da nur halb durch. könntest (oder auch wer anders) kurz erklären was dort passirt? udn hat wer ne ahnung wwarum er die labels bei mir nicht erscheinen? |
Re: taste abfragen ohne onkeypress etc und label sichtbar ma
Zitat:
Also ähm ich muss zugeben durch deinen Codeabschnitt hatte ich nicht durchgesehen, vorallem was du damit meinst. Erstes Beispiel, warum ich das nicht geschafft hab: Du setzt einen Timer, schaltest ihn auch an aber es existiert irgendwie keine OnTimer-Funktion. In der Ontimer-Finktion steht dann normal drin, was periodisch ablaufen soll. Was ich denke, was du machen wolltest ist deine Abfragen in diesen onTimer zu stecken und dann denke mal alle 50msec abfragen ob eine Taste gedrückt wurde. Das ist eigentlich nicht so effizient, da du viele unnütze Abfragen stellst. Ich habe dir dort eine Methode vorbereitet, die sicherlich für dich als "Delphi-Anfänger" schwerer zu verstehen ist anhand des Textes aber sehr viel effizienter (meiner Meinung nach ist). Ich lasse mein Programm laufen und führe nur eine Funktion aus, wenn eine Taste gedrückt (WMKeyDown) oder losgelassen wird (WMKeyUp). In der WMKeyUP-Funktion verifiziere ich mit der GetasyncKeyState-Funktion welcher der Tasten (oben, unten, rechts und links liegen in den Int-Werten 37 bis 40) gedrückt wurde und lasse aufgrund dieser Feststellung das entsprechende Label aufleuchten. Wenn irgendeine andere Taste gedrückt wird, dann erscheint ein LAbel, dass "falsche Taste" zeigt. In der WMKeyUp-Funktion setze ich einfach alle Label wieder auf unsichtbar. Mehr macht das Programm eigentlich nicht. Wenn du noch Fragen dazu hast, stelle sie ruhig, bin noch etwas hier. MfG BAMatze |
Re: taste abfragen ohne onkeypress etc und label sichtbar ma
soweit ich weiß musst du bei der Abfrage mit GetAsyncKeyState <> 0 machen. Das kann mal so mal so sein. ich versteh das result von dem teil auch nicht so ganz...probiers mal.
MfG edit: hab hier was gefunden:
Delphi-Quellcode:
MfG again
// Aus der WinAPI-Doku zu GetAsyncKeyState:
// if the function succeeds, the return value specifies whether the key was pressed // since the last call to GetAsyncKeyState, and whether the key is currently up or down. // If the most significant bit is set, the key is down, and if the least significant bit is set, // the key was pressed after the previous call to GetAsyncKeyState. // The return value is zero if a window in another thread or process currently has the keyboard focus |
Re: taste abfragen ohne onkeypress etc und label sichtbar ma
Habs mal angepasst im Quelltest von der Post. In der Pas-Datei kann man es ja selber machen, hängt ja oben an der Post mit dran. :roll: *faul ist :duck:
|
Re: taste abfragen ohne onkeypress etc und label sichtbar ma
alsoo das on timer ereignis hab ich weggelassen da ich später vorhab damit die form zu beenden und den score zu übergeben an die haubtform mit highscore was soweit auch funtionirt.
das prog hat bie mir wunderbar functionirt is aba halt noch nicht ganz was ich gaube zu rbauchen. ich will ja in einer procedure warten bis die taste oder auch nur irgenteine gedrückt ist. gibt es vielleicht ne möglcihkeit auf ein ereignis zu warten und dann weiter zumachen? mir is grad ne idde beim schreiben gekommen die ich versuchen were umzusetzten werde einfach über en timmer die abfrage stellen und in der timmer procedure weiter machen oder wirklcih onkeypress verwenden. das mit den warten würde mich aba trodem noch interessiren^^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:33 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-2025 by Thomas Breitkreuz