Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Область видимости свойств класса   Найти похожие ветки 

 
Yuri Btr ©   (2004-03-12 10:02) [0]

Ув. мастера, у меня есть проблема:
Я разрабатываю класс (вот выдержка из объявлений класса):
type
TPlayList = class
private
FSongs:TList;
....
end;

Вся работа данного класса основывается на вызовах функций из звуковой библиотеки Bass.dll
В одном из методов TPlayList вызывается вызывается ф-ия синхронизации звукового потока. В качестве одного из параметров ей нужно передать адрес т.н callback ф-ии
в Help по Bass она описана так:
void CALLBACK YourSyncProc(
   HSYNC handle,
   DWORD channel,
   DWORD data
   DWORD user
);
Я же её описываю у себя так
procedure DoFadeOut(handle: HSYNC; channel, data: DWORD; user: DWORD); stdcall;
И ередаю её так @DoFadeOut
В общем вызов этой ф-ии происходит так как мне нужно, но я не могу увидеть внутренние свойства моего класса в котоом это всё работает.
Я попытался решить проблему следующим способом:
в разделе private моего класса объявил
procedure DoFadeOut(handle: HSYNC; channel, data: DWORD; user: DWORD); stdcall;
соответственно после implementation я написал
procedure TPlayList.DoFadeOut(handle: HSYNC; channel, data: DWORD; user: DWORD); stdcall;
и передаю её так @TPlayList.DoFadeOut
В этом случае вызов ф-ии происходит (я проверял с пом. отладчика) и сразу же вываливается Access Violation (никакого
кода в callback ф-ии я ещё не писал)
Помогите разобраться как увидеть из DoFadeOut внутренние свойства класса?


 
Rem ©   (2004-03-12 10:12) [1]

1. TPlayList.DoFadeOut - использовать нельзя, так как это метод класса, и в него (в скрытом виде) передается также и указатель Self.
2. Объявить свойства как (минимум) protected. Внутри модуля они будут видны. Это такая особенность Pascal.


 
Anatoly Podgoretsky ©   (2004-03-12 10:15) [2]

YourSyncProc должна быть объявленв в том же модуле.


 
Polevi ©   (2004-03-12 10:15) [3]

>вызывается ф-ия синхронизации звукового потока. В качестве >одного из параметров ей нужно передать адрес т.н callback ф-ии

у меня есть подозрения что в качестве еще одного параметра можно передать некое user-defined число, которое затем будет передано библиотекой в callback ф-ию (например user: DWORD)
в таком случае можно в качестве этого числа передать self экз. твоего класса


 
Yuri Btr ©   (2004-03-12 10:15) [4]

to Rem ©  
Спасибо большое, попробую чуть позже.


 
Polevi ©   (2004-03-12 10:17) [5]

>Anatoly Podgoretsky ©   (12.03.04 10:15) [2]
причем тут модуль, ему указатель на экз. нужен.. можно конечно глобальную перменную объявить, но это.. ну вы сами знаете


 
Yuri Btr ©   (2004-03-12 10:18) [6]

to Anatoly Podgoretsky ©
Она там и объявлена...

to Polevi ©
Да, забыл упомянуть, так оно и есть, и такое же решение и мне пришло в голову, но не знаю как передать self в функцию и затем внутри неё использовать self?


 
Anatoly Podgoretsky ©   (2004-03-12 10:27) [7]

А ты никак не показываешь как ты смотришь внутренности класса и вообще какие внутренности класса ты ожидаешь увидеть, кроме class function/procedure ты ничего и увидеть не можешь, все остальное относится к объектам и прекрасно видно.


 
Polevi ©   (2004-03-12 10:27) [8]

SYNCPROC = procedure(handle: HSYNC; channel, data: DWORD; user: DWORD); stdcall;
...

   user   : The "user" parameter given when calling BASS_ChannelSetSync
 }

TPlayList.SomeMethod;
begin
 ...
 BASS_ChannelSetSync(.....,DWORD(self));
 ...
end;

procedure DoFadeOut(handle: HSYNC; channel, data: DWORD; user: DWORD); stdcall;
var
 pl:TPlayList;
begin
 pl:=TPLayList(user); //экземпляр

end


 
evvcom   (2004-03-12 10:32) [9]


> 2. Объявить свойства как (минимум) protected. Внутри модуля
> они будут видны. Это такая особенность Pascal.

Внутри модуля и private будут видны. Для данной задачи нет никакой разницы где объявлять (в private или protected) свойства, методы, события.

Попробуйте все же разобраться с советом Polevi ©   (12.03.04 10:15) [3]

Если не выйдет, то такой еще путь есть.
Создается массив, в который записываются все указатели на созданные объекты твоего класса, ну и во время вычищаются. Поскольку в callback функцию передается handle, который вроде как должен быть уникальным, то по нему из массива можно выбрать нужный объект.


 
Polevi ©   (2004-03-12 10:39) [10]

>evvcom   (12.03.04 10:32) [9]
>Если не выйдет, то такой еще путь есть..
и по каким причинам это млжет "не выйти " ?


 
evvcom   (2004-03-12 10:49) [11]


> и по каким причинам это млжет "не выйти " ?

Ну хотя бы по причине того, что user: DWORD - необязательно пользовательский параметр, ведь мы этого наверняка не знаем. Может это имя пользователя? Кстати, BASS_ChannelSetSync в вопросе не было, а что такое bass.dll мне не известно.


 
Polevi ©   (2004-03-12 10:55) [12]

>evvcom   (12.03.04 10:49) [11]
мне сначала тоже было неизвестно, не поленился и качнул API.. вот цитата

 SYNCPROC = procedure(handle: HSYNC; channel, data: DWORD; user: DWORD); stdcall;
 {
   Sync callback function. NOTE: a sync callback function should be very
   quick as other syncs cannot be processed until it has finished. If the
   sync is a "mixtime" sync, then other streams and MOD musics can not be
   mixed until it"s finished either.
   handle : The sync that has occured
   channel: Channel that the sync occured in
   data   : Additional data associated with the sync"s occurance
   user   : The "user" parameter given when calling BASS_ChannelSetSync
 }

BASS_ChannelSetSync:function(handle: DWORD; stype: DWORD; param: QWORD; proc: SYNCPROC; user: DWORD): HSYNC; stdcall;


 
evvcom   (2004-03-12 10:59) [13]

Всё, теперь всё ясно. Хотя это мог и автор вопроса выложить, чтобы отвечающим не искать эту инфу самим. В конце концов ответ был нужен больше всех вопрошающему.


 
Yuri Btr ©   (2004-03-12 19:42) [14]

to evvcom
to Polevi ©  
Извините пожалуйста, что не выложил всё сразу - были ужасно неотложные дела, весь день не смог подойти к компьютеру.
Огромное спасибо Polevi это именно то, что я искал.



Страницы: 1 вся ветка

Текущий архив: 2004.04.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
6-1075397579
laumer
2004-01-29 20:32
2004.04.04
Как отловить момент окончания щтправки потока


1-1079432613
MIKL_b
2004-03-16 13:23
2004.04.04
Потоки не пашут паролельно! По очереди они...


14-1079055248
Думкин
2004-03-12 04:34
2004.04.04
С днем рождения! 12 марта.


11-1058423978
savva
2003-07-17 10:39
2004.04.04
OnDrawItem для TKOLMainMenu - работает или нет?


14-1078927680
Тимур
2004-03-10 17:08
2004.04.04
playstation2