![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как создать экземпляр класса, по имени класса? [D7, WinXP]
DVM © (2007-07-03 16:30:00)Например я располагаю строкой 'TMyClass'. Как создать экземпляр класса?
Palladin (2007-07-04 18:46:00) [1]
> palva © (03.07.07 17:19) [19]
ну это проблемы автора... описывать вещи вне вселенной, а потом жаловаться что во вселенной их нетути... голова она же не только кушать дана..
DVM (2007-07-04 10:28:00) [2]
> Ведь для регистрации класса достаточно всего одной строчки:
Читайте посты выше, модуль Classes в силу некоторых причин использовать нежелательно. Соответственно весь код, ответственный за регистрацию надо писать самостоятельно. Аналог TRegGroups из Classes.
Loginov Dmitry (2007-07-03 20:19:00) [3]> С регистратором возни неизмеримо больше, чем с if-then-else.
Может наоборот? Меньше неизмеримо? Ведь для регистрации класса достаточно всего одной строчки:
AList.AddObject(AClass.ClassName, TObject(AClass));
DVM (2007-07-03 17:23:00) [4]
> Автору не подошла даже программа со ссылками (Class Reference)
> которая предложена в [13]. Так что, как я понял, ссылок
> на классы тоже нет.
Если ссылок на классы нет, то смысла в затее вообще нет. Вопрос можно переформулировать теперь, как эти ссылки рациональнее организовать. Предложенное в 13 решение, как и мое в 15, конечно в лоб, но почему бы и нет.
palva (2007-07-03 17:19:00) [5]Palladin © (03.07.07 17:07) [16]
> а почему он должен не попасть в модуль?
В [12] сказано, что классы только описаны, но не используются. Автору не подошла даже программа со ссылками (Class Reference) которая предложена в [13]. Так что, как я понял, ссылок на классы тоже нет.
DVM (2007-07-03 17:15:00) [6]
> По-моему, я предлагал нечто подобное.
Да, верно, по сути то же самое. Только в [13] покрасивее чуть будет.
Спасибо.
palva (2007-07-03 17:12:00) [7]DVM © (03.07.07 17:06) [15]
По-моему, я предлагал нечто подобное. Но это тоже должно работать.
Palladin (2007-07-03 17:07:00) [8]
> palva © (03.07.07 17:01) [14]
а почему он должен не попасть в модуль? если написать свой регистратор, то в любом случае что бы прошла регистрация в нем класса нужно будет обратиться по крайней мере к ссылке на сам класс, ничего никуда не выпадет...
DVM (2007-07-03 17:06:00) [9]
> palva © (03.07.07 17:01) [14]
Не попадет, конечно, пока я не сошлюсь на них в коде.
А сослаться на них можно при таком раскладе либо назаводив соответствующих переменных, либо сразу уж функцией типа:
function MakeClass(ClassName: string): TMyBaseClass;
begin
if ClassName = 'TMyClass' then ...
if ClassName = 'TMyClass2' then ...
end;
palva (2007-07-03 17:01:00) [10]DVM © (03.07.07 16:57) [12]
А вы уверены, что код этих классов (всякие там конструкторы, методы) попадет в exe модуль? Разве оптимизатор не выкинет этот код, если на них нет ссылок?
palva (2007-07-03 16:59:00) [11]
> 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;
DVM (2007-07-03 16:57:00) [12]
> palva © (03.07.07 16:52) [11]
Все дерево классов, которые требуется создавать в программе по их названиям, только объявлены в отдельном модуле. Более нигде в программе экземпляры этих классов не создаются и даже нет переменных этих типов.
Так что этот вариант вряд ли подойдет.
palva (2007-07-03 16:52:00) [13]Если класс 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:51:00) [14]
> Ну и не используй)
>
> Но тогда тебе придется реализовать свой "регистратор".
Помотрел код TRegGroups из Classes.
С регистратором возни неизмеримо больше, чем с if-then-else.
Ну, вобщем ясно. Спасибо всем.
Сергей М. (2007-07-03 16:44:00) [15]
> не хотел использовать модуль Classes
Ну и не используй)
Но тогда тебе придется реализовать свой "регистратор".
DVM (2007-07-03 16:43:00) [16]
> Ну так и сделай его таковым !
>
> Что мешает ?
Да в принципе ничего не мешает - не хотел использовать модуль Classes, но, видимо придется.
Хотя в принципе вариантов строки ограниченный набор - порядка 50 разных классов - можно и через if-then-else.
DrPass (2007-07-03 16:41:00) [17]
> Сергей М. © (03.07.07 16:40) [5]
:) У тебя реакция на 1 минуту быстрее
DrPass (2007-07-03 16:41:00) [18]
> DVM © (03.07.07 16:38) [4]
Так сделай его потомком, это ничуть не повредит
Сергей М. (2007-07-03 16:40:00) [19]
> У меня он не потомок TPersistent
Ну так и сделай его таковым !
Что мешает ?
DVM (2007-07-03 16:38:00) [20]У меня он не потомок TPersistent, значит никак?