Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по созданию/уничтожению форм


Страницы:   1 2

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]

Прежлагаю пользовать указатель на укзатель :)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо