|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Реализация немодальной формы в библиотеке
Приветствуем, форумчан.
Требуется библиотека с двумя процедурами: 1. Если форма не создана то создать и вывести на передний план, если создана то вывести на передний план. 2. Если форма создана уничтожить. Форма должна быть VCL без использования WinApi и иметь свою собственную обработку сообщений. Вызываться будет из проекта написанного на Delphi на код которого повлиять нет возможности. В интернете рабочей реализации не нашли. При вызове FormDll.Close; в библиотеке завершается цикл сообщений основной программы. При закрытии самой формы цикл завершается и при повторном вызове не отрабатывает, по ощущения что-то сидит внутри объекта TApplication. На WinApi реализовалось успешно, но нет желания терять возможности VCL. |
#2
|
|||
|
|||
Кривой но рабочий пример реализации
Пришлось добавить чуточки WinApi и создать экземпляр TApplication.
Без понимания почему, но работает. Единственное при завершении основной программы не происходит выход из цикла сообщений в библиотеке, пробовали ProcessMessages; Может кто в теме как реализовать без костылей без WinApi? Исходники прилагаем. |
#3
|
|||
|
|||
Не работает, потому что в обычной dll и в основном приложении объект TApplication - это 2 разных объекта (как и TObject, кстати). Можно было бы пойти через bpl, но там без залезания в основную программу, вроде, не получится. Есть возможность передавать Application из основной программы в методы dll? Если да, то можно попробовать так.
|
#4
|
|||
|
|||
TApplication разный, так и должно быть!
lmikle не согласимся когда посылаем PostQuitMessage(0); в приложении на winapi отрабатывает на ура, а когда в VCL то завершается цикл сообщений основного приложения. Будьте добры соберите исходники и проверьте. Объект TApplication что-то содержит внутри что не даёт данному решению отрабатывать как задумано.
|
#5
|
|||
|
|||
Дык тут особенность именно реализации VCL. При закрытии главной формы, а для Application в dll это и есть твоя форма, происходит закрытие приложения.
Попробуй вот такой фокус. При создании Application в dll, сначала создай невидимую форму. Она будет главной формой Application в dll. Тогда закрытие твоей формы уже не должно закрывть приложение. |
#6
|
|||
|
|||
Не поможет!
1. Если форма не создана то создать и вывести на передний план, если создана то вывести на передний план. 2. Если форма создана уничтожить. 2 подпрограмма обязана полностью завершать цикл сообщений формы библиотеки, а при завершение мы упираемся в реализацию VCL в не зависимости от количества форм. Также есть необходимость масштабировать шрифт по высоте и ширине элемента! Высота символа шрифта=высота элемента*процентное соотношение высоты/100. Ширина символа шрифта=ширина элемента*процентное соотношение ширины/100/количество символов. На WinApi проблем нет createfont позволяет, при использовании VCL ступор есть Height и Size и оба отвечают за высоту и переписывают друг друга. При уменьшении элемента нет масштабирования в ширину и в результате текст выходит за границы. Пока пробуем обыгрывать это соотношениями сторон, но получается не очень. Сдаётся, доделывать далее так и придётся на WinApi) |