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

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

заNILить форму после Close;


Страницы:   1 2 3 4 5 6 7 8 9 10

ничтожная козявка ©   (2008-08-21 12:37:00) 

В некой dll есть функция, показывающая форму. Перед созданием формы, она проверяет ее на NIL:

 if not Assigned(Form1) then Form1 := TForm1.Create(AOwner);


также требуется, что бы после закрытия (Close) форма была уничтожена:

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 ...
 Action := caFree;
 ...
end;


ВОПРОС: как сделать так, чтоб она была не только уничтожена, но и переменная Form1 приняла значение NIL. Т.к. поскольку эта переменная не NIL, при повторной попытке создать форму, ее конструктор
  if not Assigned(Form1) then Form1 := TForm1.Create(AOwner);
не вызывается, и в последствии сыпятся AV.


ничтожная козявка   (2008-08-21 16:37:00) [161]

тогда в чем соль?


Amoeba   (2008-08-21 16:33:00) [162]

Да.
Можно.

BPL всего лишь разновидность DLL.


ничтожная козявка   (2008-08-21 16:29:00) [163]


> Сергей М. ©   (21.08.08 16:01) [24]
> Кури BPL.

 некий экзешник может выполнять одну и туже функцию по-разному, подключая каждый раз нужные длл. BPL позволит это делать? можно использовать BPL настолько же динамически как длл?


Юрий Зотов   (2008-08-21 16:09:00) [164]

> @!!ex ©   (21.08.08 15:48) [22]

1. Чему будет равно поле формы после ее уничтожения?
2. И вот летят они навстречу друг другу... и ничего друг о друге не знают...

Выводы:

1. Не нужно усложнять то, что можно сделать просто.

2. Даже правильные, в принципе, вещи (отсутствие глобальных перменных, неразмещение форм в DLL и пр.) не нужно превращать в абсолютные догмы. При грамотном использовании нет ничего страшного ни в глобальных переменных, ни в DLL с формами. А при неграмотном можно напортачить и без них.


Сергей М.   (2008-08-21 16:06:00) [165]


> кто виноват


Известно кто - говнюк-начальник)


> как наказать


О, это отдельная история)

Уж мы оттянемся по полной программе - дай-ка только сюда "виновного")


Сергей М.   (2008-08-21 16:01:00) [166]


> ничтожная козявка   (21.08.08 14:26) [15]


Кури BPL.
Выбора у тебя нет.


@!!ex   (2008-08-21 15:50:00) [167]

> [11] ничтожная козявка   (21.08.08 14:11)

Вот и не делай так никогда. ЮЗ скорее всего издевнулся... Вот уж он то из тех, кто знат что ТАК делать не стоит.


@!!ex   (2008-08-21 15:48:00) [168]

> [8] Юрий Зотов ©   (21.08.08 14:04)

Хотя бы затем, что "Класс "Пассажирский самолёт ТУ-154М" не должен ничего знать о пассажирском самолёте ТУ-154М с бортовым номером 34567 и базирующимся в Благовещенске."
(С)Ega23
http://www.delphimaster.ru/cgi-bin/forum.pl?n=3&id=1213366269&p=2
пост номер 158.


Anatoly Podgoretsky   (2008-08-21 15:28:00) [169]


> ничтожная козявка   (21.08.08 12:37)  

Что бы определить существует форма или нет, глобальных переменных для этого не надо, а надо использовать Screen.Forms


Anatoly Podgoretsky   (2008-08-21 15:26:00) [170]


> Leonid Troyanovsky ©   (21.08.08 15:02) [18]

Это не отвечает на вопрос "Как наказать", а наказать надо примерно, с отрыванием.


Leonid Troyanovsky   (2008-08-21 15:15:00) [171]


> Dennis I. Komarov ©   (21.08.08 14:55) [17]

>  TForm1(Sender) := nil;

> не спасет?

Особенно трогательно выглядит TForm1().

И, во-ще, хватит извращений:
1. глобальные переменные - MD,
2. формы в длл - MD.

--
Regards, LVT.


Leonid Troyanovsky   (2008-08-21 15:02:00) [172]


> ничтожная козявка   (21.08.08 13:58) [6]

>  как полагается реализовывать это?

http://www.podgoretsky.com/OtherParts/DM/BadTips.aspx

--
Regards, LVT.


Dennis I. Komarov   (2008-08-21 14:55:00) [173]

> [16] Ega23 ©   (21.08.08 14:32)

procedure TForm1.OnDestroy(...);
begin
 TForm1(Sender) := nil;
end;
не спасет?


Ega23   (2008-08-21 14:32:00) [174]

procedure TForm1.OnDestroy(...);
begin
Form1 := nil;
end;


Ага, а она у меня и вовсе не Form1, а
var
 tmpfrm : TForm1


ничтожная козявка   (2008-08-21 14:26:00) [175]


> Сергей М. ©   (21.08.08 14:23) [14]

 довольно уж тянуть кота за резину :)) советуйте как дОлжно быть, чем грозит, кто виноват и как наказать :))


Сергей М.   (2008-08-21 14:23:00) [176]

Ну что ж ... Дословно так дословно)
Но геморрой при этом грозит не тем кто лепил ТЗ, а тебе)


ничтожная козявка   (2008-08-21 14:18:00) [177]


> Сергей М. ©   (21.08.08 14:17) [12]

 дословно


Сергей М.   (2008-08-21 14:17:00) [178]

И в ТЗ прямо так и написано - пихать всю эту форменную беду не иначе как в DLL ?


ничтожная козявка   (2008-08-21 14:11:00) [179]


> Юрий Зотов ©   (21.08.08 14:04) [8]

 я кстати постеснялся сначала так делать:)


ничтожная козявка   (2008-08-21 14:10:00) [180]


> Сергей М. ©   (21.08.08 14:00) [7]

 это что-то навроде плагина.. ТЗ так велит.

 
> @!!ex ©   (21.08.08 13:08) [5]
>
> > А нельзя ли Self для этих целецей использовать?
>
> Нет.

 ога, я понял, потому что Self и Form1 это две большие разницы и заниливание одного из этих указателей ничего не даст.


Страницы:   1 2 3 4 5 6 7 8 9 10

Наверх

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