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

Вниз

Нужна помощь   Найти похожие ветки 

 
Шишкин Илья ©   (2003-09-18 09:40) [0]

Уже целые сутки ломаю голову. Не понимаю в чём ошибка.

type
TCDPlayer=class(TObject)
Track:string; //Почему нельзя работать с этими переменными?
Drive:string; //Почему нельзя работать с этими переменными?
Volume:string; //Почему нельзя работать с этими переменными?

function Play(CD:string;Track:integer):boolean;
function GetVolume:integer;
function SetVolume(Volume:integer):boolean;
function Stop:boolean;
function GetLength:integer;
function GetPos:integer;
function IsPlaying:boolean;
function IsPaused:boolean;
function Pause:boolean;
function Resume:boolean;
end;

function TCDPlayer.IsPlaying:boolean;
begin
if BASS_ChannelIsActive(CDChannel)=BASS_ACTIVE_PLAYING then Result:=true else Result:=false;
end;

function TCDPlayer.IsPaused:boolean;
begin
if BASS_ChannelIsActive(CDChannel)=BASS_ACTIVE_PAUSED then Result:=true else Result:=false;
end;

function TCDPlayer.Play(CD:string;Track:integer):boolean;
begin
if Length(CD)<2 then
begin
Result:=false;
exit;
end;
if CD[2]<>":" then
begin
Result:=false;
exit;
end;
if BASS_CDInit(PChar(CD),0) then
begin
if BASS_CDInDrive then
begin
if BASS_CDPlay(Track,false,false) then
begin
Result:=true;
CDPlayer.Track:=IntToStr(Track); //Здесь происходит ошибка
CDPlayer.Drive:=CD; //Здесь происходит ошибка
CDPlayer.Volume:="100"; //Здесь происходит ошибка

end;
end
else
begin
Result:=false;
Bass_CDFree;
exit;
end;
end
else
begin
ShowMessage("ERROR");
Result:=false;
Bass_CDFree;
exit;
end;
end;

function TCDPlayer.GetVolume:integer;
begin
Result:=StrToIntDef(CDPlayer.Volume,0);
end;

function TCDPlayer.Pause:boolean;
begin
Result:=BASS_ChannelPause(CDChannel);
end;

function TCDPlayer.Resume:boolean;
begin
Result:=BASS_ChannelResume(CDChannel);
end;

function TCDPlayer.SetVolume(Volume:integer):boolean;
begin
Result:=BASS_ChannelSetAttributes(CDChannel,-1,Volume,-101);
if Result then CDPlayer.Volume:=IntToStr(Volume);
end;

function TCDPlayer.Stop:boolean;
begin
try
BASS_CDFree;
except
Result:=false;
exit;
end;
Result:=true;
end;

function TCdPlayer.GetLength:integer;
begin
Result:=Round(BASS_CDGetTrackLength(StrToInt(CDPlayer.Track))/1000);
end;

function TCdPlayer.GetPos:integer;
begin
Result:=Round(BASS_ChannelBytes2Seconds(CDChannel,BASS_ChannelGetPosition(CDChannel)));
end;


 
KSergey ©   (2003-09-18 09:43) [1]

А что это за переменная такая странная CDPlayer???


 
Шишкин Илья ©   (2003-09-18 09:43) [2]

Совсем забыл.

var
CDPlayer:TCDPlayer;


Вызываю функцию так: CDPlayer.Play("E:",1);


 
Шишкин Илья ©   (2003-09-18 09:56) [3]

Up!


 
Шишкин Илья ©   (2003-09-18 10:30) [4]

Up!


 
Некрофил-затейник__ ©   (2003-09-18 10:36) [5]

Шишкин Илья
по мойму по умолчанию переменные твои имеют
private не забывай указывать тип доступа

class CClass
private
...
protected
...
public
...
published
...
end;


 
MVova ©   (2003-09-18 10:38) [6]

CDPlayer := TCDPlayer.Create;
Делаеш?


 
Некрофил-затейник__ ©   (2003-09-18 10:48) [7]

MVova
судя по всему он этого и не делает.


 
Шишкин Илья ©   (2003-09-18 10:48) [8]

