Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2014, 07:38   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию Прикол. Свойство Cells

Господа, хочу поделиться с вами приколом, который недавно обнаружил...
у меня есть свой компонент для работы с табличными данными.
ну и ключевой функционал в нем - организация сетки (grid)
и доступа к ее ячейкам посредством свойства Cells[x,y] (как в TStringGrid)
+ реализована возможность доступа к столбу по его названию.
описание класса вот такое:

Код:
TA = class
public
{бла-бла-бла}
 
procedure SetCells(ACol,ARow:integer; const value:string); overload;
function  GetCells(ACol,ARow:integer):string; overload;
procedure SetCells(ACol:string; ARow:integer; const value:string); overload;
function  GetCells(ACol:string; ARow:integer):string; overload; 
 
property Cells[ACol, ARow: Integer]: string read GetCells write SetCells; default;
property Cells[ACol:string; ARow: Integer]: string read GetCells write SetCells; default;

{бла-бла-бла}
end;

ну и соответственно работа с ним:

A:=TA.Create;
A.Cells[0,0]:='text';
A.Cells['col',1]:='name';
и т.д.

в принципе тут все понятно, но случайно обнаружил,
что работает и такая запись:
A[0,0]:='text'; (!)


Меня мучает вопрос - почему??
Что это за прикол такой?
Почему с объектом класса можно работать как с массивом?
Причем корректно работать! ))


у меня есть только одно предположение - это из-за свойства Cells:
стандартное название, возможно компилятор его как-то по-особому воспринимает?

в Delphi 10 Lite открываются все новые и новые чудеса...
xrob вне форума Ответить с цитированием
Старый 18.02.2014, 08:00   #2
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

напишу это отдельным постом

Я понял в чем прикол!
Провел эксперименты с TStringGrid и другими своими классами, где есть Cells - нигде не прокатило.

Тогда я подумал, что возможно дело в массиве строк:
FCells:array of array of string;
- тоже нет...

но вот когда я создал свой класс и расписал там процедуру и свойство - все заработало.
оказывается, что дело в default.

получается что default дает возможность обращаться к свойству без написания его названия...
это объясняет то, что нельзя сделать 2 default-свойства в одном классе...

а вообще я default указывал для того, чтобы сделать два одинаковых по сути свойства,
но для работы с разными параметрами (аналог overload для процедур)
xrob вне форума Ответить с цитированием
Старый 18.02.2014, 10:26   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а вообще я default указывал для того, чтобы сделать два одинаковых по сути свойства,
но для работы с разными параметрами (аналог overload для процедур)
написал от балды, вместо того чтоб почитать доки.
ровно потому TStrings можно обрабатывать как массив.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.02.2014, 10:39   #4
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Пепел Феникса, не совсем от балды...
меня сильно интересовал вопрос перегрузки свойств,
я вроде и тему на форуме создавал соответствующую,
и по инету гуглил, и инфу всякую читал про default и другие директивы.
меня интересовала именно перегрузка, а не default.
поэтому поняв что default для этого не предназначен,
я не стал в него особо вникать.

но тем временем, вопрос перегрузки свойств оставался открытым.
к сожалению я так и не нашел "легальных" способов сделать это,
поэтому в итоге сделал через жопу - хоть default для этого не предназначен, но с ним все работает.
xrob вне форума Ответить с цитированием
Старый 18.02.2014, 10:54   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
Пепел Феникса, не совсем от балды...
меня сильно интересовал вопрос перегрузки свойств,
я вроде и тему на форуме создавал соответствующую,
и по инету гуглил, и инфу всякую читал про default и другие директивы.
меня интересовала именно перегрузка, а не default.
поэтому поняв что default для этого не предназначен,
я не стал в него особо вникать.

но тем временем, вопрос перегрузки свойств оставался открытым.
к сожалению я так и не нашел "легальных" способов сделать это,
поэтому в итоге сделал через жопу - хоть default для этого не предназначен, но с ним все работает.
по хорошему считается что у них разное поведение, потому и должно быть иное имя поидее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Супер прикол ProgMaster Общие вопросы Delphi 2 15.12.2011 17:38
Что за прикол? Gerb22 О форуме и сайтах клуба 1 17.11.2009 20:48
Нестандартное использование Cells.FormulaR1C1 и Cells.Text Lokkie Microsoft Office Excel 3 21.01.2009 17:41
Прикол с TClientSocket Avel Работа с сетью в Delphi 1 27.11.2008 22:48