![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,883
|
![]()
Задача такая у меня, возможно, покажется извращенской.
Имеем такое: Код:
Пробовал вот что : cls.classtype - не подходит гуглил возможность перевода имени класса в идентификатор класса (если я корявый, ткните в меня google/lmgtfy ссылкой) есть возможно хитрости с класстайп и классинфо, но они вроде только на рантайм, а мне надо компайл-тайм Мне кажется, что есть какое-то изящное решение. Например, когда мы в дельфи наводим мышкой на переменную объектного типа, то видим её тип, возможно , этому есть инструмент дельфи какой-то, хотя скорее всего, это делает среда. Грубыми словами, мне надо вместо самого идентификатора класса получать его(идентификатор класса) из переменной экземпляра класса. Спасибо вам, гуру ! Вполне допускаю, что будут ответы : так все и делают ! но, может, быть всё-таки, можно задать только 1 раз имя класса, в var ? Последний раз редактировалось phomm; 07.04.2011 в 13:49. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
![]()
Если я правильно понял. то структура TVarRec;(System.pas) поможет. Там же TVarType и TVarData
Ещё есть TValueType Последний раз редактировалось Человек_Борща; 07.04.2011 в 14:15. |
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Есть вариант cls := tsomeclass(sender); а больше ни как
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Integer(cls) := Integer(sender);
Но это ппц как небезопасно. Я бы шесть раз подумал, прежде чем такое делать, и... так и не сделал бы. P.S. Классы и объекты не путай.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
Если я правильно понял задачу (в чём я сомневаюсь), есть некая иерархия классов:
Код:
Код:
Код:
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#6 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,883
|
![]()
Всем спасибо , что откликнулись, всем плюсы )
Человек_Борща, почитал справку, по-моему к моему случаю сие не относится Аватар, этот случай даже не рассматриваю ) он всё равно ведь с использованием Tsomeclass , да и приведение типов для классов лучше делать с as, ибо генерит исключение при несоответствии, в отличие от прямого приведения(как Вы указали) GunSmoker, спасибо, очень дельный совет, я предполагал , что есть подобное решение из разряда хаков, скорее всего, конечно, не буду использовать, опасность такого метода, полагаю, заключается в отсутствии приведения типов ? ведь sender может быть и потомком оригинального класса veniside, я так понял, Вы расписали шаблон/паттерн Builder , вполне возможно, если вывести функцию, которая будет "строить" объекты, то можно достигнуть означеной цели, но мне кажется указания конкретного класса избежать не удастся, хоть и будет опосредовано (в функции), ведь класс надо передавать в функцию (в Вашем примере Tcat), да и решение, всё же достаточно объемным будет (я рассчитывал на пару строчек) Хотелось бы несколько прояснить , возможно, так будет яснее, имеем такое дело : Код:
Извините, я понимаю что приведенный пример сферичен в вакууме, и проще написать cls := sender as Tsomeclass1, а при необходимости перенастроить, объявить cls : tsomeclass и нажимая F9 просто переписать те несколько строчек на другой класс, но надежда на некий красивый выход есть, ведь я уже приводил пример со средой дельфи, может что-то такое.... Последний раз редактировалось phomm; 07.04.2011 в 18:31. |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,430
|
![]()
Есть ещё TClassList
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
![]()
> возможно, так будет яснее
честно говоря, понятней не стало. Проблема даже не в классе, а вот в этом: Код:
Ну вот сменили вы класс у cls с tsomeclass1 на tsomeclass2. Оба эти класса должны иметь методы do1() и doN(), так? Тогда почему бы не сделать для них базовый класс tsomeclassbase, эти методы объявить виртуальными и насладиться работой ООП в действии?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
![]() |
![]() |
![]() |
#9 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,883
|
![]()
кажется , получилось... сам не верю , что не аксесвиолейшенит, копирую прямо из проекта, чтобы не на абстрактном примере.
Код:
Получается, что теперь идентификатор для тайпкаста можно вынести в секцию объявления, и не заботиться о перекройке проекта, всё будет автоматом Хочется ещё узнать, легально ли такое ? не будет ли проблемок ? |
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 06.12.2010
Сообщений: 300
|
![]()
Нечто странное у вас. В любом случае работа с одним классом как с другим возможна только если они совместимы. К примеру TForm1 и TForm совместимы:
Код:
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов | Lanx | Помощь студентам | 0 | 06.04.2011 20:24 |
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? | Farrel | Общие вопросы C/C++ | 2 | 13.11.2010 17:37 |
Создание класса с полем типа TStringList. Ошибка при его заполнении | Son | Общие вопросы Delphi | 8 | 13.04.2010 21:38 |
Параметр конструктора класса = объект этого класса | nazavrik | Общие вопросы C/C++ | 6 | 14.02.2010 13:48 |
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? | TwiX | Общие вопросы Delphi | 3 | 15.11.2009 00:54 |