Главная страница
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.023 c
3-16173
Gorlum
2004-01-14 11:52
2004.02.06
Invalid use of key word


1-16338
Grinder
2004-01-24 21:49
2004.02.06
HintWindowClass


14-16586
Nick-From
2004-01-18 21:51
2004.02.06
Тихий кулер на Socket 478


4-16791
Simon
2003-12-01 21:56
2004.02.06
Как рлдменить оконную ф-цию окна, зная его хэндл?


14-16703
Piter
2004-01-18 01:33
2004.02.06
CreateToolhelp32Snapshot возвращает неверный дескриптор