Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Вниз

Вопрос по созданию/уничтожению форм   Найти похожие ветки 

 
novill ©   (2007-03-13 13:39) [0]

При вызове форма создается, на событие OnClose стоит  Action:=caFree
Однако, указатель остается <>nil.
Если сразу после закрытия формы создать другую, то указатель первой формы показывает на новый объект.

Как проще всего корректно обработать эту ситуацию. Форма и уничтожается в разных местах.


 
Сергей М. ©   (2007-03-13 13:45) [1]


> Однако, указатель остается <>nil.


Сделай его nil.

Что тому мешает ?


> Если сразу после закрытия формы создать другую, то указатель
> первой формы показывает на новый объект


Что в том удивительного ?

Что вообще ты видишь удивительного в том, что на один и тот же объект может существовать множество указателей ?


 
novill ©   (2007-03-13 14:29) [2]

Ничего удивительного :)

На OnDestroy вставить FormX:=nil корректно будет?


 
novill ©   (2007-03-13 14:42) [3]

нет, не будет :(

В какой же момент приравнивать указатель к  nil, если формы вызывается по Show


 
Сергей М. ©   (2007-03-13 14:51) [4]


> В какой же момент приравнивать указатель к  nil,


Какой конкретно указатель ?)

Вот в чем вопрос-то ..

Репу-то чеши ?)


 
novill ©   (2007-03-13 15:01) [5]

да я понял уже :(
обидно что нельзя Self:=nil написать


 
Сергей М. ©   (2007-03-13 15:04) [6]


> да я понял уже


Да ничерта ты не понял.


 
novill ©   (2007-03-13 15:09) [7]

> [6] Сергей М. ©   (13.03.07 15:04)
А просто помочь ты можешь?


 
Сергей М. ©   (2007-03-13 15:13) [8]

Конечно могу)


 
Рамиль ©   (2007-03-13 15:14) [9]

Если ты присвоиш Self := nil указатель FormX не изменится.


 
Desdechado ©   (2007-03-13 15:14) [10]

> В какой же момент приравнивать указатель к  nil, если формы вызывается по Show
Как вызывается, фиолетово. Указатель на нее ведь есть, если ты его не потерял (такое тоже бывает).
По логике программы должно быть четко ясно, где форма еще существует, а где уже нет. Если же у тебя не ясно, значит, надо менять эту самую логику.


 
Рамиль ©   (2007-03-13 15:16) [11]

На ОБЪЕКТ может указывать сколько угодно указателей. При присвоении любому из них nil остальные указатели не меняются.


 
novill ©   (2007-03-13 15:24) [12]

> [11] Рамиль ©   (13.03.07 15:16)
это итак ясно. Проблема в том что после уничтожения объекта указатель не обнуляется, и в итоге может указывать на другой объект.


> По логике программы должно быть четко ясно, где форма еще
> существует, а где уже нет. Если же у тебя не ясно, значит,
> надо менять эту самую логику.

Увы, логика не моя, и местами не логика :(


 
Сергей М. ©   (2007-03-13 15:27) [13]


> novill ©   (13.03.07 15:24) [12]


> после уничтожения объекта указатель не обнуляется


Ну тебе же "черным по-русскому" сказали - на один и тот же объект может существовать куча указателей !!!

Ты в КАКОМ КОНКРЕТНО из них возжелал при этом видеть nil ?!


 
Desdechado ©   (2007-03-13 15:37) [14]

> Проблема в том что после уничтожения объекта указатель не обнуляется,
> и в итоге может указывать на другой объект.
Он может указывать и на пустой участок памяти, и на середину другого объекта.
Указатель - это вещь, которая указывает на то, на что ты ему прикажешь. Если тебе нужно контролировать его указание, то разберись с логикой программы, а не лепи отмазки логика не моя, и местами не логика


 
SlymRO ©   (2007-03-13 15:50) [15]

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


 
novill ©   (2007-03-13 15:56) [16]

всем спасибо


 
SlymRO ©   (2007-03-13 15:57) [17]

novill ©   (13.03.07 15:56) [16]
тебе спасибо- посмешил :)


 
Плохиш ©   (2007-03-13 19:03) [18]


> novill ©   (13.03.07 13:39)  
> При вызове форма создается, на событие OnClose стоит  Action:
> =caFree
> Однако, указатель остается <>nil.

