
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.4] |
![]() |
|
![]() |
|
|
Может мой вопрос покажется "ламерским"
![]() Когда вызываю из главной формы дочернюю форму: ![]() ![]() ... implementation uses Unit2; ... procedure TForm1.CustomItem4Click(Sender: TObject); begin form2:=tform2.Create (self); end; ... то вылетают следующие ошибки Ошибка: Access Violation at address xxxxxxxx in module 'XXXXXXX.exe'. Read of address xxxxxxxx., xxxxxxxx - любые значения адреса, или Ошибка: External Exception C000001D. после чего приходится нажимать ОК и только после этого создается дочернее окно и в конце концов всё это виснет. Дочернюю форму закрываю так: ![]() ![]() ... procedure TForm2.SCButton1Click(Sender: TObject); begin close; end; procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin action:=cafree; end; procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin canclose:=true; end; ... Как можно обойти данную проблему ![]() Подскажите плз.. Если можно то с примерами... |
Сообщ.
#2
,
|
|
|
добавь еще проверку, скорее всего эта форма уже существует...
![]() ![]() procedure TForm1.CustomItem4Click(Sender: TObject); begin if not assigned(form2) then form2:=tform2.Create (self); form2.Show(); end; ... ну и закрывай .... ![]() ![]() procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; Form2 := nil; end; |
Сообщ.
#3
,
|
|
|
А еще лучше не проверку делать, а в свойствах проекта убрать форму, которая только динамически создается/уничтожается из автосоздания.
|
![]() |
|
|
Цитата Felan @ А еще лучше не проверку делать, а в свойствах проекта убрать форму, которая только динамически создается/уничтожается из автосоздания. Это интересно как? ![]() -Added Цитата vladimir74 @ добавь еще проверку, скорее всего эта форма уже существует... ![]() ![]() procedure TForm1.CustomItem4Click(Sender: TObject); begin if not assigned(form2) then form2:=tform2.Create (self); form2.Show(); end; ... ну и закрывай .... ![]() ![]() procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; Form2 := nil; end; Да странно он уже вызывает эти ошибки как в предыдущем и новую другую ошибку Ошибка: Abstract error! В чем бага не пойму ![]() |
Сообщ.
#5
,
|
|
|
Цитата Demon:-) @ Это интересно как? ![]() зайди в файл проекта (project1.dpr) и убери от туда все Application.CreateForm(TForm2, Form2); кроме стартовой... Цитата Demon:-) @ Да странно он уже вызывает эти ошибки как в предыдущем и новую другую ошибку Ошибка: Abstract error! непонял что и где вызывает ошибки? |
![]() |
|
|
Цитата vladimir74 @ Цитата Demon:-) @ Это интересно как? ![]() зайди в файл проекта (project1.dpr) и убери от туда все Application.CreateForm(TForm2, Form2); кроме стартовой... Цитата Demon:-) @ Да странно он уже вызывает эти ошибки как в предыдущем и новую другую ошибку Ошибка: Abstract error! непонял что и где вызывает ошибки? А эту я сразу же надпись снёс, иначе она бы вместе с главной загружалась (а это мне ненужно ![]() а ошибки... ...Ошибка: Access Violation at address xxxxxxxx in module 'XXXXXXX.exe'. Read of address xxxxxxxx., xxxxxxxx - любые значения адреса, или Ошибка: External Exception C000001D. после чего приходится нажимать ОК и только после этого создается дочернее окно и в конце концов всё это виснет.... |
Сообщ.
#7
,
|
|
|
Demon:-)
мне чего то кажется что у тебя ошибка где то в другом..... посмотри в Create и Show вызываемой формы может у тебя там что то не так... ты где то обращаешься к обьекту который в данный момент не существует (еще не создан или уже уничтожен) поставь в дебагере брейкпоинты в первой форме там где ты открываешь вторую, и во второй форме в методах Create и Show (если существуют) и посмотри где конкретно вылетает ошибка... |
Сообщ.
#8
,
|
|
|
Цитата vladimir74 @ Demon:-) мне чего то кажется что у тебя ошибка где то в другом..... посмотри в Create и Show вызываемой формы может у тебя там что то не так... ты где то обращаешься к обьекту который в данный момент не существует (еще не создан или уже уничтожен) поставь в дебагере брейкпоинты в первой форме там где ты открываешь вторую, и во второй форме в методах Create и Show (если существуют) и посмотри где конкретно вылетает ошибка... вот сам дпр ![]() ![]() program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; ..... {$R *.res} begin Application.Initialize; Application.Title := ''; Application.CreateForm(TForm1, Form1); Application.Run; end. Унит1 это главная Унит 2 дочка Вот в Уните1 я я вызываю дочку Унит2 таким образом (в первом сообщении было описано) ![]() ![]() form2:=tform2.Create (self); вылетали ошибки, и вставил Ваш код ![]() ![]() if not assigned(form2) then form2:=tform2.Create (self); form2.Show(); ошибки остались и возникла новая вот |
Сообщ.
#9
,
|
|
|
ах да может тебе вместо tform2.Create(self) создавать tform2.Create(Application) ?
разница между вызовами описана в DRKB кстати очень рекомендую.... Добавлено Demon:-) что к тебя происходит в form2.FormCreate(Sender: TObject) ? я только что сделал проект (пятница подействовала) ![]() ![]() program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}; {$R *.res} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. ![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button: TButton; procedure ButtonClick(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation uses Unit2; {$R *.dfm} procedure TForm1.ButtonClick(Sender: TObject); begin if not assigned(form2) then form2:=tform2.Create(self); form2.Show(); end; end. ![]() ![]() unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm2 = class(TForm) Edit: TEdit; procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caFree; Form2 := nil; end; end. у меня никаких ошибок нет, следовательно я так понимаю проблема ни в самом открытии а в том что ты при этом открытии делаешь дополнительно. Пройдись дебагером от начала создания до конца открытия формы... |
Сообщ.
#10
,
|
|
|
Вот так совпадение. Прям сейчас с той же проблемой сталкнулся. Код точно такой же.
AV появляется если я в TForm2.FormCreate хочу задать этой же форме позицию на экране или же присвоить ей другие значения. ![]() ![]() Ini := TIniFile.Create(ShellDir('AppData')+'\LinkCollector\Config.ini'); try form2.Top:=ini.ReadInteger('Program','Top', 100); // Если эти две сторочки убать form2.Left:=ini.ReadInteger('Program','Left',100); // то проблема исчезает finally ini.Free; end; Но как в таком случае регулировать ее позицию? Все вроде, решил проблему заменив код создания формы с ![]() ![]() if not assigned(form2) then form2:=tform2.Create(self); form2.Show; на этот ![]() ![]() if not assigned(form2) then Application.CreateForm(TForm2, Form2); Form2.Show; |
Сообщ.
#11
,
|
|
|
Цитата AnalogXP @ Вот так совпадение. Прям сейчас с той же проблемой сталкнулся. Код точно такой же. AV появляется если я в TForm2.FormCreate хочу задать этой же форме позицию на экране или же присвоить ей другие значения. ![]() ![]() Ini := TIniFile.Create(ShellDir('AppData')+'\LinkCollector\Config.ini'); try form2.Top:=ini.ReadInteger('Program','Top', 100); // Если эти две сторочки убать form2.Left:=ini.ReadInteger('Program','Left',100); // то проблема исчезает finally ini.Free; end; Но как в таком случае регулировать ее позицию? Все вроде, решил проблему заменив код создания формы с ![]() ![]() if not assigned(form2) then form2:=tform2.Create(self); form2.Show; на этот ![]() ![]() if not assigned(form2) then Application.CreateForm(TForm2, Form2); Form2.Show; да реально "тупость" почему-то дочерней форме нельзя задавать размер ![]() Вызывает ошибку вот эта запись: ![]() ![]() ![]() procedure TForm2.FormCreate(Sender: TObject); begin form2.Width:=540; form2.Height:=360; end; гы ![]() ![]() так ![]() ![]() procedure TForm2.FormCreate(Sender: TObject); begin //form2.Width:=540; //form2.Height:=360; end; всем псб... ![]() |
Сообщ.
#12
,
|
|
|
AnalogXP, Demon:-)
Ну вы и чудаки, однако ![]() Кто же в FormCreate обращается к "левой" переменной form2 ?! Нужно же с self работать, т.е. просто писать ![]() ![]() procedure TForm2.FormCreate(Sender: TObject); begin {form2.}Width:=540; {form2.}Height:=360; end; PS. Вот вам и разница между TForm2.Create и Application.CreateForm: TForm2.Create вызывает TObject.NewInstance, затем Create и FormCreate, и только после этого происходит присвоение значения переменной form2. Т.е. во время выполнения FormCreate form2 еще не присвоено и = Nil !!! А вот Application.CreateForm вызывает TObject.NewInstance, сразу присваивает значение form2 и только после этого вызывает Create и FormCreate с уже установленным значением form2 |