![]() |
| ||
|
|
Новости |
Поиск |
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);
то уже становится лучше: ошибка вылезает не постоянно, а только иногда, но всё же вылезает.
Как правильно создавать и удалять форму? Что я делаю тут не так?
И ещё, код с созданием формы у меня находится в кнопке, и пользователь эту кнопку может нажимать сколько угодно раз во время работы программы, но когда уже второй раз жмёшь на эту кнопку, то сразу же, вылезает ошибка та же.
Что делать? Как исправить глюк?
Amoeba (2006-07-12 16:33:00) [21]
> по нажатию на эту кнопку запускается Thread где и создаётся
> эта форма
Здесь запросто могут лежать хо-о-о-рошие грабли!
Чувствую, что и под пыткой наш дорогой автор вопроса не покажет нам новых кусочков своего сверхсекретного глючного кода.
Amoeba (2006-07-12 16:31:00) [22]
> Yegorchic © (12.07.06 16:26) [28]
> В [0] описаны все действия с формой! От Create до Free.
Как бы не так! Описание подразумевает показ кода за вычетом второстепенных для сабжа участков, а не невразумительные потуги изложить проблему лишь с вкраплением совершенно недостаточного количества отдельных кодовых фрагментов.
Desdechado (2006-07-12 16:30:00) [23]> вечер перестает быть томным
Это точно. У него ведь и "потом по нажатию на эту кнопку запускается Threadгде и создаётся эта форма".
Yegorchic (2006-07-12 16:28:00) [24]
> Т.е. оказывается, что в DLL две формы? И вторая показывается
> при нажатии кнопки на первой?
Да. А разве вторую форму обязательно из exe через фунцкию создавать? Прямо в DLL это нельзя?
Yegorchic (2006-07-12 16:26:00) [25]В [0] описаны все действия с формой! От Create до Free.
Amoeba (2006-07-12 16:23:00) [26]
> Yegorchic © (12.07.06 16:16) [25]
>
> > Нет, похоже, вызывается функция из ДЛЛ, которая все это
>
> > проделывает.
>
>
> А, нет!
> В DLL с самого начала загружается одна форма, где находится
> эта кнопка,
Т.е. оказывается, что в DLL две формы? И вторая показывается при нажатии кнопки на первой?
Вобщем, "вечер перестает быть томным".
Amoeba (2006-07-12 16:20:00) [27]
> И что значит всё таки "canvas does not allow drawing"? (ну
> перевод то я знаю, мне хотелось бы узнать, от чего это может
> появиться?)
Это значит, что тебя ошибка/ошибки в коде. А где конкретно - сказать на данный момет невозможно, поскольку никто еще твоего суперсекретного кода, кроме нескольких бессвязных обрывков, еще не видел. Сам понимаешь, все телепаты в отпуске.
Yegorchic (2006-07-12 16:16:00) [28]
> Нет, похоже, вызывается функция из ДЛЛ, которая все это
> проделывает.
А, нет!
В DLL с самого начала загружается одна форма, где находится эта кнопка, а потом по нажатию на эту кнопку запускается Thread где и создаётся эта форма.
> Вот только автор упорно прячет весь код обработчика события
> нажатия кнопки
Там слишком много кода, и вам наверное только непонятней будет.
Yegorchic (2006-07-12 16:12:00) [29]
> А зачем? Ведь она используется только в функции создания-
> показа-разрушения формы.
Что то я не понимаю... а как делать тогда?
И что значит всё таки"canvas does not allow drawing"? (ну перевод то я знаю, мне хотелось бы узнать, от чего это может появиться?)
Amoeba (2006-07-12 16:11:00) [30]
> Amoeba © (12.07.06 15:32) [20]
> Нет, похоже, вызывается функция из ДЛЛ, которая все это
> проделывает.
Надеюсь, что это так. Вот только автор упорно прячет весь код обработчика события нажатия кнопки на форме в хост-приложении, считая, что телепатам достаточно нескольких строчек кода даже без указания в каком модуле они находятся.
Desdechado (2006-07-12 16:05:00) [31]>> Если newform - это глобальная переменная в DLL
> Ну да
А зачем? Ведь она используется только в функции создания-показа-разрушения формы.
Amoeba © (12.07.06 15:32) [20]
Нет, похоже, вызывается функция из ДЛЛ, которая все это проделывает.
Yegorchic (2006-07-12 15:58:00) [32]Что-то я запутался.
У меня теперь компилятор стал показывать там исключение, которое гласит, что "canvas does not allow drawing" и указывает на строчку создания формы. Что это значит?
Amoeba (2006-07-12 15:32:00) [33]
> Yegorchic © (12.07.06 15:24) [19]
> см. [0] выше с поправкой из [13].
Т.е. код создания формы из DLL находится в модуле хоста? Переменная newform объявлена там же, и, следовательно основное приложение т.о. "знает" класс Tnewform?
Не здесь ли источник проблем?
Yegorchic (2006-07-12 15:24:00) [34]см. [0] выше с поправкой из [13].
Amoeba (2006-07-12 15:11:00) [35]
> код с созданием формы у меня находится в кнопке,
Как выглядит этот код?
Yegorchic (2006-07-12 14:56:00) [36]
> Действительно ли так необходимо пихать форму в DLL
Да. Именно необходимо.
Amoeba (2006-07-12 14:54:00) [37]Действительно ли так необходимо пихать форму в DLL, создавая этим себе массу проблем, ряд из которых неразрешим без компилялиции и основной программы, и DLL с пакетами?
Yegorchic (2006-07-12 14:50:00) [38]А нет, не заработало :-( Только "кол-во показов" увеличилось, кажется, но всё равно нормально не работает :-(
Yegorchic (2006-07-12 14:46:00) [39]СПАСИБО! Кажется всё заработало! Ну раз 10 точно открылось :-)
Спасибо.
isasa (2006-07-12 14:37:00) [40]Щас начнется :0
поменяй
if newform = nil then newform:=Tnewform.Create(Application);
на
if newform = nil then newform:=Tnewform.Create(nil);