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

Вниз

TClass   Найти похожие ветки 

 
Labert ©   (2004-08-17 17:41) [0]

Никогда не использовал TClass, решил вот попробовать

подскажите, почему приведенный код дает ошибку:

procedure TForm1.Button1Click(Sender: TObject);
var
FormClass : TClass;
f : TForm3;
begin
FormClass := TForm3;
f := TForm3(FormClass.Create);
f.ShowModal;
f.Free
end;

Runtime ошибка на ShowModal  "Cannot make a visible window modal"


 
Iconka ©   (2004-08-17 17:45) [1]


> var
> FormClass : TClass;

Полюбому, ты объявил указатель. Присваивай ему чё хочешь.


 
Sun bittern ©   (2004-08-17 17:47) [2]

var
f : TForm1;
begin
F := TForm1.Create(Application);
f.ShowModal;
f.Free
end;


 
VMcL ©   (2004-08-17 17:47) [3]

f := TForm3(FormClass.Create);
f.Visible := False;
f.ShowModal;


Не так ли?


 
Labert ©   (2004-08-17 17:55) [4]

>Sun bittern
я хочу использовать TClass
(еще раз - TClass)

Как динамически создавать объекты определенного в design-time класса все давно знают

>VMcL
Нет, не прокатывает


 
Sandman25 ©   (2004-08-17 17:57) [5]

[4] Labert ©   (17.08.04 17:55)

Если TClass, то откуда будете ShowModal вызывать?
Может, все-таки TFormClass?


 
Гаврила ©   (2004-08-17 17:59) [6]

procedure TForm1.Button1Click(Sender: TObject);
var
FormClass : TClass;
f : TForm3;
begin
FormClass := TForm3;
f := TForm3(FormClass).Create(Self);
f.ShowModal;
f.Free
end;


 
Labert ©   (2004-08-17 18:00) [7]

прошу прощения за резкость

да вы что перетрудились сегодня что ли все

пример читайте пожалуйста


 
Labert ©   (2004-08-17 18:02) [8]

>Гаврила

Пробовал уже - Access Violation


 
Petr V. Abramov ©   (2004-08-17 18:05) [9]

> FormClass.Create
 Вызывается конструктор от TObject, который для TCustomForm чего делает, непонятно, судя по "ошибка", ничего умного. Формы обчно создаются конструктором Create(AOwner: TComponent);
 А еще проще в данном случае использовать не TClass, а TFormClass.


 
Petr V. Abramov ©   (2004-08-17 18:07) [10]

> Гаврила ©   (17.08.04 17:59) [6]
f := TForm3(FormClass.Create(Self));
 Не там скобки, потому и AV


 
Labert ©   (2004-08-17 18:11) [11]

НУ НЕТ у меня в программе класса TFormClass!
Просто я переменную назвал FormClass, а мог бы её хоть Zadnica назвать, прошу прощения!

По поводу "как проще" - мне не надо проще, я не реальный проект делаю, а просто экспериментирую с типом TClass


 
Labert ©   (2004-08-17 18:14) [12]

>Petr V. Abramov
Вы попробуйте свой код откомпилить, который Гавриле посоветовали!

А к использование TClass меня подтолкнула очень интересная статья
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274


 
Гаврила ©   (2004-08-17 18:16) [13]

>>Labert
unit Forms

TFormClass = class of TForm

Так что есть такой, не класс, а метакласс.

На какой строке AV ? Не должно его быть тут


> Petr V. Abramov ©   (17.08.04 18:07) [10]


Компилятор не пропустит, у TObject нет параметров в конструкторе


 
Skier ©   (2004-08-17 18:17) [14]

>Labert ©   (17.08.04 18:14) [12]
-TClass = class of TObject;
-TForm = class(...TComponent)
Так понятней ?


 
Petr V. Abramov ©   (2004-08-17 18:19) [15]

Labert ©   (17.08.04 18:14) [12]
 а Вы объявите Zadnica: TFormClass. Тогда и скомпилируется, и ошибки не будет

