AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi taste abfragen ohne onkeypress etc und label sichtbar machen
Thema durchsuchen
Ansicht
Themen-Optionen

taste abfragen ohne onkeypress etc und label sichtbar machen

Ein Thema von tabl · begonnen am 13. Mai 2009 · letzter Beitrag vom 14. Mai 2009
Antwort Antwort
tabl

Registriert seit: 27. Apr 2009
Ort: 31582
19 Beiträge
 
Delphi 7 Personal
 
#1

taste abfragen ohne onkeypress etc und label sichtbar machen

  Alt 13. Mai 2009, 19:02
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 http://www.delphipraxis.net/internal...ct.php?t=33683

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^^
  Mit Zitat antworten Zitat
OG Karotte
(Gast)

n/a Beiträge
 
#2

Re: taste abfragen ohne onkeypress etc und label sichtbar ma

  Alt 13. Mai 2009, 19:37
Ist das in Zeile 16 ein Copy&Paste - Fehler oder gibt es noch eine Funktion mit dem Namen 'sKeyDown'?
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: taste abfragen ohne onkeypress etc und label sichtbar ma

  Alt 13. Mai 2009, 20:56
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:
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.
MfG BAMatze

Edit: Anpassung des Quelltextest auf Hybrid666 Hinweis hin in #6
Angehängte Dateien
Dateityp: rar tastendruck_abfangen_758.rar (172,9 KB, 15x aufgerufen)
2. Account Sero
  Mit Zitat antworten Zitat
tabl

Registriert seit: 27. Apr 2009
Ort: 31582
19 Beiträge
 
Delphi 7 Personal
 
#4

Re: taste abfragen ohne onkeypress etc und label sichtbar ma

  Alt 13. Mai 2009, 22:07
@ 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?
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: taste abfragen ohne onkeypress etc und label sichtbar ma

  Alt 13. Mai 2009, 22:35
Zitat von tabl:
udn hat wer ne ahnung wwarum er die labels bei mir nicht erscheinen?
geht mein Programm bei dir nicht richtig?

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
2. Account Sero
  Mit Zitat antworten Zitat
Hybrid666

Registriert seit: 15. Jul 2006
Ort: Erster Stock
250 Beiträge
 
Delphi 7 Personal
 
#6

Re: taste abfragen ohne onkeypress etc und label sichtbar ma

  Alt 13. Mai 2009, 23:18
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:
  // 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
MfG again
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: taste abfragen ohne onkeypress etc und label sichtbar ma

  Alt 13. Mai 2009, 23:25
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. *faul ist
2. Account Sero
  Mit Zitat antworten Zitat
tabl

Registriert seit: 27. Apr 2009
Ort: 31582
19 Beiträge
 
Delphi 7 Personal
 
#8

Re: taste abfragen ohne onkeypress etc und label sichtbar ma

  Alt 14. Mai 2009, 21:00
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^^
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz