Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1092849164
Андрюха-1
2004-08-18 21:12
2004.09.05
Сколько стоит открыть свою фирму...


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


9-1084807193
Pirate
2004-05-17 19:19
2004.09.05
3D Движки


1-1092847643
Aleksandr.
2004-08-18 20:47
2004.09.05
Как указатель превратить в строку?


14-1092382830
ruslan
2004-08-13 11:40
2004.09.05
Timaje





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