Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2019, 12:37   #11
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию

Мучаюсь но пока не получается работать с джойстиком .
Подскажите что не так ?

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private

  public

  end;

  JoyInfo=record
   wXpos:word;
   wYpos:word;
   wZpos:word;
   wButtons:word;
  end;

var
  Form1: TForm1;
  Joy:JoyInfo;
  Id:byte;

implementation

{$R *.lfm}
 function joyGetPos(ID:byte;Joy:Joyinfo):string; stdcall; external 'winmm.dll';

 { TForm1 }

 procedure TForm1.Timer1Timer(Sender: TObject);
 var sf,s:string;
     Joy:JoyInfo;
 begin
   sf:=joyGetPos(ID,Joy);
   Label5.Caption:=sf;
   str(Joy.wXpos,s);   Label1.Caption:='X '+s;
   str(Joy.wYpos,s);   Label2.Caption:='Y '+s;
   str(Joy.wZpos,s);   Label3.Caption:='Z '+s;
   str(Joy.WButtons,s);Label4.Caption:='B '+s;
   str(ID,s);   Label6.Caption:='ID '+s;
   inc(ID);
   if ID=16 then ID:=0;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ID:=0;
end;




end.
Fedia74 вне форума Ответить с цитированием
Старый 26.03.2019, 12:46   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

joyGetNumDevs что возвращает? joyGetPos что возвращает? Зачем вы ид джойстика в таймере крутите?
p51x на форуме Ответить с цитированием
Старый 26.03.2019, 13:14   #13
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию

ID кручу по причине не знания какой ID у джойстика , просто что бы все проверить .

Про joyGetNumDevs не понял у меня её нету , ааа или это как раз ID джойстика и даёт . Попробую с ней получать ID

joyGetPos возвращает везде 0 и код ошибки '' пустота.

joyGetNumDevs почитал про неё она количество возможных джойстиков возвращает , подставил в прогу выдаёт 16

Код:
implementation

{$R *.lfm}
 function joyGetPos(ID:byte;Joy:Joyinfo):string; stdcall; external 'winmm.dll';
 Function joyGetNumDevs:byte; stdcall; external 'winmm.dll';
 { TForm1 }

 procedure TForm1.Timer1Timer(Sender: TObject);
 var sf,s:string;
     Joy:JoyInfo;
     K:word;
 begin
   k:=0;
   k:=joyGetNumDevs;
   str(k,s);   Label7.Caption:='Kol '+s;
   sf:=joyGetPos(ID,Joy);
   Label5.Caption:=sf;
   str(Joy.wXpos,s);   Label1.Caption:='X '+s;
   str(Joy.wYpos,s);   Label2.Caption:='Y '+s;
   str(Joy.wZpos,s);   Label3.Caption:='Z '+s;
   str(Joy.WButtons,s);Label4.Caption:='B '+s;
   str(ID,s);   Label6.Caption:='ID '+s;
   //inc(ID);
   //if ID=16 then ID:=0;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ID:=0;
end;
Интересное то что данные меняются при получении , но они реагируют на мышку , на нажатие мышки на перемещение формы .
Возможно что ID не тот ?

Последний раз редактировалось Fedia74; 26.03.2019 в 13:32.
Fedia74 вне форума Ответить с цитированием
Старый 26.03.2019, 13:29   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Код:
function joyGetPos(ID:byte;Joy:Joyinfo):string; stdcall; external 'winmm.dll';
Цитата:
Сообщение от Fedia74 Посмотреть сообщение
joyGetPos возвращает везде 0 и код ошибки '' пустота.
Начнем с простого: joyGetPos возвращает не строку, а число. Так что она вернула?
p51x на форуме Ответить с цитированием
Старый 26.03.2019, 13:36   #15
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию

СПАСИБО как поставил место string word всё заработало и данные с джойстика пошли !!!!!!

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private

  public

  end;

  JoyInfo=record
   wXpos:longword;
   wYpos:longword;
   wZpos:longword;
   wButtons:longword;
  end;

var
  Form1: TForm1;
  Joy:JoyInfo;
  Id:byte;

implementation