Читал, читал, так и не понял, какой-такой "указатель" имеется ввиду и почему он должен становиться nil?


 
Knight ©   (2007-03-13 19:50) [19]

Люди... а так корректно временные формы делать?

procedure ShowMyForm;
begin
 with TMyForm.Create(Application) do try
   ShowModal;
// или if ShowModal=mrOk then begin какие-то действия; end;
 finally
   Free;
 end;
end;


 
Аноним   (2007-03-13 20:10) [20]

Если у тебя много указателей на одну форму, и ты в них запутался (потому что они не твои), то сноси вообще все из программы нафиг кроме одного. а можно и его снести и остаить тоьлко указатели - локальные переменные
(существующий объект ты найдешь чрез Screen.Forms)


> Knight ©

Корректно


 
VAleksey ©   (2007-03-14 10:36) [21]


> это итак ясно. Проблема в том что после уничтожения объекта
> указатель не обнуляется, и в итоге может указывать на другой
> объект.

Ну и пусть указывает. Старой формы то уже нет.
Вообще, мне кажется ты заморочился на ровном месте.


> Форма и уничтожается в разных местах.

Форма одна и та же?
Создается она тоже в разных местах?
Речь, вообще, идет об одном экземпляре класс TMySuperForm или о множестве экземпляров этого класса?
В конце концов код пиши который тебя смущает :)


 
novill ©   (2007-03-14 11:58) [22]

> В конце концов код пиши который тебя смущает :)

Увидеть поведение программы можно на следующем примере:

Проект из трех форм.

На первой форме три кнопки:
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.


 
Сергей М. ©   (2007-03-14 12:14) [23]


> Появится не form2, а form3.


С чего ты это взял ?


 
SlymRO ©   (2007-03-14 12:15) [24]

УБИВАТЬ, УБИВАТЬ...
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;


 
Reindeer Moss Eater ©   (2007-03-14 12:20) [25]

Судя по всему это псевдо-MDI приложение.
Три класса дочерних окон и одновременно могут существовать только по одному экземпляру класса.
Может вообще убрать из проекта переменные - ссылки на экземпляры?
Ведь всё, для чего они нужны - это проверка существования экземпляров.
А ее можно сделать проще.


 
Аноним   (2007-03-14 12:26) [26]


> 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]
> нет, не будет :(


??


 
Anatoly Podgoretsky ©   (2007-03-14 19:09) [27]

> novill  (14.03.2007 11:58:22)  [22]

Убивать не задумываясь.


 
Аноним   (2007-03-14 22:26) [28]


> try form2.Free except end;


Аналогия пришла в голову. Проверить после охоты,  не забыл ли разрядить ружье, выстрелив из него в потолок.


 
novill ©   (2007-03-19 09:21) [29]

Удалено модератором
Примечание: МАТ, RO 7 дней


 
RASkov   (2007-03-19 10:16) [30]

> [29] novill ©   (19.03.07 09:21)

А че ты так кипятишся... тем более, что код не твой...
Ведь имелось ввиду - "убивать" автора кода :)


 
SlymRO ©   (2007-03-19 11:44) [31]

Удалено модератором
Примечание: Не цитируем


 
clickmaker ©   (2007-03-19 11:48) [32]

и начались предъявы


 
novill ©   (2007-03-19 12:18) [33]

> [31] SlymRO ©   (19.03.07 11:44)
> Знаем... Код не твой. Ты только разместил объяву... :)

:) Я еще не показывал жуткие куски, от которых у меня волосы по телу шевелятся.

> [32] clickmaker ©   (19.03.07 11:48)
Во, во, щас хор зайчиков пойдет! :)


 
Хор зайчиков   (2007-03-19 19:08) [34]


> novill ©


> как вы все


Во избежание дальшейшего .. этого самого.. больше ответов на вопросы не получишь.
Аминь



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.077 c
15-1173965080
Анна_А
2007-03-15 16:24
2007.04.08
Скремблеры


15-1173709952
Prohodil Mimo
2007-03-12 17:32
2007.04.08
If ... then : Begin End VS Exit;


15-1173821076
mike888777666
2007-03-14 00:24
2007.04.08
декомпиляция


2-1174379520
Malik
2007-03-20 11:32
2007.04.08
Вопрос про распечатку на принтере


2-1173768132
DimonS
2007-03-13 09:42
2007.04.08
Like в Access





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