Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1079321290
PIA
2004-03-15 06:28
2004.04.04
Почему программа из Delphi не запускается на других компах


1-1079527534
Inimeg
2004-03-17 15:45
2004.04.04
EIBInterBaseError - что это такое


7-1076403470
Димос
2004-02-10 11:57
2004.04.04
Очистка корзины


1-1079270474
YurikGl
2004-03-14 16:21
2004.04.04
EhLib


8-1070651618
News
2003-12-05 22:13
2004.04.04
Эффект для мыши





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский