![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TClass
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]прошу прощения за резкость
да вы что перетрудились сегодня что ли все
пример читайте пожалуйста