Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
3-18249
muzzzy
2003-09-16 11:07
2003.10.06
dbf создать...


1-18400
w666w
2003-09-25 17:25
2003.10.06
OnTreminate := SomeObj.SomeProc вместе с FreeOnTerminate := true;


6-18498
oduvan
2003-08-10 15:49
2003.10.06
Как определить кол-во писем на сервере не используя компоненты


1-18360
explorer
2003-09-22 15:16
2003.10.06
FastReport - MastreData


1-18381
lak
2003-09-22 15:48
2003.10.06
вычисление выражений в префиксной записи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский