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