2 MVova
А надо?


 
Igorek ©   (2003-09-18 10:53) [9]


>CDPlayer.Track:=IntToStr(Track);
>CDPlayer.Drive:=CD; //Здесь
>CDPlayer.Volume:="100"; //Здесь

Как компилятор варит первый вызов?


 
MVova ©   (2003-09-18 10:53) [10]


> Шишкин Илья © (18.09.03 10:48) [8]

Желательно ;)


 
Andryk ©   (2003-09-18 10:54) [11]


> Некрофил-затейник__ © (18.09.03 10:36) [5]
> Шишкин Илья
> по мойму по умолчанию переменные твои имеют
> private не забывай указывать тип доступа

Это с какой такой радости они Private? Посмотри на объявления форм, они Published

По сабжу, а где собственно говоря вы инициализируете (создаете экземпляр) переменную CDPlayer?


 
MVova ©   (2003-09-18 10:56) [12]

function TCDPlayer.Play(CD:string;Track:integer):boolean;
IntToStr(Track); - Track это параметр метода;


 
MVova ©   (2003-09-18 10:59) [13]

Вообще както странно обращение в объекте к экземплялу своего объекта????


 
KSergey ©   (2003-09-18 11:07) [14]

Да хоть где бы он этот экземпляр не создавал, но нельзя же из метода класса обращаться к глобальной (?) переменной типа этого класса!! Это корректно с точки зрения компилятора, но такое делать никак не надо!!! Функциональность метожов класса становится зависимой от значения некой глобальной переменной, что напрочь не соответствует задумкак, заложенным в идеи ООП (класс выполняет некие не зависящие от внешних факторов действия по своему сообжажению; все воздействие на класс - только через его методы/проперти)
В принципе, коенчно, иногда приходится делать такие ссылки, но это явно не тот случай.
Внутри метода класса не надо ссылаться на имя его экземпляра, в случае, когда это необходимо надо использовать спец. слово Self - это ссылка на данный экземпляр класса, для которого этот метод вызван.

Давайте разберем, что происходит при обработке строки

CDPlayer.Track:=IntToStr(Track);

Фактически, происходит присвоение значения переменной Track экземпляра класса, на который ссылается переменная CDPlayer значением, которое хранится в переменной Track. Тут есть 2 момента
а) наш класс зависим от значения какой-то переменной CDPlayer
б) у компилятора едет крыша, т.к. и в классе ТCDPlayer есть переменная Track, и аргументом метода Play передана переменная того же типа. Что он будет именно иметь в виду -надо читать книжки.

А сделать надо так:

function TCDPlayer.Play(CD:string; NumTrack:integer):boolean;
...
Track:=IntToStr(NumTrack);
...


 
KSergey ©   (2003-09-18 11:09) [15]

Пункт б) читать в следующей редакции:

б) у компилятора едет крыша, т.к. и в классе ТCDPlayer есть переменная Track, и аргументом метода Play передана переменная с тем же именем. Что он будет именно иметь в виду - надо читать книжки, я точно не знаю.
Н отсюда все и идет, сейчас разглядел. Впрочем, не только отсюда, если копать глубже ;)


 
Igorek ©   (2003-09-18 11:46) [16]


> CDPlayer.Track:=IntToStr(Track);

Надо.
Self.Track := IntToStr(Track);
...


 
Некрофил-затейник__ ©   (2003-09-18 12:22) [17]

Andryk
запарился целый день с С на Паскаль прыгать.



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

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

Наверх




Память: 0.51 MB
Время: 0.02 c
14-18534
Zhouck
2003-09-19 12:33
2003.10.06
Механизмы межпроцессорного взаимодействия( IPC)


3-18233
DmitryMN
2003-09-15 23:41
2003.10.06
Зависание клиента


14-18537
ie
2003-09-17 11:51
2003.10.06
да уж тема


1-18407
Тимохов
2003-09-24 16:49
2003.10.06
Вопрос по Excel из Delphi.


1-18423
Serginio666
2003-09-25 13:23
2003.10.06
Как програмно управлять сервисом ???