Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.13;
Скачать: CL | DM;

Вниз

Вызов формы из процесса   Найти похожие ветки 

 
Фдуч   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.026 c
9-1076665683
ZAROLF
2004-02-13 12:48
2004.06.13
TEdit в Delphix


6-1082626827
-=Rezya=-
2004-04-22 13:40
2004.06.13
WinPCap-кара божья или манна небесная.


1-1085726881
errorr
2004-05-28 10:48
2004.06.13
Галочки в stringgrid


3-1085035035
NoName
2004-05-20 10:37
2004.06.13
DBGridEh


14-1085206733
<skipped>
2004-05-22 10:18
2004.06.13
Где скачать Delphi 7 Personal???