Доступ к компонентам класса TDaemon

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Доступ к компонентам класса TDaemon

Сообщение jsa » 22.05.2023 09:46:20

Переделываю программу в службу.
Столкнулся со странностью, с которой ранее при написании служб не сталкивался.

В обычной программе такие компоненты как TMSSQLConnection и т.д. набросанные на форме/датамодуле, доступны из процедур не входящих в класс формы/модуля
т.е. я просто пишу имя модуля и обращаюсь к компонентам в нем. например Form1.MSSQLConnection1
А в службе это вызывает ошибку, при любом действии даже при прописывании параметров подключения mySrv.MSSQLConnection1.HostName:=SrvName;
try except в логи пишет ошибку EAccessViolation: Access violation
Т.е. компонент не доступен снаружи класса mySrv.
При этом если если процедуру прописать в класс, то все отрабатывает как положено.
Цель у меня вообще обращаться к компонентам не просто из процедур вне класса, а из соседних модулей.
Получается в службе/демоне это нельзя делать?
Или что-то нужно прописать дополнительно?

Добавлено спустя 3 минуты 23 секунды:
Вот тут интересно расписано про "дружественность" классов к компонентам друг друга в Delphi
https://www.gunsmoker.ru/2013/02/delphi ... ss.html#t3
получается что в Lazarus TDaemon по умолчанию закрыт от других классов т.е. "НЕ дружественный"
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Доступ к компонентам класса TDaemon

Сообщение sts » 22.05.2023 12:07:30

Form1 это переменная, прежде чем к ней обращаться надо ей присвоить значение
В обычном режиме присвоение оформлено так
Application.CreateForm(TForm1, Form1); в lpr файле, где в CreateForm второй параметр out,
если такого нет, можно присвоить
Form1:= TForm1.Create(например, nil);

к сожалению в делфе (что в последствии перешло на лазарус) этот момент - архитектура приложения в части организации форм, сделан криво и прибито намертво, без возможности нормально ее менять

Добавлено спустя 32 минуты 11 секунд:
я наврал, в лазарусе есть нужное
unit daemonapp
TCustomDaemonApplication
CreateForm
у вас там класс наследник от TCustomDaemonApplication
создаете формы как и в обычном режиме
правда я не вижу примеров использования
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Доступ к компонентам класса TDaemon

Сообщение jsa » 22.05.2023 13:41:04

