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

Объекты Pascal, классы Object Pascal, интерфейсы, наследование, инкапсуляция и т.д
vitek1
Сообщения: 6
Зарегистрирован: 05 май 2006, 19:59
Контактная информация:

05 май 2006, 20:03

Как создать невизуальный класс (потомок TObject) по имени.
Есть функции FindClass и GetClass, но для них класс должен быть зарегистрирован с помощью RegisterClass или RegisterClasses, а эти функции регистрируют только потомков TComponent (визуальных класов)?
В общем нужно что-то типа

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

type
  TGenerate = class(TObject)
    ...
  end;
var
  Genarate: TGenerate;
Generate := GetClassByName('TGenerate').Create;
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

06 май 2006, 09:26

Ну TObject по умолчанию родитель так что его можно не указывать..

Ну создать его можно так же как обычный класс без визуализации, здесь вопрос насколько тебе это надо?...
[syntax=Delphi] [/syntax]
vitek1
Сообщения: 6
Зарегистрирован: 05 май 2006, 19:59
Контактная информация:

06 май 2006, 09:44

У меня есть базовый класс

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

type
  TBlock = class(TObject)
    ...
  end;

  TBlocks = class(TObject)
    FBlocks: Array of TBlock;
  privat
    procedure Add(BlockName: String);
  end;
от TBlock наследуются много других
TGenerate = class(TBlock)
и т.д.
Смысл в том, что я не знаю всех его наследников, т.к. они будут добавляться run-time
Метод Add должен добавлять объекты классов-наследников TBlock.

P.S. То что можно TObject не указывать я прекрасно знаю, однако для большей наглядности я это деляю.
Blood_Magic
Сообщения: 268
Зарегистрирован: 30 июн 2005, 14:53

06 май 2006, 10:16

vitek1 писал(а):У меня есть базовый класс
Смысл в том, что я не знаю всех его наследников, т.к. они будут добавляться run-time
.
попробуй что-то типа того

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

type
  TBlock = class&#40]
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

06 май 2006, 11:03

Хм.. создание разных объектов-наследников TObject можно попытаться реализовать таким образом:

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

function CreateClassByName(AName: String): TObject;
begin
  Result := nil;
  if AName = 'TGenerate' then Result := TGenerate.Create;
  if AName = 'TSomeClass' then Result := TSomeClass.Create;
end;
Пример использования:

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

Generate := TGenerate(CreateClassByName('TGenerate'));
С уважением, Lost Angel...
vitek1
Сообщения: 6
Зарегистрирован: 05 май 2006, 19:59
Контактная информация:

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и исоздается его экземпляр
Blood_Magic
Сообщения: 268
Зарегистрирован: 30 июн 2005, 14:53

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]
Blood_Magic
Сообщения: 268
Зарегистрирован: 30 июн 2005, 14:53

06 май 2006, 12:02

vitek1 писал(а):

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

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

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

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

[code]
var
  Genarate&#58]

если ты не знаешь имя класса наследника
vitek1
Сообщения: 6
Зарегистрирован: 05 май 2006, 19:59
Контактная информация:

06 май 2006, 12:06

в примере показано как сохранить все описанные классы, чтобы потом не искать их с помощью GetClassByName, а найти с помощью перебора всех описанных типов.
А если классы пока еще не описаны, а описываться будут run-time?
Как реализовать возможность добавлять в этот контейнер потомков, которых пока еще не существует?
vitek1
Сообщения: 6
Зарегистрирован: 05 май 2006, 19:59
Контактная информация:

06 май 2006, 12:20

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