Форум: "Основная";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизПодскажите как создать экземпляр класса, по имени класса? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.046 c