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

Propriedades

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!

aparencia

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:

serviço

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.

aplicativo serviços

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.

mensagem