> НУ НЕТ у меня в программе класса TFormClass!
 зато есть в модуле Forms есть.


 
Labert ©   (2004-08-17 18:24) [16]

> Гаврила
Ну хорошо, есть такой класс. Но я его не использую. И вообще непонятно, почему все решили, что я его использую.

Перепишу код из моего вопроса вот так, чтоб не было непоняток:


procedure TForm1.Button1Click(Sender: TObject);
var
SomeVariable : TClass;
f : TForm3;
begin
SomeVariable := TForm3;
f := TForm3(SomeVariable.Create);
f.ShowModal;
f.Free
end;


если вместо выделенного использовать такую строку
f := TForm3(FormClass).Create(Self);

то на ней выходит AV


 
Labert ©   (2004-08-17 18:27) [17]

>Petr V. Abramov
Да действительно, так работает
т.е. если в моей программе вместо TClass использовать пресловутый TFormClass то все проходит.

Но все равно непонятно, почему первый вариант (с TClass) не работает


 
Гаврила ©   (2004-08-17 18:28) [18]


> Labert ©   (17.08.04 18:24) [16]


Во первых, определимся с терминологией
TClass, равно как и TFormClass, называются не классами, а метаклассами. Таким образом, мы избежим ошибок ,связанных с терминами.

Я вроде понял, почему AV
дело в том ,что у TObject конструктор статический ,а у TForm - виртуальный.
В данном случае использовать следует именно TFormClass. Иименно по этой причине.
Правильное решение

procedure TForm1.Button1Click(Sender: TObject);
var
FormClass : TFormClass;
f : TForm3;
begin
FormClass := TForm3;
f := FormClass.Create(self);
f.ShowModal;
f.Free
end;


 
alless   (2004-08-17 18:29) [19]

что такое FormClass? где он обявлен?


 
Гаврила ©   (2004-08-17 18:30) [20]

Опоздал немного :-)


 
Petr V. Abramov ©   (2004-08-17 18:30) [21]

> И вообще непонятно, почему все решили, что я его использую.
 
Потому что хочу, чтоб у Вас все получилось как надо :). То есть переменой типа TFom3 присвоился указатель на объект, который создан конструктором от класса TForm, а не черт знает от чего. Ведь TForm3 = class(TForm)?


 
Labert ©   (2004-08-17 18:31) [22]

>Гаврила

Похоже, вы правы.

Разве что надо писать не

f := FormClass.Create(self);

а

f := TForm3(FormClass.Create(self));


 
Labert ©   (2004-08-17 18:33) [23]

Petr V. Abramov, Гаврила - спасибо


 
Sun bittern ©   (2004-08-17 18:35) [24]

Labert ©   (17.08.04 18:24) [16]

Вас ни чего не смущает :)?
Skier ©   (17.08.04 18:17) [14]


 
Sun bittern ©   (2004-08-17 18:40) [25]

Еще вариант

function ETSCreateComponent(AComponentClass: TClass; AOwner: TComponent = Nil): TComponent;
 var
   A: TComponentClass;
begin
 A := TComponentClass(AComponentClass);
 Result := A.Create(AOwner);
end;


 
jack128 ©   (2004-08-17 18:43) [26]

В качестве примера можешь посмотреть TApplication.CreateForm



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

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

Наверх




Память: 0.53 MB
Время: 0.03 c
1-1092677011
AlexZ
2004-08-16 21:23
2004.09.05
external variable | {$L MyFile.obj}


3-1092227070
TeN
2004-08-11 16:24
2004.09.05
Подключение к Oracle, конверт данных из VisualFoxPro в Oracle


14-1092697349
Leaner
2004-08-17 03:02
2004.09.05
А есть в Питере компьютерные клубы, где собираються Delphi-сты ?


4-1090459452
Алексей
2004-07-22 05:24
2004.09.05
запустить консольное приложение из программы


4-1090309158
andrey__
2004-07-20 11:39
2004.09.05
Как программно узнать процент Загрузку ЦП