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

Вниз

Создать экземпляр объекта по названию класса в строке   Найти похожие ветки 

 
SnapIn   (2004-01-23 17:48) [0]

Функция GetClass не находит классы имеющихся в проекте форм
(например: TfmFirst, TfmSecond, которые автоматически не создаются)
А на строке регистрации класса вываливается ошибка:

procedure TForm1.btShowModalClick(Sender: TObject);
var
cClass: TPersistentClass;
MyClass: TClass;
begin
cClass := TPersistentClass(edClassName.Text);
RegisterClass(cClass);
MyClass := GetClass(edClassName.Text);
...
end;


Подскажите, как правильно?


 
hfa ©   (2004-01-23 17:50) [1]

а что за ошибка?


 
hfa ©   (2004-01-23 17:53) [2]

а что такое edClassName?


 
Юрий Зотов ©   (2004-01-23 18:00) [3]

> cClass := TPersistentClass(edClassName.Text);

Приводим строку к метаклассу? Это поистине КЛАССно.

Так не получится. Все классы, названия которые Вы хотите вводить в edClassName, должны быть зарегистрированы заранее. Например, в секции initialization:
RegisterClasses([TEdit, TButton, TPanel, ...]);

А потом только остается вызвать GetClass(edClassName.Text).


 
Анонимщик ©   (2004-01-23 18:14) [4]

Может быть такая ситуация, что имя класса на этапе разработки неизвестно. Тогда нужно регистрировать этот класс так, как делается регистрация при создании форм. Это, кажется, в модуле Forms.pas.
Если компоненты есть в ресурсах, то их там сначала нужно найти, а после зарегистрировать.


 
SnapIn   (2004-01-23 18:16) [5]

procedure TForm1.btShowModalClick(Sender: TObject);
var
MyClass: TComponentClass;
Form: TForm;
begin
MyClass := TComponentClass(GetClass(edClassName.Text));

if MyClass <> nil then
with TForm(MyClass).Create(self) do
begin
ShowModal;
Free;
end;
end;

initialization
RegisterClasses([TfmFirst, TfmSecond]);


Мне нужно вывести модальной созданную форму.. но не получается создать.. на строке with TForm(MyClass).Create - access violation...


 
Vuk ©   (2004-01-23 18:18) [6]

to Анонимщик:
>Тогда нужно регистрировать этот класс так, как делается
>регистрация при создании форм.
При создании форм никакой регистрации каких-либо классов не производится.


 
yo   (2004-01-23 18:22) [7]

>Мне нужно вывести модальной созданную форму.. но не получается >создать.. на строке with TForm(MyClass).Create - access >violation...

TFormClass = class(TForm);

with TFormClass(MyClass).Create(...)


 
yo   (2004-01-23 18:23) [8]

тьфу

type
TFormClass = class of TForm;

with TFormClass(MyClass).Create(...)


 
SnapIn   (2004-01-23 18:33) [9]

Пасябо!!! .. я уж начал было набивать жалостливую мессагу о том, что нифига не получается.... =)

Delphi - форэва!
Delphi и Мастера - вместе веселее! ))


 
SnapIn   (2004-01-23 18:35) [10]

А чтобы вообще круто было можно все это сделать, не перечисляя все классы форм:

initialization
RegisterClasses([TfmFirst, TfmSecond, ...]);


 
SnapIn   (2004-01-23 18:50) [11]

чтобы классы регистрировать налету?


> 2 Анонимщик © (23.01.04 18:14) [4]
> Если компоненты есть в ресурсах, то их там сначала нужно
> найти, а после зарегистрировать.


сорса нет?


 
Юрий Зотов ©   (2004-01-23 18:58) [12]

Объявления

type
TFormClass = class of TForm;

делать не нужно - оно уже есть в модуле Forms.


 
SnapIn   (2004-01-23 19:45) [13]


> Юрий Зотов © (23.01.04 18:58) [12]
> Объявления
>
> type
> TFormClass = class of TForm;
>
> делать не нужно - оно уже есть в модуле Forms.


В моем случае нужно, т.к. я переопределял конструктор той формы, от которой наследовал все остальные


 
vuk ©   (2004-01-23 19:47) [14]

to SnapIn:
>В моем случае нужно, т.к. я переопределял конструктор той формы,
>от которой наследовал все остальные
Конструктор Create у наследников TComponent виртуальный. Поэтому не нужно.


 
Юрий Зотов ©   (2004-01-23 19:53) [15]

> SnapIn (23.01.04 19:45) [13]

Не нужно. И придумывать несуществующие проблемы тоже не нужно.


 
SnapIn   (2004-01-24 07:26) [16]

У меня при создании формы нужно передавать два параметра, если не переобъявить - ругается, или я что-то не понимаю?


 
Aleksey V.P.   (2004-01-24 20:07) [17]

На что ругается? В run-time или при компиляции?


 
Анонимщик ©   (2004-01-26 11:36) [18]

Я невнятно выразился, объясню на примере.
Предположим, у нас есть две формы. Одна создается автоматически:
TForm1. Бросим на нее TLabel и в инспекторе объектов установим ее имя в "". Запустим приложение, нам вывалится сообщение о том, что класс TLabel не найден. Хорошо, теперь создадим еще одну форму, которая не создается автоматически и бросим на нее TLabel, но имя ее очищать не будем. Запустим приложение - получим то же самое. Теперь вопрос: каким образом зарегистрировать TLabel, явным образом нигде не упомянув TLabel как класс.
Для этого нужно сделать следующее:
Для формы 1 перепишем конструктор:

implementation

uses unit2;

type
PFieldClassTable = ^TFieldClassTable;
TFieldClassTable = packed record
Count: Smallint;
Classes: array[0..8191] of ^TPersistentClass;
end;

function GetFieldClassTable(AClass: TClass): PFieldClassTable; assembler;
asm
MOV EAX,[EAX].vmtFieldTable
OR EAX,EAX
JE @@1
MOV EAX,[EAX+2].Integer
@@1:
end;

constructor TForm1.Create(AOwner: TCOmponent);
var
fCT: TFieldClassTable;
i: Integer;
begin
fCT := GetFieldClassTable(TForm2)^;
for i := 0 to fCT.Count - 1 do
begin
if fCT.Classes[i].ClassName = "TLabel" then
RegisterClass(fCT.Classes[i]^);
// здесь, естественно, можно делать что-то вроде:
// если (проверка того, что класс не зарегистрирован)
// то ресистрируем клас, если нам это нужно
end;
inherited;
// здесь, если нужно, вызываем UnRegisterClass
end;

Имеем в виду, что
TFieldClassTable
function GetFieldClassTable(AClass: TClass): PFieldClassTable;

я просто скопировал из модуля classes.pas



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

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

Наверх




Память: 0.51 MB
Время: 0.022 c
3-16067
}|{yk
2004-01-12 13:15
2004.02.06
Форматирование данных в гриде


7-16781
User_OKA
2003-11-21 08:53
2004.02.06
Получение информации о выполняющихся в системе процессах


1-16345
Vitalik
2004-01-24 15:06
2004.02.06
Классы


14-16587
Knight
2004-01-10 17:27
2004.02.06
Не могу загрузить комп...


4-16786
closer
2003-12-02 16:15
2004.02.06
Закрытие таймера