Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.05;
Скачать: CL | DM;

Вниз

заNILить форму после Close;   Найти похожие ветки 

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

В некой 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.


 
@!!ex ©   (2008-08-21 12:41) [1]

TForm1 = class
public
 FormLinkPointer:^TForm1;
end;

....
Form1:TForm;
Form1:=TForm.Create();
Form1.FormLinkPointer:=@Form1;

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


 
Ega23 ©   (2008-08-21 12:41) [2]

Ну самого себя занилить у тебя не получится.
Форма модальная?


 
ничтожная козявка   (2008-08-21 12:52) [3]

@!!ex
 Ок, спасибо! Это работает. А нельзя ли Self для этих целецей использовать?

Ega23
 Модальной ее делать нельзя, к сожалению.


 
Leonid Troyanovsky ©   (2008-08-21 13:01) [4]


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

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

Это ошибка.

--
Regards, LVT.


 
@!!ex ©   (2008-08-21 13:08) [5]

> А нельзя ли Self для этих целецей использовать?

Нет.


 
ничтожная козявка   (2008-08-21 13:58) [6]

Leonid Troyanovsky

> Это ошибка

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


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


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


А как она, форма, там завелась ?
Что ей не жилось спокойно в ехе ?


 
Юрий Зотов ©   (2008-08-21 14:04) [8]

> @!!ex ©   (21.08.08 12:41) [1]

Зачем такие извраты?

procedure TForm1.FormClose(...);
begin
  Action := caFree;
end;

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


И вся морковь.


 
{RASkov} ©   (2008-08-21 14:08) [9]

А зачем эта ссылка на форму вообще? убрать ее нафик...
И будет достаточно Action := caFree; а "единичность формы"(если именно ее преследует автор) можно будет сделать "такой же" глобальной переменной, только например Булевого типа.... и делов.


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


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

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

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

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


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


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

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


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

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


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


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

 дословно


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

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


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


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

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


 
Ega23 ©   (2008-08-21 14:32) [16]

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


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


 
Dennis I. Komarov ©   (2008-08-21 14:55) [17]

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

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


 
Leonid Troyanovsky ©   (2008-08-21 15:02) [18]


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

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

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

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2008-08-21 15:15) [19]


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

>  TForm1(Sender) := nil;

> не спасет?

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

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

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2008-08-21 15:26) [20]


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

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


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


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

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


 
@!!ex ©   (2008-08-21 15:48) [22]

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

Хотя бы затем, что "Класс "Пассажирский самолёт ТУ-154М" не должен ничего знать о пассажирском самолёте ТУ-154М с бортовым номером 34567 и базирующимся в Благовещенске."
(С)Ega23
http://delphimaster.net/view/15-1213366269/
пост номер 158.


 
@!!ex ©   (2008-08-21 15:50) [23]

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

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


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


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


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


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


> кто виноват


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


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


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

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


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

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

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

Выводы:

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

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


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


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

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


 
Amoeba ©   (2008-08-21 16:33) [28]

Да.
Можно.

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


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

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


 
Amoeba ©   (2008-08-21 16:39) [30]


> ничтожная козявка   (21.08.08 16:37) [29]
>
> тогда в чем соль?

В отсутствии множества граблей.


 
Vlad Oshin ©   (2008-08-21 16:45) [31]


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


http://softwarer.ru/packages.html


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


> Vlad Oshin ©   (21.08.08 16:45) [31]

спасибо, нашел уже
тут тоже пишут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=274


 
Vlad Oshin ©   (2008-08-21 16:56) [33]


> ничтожная козявка   (21.08.08 16:50) [32]

Тоже читал. Собственно:
Вот это впечатляет:
С пакетами первый раз компилим и без пакетов второй раз

В DLL экспортируется следующая функция:
function GetObjectClass : TClass ;
begin
 Result := TObject ;
end ;
В главном файле приложения результат функции сравнивается с ожидаемым:
var Result : AnsiString ;
begin
 if GetObjectClass = TObject
   then Result := "MainProject.TObject = DllProject.TObject"
   else Result := "MainProject.TObject <> DllProject.TObject" ;
 MessageBox ( 0, PChar ( Result ), PChar ( "Линковка" ), MB_OK ) ;
end.


 
ЛшдлуттнСфе   (2008-08-21 17:20) [34]

не по существу, но я люблю глобальные переменные.


 
Leonid Troyanovsky ©   (2008-08-21 17:55) [35]


> ЛшдлуттнСфе   (21.08.08 17:20) [34]

> не по существу, но я люблю глобальные переменные.

А я - лесбиян, люблю девушек.

--
Regards, LVT.


 
ЛшдлуттнСфе   (2008-08-21 18:17) [36]


> Leonid Troyanovsky ©   (21.08.08 17:55) [35

а я не лесбиян, я просто люблю девушек...


 
Сергей М. ©   (2008-08-21 18:38) [37]


> я не лесбиян, я просто люблю девушек


Девушкам-то "вкайф", а каковО тому, о ком идет "любовь" ?
Им-то, знаешь ли, кАково)


 
Leonid Troyanovsky ©   (2008-08-21 20:03) [38]


> ЛшдлуттнСфе   (21.08.08 18:17) [36]

Любвиобилен.

--
Regards, LVT.


 
Германн ©   (2008-08-21 20:07) [39]


> Leonid Troyanovsky ©   (21.08.08 20:03) [38]
>
>
> > ЛшдлуттнСфе   (21.08.08 18:17) [36]
>
> Любвиобилен.
>

Чего ещё можно ждать от кота?
:)


 
@!!ex ©   (2008-08-21 20:52) [40]

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

Согласен, лучше обнулять на уничтодение, а не на закрытие.


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

а нет там усложнения. А вот когда выяснится, что нужно две TForm1 будет СТОЛЬКО граблей...
Мы все таки с использованием ООП пишем, или только вид делаем?



Страницы: 1 2 3 4 5 вся ветка

Текущий архив: 2008.10.05;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.017 c
15-1218711018
Vlad Oshin
2008-08-14 14:50
2008.10.05
Об именах. Вот зачем так делать, да еще в пример ставить.


15-1218592874
Slider007
2008-08-13 06:01
2008.10.05
С днем рождения ! 13 августа 2008 среда


15-1218023843
Ru
2008-08-06 15:57
2008.10.05
А чего чат сдох?


2-1219413550
zoh
2008-08-22 17:59
2008.10.05
image&amp;text


1-1199531227
ras122
2008-01-05 14:07
2008.10.05
помогите с работой с мышкой, пожалуйста