Carregando um Form em um Windows Service

Nesse artigo irei mostrar como carregar um form dentro de um windows service. Esse recurso poderá ser útil se vc deseja parametrizar o seu serviço usando uma interface gráfica.

Olá Pessoal, no artigo Criando um Windows Service eu mostrei como criar um windows service passo a passo. Agora veremos como carregar um form dentro desse serviço.

Talvez você esteja se perguntando para que carregar um formulário dentro de um serviço windows. Bem! A resposta é simples. Se você por exemplo criou um serviço para replicar dados entre banco de dados. Os bancos origem e destino talvez estejam configurados dentro de um arquivo INI. Mas ai você gostaria que na inicialização do serviço essa parametrização fosse feita. Então! Para resolver esse problema vamos checar quais alterações serão necessárias. Pois no exemplo abaixo criaremos um formulário para o usuário fazer o login. Se a senha for diferente de 1234 então serviço não será executado.

1) Primeiro certifique-se que as propriedades AllowPause, AllowStop e Interactive estejam marcadas como true

2) Crie uma variável no escopo Private chamada FLogado para sabermos se o usuário esta logado no serviço. Veja o código da classe do meu serviço logo abaixo:

TService3 = class(TService) procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceExecute(Sender: TService); private { Private declarations } FLogado: Boolean; public function GetServiceController: TServiceController; override; { Public declarations } end;

3) Implemente o Evento OnExecute com o código abaixo:

procedure TService3.ServiceExecute(Sender: TService); begin // o servico so executara se a aplicação não terminou e se o usuário está logado while (not self.Terminated) and (FLogado) do ServiceThread.ProcessRequests(true); // se o cara não está logado, muda o status do servico para STOP if not FLogado then Self.Status := csStopped; end;

4) No evento OnExecute vamos criar o nosso formulário MODAL com o código abaixo:

procedure TService3.ServiceStart(Sender: TService; var Started: Boolean); begin Application.CreateForm(TForm1, Form1); try // a variavel esta sendo atualizada apos o fechamento do form FLogado := Form1.ShowModal = mrOk; finally Form1.Free; end; end;

5) Agora vamos verificar como o meu formulário "SIMPLES" de login está feito. Atenção! Ele está com essa aparência ruim só para ilustração do nosso exemplo. Não perdi tempo com detalhes! hehehehe!

6) No evento OnClick implemente o código abaixo.

procedure TForm1.Button1Click(Sender: TObject); begin if Edit1.Text <> '1234' then exit; ModalResult := mrOK; end;

7) Agora vamos testar o nosso serviço:

a) abra o prompt de comando e digite:

Após compilar o projeto, eu copie o arquivo Project1.exe para dentro do c:\ para que a linha de comando ficasse o mais simples possível. Após a execução do comando você receberá uma msg Service Instaled.

b) No painel de controle, ferramentas administrativas execute o aplicativo SERVICOS. Localize o seu serviço dentro da lista de serviços instalados, selecione-o e em seguida clique em Start.

Observe na figura que a barra de instalação do serviço ao chegar numa posição X ele fica parada aguardando o fechamento do formulário de parâmetros que foi criado (FORM MODAL). Se o usuário não informar a senha correta "1234" então após ele fechar a janela o resultado da property ModalResult será diferente de mrOK. Então o serviço não conseguirá ser INICIADO e a seguinte msg será exibida.

Artigos relacionados