К списку форумов К списку вопросов
Abstract error
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
:)

К списку вопросов на форуме Программирование

>>