Создание класса по его имени

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[flash] ОТКЛЮЧЕН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Создание класса по его имени

Re: Создание класса по его имени

atavin-ta » 26 окт 2009, 09:53

&quot писал(а):типы в run-time описывать нельзя
Ты загрузил транслятор, описал тип и запустил процесс трансляции. Тип создан, но для транслятора это рантайм. Или ты имеешь ввиду, что прилада не может создавать новые типы в рантайм? Запихай в неё транслятор с каким нибудь метатипом - сможет.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
&quot писал(а):разрабатываю язык GPSS
А если разрабатывается язык, то причём здесь вообще прилады и ограничения на создание типа в рантайме? Уж если язык, то значит транслятор, а транслятор должен создавать типы именно в рантайме. Возможно даже только в рантайме.

vunder » 10 май 2006, 12:27

RegisterClass регистрирует любой класс, необязательно визуальный.
Для получения класса советую использовать GetClass, а не FindClass, т.к. если не находит класс с таким именем, то возвращает nil, а FindClass генерирует исключение.
Я так делал в своей программе: и классы объекстов и списковые классы являлись наследниками от одного объекта. Потом объявлял TMyClass = class of TMyObject и еще писал функцию проверяющую, является ли данный данный класс наследником от другого

vitek1 » 06 май 2006, 14:53

2 Blod_Magic
Я бы не стал так котигорично утверждать о невозможности создания класса динамически. Если покопаться в структуре VMT, то все может быть. И если класс создать все же не получиться, то скорее всего возможно изменить через VMT заготовленное заранее описание
TMyClass = class(TObject) end;
до неузнаваемости, добавив ему необходимые поля и методы

LAngel » 06 май 2006, 12:39

можно создавать (как это делает, например TCollection) тип класса и указывать его.
например:

Код: Выделить всё

type
  TObjectClass = class of TObject;
и в коде создавать уже его.

Код: Выделить всё

function CreateComeClass(AClass: TObjectClass): TObject;
begin
  Result := AClass.Create;
end;
пример использования:

Код: Выделить всё

Generate := CreateComeClass(TGenerate);

Blood_Magic » 06 май 2006, 12:28

типы в run-time описывать нельзя

vitek1 » 06 май 2006, 12:20

Да если честно глупо я подошел с вопросами.
Просто разрабатываю язык GPSS (язык представляет собой последовательность строк, а каждая строк: <метка>, <имя блока>, < параметры>) на Delphi и хочу сделать его гибким, т.е. чтобы пользователь мог не только использовать стандартные блоки языка, но и описывать и потом использовать свои блоки. Описания будут делаться строкой с помощью какого-нибудь скриптового языка (FastScript например) вноситься в программу.
В общем пока стоит задача хотя бы реализовать стандартные блоки языка, но хотелось бы писать программу в расчете на дальнейшее расширение, а то потом много переписывать придется.
В общем если есть мысли по поводу общей структуры программы, высказывайтесь. А если нет, то над впросом топика темы не думайте, а то получается сам спросил то, не знаю что.

vitek1 » 06 май 2006, 12:06

в примере показано как сохранить все описанные классы, чтобы потом не искать их с помощью GetClassByName, а найти с помощью перебора всех описанных типов.
А если классы пока еще не описаны, а описываться будут run-time?
Как реализовать возможность добавлять в этот контейнер потомков, которых пока еще не существует?

Re: Создание класса по его имени

Blood_Magic » 06 май 2006, 12:02

vitek1 писал(а):

Код: Выделить всё

type
  TGenerate = class&#40][/quote]

[quote="vitek1"]
Смысл в том, что я не знаю всех его наследников, т.к. они будут добавляться run-time
[/quote]

немного не понятно что тебе нужно, напиши подробнее как же ты можешь описать 

[code]
var
  Genarate&#58]

если ты не знаешь имя класса наследника

Blood_Magic » 06 май 2006, 11:50

vitek1 писал(а): Есть базовый класс TBlock и много его наследников (неизвестных) и TBlocks, который является как бы контейнером для всех потомков. Метод Add должен добавлять потомков в контейнер.
А в приведенном листинге добавляется сам контейнер TBlocksи исоздается его экземпляр
это я цитировал твое сообщение, оттуда я и взял описания типов, а в примере показано как сохранить все описанные классы, чтобы потом не искать их с помощью GetClassByName, а найти с помощью перебора всех описанных типов.
vitek1 писал(а):У меня есть базовый класс

Код: Выделить всё

type
  TBlock = class&#40]
от TBlock наследуются много других
TGenerate = class(TBlock)
и т.д.
Смысл в том, что я не знаю всех его наследников, т.к. они будут добавляться run-time
Метод Add должен добавлять объекты классов-наследников TBlock.

P.S. То что можно TObject не указывать я прекрасно знаю, однако для большей наглядности я это деляю.[/quote]

vitek1 » 06 май 2006, 11:39

Код:
function CreateClassByName(AName: String): TObject;
begin
Result := nil;
if AName = 'TGenerate' then Result := TGenerate.Create;
if AName = 'TSomeClass' then Result := TSomeClass.Create;
end;
В этом случае все равно используется имя класса. А возможно ли сделать чтобы имя конкретного класса вообще не упоминалось?
Т.е. чтобы везде упоминалось не имя класса TGenerate, а строковая переменная 'TGenerate'


2 Blood_Magic

Здесь что-то я ничего не понял
Есть базовый класс TBlock и много его наследников (неизвестных) и TBlocks, который является как бы контейнером для всех потомков. Метод Add должен добавлять потомков в контейнер.
А в приведенном листинге добавляется сам контейнер TBlocksи исоздается его экземпляр

Вернуться к началу