Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизОбласть видимости свойств класса Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.028 c