Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Timer blocken -.- (https://www.delphipraxis.net/135279-timer-blocken.html)

MasterTobi 8. Jun 2009 13:27


Timer blocken -.-
 
hallo hab da noch eine frage
un zwar

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if taste =1 then else begin
  if (GetASYNCKeyState ($31) <> 0)then begin
    keybd_event(VKKeyScan('t'),0,0,0);
    text :=Edit1.Text;
    EnterText(text);
    keybd_event(239, 0, KEYEVENTF_KEYUP, 0);
    sendkeys('{ENTER}',true);
    end;

......
das funktioniert ja wunderbar =)

dieses "t" ist dafür da dass man ingame ein text eingeben kann << nur zur info

so wenn ich jetzt nun ingame einen manuellen text eingeben will sprich ich drücke "t" un dann ein text z.b. hallo test1. dann führt er mir den Code oben aus.
da habe ich mir gedacht unterbinden wir das mal =)

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);

begin
case key of
Ord('T'): begin Timer1.Enabled:=false;taste:=1; end;
Ord(VK_Return): begin timer1.Enabled:=True;taste:=0 end;
end;

nun drücke ich "t" gebe einen text ein zb "hallo herr1" führt er mir den code nicht aus (siehe oben) aber sobald ich dann "enter" drücke führt er mir den aus =(


meine frage ist ob man irgendwie den timer bzw den binder blocken kann wenn ich "t" drücke und dann text+zahl!?

[edit=Matze]Delphi-Code von zu viel Copy&Paste-Text bereinigt. Bitte zukünftig vor dem Absenden die Vorschaufunktion nutzen. MfG, Matze[/edit]

Die Muhkuh 8. Jun 2009 13:35

Re: Timer blocken -.-
 
Wenn Du den Timer ausschaltet ist ja klar, dass der Code im Timer nicht ausgeführt wird, Du musst den Timer schon laufen lassen.

angos 8. Jun 2009 13:40

Re: Timer blocken -.-
 
hi,

ich verstehe leider nicht was du willst. Erkläre doch mal, was du überhaupt genau vorhast, und was du mit ingame meinst? Ingame in einem x-beliebigen spiel, oder programmierst du gerade ein spiel und ist das der Source aus dem Projekt??

Einen Timer an der automatischen Ausführung hindern kann man mit
Delphi-Quellcode:
Timer.Enabled := False;
@Muhkuh: ich bin mir nciht sicher, ob er das meint ;)
Zitat:

da habe ich mir gedacht unterbinden wir das mal =)
Also nochmal, MasterTobi: Bitte erklär einmal grundsätzlich was du da machen möchtest


Gruß
Ansgar

MasterTobi 8. Jun 2009 13:46

Re: Timer blocken -.-
 
vll falsch ausgedrückt

ok ich programmiere ein keybinder für ein Spiel!
wenn ich dort ingame(im spiel) die taste "t" drücke öffnet sich eine eingabebox wo man einen text reinschreiben kann zb " hallo du " oder befehle zb "/muha". um mir und anderen gamern eine hilfe zuschaffen lege ich die befehle auf die tasten 1-0, sprich ich drücke ingame die taste 1 dann soll er zb "/muha" senden

mein problem ist allerdings das man ja auch manuel schreiben kann "hallo 1"
sprich ich drücke erst "t" dann meinen text << beinhaltet der der text allerdings eine zahl die ich über die tasten 1- 0 eingebe und nicht über die numpad tasten dann führt er mir dies aus:

Delphi-Quellcode:
  if (GetASYNCKeyState ($31) <> 0)then begin
    keybd_event(VKKeyScan('t'),0,0,0);
    text :=Edit1.Text;
    EnterText(text);
    keybd_event(239, 0, KEYEVENTF_KEYUP, 0);
    sendkeys('{ENTER}',true);
    end;
dies ausführen

