Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];
ВнизВызов формы из процесса Найти похожие ветки
← →
Фдуч (2004-06-02 12:43) [0]Как правильно создать форму из сервиса. Если form1:= TForm1.Create(Application), то получается что ее деструктор не вызывается до выгрузки самого сервиса. А если form1:= TForm1.Create(service1 или nil) то форма, сворачиваясь, убирается в левай нижний край экрана а не в таск бар, как хотелось бы.
← →
Digitman © (2004-06-02 14:19) [1]
> Фдуч
интерактивный сервис - это блажь
нечего сервису делать в панели задач, панель задач отражает состояние обычных приложений, а не сервисов
если же так необходимо интерактивно управлять с пом.формы параметрами работы сервиса, то на это есть апплеты панели управления, в кр.случае - обычное приложение
кр.того, можно реализовать сервис-приложение таким образом, что в зависимости от использования оно будет стартовать в разное время и как сервис-приложение и как обычное приложение
← →
Digitman © (2004-06-02 14:22) [2]
> до выгрузки самого сервиса
под этим можно подразумевать все что угодно : и завершение процесса SevriveApplication и разрушение объекта TService
← →
Фдуч (2004-06-02 15:01) [3]Вообще то конечная цель - сервис, висящий на TCP порту и обслуживающий клиентов. В трее от него есть иконка. По ней клик и видим окошко, отображающее текущую активность. Вот откуда его создавать и проблема. Если прямо из сервиса, то проще передавать данные для визуализации процессов. А если отдельным exe упаковывать, то как эти данные туда пихать не совсем ясно.
← →
jack128 © (2004-06-02 15:07) [4]
> Если form1:= TForm1.Create(Application), то получается что
> ее деструктор не вызывается до выгрузки самого сервиса.
>
а что мешает те самому вызвать деструктор когда тебе это нужно??
← →
Digitman © (2004-06-02 15:13) [5]так, а панель задач здесь причем ?
щелкнул на иконке в трее - открылась форма
щелкнул на иконке закрытия формы - форма вновь свернулась в трей-иконку
> Если прямо из сервиса, то проще передавать данные для визуализации
> процессов
чем же проще ? и намного ли проще ? все равно каким-то образом нужно организовывать коммуникацию между сервис-трэдом и объектом-формой.. это м.б. и MMF, и NamedPipes и оконные сообщения (если, конечно, сервис имеет св-во интерактивного взаимодействия с тек.десктопом)
← →
Фдуч (2004-06-02 15:21) [6]С удовольствием бы. Только если из сервиса делаешь Form1.Free, то форма уничтожается. А вот если по кресту на самой форма кликать, то она становится неактивной и ждет, пока сервис не остановится.
← →
Фдуч (2004-06-02 15:26) [7]> Digitman. Если форма - часть приложения сервиса, то мне вообще не надо огород городить с передачей данных. Описываю набор переменных внутри приложения и отрисовываю их на форме в нужном формате.
← →
Digitman © (2004-06-02 15:34) [8]
> Только если из сервиса делаешь Form1.Free, то форма уничтожается
зачем ?
если владельцем формы будет объект TService, то форма будет автоматически уничтожена перед уничтожением объекта TService, который уничтожается после остановки сервиса
> А вот если по кресту на самой форма кликать, то она становится
> неактивной и ждет, пока сервис не остановится.
а как же ты хотел иначе ? объект ServiceApplication, контролирующий интерактивный ввод/вывод, вместо цикла выборки/диспетчеризации сообщений в этот момент занят ожиданием завершения сервис-трэда
← →
Digitman © (2004-06-02 15:40) [9]
> Описываю набор переменных внутри приложения и отрисовываю
> их на форме в нужном формате
угу.. как бы не так !
не забывай, что ключевая функциональность сервиса исполняется в дополнительном трэде (сервис-треде), и напрямую общаться с виз.контролами формы без синхронизации с осн.код.потоком ServApp-процесса ты не имеешь права ... а раз требуется синхронизация, то требуется либо воспользоваться методом TServiceThread.Synchronize() (что невозможно сделать "в лоб", ибо это защищенный метод), либо задействовать иной механизм интерпоточной коммуникации (о чем я и говорил выше)
← →
Фдуч (2004-06-02 15:43) [10]Так хочу что бы закрылась. В итоге то как лучше поступить? Может в отдельный поток ее как-нибудь прикрутить. Или все таки отдельное приложение писать придется.
← →
Digitman © (2004-06-02 15:49) [11]
> Фдуч
я что-то не понял - ты хочешь чтобы по клику на кресте формы она исчезла с экрана и тут же сервис был остановлен ? так что ли ?
← →
Фдуч (2004-06-02 15:53) [12]Нет конечно. По кресту на форме должна только форма уничтожиться и все.
← →
Фдуч (2004-06-02 15:56) [13]Хотелось бы подитожить. Какой все таки наиболее приемлемый способ все это организовать?
← →
Digitman © (2004-06-02 15:59) [14]ну тогда я не понимаю, что ты там такого творишь в коде формы, что ее разрушение приводит к останову сервиса
ты поди конструктор формы вызываешь в dpr, а вызывать его следует в событии TService.Create.. видимо, не понимаешь, что одно и тоже сервис-приложение может создавать более одного сервиса (т.е. в дан.случае объект TService ), каждый из которых представляет собой отдельную независимую службу
← →
Digitman © (2004-06-02 16:06) [15]
> В трее от него есть иконка. По ней клик и видим окошко,
> отображающее текущую активность
в обработчике клика и создавай форму (владелец формы - объект TMyService), перед этим проверив, не существует ли уже форма (если существует - вывести ее на передний план и передать ей фокус ввода)
← →
Фдуч (2004-06-02 16:07) [16]Похоже я не правильно донес мысль. Разверну. Ни какой самопроизвольной остановки сервиса не происходит. Проблема в том, что окно по клику на кресте остается висеть в неактивном состоянии. А вот если через управление сервисом его ручками остановить, то только в этот момент и происходит уничтожение формы.
← →
Digitman © (2004-06-02 16:09) [17]
> Фдуч (02.06.04 16:07) [16]
где, в каком месте, при каком событии ты создаешь форму и где фиксируешь полученную ссылку на созданный ее экземпляр ?
код приводи
← →
Фдуч (2004-06-02 16:18) [18]type
TsrvRoson = class(TService);
ctrBrkSrv: TCoolTrayIcon;
miCurActivity: TMenuItem;
procedure miCurActivityClick(Sender: TObject);
...
procedure TsrvRoson.miCurActivityClick(Sender: TObject);
var
FindForm: TComponent;
begin
FindForm:=Application.FindComponent("frmActivs");
if FindForm=nil then Application.CreateForm(TfrmActivs, frmActivs)
else with FindForm as TForm do
begin
if WindowState=wsMinimized then WindowState:=wsNormal;
BringToFront;
end;
frmActivs.Show;
end;
Вот собственно и весь код. Форма появляется. Сворачивается, разворачивается, а вот убираться не желает. У формы на onClose висит Action:= caFree
← →
Digitman © (2004-06-02 17:17) [19]TsrvRoson = class(TService)
..
private
frmActivs: TfrmActivs;
..
public
property FormActivs: TfrmActivs read frmActivs;
end;
TfrmActivs = class(TForm)
public
descructor Destroy; override;
end;
procedure TsrvRoson.miCurActivityClick(Sender: TObject);
begin
if not Assigned(frmActivs) then
frmActivs := TfrmActivs.Create(Self);
with frmActivs do
if not Visible then
Show
else
begin
... // разворачивание формы и/или вынос ее на передний план
end;
end;
destructor TfrmActivs.Destroy;
begin
if Assigned(Owner) and (Owner is TsrvRoson) then
TsrvRoson(Owner).FormActivs := nil;
inherited;
end;
← →
Фдуч (2004-06-02 17:37) [20]Попробовал. На TsrvRoson(Owner).FormActivs := nil ругается мол нельзя присвоить для Read only property. Но в общем спасибо. Курс наметил, дальше разгребу.
← →
WebErr © (2004-06-02 17:39) [21]В обработчике OnClose попробуйте Action := caFree; ;)
← →
Digitman © (2004-06-02 17:39) [22]property FormActivs: TfrmActivs read frmActivs write frmActivs;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.702 c