![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL и форма [D7, XP]
Yegorchic © (2006-07-12 09:29:00)Здравствуйте!
Во время выполнения в DLL'ке одного кода мне надо создавать там форму и потом после того как она закроется её уничтожать. Создаю форму я так:
if newform = nil then newform:=Tnewform.Create(Application);
Далее у меня идёт код работы с формой, а точнее я присваиваю переменной LV (TTreeView) свой TreeView с NewForm.
LV:=newform.TreeView;
И потом идёт одиц цикл и после его выполнения делается
newform.ShowModal;
А сразу поле этого я пишу
newform.Free;
Если запустить этот код, то сразу будет какая-то ошибка (vialation access, т.к. Delphi ни на какую строчку не показыват).
Если же, сразу после создания формы постаить вот такой небольшой код
repeat
Application.ProcessMessages;
sleep(100);
until not (newform = nil);
то уже становится лучше: ошибка вылезает не постоянно, а только иногда, но всё же вылезает.
Как правильно создавать и удалять форму? Что я делаю тут не так?
И ещё, код с созданием формы у меня находится в кнопке, и пользователь эту кнопку может нажимать сколько угодно раз во время работы программы, но когда уже второй раз жмёшь на эту кнопку, то сразу же, вылезает ошибка та же.
Что делать? Как исправить глюк?
Yegorchic (2006-07-12 13:38:00) [41]
> Например, ты дважды быстро нажал на кнопку
Да я пока что специально даже всё медленно делаю, что бы комп всё создал и прорисовал и т.п.
> Если newform - это глобальная переменная в DLL
Ну да
Ну почему то первый 2 раза точно всё создаётся и причём хорошо.
Кстати, когда я пошагово (ну на F8 жал, вообщем) всё делал, то почему то даже на 7 раз я так и не дождался, когдя у меня будет глюк. Глюка почему то не было. А когда прога спокойно работает - он появляется
Yegorchic (2006-07-12 13:31:00) [42]Нет, тут дело уже в создании формы... И Free, и Nil я сделал уже...
Desdechado (2006-07-12 13:31:00) [43]> FreeAndNil
Это то же самое, что Free, затем :=nil
Desdechado (2006-07-12 13:30:00) [44]Если newform - это глобальная переменная в DLL, то есть шансы утечки памяти. Например, ты дважды быстро нажал на кнопку, причем после первого нажатия форма еще не успела захватить модально фокус. В итоге по первому указателю пропишется вторая созданная форма, а первая "утечет".
Если же переменная локальная, то утечки не будет, но при долгом старте формы есть возможность нажать на кнопку вызова снова, что приведет к конкуренции форм за фокус.
КиТаЯц (2006-07-12 13:27:00) [45]Не уверен что поможет, но...
FreeAndNil(newform)
Yegorchic (2006-07-12 13:22:00) [46]Всё почти заработало, НО когда я жму на эту кнопку раз в четвёртый-пятый - прога как бы виснет, но ошибку никакую не выдаёт. Я посмотрел, "зависание" происходит на сточке, где как раз создаётся форма. Почему так происходит? И причём всегда по-разному: то на третий раз, то на пятый, то на четвёртый...
Yegorchic (2006-07-12 12:17:00) [47]А так можно? Не знал просто...
Спасибо, щас попробую...
Desdechado (2006-07-12 12:15:00) [48]после Free присваивать nil
очевидно же
Yegorchic (2006-07-12 12:02:00) [49]А как тогда можно определить, можно ли создавать форму или нет?
Desdechado (2006-07-12 11:19:00) [50]Free не присваивает указателю nil, поэтому код
if newform = nil then newform:=Tnewform.Create(Application);
идет по другой ветке
Yegorchic (2006-07-12 10:29:00) [51]Нет. Так нельзя. Потом когда я закрою приложение у меня тоже ошибка эта будет. Поэтому надо обязательно Free делать. А если я её делаю при закрытии приложения, то всё равно ошибка. А вот если сразу поле ShowModal - всё ОК.
Elen (2006-07-12 10:17:00) [52]Попробуй убрать newform.Free.ИМХО это мешает