deswegen dachte ich gut sage ich wenn ich "t" drücke soll er mir den Timer deaktivieren um die eingaben nicht mehr zu registrieren. aber dies macht er nicht =(

der Code:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);

begin
case key of
Ord('T'): begin Timer1.Enabled:=false;taste:=1; end;
Ord(VK_Return): begin timer1.Enabled:=True;taste:=0 end;
end;

MasterTobi 10. Jun 2009 11:36

Re: Timer blocken -.-
 
ok da ich es nicht hinbekommen habe :D habe ich es etwas anders gemacht.

un zwar :
habe ich nur 7 Buttons, in jedem Button ändert sich text := Edit1.text um 1, also ..:=edit1, edit2, edit3 etc.



Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
if taste = 1 then
  begin
    keybd_event(VKKeyScan('t'),0,0,0);
    text :=Edit1.Text;
    EnterText(text);
    sendkeys('{ENTER}',true);
    taste:=0;
    exit;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if taste = 1 then else begin
    keybd_event(VKKeyScan('t'),0,0,0);
    text :=Edit2.Text;
    EnterText(text);
    sendkeys('{ENTER}',true);
    taste:=0;
    exit;
end;
end;
....
procedure TForm1.Button3Click(Sender: TObject);
procedure TForm1.Button7Click(Sender: TObject);
nun noch 2 Timer
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (GetASYNCKeyState ($31) <> 0)then begin
  button1.Click;
  end;

  if (GetASYNCKeyState ($32) <> 0)then begin
  button2.Click;
  end;

  if (GetASYNCKeyState ($33) <> 0)then begin
  button3.Click;
  end;

  if (GetASYNCKeyState ($34) <> 0)then begin
  button4.Click;
  end;
  if (GetASYNCKeyState ($35) <> 0)then begin
  button5.Click;
  end;
  if (GetASYNCKeyState ($36) <> 0)then begin
  button6.Click;
  end;
  if (GetASYNCKeyState ($37) <> 0)then begin
  button7.Click;
  end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if (GetASYNCKeyState (VK_return) <> 0) then begin
  taste:=0;
  end;
  if (GetASYNCKeyState (Ord('T')) <> 0)then begin
  taste:=1;
  end;

alles geht wunderbar bis Button6 bzw. bis Taste 6
sobald ich taste7 drücke oder button7 hängt sich alles auf, er gibt mir dann irgendwie button1 aus un das immer hintereinander bis ich das programm dann schließe.

weiß jemand wieso das so ist?

MasterTobi 10. Jun 2009 13:18

Re: Timer blocken -.-
 
ok der fehler liegt darin das wenn in einem edit eine zahl steht erkennt der timer diese un führt dann den dazugehörigen button aus =(

kann man dies verhindern also das wenn im edit eine zahl steht das der timer das nicht erkennt?

QuickAndDirty 10. Jun 2009 13:35

Re: Timer blocken -.-
 
1. du brauchst nur einen Timer. Dieser Timer wird nur bei Spielende gestoppt.
2. Du musst dir einen Automaten entwerfen.
3. Du nimmst dir eine Zustandsspeicher z.B. eine Variable vom Aufzählungstyp oder wenn du mehrere Zustände paralell hast vom
Mengentyp .
Delphi-Quellcode:
type tgamestate=(gsPause, gsPlaying, gsChatstartet );
so kannst du im Timer je nach spielstatus unterschiedlich reagieren.

Delphi-Quellcode:
case gamestate of
  gsPause:; //do nothing

  gsPlaying:
  Begin
    ;//Spiellogik
     (*z.b. warten das t gedrückt wird und dann gamestate anpassen *)
  end;
  gsChatstartet:
  Begin
    ;//texteingaben entgegen nehmen oder z.b. auf ENTER warten und dann gamestate anpassen
  end;
end;

fui-tak 12. Jun 2009 14:07

Re: Timer blocken -.-
 
Anmerkung: Den ganzen Thread gibt's hier nochmal. Ab Post #4


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf