Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как объявить свойство доступ по индексу


Автор: Anikmar 22.4.2007, 13:12
В стандартном классе vcl TList есть свойство items.
В него передается индекс и получается адрес элемента

Я не могу понять как это объявить - у меня есть свой класс, который хранит список объектов моего типа (не чисто массив, а с неким функционалом). Доступ к элементу у меня при помощи метода GetItem(Index). А как сделать этот же доступ через квадратные скобки?
Полез в исходники vcl - а там во-первых все на паскале, а во-вторых я вообще этого свойства не нашел. Может исходники у меня не полные, либо искатель из меня фиговый.


Автор: Klin 22.4.2007, 16:00
А что ты имеешь ввиду, не чисто массив, а с функциональностями? 

Автор: fish9370 22.4.2007, 18:25
Цитата(Anikmar @ 22.4.2007,  13:12)
В стандартном классе vcl TList есть свойство items.
В него передается индекс и получается адрес элемента

Я не могу понять как это объявить - у меня есть свой класс, который хранит список объектов моего типа (не чисто массив, а с неким функционалом). Доступ к элементу у меня при помощи метода GetItem(Index). А как сделать этот же доступ через квадратные скобки?
Полез в исходники vcl - а там во-первых все на паскале, а во-вторых я вообще этого свойства не нашел. Может исходники у меня не полные, либо искатель из меня фиговый.

я на днях, тоже создал свой список, который может содержать любую субстанцию, а не тоько строку.. мы с тобой встречались по этому поводу в другой ветке.. интересно по какому пути пошел ты, как память выделяешь, как хранишь элементы?

в твоем же случае нужно перегрузить operator[] и собственно все.. выглядит примерно так:

Код

Element* operator[](int index)
{
       //вычисление адреса  
       return addr;
}

Автор: Anikmar 22.4.2007, 19:00

Цитата(fish9370 @  22.4.2007,  18:25 Найти цитируемый пост)
в твоем же случае нужно перегрузить operator[] и собственно все.. 

Нет, мне не это нужно.
Перегружать оператор - это на один уровень ниже. В данном случае это не нужно.

Все оказалось просто: надо было это свойство объявлять не через класс эксполорер. Сначала создаются методы Get и Set с параметром int, а потом вручную правится свойство и получается так:
Код

    TvrClass* GetTvr(int pIndex);
    __property TvrClass* Tvrs[int Index]  = { read=GetTvr };

А если перегружать скобки, то синтаксис бы усложнился - мне вариант, использованный в Tlist больше понравился. Я просто неврубился как его реализовать.


Цитата(fish9370 @  22.4.2007,  18:25 Найти цитируемый пост)
как память выделяешь, как хранишь элементы?

Я использую стандартный Tlist - у меня массив не более 100 элементов, мне нужно другое. У меня некие универсальные объекты хранения записей таблиц БД - Получил запись из БД, потом надо с ней что-то делать, об изменениях записать в Лог и т.п.
Все это реализовано в базовом классе, от которого наследники уже переопределяют нужные виртальные методы.
А этот класс - массив таких записей (для построения интерфейса). Например некий документ со строками. Не будешь же его редактировать прямо в гриде - вдруг пользователь нажмет отмену. А держать открытой транзакцию - это плохо.
Вот и понадобился универсальный список строк

Пожалуй спасибо всем за участие - тему помечу как решенную.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)