Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема в наследование функции классами 
:(
    Опции темы
gesper
Дата 19.1.2013, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: 1
Всего: 2



Есть базовый класс TADataBaseItem, описывающий общие физические черты какой то вещи. На его основе создаются новые классы отличающиеся рядом дополненых параметров. Проблема в функции, которая на основе тега в тексте должна вернуть значение переменной из класса.

Вот функция определенная в классе родителе.
Код

function TADataBaseItem.GetParameter(Name: ShortString): Variant;
begin
Result:=null;
try
        Name:=lowercase(Name);
        if Name='guid' then
        Result:=guid
        else if Name='labelname' then
        Result:=labelname
        else if Name='description' then
        Result:=description
        else if Name='comment' then
        Result:=comment
        else if Name='manufacturer' then
        Result:=manufacturer
        else if Name='codenumber' then
        Result:=codenumber
        else if Name='mark' then
        Result:=Mark
        else begin
          if AdditionalProperty.Values[Name]<>'' then
             Result:=AdditionalProperty.Values[Name]
          else
          Result:=null;
        end;
except
    Result:=null;
end;
end;


вот функция из потомка.
Код


TKnopkaItem = class(TADataBaseItem)

***

function TKnopkaItem.GetParameter(Name: ShortString): Variant;
begin
  Result:=null;
try
        Result:=inherited GetParameter(Name);
        if Result=null then
        begin
        Name:=lowercase(Name);
        if Name='aarea' then
        Result:=AArea
        else if Name='barea' then
        Result:=BArea
        else if Name='shapetype' then
        Result:=ShapeType
        else if Name='thicknessinsulation' then
        Result:=ThicknessInsulation
        else begin
          Result:=null;
        end;
        end;
except
    Result:=null;
end;
end;


когда вторая функция выполняет процедуру 
Код

Result:=inherited GetParameter(Name);

то программа вываливается с ошибкой ошибки доступа к памяти, на строчке родительской функции.
Код

        else if Name='mark' then
        Result:=Mark

Хотя переменная существует и доступна. 
Как правильно обработать такой вызов функции родителя, если переопределяем ее в наследнике?

Это сообщение отредактировал(а) gesper - 19.1.2013, 15:33
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
kami
Дата 19.1.2013, 16:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



В конструкторе потомка есть вызов конструктора предка?
PM MAIL WWW   Вверх
gesper
Дата 19.1.2013, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: 1
Всего: 2



да
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
gesper
Дата 19.1.2013, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: 1
Всего: 2



Не понимаю smile  нашел причину Self класса идет как nil, исправил функцию родительского класса на 

Код

function TADataBaseItem.GetParameter(Name: ShortString): Variant;
begin
Result:=null;
try
        if Assigned(Self) then /////////////// Добавлено
        begin
        Name:=lowercase(Name);
        if Name='guid' then
        Result:=guid
        else if Name='labelname' then
        Result:=labelname
        else if Name='description' then
        Result:=description
        else if Name='comment' then
        Result:=comment
        else if Name='manufacturer' then
        Result:=manufacturer
        else if Name='codenumber' then
        Result:=codenumber
        else if Name='mark' then
        Result:=Mark
        else begin
          if AdditionalProperty.Values[Name]<>'' then
             Result:=AdditionalProperty.Values[Name]
          else
          Result:=null;
        end;
end;
except
    Result:=null;
end;
end;


и все пашет. Не понимаю, Почему она вызывается и кем тогда без объекта самого данных.

Это сообщение отредактировал(а) gesper - 19.1.2013, 17:43
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
DarkProg
Дата 19.1.2013, 18:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(gesper @  19.1.2013,  17:40 Найти цитируемый пост)
Self класса идет как nil 

По стеку вызова посмотрите откуда пришёл вызов функции, кто его породил и почему не создан объект.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Rennigth
Дата 19.1.2013, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



TADataBaseItem от чего наследуется и как создается TKnopkaItem?


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
gesper
Дата 19.1.2013, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


"Shарфик"
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 23.2.2005

Репутация: 1
Всего: 2



Цитата(Rennigth @  19.1.2013,  21:23 Найти цитируемый пост)
TADataBaseItem от чего наследуется и как создается TKnopkaItem?


TADataBaseItem = class

Цитата(DarkProg @  19.1.2013,  18:04 Найти цитируемый пост)
По стеку вызова посмотрите откуда пришёл вызов функции, кто его породил и почему не создан объект.


 smile Одна из переменных в описании класса потомка меняет тип данных и ее значение не передается сверху виз родителю, родитель глючит :(

Через обьявление свойства и переменной в protected, вроде решил проблему smile

Это сообщение отредактировал(а) gesper - 20.1.2013, 00:51
--------------------
...И приколется обломившийся и oбломится приколовшийся...
PM MAIL   Вверх
kami
Дата 20.1.2013, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



del

Это сообщение отредактировал(а) kami - 20.1.2013, 09:42
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.