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