Страница 1 из 2

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

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

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

type
  TGenerate = class(TObject)
    ...
  end;
var
  Genarate: TGenerate;
Generate := GetClassByName('TGenerate').Create;

Добавлено: 06 май 2006, 09:26
Duncon
Ну TObject по умолчанию родитель так что его можно не указывать..

Ну создать его можно так же как обычный класс без визуализации, здесь вопрос насколько тебе это надо?...

Добавлено: 06 май 2006, 09:44
vitek1
У меня есть базовый класс

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

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 не указывать я прекрасно знаю, однако для большей наглядности я это деляю.

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

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

type
  TBlock = class&#40]

Добавлено: 06 май 2006, 11:03
LAngel
Хм.. создание разных объектов-наследников 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'));

Добавлено: 06 май 2006, 11:39
vitek1
Код:
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и исоздается его экземпляр

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

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

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

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

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

Добавлено: 06 май 2006, 12:02
Blood_Magic
vitek1 писал(а):

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

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

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

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

[code]
var
  Genarate&#58]

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

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

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