sts
я вообще не понял к чему ваш комментарий.
1. Form1 я просто привел в пример, по умолчанию в новом проекте создание формы как вы пишите ("это переменная, прежде чем к ней обращаться надо ей присвоить значение"), нормально создается и Application.CreateForm( прописывается автоматически. К чему вы это все написали я не понял.

2. "у вас там класс наследник от TCustomDaemonApplication создаете формы как и в обычном режиме" - не понял зачем мне в службе формы?
TDaemon наследуется от TCustomDaemon тот в свою очередь от TDataModule
С дата модулем я работаю в Lazarus почти в каждом проекте там точно так же как с TForm , создается кастомный класс TDM = class(TDataModule)
потом объявляется переменная var DM: TDM; и идет обращение к объектом в датамодуле через DM.

3. в службах/демонах не делается Application.CreateForm() , а делается регистрация класса
procedure RegisterDaemon;
begin
RegisterDaemonClass(TmySrv)
end;
и
initialization RegisterDaemon;

В общем спасибо за попытку, но вашу идею я не понял.
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Доступ к компонентам класса TDaemon

Сообщение sts » 22.05.2023 17:22:08

mySrv.MSSQLConnection1.HostName:=SrvName;
try except в логи пишет ошибку EAccessViolation: Access violation

это говорит о том что mySrv не создан, вариант mySrv создан а его mySrv.MSSQLConnection1 не создан технически возможно если была выполнена процедура создания mySrv без загрузки lfm а это надо еще суметь, возможно какето исключение возникает в конструкторе которое гасится

Добавлено спустя 1 минуту 56 секунд:
в службах/демонах не делается Application.CreateForm() , а делается регистрация класса

вово, а нужно делать иначе в mySrv не будет то что ожидается

Добавлено спустя 3 минуты 26 секунд:
либо не работать через mySrv что самое верное и в чем заключается архитектурный косяк делфы

Добавлено спустя 2 минуты 20 секунд:
jsa писал(а):TDM = class(TDataModule)
потом объявляется переменная var DM: TDM;

а потом надо DM:= TDM.Create(nil);
и только потом
jsa писал(а):идет обращение к объектом в датамодуле через DM.


Добавлено спустя 1 минуту 17 секунд:
а при завершении работы
FreeAndNil(DM);
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Доступ к компонентам класса TDaemon

Сообщение jsa » 23.05.2023 06:29:00

sts писал(а):это говорит о том что mySrv не создан, вариант mySrv создан а его mySrv.MSSQLConnection1 не создан технически возможно если была выполнена процедура создания mySrv без загрузки lfm а это надо еще суметь, возможно какето исключение возникает в конструкторе которое гасится

Это врятли. Напоминаю, в первом же сообщении сразу написал
"При этом если если процедуру прописать в класс, то все отрабатывает как положено."
Т.е. Объект СОЗДАН. Но работа с его компонентами возможна ТОЛЬКО внутри класса.
Еще раз проблема не в отсутсвии объекта-экземпляра класса, а в том что доступ к нему ОГРАНИЧЕН.

Добавлено спустя 4 часа 23 минуты 40 секунд:
Пока решил вопрос так. Удалил с формы DataModule объекты, и прописал их создание в модулях вручную. Так с доступом нет проблем.
Но вопрос все равно остается почему объект класса TDaemon так себя и ведет и можно ли это обойти.
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Доступ к компонентам класса TDaemon

Сообщение sts » 23.05.2023 11:22:49

jsa писал(а):Еще раз проблема не в отсутсвии объекта-экземпляра класса, а в том что доступ к нему ОГРАНИЧЕН.

это из серии чудес. ссылка в первом посте, там говорится о доступе к private полям класса, это ограничение проявляется на этапе компиляции.
EAccessViolation: Access violation говорит о том что не помещен в переменную созданный экземпляр класса
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Доступ к компонентам класса TDaemon

Сообщение jsa » 23.05.2023 12:03:00

sts писал(а):это из серии чудес.

Давно бы уже создал проект, набросал компоненты, создал процедуру вне класса и попробовал бы обратиться к компонентам в классе.
Нет чего-то разглагольствует.
sts писал(а):ссылка в первом посте, там говорится о доступе...

По этой ссылке описана НЕ моя ситуация, а чем-то схожая. Так что не притягивай ее как есть.

И еще раз.
Хватит разглагольстовать, ты же не знаешь в точности ситуацию, а только теоретизируешь, "так не может быть, сяк не может быть..."
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04

Re: Доступ к компонентам класса TDaemon

Сообщение sts » 23.05.2023 15:30:54

jsa писал(а):Давно бы уже создал проект, набросал компоненты, создал процедуру вне класса и попробовал бы обратиться к компонентам в классе.

каждый день такое работает, кинь минимальный огрызок своего проекта, посмотрю где там косяк
jsa писал(а):И еще раз.
Хватит разглагольстовать, ты же не знаешь в точности ситуацию, а только теоретизируешь, "так не может быть, сяк не может быть..."

ну судя по твоим сообщениям ты несколько неверно понимаешь как классы работают
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Доступ к компонентам класса TDaemon

Сообщение jsa » 30.05.2023 07:13:23

sts писал(а):каждый день такое работает, кинь минимальный огрызок своего проекта, посмотрю где там косяк
спс, как разгребу работу, вспомню и сооружу тестовый проект.

sts писал(а): ну судя по твоим сообщениям ты несколько неверно понимаешь как классы работают

Я много не понимаю в том как классы работают. Разбираться приходится по мере решения практических задач.
jsa
постоялец
 
Сообщения: 282
Зарегистрирован: 28.11.2017 13:46:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru