Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-1085816437
Knight
2004-05-29 11:40
2004.06.13
Как правильно прилипание окна сделать?


3-1085379751
DimonNew
2004-05-24 10:22
2004.06.13
ADO и кэширование данных


14-1085176317
lak
2004-05-22 01:51
2004.06.13
http://www.artlebedev.ru


1-1085766831
Senti
2004-05-28 21:53
2004.06.13
Убрать приложение из Таскбара


3-1085388083
NewUser
2004-05-24 12:41
2004.06.13
Система безопасности в IB6





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский