|
|
Регистрация | << Правила форума >> | 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) |
#7
|
|||
|
|||
Почти финал
После долгих изысканий найдено решение FreeAndNil(App);
Единственное при закрытие из вне ловим системную ошибку доступа: 5 Вопрос ведающим, стоит ли его использовать? Исходники прилагаем! |
#8
|
|||
|
|||
FreeAndNil вызывает тот же Free. Просто дополнительно присваивает Nil переданной переменной. Грубо говоря, реализация FreeAndNil такая:
Код:
procedure FreeAndNil(var O : TObject); begin If Assigned(O) Then O.Free; O := Nil; end; |
#9
|
|||
|
|||
FreeAndNil
Приветствуем.
FreeAndNil вызывается на событие формы OnClose! Если закрыть форму ручками то ошибка не происходит, а если вызвать метод OnClose програмно, то и ловим System Error: 5 отказано в доступе. Почему, пока не можем понять? |
#10
|
|||
|
|||
Нельзя вызывать FreeAndNil на себя из объекта (формы в твоем случае), т.к. после этого тдет взврат управления в событие, а объекта уже не существует. Если надо уничтожать форму при закрытии, установи параметр OnClose CloseAction в caFree. Тогда VCL сама вызовет деструктор в правильный момент.
|
#11
|
|||
|
|||
Реализация на WinApi
На VCL нормально реализовать не получилось!
Пример работающий без глюков во вложении. |