Пробовал кто то наследоваться от TListItemSimpleControl? Печаль-беда
Меня собственно не устроил TListItemTextButton. Захотел я сделать свою кнопочку. Для этого создал свой unit и наследовался от TListItemSimpleControl. Но тут меня ждал большой сюрприз. Дело в том что многие поля и даже методы оказались не доступны! Беглое изучение кода в файле FMX.ListView.Types показали что "не боги горшки обжигают". Досадных ошибок в нем хватает. Когда разработчики писали этот модуль, у них все было хорошо, потому что как известно в пределах видимости unit можно в одном классе иметь доступ к полям private другого класса. Это известная "болезнь".
В чем собственно проблемы? Сначала не нашлось некоторые константы и поля классов. Эти поля активно используются в наследниках, хотя объявлены они так:
TListItemSimpleControl = class(TListItemObject)
private const
DisabledOpacity = 0.6;
private
FEnabled: Boolean;
FPressed: Boolean;
FMouseOver: Boolean;
FOnClick: TNotifyEvent;
FTouchExpand: Single;
...
Дальше оказалось еще интересней. Есть такой метод:
procedure SetData(const AValue: TValue); override;
Как видим, метод перекрытый. Это значит что он где то в родительском классе объявлен как virtual, однако компилятор бодро сообщил что такой метод не найден в базовом классе. Внезапно! Смотрим базовые классы и что же мы видим:
TListItemObject = class(TInterfacedPersistent)
private
.....
procedure SetData(const Value: TValue); virtual;
Браво! Аплодирую стоя!
Дальше копать я не стал. Уже и так стало ясно что затея с наследованием обречена на провал. Единственное пожалуй решение из данной ситуации это скопировать модуль FMX.ListView.Types в папку с проектом, добавить его в проект и внести нужные изменения. Ну или дописать в этом модуле свои классы.
Написал я это с горяча. Достали нелепые ошибки. Может кому то пригодится мои исследования и сэкономят немного времени.