Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

Подскажите как создать экземпляр класса, по имени класса?   Найти похожие ветки 

 
DVM ©   (2007-07-03 16:30) [0]

Например я располагаю строкой "TMyClass". Как создать экземпляр класса?


 
Сергей М. ©   (2007-07-03 16:34) [1]


> Как создать экземпляр класса?


Для начала - класс TMyClass д.б. зарегистрирован в тек.экз-ре RTTI, см. RegisterClass().

Только при этом условии можно получить ссылку на класс (см. GetClass) для последующего создания его экз-ра.


 
DrPass ©   (2007-07-03 16:35) [2]

GetClass либо FindClass. При условии, что TMyClass является потомком TPersistent и был ранее зарегистрирован с помощью RegisterClass


 
palva ©   (2007-07-03 16:36) [3]

Вообще говоря, никак.


 
DVM ©   (2007-07-03 16:38) [4]

У меня он не потомок TPersistent, значит никак?


 
Сергей М. ©   (2007-07-03 16:40) [5]


> У меня он не потомок TPersistent


Ну так и сделай его таковым !

Что мешает ?


 
DrPass ©   (2007-07-03 16:41) [6]


> DVM ©   (03.07.07 16:38) [4]

Так сделай его потомком, это ничуть не повредит


 
DrPass ©   (2007-07-03 16:41) [7]


> Сергей М. ©   (03.07.07 16:40) [5]

:) У тебя реакция на 1 минуту быстрее


 
DVM ©   (2007-07-03 16:43) [8]


> Ну так и сделай его таковым !
>
> Что мешает ?

Да в принципе ничего не мешает - не хотел использовать модуль Classes, но, видимо придется.

Хотя в принципе вариантов строки ограниченный набор - порядка 50 разных классов - можно и через if-then-else.


 
Сергей М. ©   (2007-07-03 16:44) [9]


> не хотел использовать модуль Classes


Ну и не используй)

Но тогда тебе придется реализовать свой "регистратор".


 
DVM ©   (2007-07-03 16:51) [10]


> Ну и не используй)
>
> Но тогда тебе придется реализовать свой "регистратор".

Помотрел код TRegGroups из Classes.
С регистратором возни неизмеримо больше, чем с if-then-else.
Ну, вобщем ясно. Спасибо всем.


 
palva ©   (2007-07-03 16:52) [11]

Если класс TMyClass реализован и используется в программе, то можно сделать следующим образом: Создать массив всех классов использующихся в программе. Найти в этом массиве нужный класс и создать его.

procedure TForm1.Button1Click(Sender: TObject);
var
 ar: array [0..1] of TClass;
 s: String;
 i: Integer;
 ob: TObject;
begin
 ar[0] := TList;
 ar[1] := TStringList;
 s := "TList";
 for i := 0 to 1 do
   if ar[0].ClassName = s then
     ob := ar[0].Create;
end;


 
DVM ©   (2007-07-03 16:57) [12]


> palva ©   (03.07.07 16:52) [11]

Все дерево классов, которые требуется создавать в программе по их названиям, только объявлены в отдельном модуле. Более нигде в программе экземпляры этих классов не создаются и даже нет переменных этих типов.
Так что этот вариант вряд ли подойдет.


 
palva ©   (2007-07-03 16:59) [13]


> palva ©   (03.07.07 16:52) [11]

Ошибся. Вот рабочий код.

procedure TForm1.Button1Click(Sender: TObject);
var
 ar: array [0..1] of TClass;
 s: String;
 i: Integer;
 ob: TObject;
begin
 ar[0] := TList;
 ar[1] := TStringList;
 s := "TList";
 for i := 0 to 1 do
   if ar[i].ClassName = s then
     ob := ar[i].Create;
 ShowMessage(ob.ClassName); // TList
end;


 
palva ©   (2007-07-03 17:01) [14]

DVM ©   (03.07.07 16:57) [12]
А вы уверены, что код этих классов (всякие там конструкторы, методы) попадет в exe модуль? Разве оптимизатор не выкинет этот код, если на них нет ссылок?


 
DVM ©   (2007-07-03 17:06) [15]


> palva ©   (03.07.07 17:01) [14]

Не попадет, конечно, пока я не сошлюсь на них в коде.

А сослаться на них можно при таком раскладе либо назаводив соответствующих переменных, либо сразу уж функцией типа:

function MakeClass(ClassName: string): TMyBaseClass;
begin
 if ClassName = "TMyClass" then ...
 if ClassName = "TMyClass2" then ...
end;


 
Palladin ©   (2007-07-03 17:07) [16]


> palva ©   (03.07.07 17:01) [14]

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


 
palva ©   (2007-07-03 17:12) [17]

DVM ©   (03.07.07 17:06) [15]
По-моему, я предлагал нечто подобное. Но это тоже должно работать.


 
DVM ©   (2007-07-03 17:15) [18]


> По-моему, я предлагал нечто подобное.

Да, верно, по сути то же самое. Только в [13] покрасивее чуть будет.
Спасибо.


 
palva ©   (2007-07-03 17:19) [19]

Palladin ©   (03.07.07 17:07) [16]
> а почему он должен не попасть в модуль?
В [12] сказано, что классы только описаны, но не используются. Автору не подошла даже программа со ссылками (Class Reference) которая предложена в [13]. Так что, как я понял, ссылок на классы тоже нет.


 
DVM ©   (2007-07-03 17:23) [20]


> Автору не подошла даже программа со ссылками (Class Reference)
> которая предложена в [13]. Так что, как я понял, ссылок
> на классы тоже нет.

Если ссылок на классы нет, то смысла в затее вообще нет. Вопрос можно переформулировать теперь, как эти ссылки рациональнее организовать. Предложенное в 13 решение, как и мое в 15, конечно в лоб, но почему бы и нет.


 
Loginov Dmitry ©   (2007-07-03 20:19) [21]

> С регистратором возни неизмеримо больше, чем с if-then-else.


Может наоборот? Меньше неизмеримо? Ведь для регистрации класса достаточно всего одной строчки:

AList.AddObject(AClass.ClassName, TObject(AClass));


 
DVM ©   (2007-07-04 10:28) [22]


> Ведь для регистрации класса достаточно всего одной строчки:

Читайте посты выше, модуль Classes в силу некоторых причин использовать нежелательно. Соответственно весь код, ответственный за регистрацию надо писать самостоятельно. Аналог TRegGroups из Classes.


 
Palladin ©   (2007-07-04 18:46) [23]


> palva ©   (03.07.07 17:19) [19]

ну это проблемы автора... описывать вещи вне вселенной, а потом жаловаться что во вселенной их нетути... голова она же не только кушать дана..



Страницы: 1 вся ветка

Текущий архив: 2007.09.09;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
15-1187027189
Rouse_
2007-08-13 21:46
2007.09.09
Блин, ну до чего уже спамеров довели


2-1187083802
programmist87
2007-08-14 13:30
2007.09.09
Как записать текст в файл?


1-1182926455
Stanislav
2007-06-27 10:40
2007.09.09
Упаковка данных с помощью ZLIB


15-1187188524
Cobalt
2007-08-15 18:35
2007.09.09
легкий текстовый редактор rtf


15-1186626194
Slider007
2007-08-09 06:23
2007.09.09
С днем рождения ! 9 августа 2007 четверг