Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TClass


Страницы:   1 2

Labert ©   (2004-08-17 17:41:00) 

Никогда не использовал 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"


jack128   (2004-08-17 18:43:00) [1]

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


Sun bittern   (2004-08-17 18:40:00) [2]

Еще вариант

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


Sun bittern   (2004-08-17 18:35:00) [3]

Labert ©   (17.08.04 18:24) [16]

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


Labert   (2004-08-17 18:33:00) [4]

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


Labert   (2004-08-17 18:31:00) [5]

>Гаврила

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

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

f := FormClass.Create(self);

а

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


Petr V. Abramov   (2004-08-17 18:30:00) [6]

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


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

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


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

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


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


> 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;


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

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

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


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

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

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


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


Petr V. Abramov   (2004-08-17 18:19:00) [12]

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

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


Skier   (2004-08-17 18:17:00) [13]

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


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

>>Labert
unit Forms

TFormClass = class of TForm

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

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


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


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


Labert   (2004-08-17 18:14:00) [15]

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

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


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

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

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


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

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


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

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


Labert   (2004-08-17 18:02:00) [19]

>Гаврила

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


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

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

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо