Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

[dcc32 Error] E2036 Variable required


mybass ©   (2016-01-13 01:44:00) 

подскажите пожалуйста, использую модуль bass для проигрывания мп3.

процедура описана как:
SYNCPROC = procedure(handle: HSYNC; channel, data: DWORD; user: Pointer);stdcall;

описал у себя её так же само.
procedure EndSync(handle: HSYNC; channel, data, user: DWORD ); stdcall;
begin
//
end;
..
BASS_ChannelSetSync(chan, BASS_SYNC_END, 0, @EndSync, 0);
работает нормально.

но если помещаю это всё в класс, то не могу назначить эту процедуру.
procedure TPlayer.EndSync..
...
procedure TPlayer.Play;
BASS_ChannelSetSync(chan, BASS_SYNC_END, 0, @EndSync,0);
[dcc32 Error] E2036 Variable required
если без собачки указать EndSync, то ошибка:
E2009 Incompatible types: 'regular procedure and method pointer'

что-то и гугл в это позднее время ничего путнего не подсказывает.


icWasya   (2016-01-13 09:20:00) [1]

Как-то так


type TPlayer=class
 procedure EndSync(handle: HSYNC; channel, data: DWORD);

end;

implementation
procedure EndSync_CallBack(handle: HSYNC; channel, data, user: DWORD ); stdcall;
var Player:TPlayer;
begin
 Player:=TPlayer(user);
 Player.EndSync(handle, channel, data);
end;

procedure TPlayer.Play;
begin
....
 BASS_ChannelSetSync(chan, BASS_SYNC_END, 0, EndSync_CallBack, Self);
end;


Работать будет только на x86-32


mybass   (2016-01-13 02:07:00) [2]

может всё же есть какие идеи, как передать в bass не процедуру а метод класса:

procedure TMyPlayer.EndSync(handle: HSYNC; channel, data, user: DWORD ); stdcall;

что бы в этой процедуре я мог обращаться к другим полям этого класса.
тут только одна пользовательская переменная: user: DWORD
BASS_ChannelSetSync(chan, BASS_SYNC_END, 0, @EndSync, user);
если использовать как статик, то и никак не передашь указатель на класс если не отказываться от 64 бита.


mybass   (2016-01-13 01:55:00) [3]

получилось объявить метод класса как статику:
class procedure EndSync(handle: HSYNC; channel, data, user: DWORD ); stdcall; static;
не знаю правильно ли..
а вот как получить вместо 8 только эти 4 байта функции без объекта никак что-то не пойму.


Наверх

Титульная страница Поиск, карта сайта Написать письмо