Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
2-1186922035
***mikle***
2007-08-12 16:33
2007.09.09
Обращение через указатель


11-1169360395
Mabia
2007-01-21 09:19
2007.09.09
Ошибка компиляции пакета


2-1187084180
DagOT-R
2007-08-14 13:36
2007.09.09
Таймер - WTF??? Помогите разобраться с проблемой:


4-1174383793
Magedon
2007-03-20 12:43
2007.09.09
Поиск элементов на форме.


3-1179236373
oleg__
2007-05-15 17:39
2007.09.09
Oracle через ADO





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский