Autor Beitrag
flaavia
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: Fr 26.12.03 13:07 
Hallo

Nachdem ich jetzt DirectInput endlich zum laufen gebracht habe, habe ich jetzt noch ein Problem mit der Tatsache, das das Drücken der Gamepad-Buttons entweder leicht verzögert (ca 1 sec) registriert wird (und die daran geknüpfte Aktion dann bei nur ganz kurzem Drücken des Buttons nicht gestartet wird) oder das Button-Gedrückt Ereignis gleich mehrfach ausgelöst wird (weil ich eben den Button länger drücken muss, damit überhaupt das ButtonGedrückt-Ereigniss registriert wird) und damit das Program auch nicht richtig läuft (Die auszulösende Aktion wird eben mehrfach gestartet, obwohl dies nur einmal bei Knopfdruck der Fall sein sollte.

Ich habe die GamePad-Buttongedrückt-Ereigniss-Abfrage folgendermaßen umgesetzt:

ausblenden Delphi-Quelltext
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:
procedure TfoMain.btDirectInputStartClick(Sender: TObject);
var
  diJoyState: TDIJoyState;
begin

  DIDJoystick.Acquire;

  Aborted:=False;
  
  repeat
    Application.ProcessMessages;
    // Joystickstatus in diJoyState speichern ...
    DIDJoystick.Poll;
    DIDJoystick.GetDeviceState(SizeOf(diJoyState), @diJoyState);

    // diJoyState.rgbButtons[0..31] -> Buttons des Joysticks / Gamepads; wenn >0 dann gedrückt...

    
          if ((diJoyState.rgbButtons[0]>0) and (foMain.Active = True) and ...) then btXYZ.Click;
             //das im Program mit dem Button btXYZ verknüpfte Ereignis wird ausgelöst
          if ((diJoyState.rgbButtons[1]>0) and...

    
  until (GetKeyState(VK_ESCAPE) and 128>0) or Aborted; // bis Taste ESCAPE oder Abbruch gedrückt ...
  
end;



Das ganze mit einem Timer abzufragen würde die Situation auch nicht ändern.
Ich würde mich sehr über Tips freuen, wie man dieses Problem prizipiell angeht (Der gedrückte Gamepad-Button soll das Ereigniss nur einmal auslösen, erst wenn er ein zweitesmal gedrückt wird, also nach loslassen und neu drücken, sollte das Ereigniss erneut ausgelöst werden).

Kann man auch etwas gegen die variable Zeit (bis zu 1/2 bis 1 Sek) unternehmen, bis das gedrückt-Ereignis registriert wird, so daß man den GamepadButton nicht dauernd gedrückt halten mus, bis man merkt, das der "Computer dies mitbekommen hat" :?:

Viele Dank für alle Tips

Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 26.12.03 13:34 
Hallo!

Bitte nutze Delphi- statt Code-Tags. Ich habe dies schon in mehreren Postings für Dich geändert. Denke bitte demnächst daran!

Grüße
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
flaavia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: Fr 26.12.03 16:29 
@ Peter LustiG: Sorry für die Tags, mir war (und ist eigentlich gar nicht klar warum dies wichtig ist :oops: ) aber ich werde es selbstverständlich tun. Nur, was ist denn dann mit Code-Tags gemeint?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 26.12.03 16:34 
Hallo!

Code-Tags sind für allgemeinen Code gedacht, also nicht speziell Delphi-Source. Dabei ist eigentlich der einzige Effekt, dass die Leerzeichen am Anfang von Zeilen nicht entfernt werden.
Delphi-Tags sind speziell auf Delphi-Sourcecode zugeschnitten und unterstützen Syntax-Highlighting. Und weshalb Delphi-Tags durchaus Sinn machen, zeigt schon unten stehendes Beispiel. Der Source wird viel besser lesbar!

mit Code-Tags:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
procedure meineProz;
VAR i : Integer;
begin
  Label1.Caption := 'Hallo';
  for i:=1 TO 10 DO irgendwas; //Ein Kommentar
end;

mit Delphi-Tags:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure meineProz;
VAR i : Integer;
begin
  Label1.Caption := 'Hallo';
  for i:=1 TO 10 DO irgendwas; //Ein Kommentar
end;


Überzeugend, oder? :)

Grüße
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
flaavia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105

WinXp Vista
D6 Ent, D2007 Ent
BeitragVerfasst: Sa 27.12.03 16:02 
:shock: :autsch: :D

überzeugt


hat denn auch noch jemand eine idee zu meínem am Anfang genannten Problem :nixweiss: :?:

Dies müsste doch ein Problem sein, das öfter vorkommt und zu dem es Lösungsansätze gibt (die mir leider noch aus mangelnder langzeitprogramiererfahrung fehlen)

Für alle Tips vielen Dank im voraus