Форум: "Начинающим";
Текущий архив: 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;
во второй форме на событие OnCloseprocedure 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