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

Вниз

DLL и форма   Найти похожие ветки 

 
Yegorchic ©   (2006-07-12 09:29) [0]

Здравствуйте!
Во время выполнения в 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);


то уже становится лучше: ошибка вылезает не постоянно, а только иногда, но всё же вылезает.

Как правильно создавать и удалять форму? Что я делаю тут не так?

И ещё, код с созданием формы у меня находится в кнопке, и пользователь эту кнопку может нажимать сколько угодно раз во время работы программы, но когда уже второй раз жмёшь на эту кнопку, то сразу же, вылезает ошибка та же.

Что делать? Как исправить глюк?


 
Elen ©   (2006-07-12 10:17) [1]

Попробуй убрать newform.Free.ИМХО это мешает


 
Yegorchic ©   (2006-07-12 10:29) [2]

Нет. Так нельзя. Потом когда я закрою приложение у меня тоже ошибка эта будет. Поэтому надо обязательно Free делать. А если я её делаю при закрытии приложения, то всё равно ошибка. А вот если сразу поле ShowModal - всё ОК.


 
Desdechado ©   (2006-07-12 11:19) [3]

Free не присваивает указателю nil, поэтому код
if newform = nil then newform:=Tnewform.Create(Application);
идет по другой ветке


 
Yegorchic ©   (2006-07-12 12:02) [4]

А как тогда можно определить, можно ли создавать форму или нет?


 
Desdechado ©   (2006-07-12 12:15) [5]

после Free присваивать nil
очевидно же


 
Yegorchic ©   (2006-07-12 12:17) [6]

А так можно? Не знал просто...
Спасибо, щас попробую...


 
Yegorchic ©   (2006-07-12 13:22) [7]

Всё почти заработало, НО когда я жму на эту кнопку раз в четвёртый-пятый - прога как бы виснет, но ошибку никакую не выдаёт. Я посмотрел, "зависание" происходит на сточке, где как раз создаётся форма. Почему так происходит? И причём всегда по-разному: то на третий раз, то на пятый, то на четвёртый...


 
КиТаЯц ©   (2006-07-12 13:27) [8]

Не уверен что поможет, но...

FreeAndNil(newform)


 
Desdechado ©   (2006-07-12 13:30) [9]

Если newform - это глобальная переменная в DLL, то есть шансы утечки памяти. Например, ты дважды быстро нажал на кнопку, причем после первого нажатия форма еще не успела захватить модально фокус. В итоге по первому указателю пропишется вторая созданная форма, а первая "утечет".
Если же переменная локальная, то утечки не будет, но при долгом старте формы есть возможность нажать на кнопку вызова снова, что приведет к конкуренции форм за фокус.


 
Desdechado ©   (2006-07-12 13:31) [10]

> FreeAndNil
Это то же самое, что Free, затем :=nil


 
Yegorchic ©   (2006-07-12 13:31) [11]

Нет, тут дело уже в создании формы... И Free, и Nil я сделал уже...


 
Yegorchic ©   (2006-07-12 13:38) [12]


>  Например, ты дважды быстро нажал на кнопку


Да я пока что специально даже всё медленно делаю, что бы комп всё создал и прорисовал и т.п.


> Если newform - это глобальная переменная в DLL

Ну да

Ну почему то первый 2 раза точно всё создаётся и причём хорошо.

Кстати, когда я пошагово (ну на F8 жал, вообщем) всё делал, то почему то даже на 7 раз я так и не дождался, когдя у меня будет глюк. Глюка почему то не было. А когда прога спокойно работает - он появляется


 
isasa ©   (2006-07-12 14:37) [13]

Щас начнется :0
поменяй
if newform = nil then newform:=Tnewform.Create(Application);
на
if newform = nil then newform:=Tnewform.Create(nil);


 
Yegorchic ©   (2006-07-12 14:46) [14]

СПАСИБО! Кажется всё заработало! Ну раз 10 точно открылось :-)
Спасибо.


 
Yegorchic ©   (2006-07-12 14:50) [15]

