Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-16439
Blade
2004-01-28 12:31
2004.02.06
Потоки


1-16428
AkaSaint
2004-01-22 13:55
2004.02.06
ComboBox, изменяющийся по высоте; Edit с BorderColor


1-16319
real_dimedrol
2004-01-23 22:05
2004.02.06
фон в memo


4-16789
mRodion
2003-12-02 10:24
2004.02.06
Сделать элемент TlistView в фокусе


3-16092
Veetyok
2004-01-11 00:54
2004.02.06
Delphi виснет





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский