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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2013, 16:09   #1
savva-paladin
Пользователь
 
Аватар для savva-paladin
 
Регистрация: 09.07.2010
Сообщений: 89
По умолчанию Проблема с вызовом статического метода перегруженного класса, полученного через GetClass

Добрый день. Ситуация такая.
Имеем:
класс TTool (от TPersistent) со статическим методом CreateControls;
наследников от класса TTool, предварительно зарегистрированных (RegisterClass), с перегруженным методом CreateControls;
переменную lcc - класс, по имени которого через GetClass получается наследник от TTool (имена этих классов точно правильные, проверил уже раза 3);
А также нижеприведенный код, который вылетает с EAccessViolation:

Код:
TTool(GetClass(Concat(lcc.ClassName, 'Tool'))).CreateControls(TWinControl(GreyDrawForm.PropPanel));
При этом
Код:
GetClass(Concat(lcc.ClassName, 'Tool')).ClassName
содержит нужное имя класса.
Может кто-нибудь подскажет, в чём проблема? Благодарен буду.
P.S.: Исходники на GitHub. Проблемное место. Проект под Lazarus.
savva-paladin вне форума Ответить с цитированием
Старый 16.12.2013, 16:34   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

Если не ошибаюсь (некогда проверить), то
Код:
function GetClass(const AClassName: string): TPersistentClass;
У Вас
Цитата:
класс TTool
На лицЕ расхождение.
TPersistentClass это class ref - ссылка на класс.
TTool же это сам класс.

Полагаю, Вам придётся создать тип ссылки на класс
Код:
TToolClass  = class of TTool;
и инстанцировать это дело.
Код:
var
  Tool: TTool;
...
Tool := TToolClass(GetClass(Concat(lcc.ClassName, 'Tool'))).Create();
Причём немаловероятно, что надо будет ещё виртуальный конструктор сделать.
и уже потом вызывать свой метод, который, к слову, имеет смысл сделать виртуальным и нестатическим.
Да даже подумайте вот сами, как должен компиль вызвать Ваш метод (даже опустив что у классовой ссылки скастованной в класс предка это невозможно), если он у Вас статический, а Вы хотите зависящий от наследника.

Как будет время, копну свой код, как я подобные интерфейсо-построители писал.

Кстати, что пишете ? на гитхабе глянул вползуба , но конкретики не нашёл.

Последний раз редактировалось phomm; 16.12.2013 в 16:37.
phomm вне форума Ответить с цитированием
Старый 16.12.2013, 16:38   #3
savva-paladin
Пользователь
 
Аватар для savva-paladin
 
Регистрация: 09.07.2010
Сообщений: 89
По умолчанию

Да, логично.
Спасибо!
savva-paladin вне форума Ответить с цитированием
Старый 16.12.2013, 16:52   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

Кстати, вспомнил, недавно вот обсуждали, хоть и не совсем то, но примеры по GetClass , есть куда покопать.
http://programmersforum.ru/showthread.php?t=247508
phomm вне форума Ответить с цитированием
Старый 16.12.2013, 16:53   #5
savva-paladin
Пользователь
 
Аватар для savva-paladin
 
Регистрация: 09.07.2010
Сообщений: 89
По умолчанию

Векторный редактор графики, задание на первый семестр первого курса.

И я так понял, GetClass (как и весь RTTI) - костыль, юзать его нехорошо.
savva-paladin вне форума Ответить с цитированием
Старый 16.12.2013, 17:23   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,881
По умолчанию

Ну, я бы не сказал, что это костыль. Как и любое другое средство - в нужное время в нужном месте и в нужных руках даёт свои результаты, а криво можно даже сложением пользоваться. Недаром в дельфи2010 сильно улучшили RTTI, да и в дотнете вон поглядите, что рефлексией бывает вытворяют.

Последний раз редактировалось phomm; 16.12.2013 в 17:25.
phomm вне форума Ответить с цитированием
Старый 16.12.2013, 18:05   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А почему вместо огорода с GetClass не просто
lcc.CreateControls или TTool(lcc).CreateControls
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.12.2013, 18:19   #8
savva-paladin
Пользователь
 
Аватар для savva-paladin
 
Регистрация: 09.07.2010
Сообщений: 89
По умолчанию

Не всё так просто - lcc - ссылка не на тот класс, который мне нужен.
Глядите: GetClass(Concat(lcc.ClassName, 'Tool')) - имя класса lcc конкатенируется с тулой.
Да и собственно проблема решена, спасибо phomm'у, я упорно не замечал, что не к тому типу привожу.
savva-paladin вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JList Listener непонятки c вызовом метода из другого класса alekola Общие вопросы по Java, Java SE, Kotlin 1 22.11.2012 02:12
Достучаться до контрола из под статического метода coNsept C# (си шарп) 1 03.10.2012 09:29
Динамическая загрузка статического метода из DLL Granus Общие вопросы C/C++ 6 15.02.2012 15:47
Преобразование в строчный тип данных(Ошибка не содержит статического метода "Main", подходящего для точки входа) aly-lucenko Помощь студентам 8 02.10.2011 11:36
Проблема с вызовом Юлия_utcit HTML и CSS 0 03.01.2011 23:00