Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c