А нет, не заработало :-( Только "кол-во показов" увеличилось, кажется, но всё равно нормально не работает :-(


 
Amoeba ©   (2006-07-12 14:54) [16]

Действительно ли так необходимо пихать форму в DLL, создавая этим себе массу проблем, ряд из которых неразрешим без компилялиции и основной программы, и DLL с пакетами?


 
Yegorchic ©   (2006-07-12 14:56) [17]


> Действительно ли так необходимо пихать форму в DLL


Да. Именно необходимо.


 
Amoeba ©   (2006-07-12 15:11) [18]


> код с созданием формы у меня находится в кнопке,

Как выглядит этот код?


 
Yegorchic ©   (2006-07-12 15:24) [19]

см. [0] выше с поправкой из [13].


 
Amoeba ©   (2006-07-12 15:32) [20]


> Yegorchic ©   (12.07.06 15:24) [19]
> см. [0] выше с поправкой из [13].

Т.е. код создания формы из DLL находится в модуле хоста? Переменная newform объявлена там же, и, следовательно основное приложение т.о. "знает" класс Tnewform?

Не здесь ли источник проблем?


 
Yegorchic ©   (2006-07-12 15:58) [21]

Что-то я запутался.
У меня теперь компилятор стал показывать там исключение, которое гласит, что "canvas does not allow drawing" и указывает на строчку создания формы. Что это значит?


 
Desdechado ©   (2006-07-12 16:05) [22]

>> Если newform - это глобальная переменная в DLL
> Ну да
А зачем? Ведь она используется только в функции создания-показа-разрушения формы.

Amoeba ©   (12.07.06 15:32) [20]
Нет, похоже, вызывается функция из ДЛЛ, которая все это проделывает.


 
Amoeba ©   (2006-07-12 16:11) [23]


> Amoeba ©   (12.07.06 15:32) [20]
> Нет, похоже, вызывается функция из ДЛЛ, которая все это
> проделывает.

Надеюсь, что это так. Вот только автор упорно прячет весь код обработчика события нажатия кнопки на форме в хост-приложении, считая, что телепатам достаточно нескольких строчек кода даже без указания в каком модуле они находятся.


 
Yegorchic ©   (2006-07-12 16:12) [24]


> А зачем? Ведь она используется только в функции создания-
> показа-разрушения формы.

Что то я не понимаю... а как делать тогда?

И что значит всё таки "canvas does not allow drawing"? (ну перевод то я знаю, мне хотелось бы узнать, от чего это может появиться?)


 
Yegorchic ©   (2006-07-12 16:16) [25]


> Нет, похоже, вызывается функция из ДЛЛ, которая все это
> проделывает.


А, нет!
В DLL с самого начала загружается одна форма, где находится эта кнопка, а потом по нажатию на эту кнопку запускается Thread где и создаётся эта форма.


>  Вот только автор упорно прячет весь код обработчика события
> нажатия кнопки


Там слишком много кода, и вам наверное только непонятней будет.


 
Amoeba ©   (2006-07-12 16:20) [26]


> И что значит всё таки "canvas does not allow drawing"? (ну
> перевод то я знаю, мне хотелось бы узнать, от чего это может
> появиться?)

Это значит, что тебя ошибка/ошибки в коде. А где конкретно - сказать на данный момет невозможно, поскольку никто еще твоего суперсекретного кода, кроме нескольких бессвязных обрывков, еще не видел. Сам понимаешь, все телепаты в отпуске.


 
Amoeba ©   (2006-07-12 16:23) [27]


> Yegorchic ©   (12.07.06 16:16) [25]
>
> > Нет, похоже, вызывается функция из ДЛЛ, которая все это
>
> > проделывает.
>
>
> А, нет!
> В DLL с самого начала загружается одна форма, где находится
> эта кнопка,

Т.е. оказывается, что в DLL две формы? И вторая показывается при нажатии кнопки на первой?

Вобщем, "вечер перестает быть томным".


 
Yegorchic ©   (2006-07-12 16:26) [28]

В [0] описаны все действия с формой! От Create до Free.


 
Yegorchic ©   (2006-07-12 16:28) [29]


> Т.е. оказывается, что в DLL две формы? И вторая показывается
> при нажатии кнопки на первой?


Да. А разве вторую форму обязательно из exe через фунцкию создавать? Прямо в DLL это нельзя?


 
Desdechado ©   (2006-07-12 16:30) [30]

> вечер перестает быть томным
Это точно. У него ведь и "потом по нажатию на эту кнопку запускается Thread где и создаётся эта форма".


 
Amoeba ©   (2006-07-12 16:31) [31]


> Yegorchic ©   (12.07.06 16:26) [28]
> В [0] описаны все действия с формой! От Create до Free.

Как бы не так! Описание подразумевает показ кода за вычетом второстепенных для сабжа участков, а не невразумительные потуги изложить проблему лишь с вкраплением совершенно недостаточного количества отдельных кодовых фрагментов.


 
Amoeba ©   (2006-07-12 16:33) [32]


> по нажатию на эту кнопку запускается Thread где и создаётся
> эта форма

Здесь запросто могут лежать хо-о-о-рошие грабли!

Чувствую, что и под пыткой наш дорогой автор вопроса не покажет нам новых кусочков своего сверхсекретного глючного кода.


 
Yegorchic ©   (2006-07-12 16:34) [33]


> Desdechado ©   (12.07.06 16:30) [30]


Что, всё так плохо?


 
Amoeba ©   (2006-07-12 16:41) [34]


> Yegorchic ©   (12.07.06 16:34) [33]
>
> > Desdechado ©   (12.07.06 16:30) [30]
>
>
> Что, всё так плохо?

Не просто плох, а хуже некуда!


 
Yegorchic ©   (2006-07-12 16:44) [35]

Вообщем, если кнопка. По её нажатию запускается так поток:

MyThread:=TMyThread.Create;
MyThread.Resume;  // поток создаётся приостановленным


В потоке запускается одна функция:
procedure TMyThread.Execute;
begin
MyProc;
end;


Что это за процедура:
procedure TMyThread.MyProc;
var
 i: integer;
 //.......
begin
 //... тут второстепенный код, не имебщий никакого отношения в созданию формы
if newform=nil then begin
newform:=Tmsgform.Create(nil);
repeat
 Application.ProcessMessages;
 sleep(100);
until not (newform = nil);
end;
// ... тут опять второстепенный код
for i:=1 to .... do
begin
 // здесь создаются Item"ы в TListView"е, который на newform находится
end;
newform.ShowModal;
newform.Free; newform:=nil;
// всё, работа с формой закончена, опять второстепенный код
end;


На форме newform нет ничего особенного, только этот ListView и одна кнопка, которая закрывает форму (Close;).

Всё. Столько хватит? Или ещё что-то?

P.S:
> Здесь запросто могут лежать хо-о-о-рошие грабли!


К примеру?


 
Yegorchic ©   (2006-07-12 16:45) [36]


> Вообщем, если кнопка.

если = есть


>  одна функция:

извиняюсь, процедура


 
Desdechado ©   (2006-07-12 16:52) [37]

Если у тебя форма модальная, зачем тебе отдельная нить?


 
Amoeba ©   (2006-07-12 16:54) [38]


> В потоке запускается одна функция:
> procedure TMyThread.Execute;
> begin
> MyProc;
> end;

Вот и грабли! Поскольку в MyProc имеем дело с компонетами, то не надо забывать про Synchronize:

procedure TMyThread.Execute;
begin
 Synchronize(MyProc);
end;


 
Yegorchic ©   (2006-07-12 16:57) [39]


> Desdechado ©   (12.07.06 16:52) [37]


Дык дело то не в форме. Просто действия, которые в том потоке достаточно долго выполняются, поэтому что бы программа "не зависала", я сделал поток такой.


 
Amoeba ©   (2006-07-12 16:59) [40]


> repeat
>  Application.ProcessMessages;
>  sleep(100);
> until not (newform = nil);

И нафига здесь Sleep?



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

Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.014 c
2-1152764056
Rubey
2006-07-13 08:14
2006.07.30
Sirus


3-1148841228
Still Swamp
2006-05-28 22:33
2006.07.30
Требуется локальная DB


8-1139400515
AlexeyMir
2006-02-08 15:08
2006.07.30
Как можно оцифровать определенный кусок из песни в файл .wav


1-1150451941
oleg444
2006-06-16 13:59
2006.07.30
Не могу отладить DLL


2-1152528269
Zidane5
2006-07-10 14:44
2006.07.30
API функции





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