![]() |
![]() |
megabax 28.09.2004 - 22:17 |
При вызове конструктора constructor TPassPriceSource.Create(AFilePath:string;AActive:boolean); begin Inherited Create; FFields:=TStringList.Create; FFields.Add('Open'); FFields.Add('Close'); FFields.Add('Higth'); FFields.Add('Low'); FFields.Add('Volume'); FFields.Add('DateTime'); GetMem(FBuffer,CMaxBarCount*Sizeof(TBarStructure)); FFilePath:=AFilePath;// Путь к файлу присваиваем полю напрямую - ничего делать не надо Active:=AActive; // А вот ту присваивам свойству - надо загрузить файл, если объект делем активным end; на строке Active:=AActive; выдается сообщение: Project PASS.exe raised exception class EAbstrctError with message 'Abstrct error'. Класс TPASSPriceSource является потмком класса, имеющего абстрактыне методы. Свойство Active определено в этом родительствком (абстрактном классе). В классе TPASSPriceSource оно не перерпредлеляется, потому что свойство в родительском классе оно определено не как абстрактное. Методы установки свойства опредлен как абстрактный, но в классе TPASSPriceSource он нормально предопределен. Подскажите плз, в чем может быть проблема? |
DrVisor 1 - 29.09.2004 - 08:04 | покажи определение методов установки свойства в родительском и дочернем классе,имхо где-то в синтаксисе ошибся |
VaS 2 - 29.09.2004 - 16:53 | Где-то в базовом классе вызывается абстрактный метод, который потомки обязаны переопределить. Посмотри стек в момент исключения и все станет ясно. |
Delphist 3 - 29.09.2004 - 23:09 |
Скорее всего, Active определено как property Active: boolean read GetActive write SetActive; или property Active: boolean read FActive write SetActive; А метод SetActive определен в родителе как абстрактный, его-то и нужно перекрыть в своем классе. . Если не угадал, то читай ответ #1 |
Sabrian 4 - 30.09.2004 - 17:06 | Возможно, что обьявлен обьявленый обьект предка TPassPriceSource, создается как TPassPriceSource, а SetActive не переопределен (override), а просто затеняет абстрактный метод, ты уверен что обьявил TPassPriceSource.SetActive как override? |
Sabrian 5 - 30.09.2004 - 17:09 | "обьявлен обьявленый обьект" - туфталогия :) Вот так всегда! Вначале пост отправляю, а потом уже его читаю - нет ли там ошибок??? :) |
megabax 6 - 30.09.2004 - 21:41 |
SetActive У МЕНЯ ОБЪЯВЛЕН В РОДИТЕЛЬСКОМ КЛАССЕ КАК абстрактный вирутальный. В этом классе он у меня переопределяется. Правда, свойсвто активе не переопределялось в этов классе, но в родительстком оно было объявлено не как абстракт. Когда я переопредели свойство, все заработало. Нигде оввердие не стаивл. А где его надо ставить, в родительсокм или в этом классе? И надо ли вместе с ним виртуал. И чем чревато, если я не поставил овериде? |
Delphist 7 - 30.09.2004 - 23:46 |
Никогда не слышал об абстрактных свойствах, только о методах. А override надо ставить у SetActive в твоем классе вместо "abstract; virtual;" Только не ставь внутри у SetActive вызов inherited :) |