Carregando um Form em um Windows Service

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (11)  (1)

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 abaixo eu mostrei como criar um windows service passo a passo:
 
http://www.devmedia.com.br/articles/viewcomp.asp?comp=7867
 
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 RIDICULA 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 dentra 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.



Mais uma dica prática para a coleção!
Para dúvidas ou treinamentos
reneuece@ig.com.br













 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?