{$R *.lfm}
 function joyGetPos(ID:byte;Joy:Joyinfo):word; stdcall; external 'winmm.dll';
 Function joyGetNumDevs:word; stdcall; external 'winmm.dll';
 { TForm1 }

 procedure TForm1.Timer1Timer(Sender: TObject);
 var sf,s:string;
     Joy:JoyInfo;
     K:word;
     mm:word;
 begin
   k:=0;mm:=0;
   k:=joyGetNumDevs;
   str(k,s);   Label7.Caption:='Kol '+s;
   mm:=joyGetPos(ID,Joy);
   str(mm,s);Label5.Caption:=s;
   str(Joy.wXpos,s);   Label1.Caption:='X '+s;
   str(Joy.wYpos,s);   Label2.Caption:='Y '+s;
   str(Joy.wZpos,s);   Label3.Caption:='Z '+s;
   str(Joy.WButtons,s);Label4.Caption:='B '+s;
   str(ID,s);   Label6.Caption:='ID '+s;
   //inc(ID);
   //if ID=16 then ID:=0;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ID:=0;
end;

end.
Fedia74 вне форума Ответить с цитированием
Старый 26.03.2019, 13:38   #16
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию

Для тех кто будет наступать на мои грабли winmm.dll в своей Винде смотрите . и кидайте его к своей проге.

Всем спасибо !!!
Fedia74 вне форума Ответить с цитированием
Старый 26.03.2019, 13:38   #17
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

В лазарусе же был MMSystem, зачем вы переизобретает определения функции...
p51x на форуме Ответить с цитированием
Старый 26.03.2019, 13:51   #18
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию

Не знаю как с ним работать )))) По этому сделал как знал .
Fedia74 вне форума Ответить с цитированием
Старый 26.03.2019, 14:31   #19
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 29
По умолчанию

Попробовал использовать расширенную функцию joyGetPosEx

Поскольку у меня на джойстике 4 оси , рукоятка , газ и рудер и ещё 8 кнопок . А по описанию joyGetPosEx это позволяет использовать , но почему то при обращении функция даёт ошибку 165, $A5 и не даёт данных . что не так делаю ?

Код:

  joyinfoex=record
   dwSize:longword;
   dwFlags:longword;
   dwXpos:longword;
   dwYpos:longword;
   dwZpos:longword;
   dwRpos:longword;
   dwUpos:longword;
   dwVpos:longword;
   dwButtons:longword;
   dwButtonNumber:longword;
   dwPOV:longword;
   dwReserved1:longword;
   dwReserved2:longword;
  end;

var
  Form1: TForm1;
  Joy:JoyInfo;
  JoyEx:JoyInfoEx;
  Id:byte;

implementation

{$R *.lfm}
 function joyGetPos(ID:byte;Joy:Joyinfo):word; stdcall; external 'winmm.dll';
 Function joyGetNumDevs:word; stdcall; external 'winmm.dll';
 function joyGetPosEx(ID:byte;Joy:Joyinfoex):word; stdcall; external 'winmm.dll';
 { TForm1 }

 procedure TForm1.Timer1Timer(Sender: TObject);
 var sf,s:string;
     Joy:JoyInfo;
     K:word;
     mm:word;
 begin
   k:=0;mm:=0;
   k:=joyGetNumDevs;
   str(k,s);   Label7.Caption:='Kol '+s;
   mm:=joyGetPos(ID,Joy);
   str(mm,s);          Label5.Caption:='Err-'+s;
   str(Joy.wXpos,s);   Label1.Caption:='X '+s;
   str(Joy.wYpos,s);   Label2.Caption:='Y '+s;
   str(Joy.wZpos,s);   Label3.Caption:='Z '+s;
   str(Joy.WButtons,s);Label4.Caption:='B '+s;


   mm:=joyGetPosEx(ID,JoyEx);
   str(mm,s);          Label14.Caption:='Err-'+s;
   str(JoyEx.dwXpos,s);Label8. Caption:='X '+s;
   str(JoyEx.dwYpos,s);Label9. Caption:='Y '+s;
   str(JoyEx.dwZpos,s);Label10.Caption:='Z '+s;
   str(JoyEx.dwRpos,s);Label11.Caption:='R '+s;
   str(JoyEx.dwUpos,s);Label12.Caption:='U '+s;
   str(JoyEx.dwVpos,s);Label13.Caption:='V '+s;


   str(ID,s);          Label6.Caption:='ID '+s;
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ID:=4;
end;

end.
Fedia74 вне форума Ответить с цитированием
Старый 26.03.2019, 14:39   #20
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Не читаете описание используемых функций.
https://docs.microsoft.com/en-us/pre...7108(v%3Dvs.85)
Цитата:
You must set the dwSize and dwFlags members or joyGetPosEx will fail. The information returned from joyGetPosEx depends on the flags you specify in dwFlags.
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
прошу помощи seregapa25 Помощь студентам 1 16.12.2017 14:13
Прошу помощи:) valiza Помощь студентам 0 03.07.2009 11:58
прошу помощи ex-hack Помощь студентам 2 05.06.2009 15:54