Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.12.2021, 00:39
chiacorp chiacorp вне форума
Прохожий
 
Регистрация: 03.12.2021
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Реализация немодальной формы в библиотеке

Приветствуем, форумчан.
Требуется библиотека с двумя процедурами:
1. Если форма не создана то создать и вывести на передний план, если создана то вывести на передний план.
2. Если форма создана уничтожить.
Форма должна быть VCL без использования WinApi и иметь свою собственную обработку сообщений.
Вызываться будет из проекта написанного на Delphi на код которого повлиять нет возможности.
В интернете рабочей реализации не нашли.
При вызове FormDll.Close; в библиотеке завершается цикл сообщений основной программы.
При закрытии самой формы цикл завершается и при повторном вызове не отрабатывает, по ощущения что-то сидит внутри объекта TApplication.
На WinApi реализовалось успешно, но нет желания терять возможности VCL.
Вложения
Тип файла: 7z FormInDll.7z (22.2 Кбайт, 0 просмотров)
Ответить с цитированием
  #2  
Старый 10.12.2021, 09:58
chiacorp chiacorp вне форума
Прохожий
 
Регистрация: 03.12.2021
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Кривой но рабочий пример реализации

Пришлось добавить чуточки WinApi и создать экземпляр TApplication.
Без понимания почему, но работает.
Единственное при завершении основной программы не происходит выход из цикла сообщений в библиотеке, пробовали ProcessMessages;
Может кто в теме как реализовать без костылей без WinApi?
Исходники прилагаем.
Вложения
Тип файла: 7z FormInDll.7z (22.4 Кбайт, 0 просмотров)
Ответить с цитированием
  #3  
Старый 10.12.2021, 18:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,833
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не работает, потому что в обычной dll и в основном приложении объект TApplication - это 2 разных объекта (как и TObject, кстати). Можно было бы пойти через bpl, но там без залезания в основную программу, вроде, не получится. Есть возможность передавать Application из основной программы в методы dll? Если да, то можно попробовать так.
Ответить с цитированием
  #4  
Старый 10.12.2021, 22:49
chiacorp chiacorp вне форума
Прохожий
 
Регистрация: 03.12.2021
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию TApplication разный, так и должно быть!

lmikle не согласимся когда посылаем PostQuitMessage(0); в приложении на winapi отрабатывает на ура, а когда в VCL то завершается цикл сообщений основного приложения. Будьте добры соберите исходники и проверьте. Объект TApplication что-то содержит внутри что не даёт данному решению отрабатывать как задумано.
Ответить с цитированием
  #5  
Старый 11.12.2021, 00:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,833
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Дык тут особенность именно реализации VCL. При закрытии главной формы, а для Application в dll это и есть твоя форма, происходит закрытие приложения.
Попробуй вот такой фокус. При создании Application в dll, сначала создай невидимую форму. Она будет главной формой Application в dll. Тогда закрытие твоей формы уже не должно закрывть приложение.
Ответить с цитированием
  #6  
Старый 11.12.2021, 17:20
chiacorp chiacorp вне форума
Прохожий
 
Регистрация: 03.12.2021
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Не поможет!
1. Если форма не создана то создать и вывести на передний план, если создана то вывести на передний план.
2. Если форма создана уничтожить.
2 подпрограмма обязана полностью завершать цикл сообщений формы библиотеки, а при завершение мы упираемся в реализацию VCL в не зависимости от количества форм.

Также есть необходимость масштабировать шрифт по высоте и ширине элемента!
Высота символа шрифта=высота элемента*процентное соотношение высоты/100.
Ширина символа шрифта=ширина элемента*процентное соотношение ширины/100/количество символов.
На WinApi проблем нет createfont позволяет, при использовании VCL ступор есть Height и Size и оба отвечают за высоту и переписывают друг друга. При уменьшении элемента нет масштабирования в ширину и в результате текст выходит за границы. Пока пробуем обыгрывать это соотношениями сторон, но получается не очень.

Сдаётся, доделывать далее так и придётся на WinApi)
Ответить с цитированием
  #7  
Старый 22.12.2021, 17:23
chiacorp chiacorp вне форума
Прохожий
 
Регистрация: 03.12.2021
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Почти финал

После долгих изысканий найдено решение FreeAndNil(App);
Единственное при закрытие из вне ловим системную ошибку доступа: 5
Вопрос ведающим, стоит ли его использовать?
Исходники прилагаем!
Вложения
Тип файла: 7z temp.7z (23.2 Кбайт, 1 просмотров)
Ответить с цитированием
  #8  
Старый 24.12.2021, 01:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,833
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

FreeAndNil вызывает тот же Free. Просто дополнительно присваивает Nil переданной переменной. Грубо говоря, реализация FreeAndNil такая:
Код:
procedure FreeAndNil(var O : TObject);
begin
  If Assigned(O) Then O.Free;
  O := Nil;
end;
Т.е. ошибка доступа совершенно не связанна с FreeAndNil. Как я понимаю, ты вызываешь FreeAndNil из основной программы. Таким образом, похоже, происходит освобождение памяти, выделенной в DLL, в основном модуле. Отсюда, походу, и ошибка. Я бы попробовал вызывать FreeAndNil из DLL.
Ответить с цитированием
  #9  
Старый 26.12.2021, 21:00
chiacorp chiacorp вне форума
Прохожий
 
Регистрация: 03.12.2021
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию FreeAndNil

Приветствуем.
FreeAndNil вызывается на событие формы OnClose!
Если закрыть форму ручками то ошибка не происходит, а если вызвать метод OnClose програмно, то и ловим System Error: 5 отказано в доступе.
Почему, пока не можем понять?
Ответить с цитированием
  #10  
Старый 27.12.2021, 23:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,833
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Нельзя вызывать FreeAndNil на себя из объекта (формы в твоем случае), т.к. после этого тдет взврат управления в событие, а объекта уже не существует. Если надо уничтожать форму при закрытии, установи параметр OnClose CloseAction в caFree. Тогда VCL сама вызовет деструктор в правильный момент.
Ответить с цитированием
  #11  
Старый 31.12.2021, 10:48
chiacorp chiacorp вне форума
Прохожий
 
Регистрация: 03.12.2021
Сообщения: 10
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Реализация на WinApi

На VCL нормально реализовать не получилось!
Пример работающий без глюков во вложении.
Вложения
Тип файла: 7z temp.7z (24.0 Кбайт, 0 просмотров)
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram