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

Вниз

за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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.008 c
2-1219812694
Гость
2008-08-27 08:51
2008.10.05
Выбор значения в комбике.


15-1218766496
Slider007
2008-08-15 06:14
2008.10.05
С днем рождения ! 15 августа 2008 пятница


3-1207291974
Альберт
2008-04-04 10:52
2008.10.05
Поиск дубликатов


1-1198856107
Max
2007-12-28 18:35
2008.10.05
Подсказка...


15-1218610196
MsGuns
2008-08-13 10:49
2008.10.05
Лето или очередная летаргия форума ?





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