![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по созданию/уничтожению форм
novill © (2007-03-13 13:39:00)При вызове форма создается, на событие OnClose стоит Action:=caFree
Однако, указатель остается <>nil.
Если сразу после закрытия формы создать другую, то указатель первой формы показывает на новый объект.
Как проще всего корректно обработать эту ситуацию. Форма и уничтожается в разных местах.
Хор зайчиков (2007-03-19 19:08:00) [1]
> novill ©
> как вы все
Во избежание дальшейшего .. этого самого.. больше ответов на вопросы не получишь.
Аминь
novill (2007-03-19 12:18:00) [2]> [31] SlymRO © (19.03.07 11:44)
> Знаем... Код не твой. Ты только разместил объяву... :)
:) Я еще не показывал жуткие куски, от которых у меня волосы по телу шевелятся.
> [32] clickmaker © (19.03.07 11:48)
Во, во, щас хор зайчиков пойдет! :)
clickmaker (2007-03-19 11:48:00) [3]и начались предъявы
SlymRO (2007-03-19 11:44:00) [4]Удалено модератором
Примечание: Не цитируем
RASkov (2007-03-19 10:16:00) [5]> [29] novill © (19.03.07 09:21)
А че ты так кипятишся... тем более, что код не твой...
Ведь имелось ввиду - "убивать" автора кода :)
novill (2007-03-19 09:21:00) [6]Удалено модератором
Примечание: МАТ, RO 7 дней
Аноним (2007-03-14 22:26:00) [7]
> try form2.Free except end;
Аналогия пришла в голову. Проверить после охоты, не забыл ли разрядить ружье, выстрелив из него в потолок.
Anatoly Podgoretsky (2007-03-14 19:09:00) [8]> novill (14.03.2007 11:58:22) [22]
Убивать не задумываясь.
Аноним (2007-03-14 12:26:00) [9]
> novill © (14.03.07 11:58) [22]
Расстреливать за такой код, сразу. И для верности потом еще повесить, за ноги.
SlymRO ©
> procedure TForm2.FormClose(Sender: TObject; var Action:
> TCloseAction);
> begin
> Form2:=nil;
> Action:=caFree;
> end;
Вот и все решение проблемы.
С чего ты взял, что
> novill © (13.03.07 14:42) [3]
> нет, не будет :(
??
Reindeer Moss Eater (2007-03-14 12:20:00) [10]Судя по всему это псевдо-MDI приложение.
Три класса дочерних окон и одновременно могут существовать только по одному экземпляру класса.
Может вообще убрать из проекта переменные - ссылки на экземпляры?
Ведь всё, для чего они нужны - это проверка существования экземпляров.
А ее можно сделать проще.
SlymRO (2007-03-14 12:15:00) [11]УБИВАТЬ, УБИВАТЬ...
form2,form3 - объявлены глобально... тады можно так:
procedure TForm1.Button1Click(Sender: TObject);
begin
if assigned(form2) then
FreeAndNil(form2);
if assigned(form3) then
FreeAndNil(form3);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not assigned(form2) then
Application.CreateForm(TForm2, Form2);
if not Form2.Visible then
Form2.Show;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if not assigned(form3) then
Application.CreateForm(TForm3, Form3);
if not Form3.Visible then
Form3.Show;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form2:=nil;
Action:=caFree;
end;
Сергей М. (2007-03-14 12:14:00) [12]
> Появится не form2, а form3.
С чего ты это взял ?
novill (2007-03-14 11:58:00) [13]> В конце концов код пиши который тебя смущает :)
Увидеть поведение программы можно на следующем примере:
Проект из трех форм.
На первой форме три кнопки:
procedure TForm1.Button1Click(Sender: TObject);
begin
try form2.Free except end;
try form3.Free except end;
form2:=nil;
form3:=nil;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
try
Form2.Show;
except
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
try
Form3.Show;
except
Application.CreateForm(TForm3, Form3);
Form3.Show;
end;
end;
во второй форме на событие OnClose
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;
третья форма пустая.
Последовательность действий:
1.нажать Button1
2.нажать Button2
3.закрыть появившуюся форму form2
4.нажать Button3
5.закрыть появившуюся форму form3
6.нажать Button2
Появится не form2, а form3.
VAleksey (2007-03-14 10:36:00) [14]
> это итак ясно. Проблема в том что после уничтожения объекта
> указатель не обнуляется, и в итоге может указывать на другой
> объект.
Ну и пусть указывает. Старой формы то уже нет.
Вообще, мне кажется ты заморочился на ровном месте.
> Форма и уничтожается в разных местах.
Форма одна и та же?
Создается она тоже в разных местах?
Речь, вообще, идет об одном экземпляре класс TMySuperForm или о множестве экземпляров этого класса?
В конце концов код пиши который тебя смущает :)
Аноним (2007-03-13 20:10:00) [15]Если у тебя много указателей на одну форму, и ты в них запутался (потому что они не твои), то сноси вообще все из программы нафиг кроме одного. а можно и его снести и остаить тоьлко указатели - локальные переменные
(существующий объект ты найдешь чрез Screen.Forms)
> Knight ©
Корректно
Knight (2007-03-13 19:50:00) [16]Люди... а так корректно временные формы делать?
procedure ShowMyForm;
begin
with TMyForm.Create(Application) do try
ShowModal;
// или if ShowModal=mrOk then begin какие-то действия; end;
finally
Free;
end;
end;
Плохиш (2007-03-13 19:03:00) [17]
> novill © (13.03.07 13:39)
> При вызове форма создается, на событие OnClose стоит Action:
> =caFree
> Однако, указатель остается <>nil.
Читал, читал, так и не понял, какой-такой "указатель" имеется ввиду и почему он должен становиться nil?
SlymRO (2007-03-13 15:57:00) [18]novill © (13.03.07 15:56) [16]
тебе спасибо- посмешил :)
novill (2007-03-13 15:56:00) [19]всем спасибо
SlymRO (2007-03-13 15:50:00) [20]Прежлагаю пользовать указатель на укзатель :)