Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Переопределение свойства класса-наследника   Найти похожие ветки 

 
Verner ©   (2012-05-16 09:20) [0]

Здравствуйте, уважаемые мастера. Пытаюсь создать класс, наследник класса TList модуля Classes^:

 TScheduleTime = record
   TimeStamp: TDateTime;
   Active: boolean;
   Done: boolean;
 end;

 PScheduleTime = ^TScheduleTime;//тип свойства, с которым идет работа

 // Список времен расписания.
 TScheduleTimeList = class (TList)
 private
     function GetItems:PScheduleTime;
 public
   function NewTime(aTimeStamp: TDateTime; aActive: boolean; aDone: boolean): PScheduleTime;
   property Items[aIndex: integer]: PScheduleTime read GetItems; default;
 end;


Реализовал тело функции GetItems, возвращающей значение свойства, для заглушки:

function TScheduleTimeList.GetItems:PScheduleTime;
var PSH:PScheduleTime;
begin
Result:=PSH;
end;


При нажатии на проверку синтаксиса, ругается на эту строку

   property Items[aIndex: integer]: PScheduleTime read GetItems; default;

  -- Incompatible types

Пробовал это свойство объявить с типом Pointer, как в род. классе TList - не помогает. Буду очень благодарен, если кто сможет сказать, в чём тут дело.


 
Медвежонок Пятачок ©   (2012-05-16 09:24) [1]

ну как минимум гетитемс должно иметь один параметр


 
Dimka Maslov ©   (2012-05-16 09:26) [2]

Во первых GetItems должен быть объявлен как function GetItems(AIndex: Integer): PScheduleTime. А во вторых то, как сделано это прямая дорога к access violation и полной неработоспособности


 
Verner ©   (2012-05-16 09:51) [3]

Огромное спасибо, не докумекал!

>>А во вторых то, как сделано это прямая дорога к access violation и полной неработоспособности<<
Ну так конструктор и деструктор еще не реализованы, не весь функционал класса.


 
Dimka Maslov ©   (2012-05-16 10:05) [4]


> Ну так конструктор и деструктор еще не реализованы, не весь
> функционал класса.


Внимательно смотрим, что возвращает функция GetItems:
Значение неинициализированного указателя, являющегося внутренней переменной функции. С тем же успехом можно было просто использовать генератор случайных чисел. Так делать нельзя.


 
KSergey ©   (2012-05-16 12:48) [5]

Я чета не понял: у класса TList есть метод Get (а не GetItems)

TScheduleTimeList = class (TList)
 protected   // а не private
    function Get(Index: Integer): PScheduleTime;
 public
   function NewTime(aTimeStamp: TDateTime; aActive: boolean; aDone: boolean): PScheduleTime;
   property Items[aIndex: integer]: PScheduleTime read Get; default;
end;

function TScheduleTimeList.Get(Index: Integer): PScheduleTime;
begin
 Result := inherited Get(Index);
end;

function TScheduleTimeList.NewTime(aTimeStamp: TDateTime; aActive: boolean; aDone: boolean): PScheduleTime;
begin
end;


 
Ega23 ©   (2012-05-16 15:43) [6]

У TList надо Notify перекрыть.


 
Leonid Troyanovsky ©   (2012-05-16 18:28) [7]


> Ega23 ©   (16.05.12 15:43) [6]

> У TList надо Notify перекрыть.

А оно у него есть?

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2012-05-16 18:44) [8]


> Leonid Troyanovsky ©   (16.05.12 18:28) [7]

> А оно у него есть?

Есть. Всем расслабиться.
Sorry.

--
Regards, LVT.


 
KSergey ©   (2012-05-17 08:10) [9]

> Ega23 ©   (16.05.12 15:43) [6]
> У TList надо Notify перекрыть.

Как это решит задачу получения от Items[] типа PScheduleTime ?
Это уже следующий шаг )


 
Romkin ©   (2012-05-24 18:03) [10]

Вообще говоря, писать потомка TList и использовать его - крайне неблагодарное занятие. Его использовать надо.


 
MBo ©   (2012-05-24 19:19) [11]

>Romkin ©   (24.05.12 18:03) [10]
Мощно задвинул ;)


 
Ega23 ©   (2012-05-24 19:25) [12]


> Мощно задвинул ;)


Я даже знаю откуда у этого задвига ноги растут. Более того, я с ним в целом согласен.
Не далее как в прошлый четверг сидели мы с Ромой у меня на кухне, пили "Лакинское" и "Чешское" и как раз бурно обсуждали: имеет ли смысл писать наследников от TList, либо делать класс-обёртку над листом, вынося в паблик ровно то, что нужно видеть снаружи.
Т.е.

 TMyList = class (TList)
 
 vs.

 TMyList = class (TObject)
 private
   FItems: TList
 public
   Items
   count
   etc
 end;  


Сошлись на втором.
Точнее, сошлись на TObjectList<T>, но потом - на втором. :)


 
MBo ©   (2012-05-25 05:49) [13]

>Ega23
Мне сдаётся, что Роман выдал только часть мысли. Тебе эта незавершённость понятна благодаря контексту, а я вот недопонял... Вот, например, слово "его" в первом и втором предложении относится к одной и той же сущности?


 
Romkin ©   (2012-05-25 15:24) [14]

Ну под вечер из меня моща так и прет. Включать список в свой объект надо, обычный пример - Components + ComponentsCount и т.д.
А топикстартеру я бы рекомендовал посмотреть на TCollection, и не извращаться с выделением памяти под записи.


 
Amoeba_   (2012-05-25 15:40) [15]


> А топикстартеру я бы рекомендовал посмотреть на TCollection

Здесь статья Ю.З.
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=215



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.05 c
15-1329199075
Думкин
2012-02-14 09:57
2013.03.22
Задчка с олимпиады недавней


2-1338853453
Vainu
2012-06-05 03:44
2013.03.22
random,textfile, дипломная работа


2-1329298711
ixen
2012-02-15 13:38
2013.03.22
Вопросы по потокам


15-1342015306
Дмитрий С
2012-07-11 18:01
2013.03.22
Apache mod_rewrite


15-1338898180
Owner111
2012-06-05 16:09
2013.03.22
LPVOID &amp; LPCVOID