Lista de Exercícios Resolvidos: Java | Python | VisuAlg | Portugol | C | C# | VB.NET | C++
Você está aqui: Delphi ::: Dicas & Truques ::: Serviços (Service Applications)

Como criar um serviço (Service applications) usando Delphi

Quantidade de visualizações: 25131 vezes
Serviços ou aplicações de serviços ou ainda serviços do Windows (Service applications) são aplicações que são executadas nos bastidores, sem interface gráfica (GUI - Graphical User Interface) e geralmente não recebem entrada do usuário.

Aplicações deste tipo são automaticamente iniciadas juntamente com o Windows e podem ser pausadas, paradas ou reiniciadas. Para ver uma lista de serviços do Windows e o status de cada um basta acessar Painel de Controle -> Ferramentas administrativas -> Serviços.

Mas, antes de iniciarmos, qual o propósito de um serviço do Windows? Este tipo de aplicação é projetado para funcionar durante todo o tempo em que o Windows estiver ativo, talvez monitorando recursos, verificando status de servidores ou aplicações, acessando contas de e-mail, baixando arquivos, atualizando aplicações, etc.

Então, vamos criar nossa primeira aplicação serviço. Siga atentamente os passos abaixo:

1) Vá em File -> New -> Other. Marque Delphi Project e selecione Service Application. Clique OK. O Delphi criará uma unit juntamente com o projeto. Salve o projeto com o nome de "ACServico.dproj" e a unit com o nome de "ACServicoUnit.pas". Note que a unit contém um "formuláriozinho" (veja isso pressionando a tecla F12) que herda de TService e serve para arrastarmos e colocarmos nele os controles não visuais que nosso serviço conterá.

2) Chegou a hora de dar um nome para o serviço. Para isso clique no formulário e acesse sua propriedade Name. É importante ter muita atenção na escolha do valor para esta propriedade, já que tal valor será usado na criação de uma chave no registro do Windows sob HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services. Não use espaços ou caracteres especiais e escolha um nome que terá poucas chances de outra pessoa ou empresa criar um igual (se houver conflito de nomes de serviços em seu PC o Windows poderá evitar a execução de ambos). Para esta demonstração vamos dar o nome de "ac_servico_update".

3) Vamos agora definir um valor para a propriedade DisplayName. Aqui nós podemos usar um nome mais amigável, contendo espaços e caracteres especiais. O valor desta propriedade aparecerá na lista de serviços em Painel de Controle -> Ferramentas administrativas -> Serviços. Para este exemplo vamos definir o valor "AC Serviços Update" para a propriedade DisplayName.

4) Pronto! Pode parecer simples mas já temos nosso primeiro serviço. Apenas revise o código do projeto ACServico.dproj e veja se está bem parecido ao que temos abaixo:

program ACServico;

uses
  SvcMgr,
  ACServicoUnit in 'ACServicoUnit.pas' {ac_servico_update: TService};

{$R *.RES}

begin
  // Windows 2003 Server requires StartServiceCtrlDispatcher to be
  // called before CoRegisterClassObject, which can be called indirectly
  // by Application.Initialize. TServiceApplication.DelayInitialize allows
  // Application.Initialize to be called from TService.Main (after
  // StartServiceCtrlDispatcher has been called).
  //
  // Delayed initialization of the Application object may affect
  // events which then occur prior to initialization, such as
  // TService.OnCreate. It is only recommended if the ServiceApplication
  // registers a class object with OLE and is intended for use with
  // Windows 2003 Server.
  //
  // Application.DelayInitialize := True;
  //
  if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
  Application.CreateForm(Tac_servico_update, ac_servico_update);
  Application.Run;
end.


Agora revise o código da unit ACServicoUnit.pas e veja se está parecido com:

 
unit ACServicoUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;

type
  Tac_servico_update = class(TService)
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  ac_servico_update: Tac_servico_update;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ac_servico_update.Controller(CtrlCode);
end;

function Tac_servico_update.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

end.

5) Hora de compilar o projeto e instalar o serviço. Vá em Project -> Build ACServico. Vá no diretório no qual você salvou o projeto e terá um arquivo chamado ACServico.exe. Agora vamos instalar o serviço. Abra uma janela de terminal e navegue até o diretório no qual o serviço foi salvo:

C:\Documents and Settings\Osmar>cd C:\estudos_delphi\servicos

Agora dispare o seguinte comando:

C:\estudos_delphi\servicos>ACServico.exe /install

Se o serviço for instalado com sucesso você verá a mensagem "Service installed successfully". Agora vá em Painel de Controle -> Ferramentas administrativas -> Serviços e veja se o serviço já está na lista de serviços e qual seu status. Para desinstalar o serviço basta disparar:

C:\estudos_delphi\servicos>ACServico.exe /uninstall

Se o serviço for desinstalado com sucesso teremos a mensagem "Service uninstalled successfully".

Mas, temos agora um serviço que pode ser instalado, iniciado, parado, reiniciado, desinstalado mas que não faz nada de útil. Basta ver minhas outras dicas sobre o assunto para saber como implementar a funcionalidade que você deseja.

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.

Link para compartilhar na Internet ou com seus amigos:

C# ::: Namespace System.Drawing ::: Image

Como usar o método FromFile() da classe Image do C# para criar um objeto desta classe a partir de um arquivo de imagem JPG, GIF, PNG, BMP, etc

Quantidade de visualizações: 6861 vezes
Em algumas situações precisamos criar um objeto Image a partir de um arquivo de imagem JPG, GIF, PNG, BMP, etc. Isso pode ser feito por meio do método estático FromFile() da classe Image. Veja sua assinatura:

public static Image FromFile(string filename)
Note que o método recebe uma string identificando o nome do arquivo da imagem e retorna um objeto da classe Image.

Veja um trecho de código no qual usamos o método FromFile() para criar um objeto Image a partir de uma imagem JPG em um determinado diretório. Em seguida usamos a Image construída para exibir a imagem em um PictureBox:

private void button1_Click_1(object sender, EventArgs e){
  // constrói um objeto Image a partir do endereço da image
  Image imagem = Image.FromFile(@"C:\estudos_csharp_wf\logo.jpg");
  // atribui a imagem construída à propriedade Image
  pictureBox1.Image = imagem;
}

É importante observar que o método FromFile() pode disparar as seguintes exceções:

a) OutOfMemoryException - O arquivo não contém um formato de imagem válido ou o GDI+ não suporta o formato de pixel para o arquivo.

b) FileNotFoundException - O arquivo de imagem indicado não existe.

Assim, é sempre uma boa idéia colocar o código acima em um bloco try..catch. Veja como isso pode ser feito:

private void button1_Click_1(object sender, EventArgs e){
  try{
    // constrói um objeto Image a partir do endereço da image
    Image imagem = Image.FromFile(@"C:\estudos_csharp_wf\logoi.jpg");
    // atribui a imagem construída à propriedade Image
    pictureBox1.Image = imagem;
  }
  catch (Exception ex){
    MessageBox.Show("Houve um erro ao carregar a imagem: " +
      ex.Message.ToString());
  }
}

Há uma sobrecarga do método FromFile() com a seguinte assinatura:

public static Image FromFile(string filename,
  bool useEmbeddedColorManagement)
O parâmetro useEmbeddedColorManagement, quando true, indica que o objeto Image retornado aplicará a correção de cores de acordo com as informações de gerenciamento de cores contidas no arquivo de imagem. As informações contidas no arquivo de imagem podem incluir perfis International Color Consortium (ICC), valores gama e informações de cromaticidade.


PHP ::: Fundamentos da Linguagem ::: Estruturas de Controle

Apostila PHP para iniciantes - Como testar múltiplas condições usando a construção if...elseif...else da linguagem PHP

Quantidade de visualizações: 9156 vezes
A construção if...else (se...do contrário) pode ser extendida com o uso de elseif para testar múltiplas condições. Desta forma, você pode ter quantos blocos elseif (ou então se) você desejar. Veja o trecho de código a seguir:

<?php
  $valor = 20;
  
  if($valor == 15){
    echo "O valor é igual à 15";
  }
  elseif($valor > 15){
    echo "O valor é maior que 15";
  }
  else{
    echo "O valor é menor que 15";
  }
?>

Ao executar este código nós teremos o seguinte resultado:

O valor é maior que 15


VB.NET ::: Fundamentos da Linguagem ::: Estruturas de Controle

Como usar o laço For do VB.NET - Apostila VB.NET para iniciantes

Quantidade de visualizações: 13215 vezes
O laço For...Next é usado quando sabemos exatamente a quantidade de vezes que o bloco de códigos deverá ser executado. Veja um exemplo no qual contamos de 1 a 10:

For valor As Integer = 1 To 10 Step 1
  Console.WriteLine(valor)
Next

Veja que o laço For...Next é composto de três partes muito importantes:

a) Inicialização da variável de controle:

For valor As Integer = 1

Aqui é onde definimos o valor inicial da variável de controle. No exemplo nós fizemos a declaração da variável no cabeçalho do laço, mas ela pode ser declarada externamente sem nenhum problema.

b) Limite do valor da variável de controle:

To 10

A palavra-chave To permite definir o valor máximo que a variável de controle pode alcançar.

c) Incremento da variável de controle:

Step 1

A palavra-chave Step permite definir o valor que servirá de incremento para a variável de controle. No exemplo usamos 1, mas poderia ser qualquer valor inteiro.

Veja um exemplo de laço For...Next no qual exibimos os números pares de 0 a 20:

For numero As Integer = 0 To 20 Step 2
  Console.WriteLine(numero)
Next

E se quisermos contar de trás para frente? Fácil, basta fornecer um valor negativo para o incremento. Veja:

For numero As Integer = 10 To 0 Step -1
  Console.WriteLine(numero)
Next



C# ::: LINQ ::: LINQ to Objects

Como retornar o menor elemento em um array de int em C# usando a função Min() do LINQ

Quantidade de visualizações: 907 vezes
Nesta dica mostrarei, em um exemplo bem simples, como podemos usar o método Min() do LINQ (Language-Integrated Query) do C# para retornar o menor elemento de um vetor de inteiros.

Note que temos um vetor de int com os valores {5, 2, 8, 3, 0, 1} e o valor 0 deverá ser retornado como sendo o menor.

Veja o código completo para o exemplo:

using System;
using System.Linq;

namespace Estudos {
  class Principal {
    static void Main(string[] args) {
      // vamos construir um vetor de inteiros
      int[] valores = {5, 2, 8, 3, 0, 1};

      // vamos obter o menor elemento do vetor
      int menor = valores.Min();

      // vamos mostrar o resultado
      Console.WriteLine("O menor valor é: {0}", menor);

      Console.WriteLine("\nPressione uma tecla para sair...");
      Console.ReadKey();
    }
  }
}

Ao executar este código C# nós teremos o seguinte resultado:

O menor valor é: 0

Fique atento ao fato de que o método Min() pode atirar uma exceção do tipo InvalidOperation se o array ou coleção estiver vazia ou não incluir nenhum elemento que se encaixe nas condições testadas.

Veja o resultado ao chamarmos este método em um vetor vazio:

System.InvalidOperationException
HResult=0x80131509
Message=Sequence contains no elements
Source=System.Linq
StackTrace:
at System.Linq.ThrowHelper.ThrowNoElementsException()
at System.Linq.Enumerable.Min(IEnumerable`1 source)
at Estudos.Principal.Main(String[] args) in C:\estudos_c#\Estudos\Principal.cs:line 11


Java ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Dados - Árvores Binárias e Árvores Binárias de Busca

Exercícios Resolvidos de Java - Como pesquisar um valor em uma árvore binária de busca usando uma função recursiva

Quantidade de visualizações: 3797 vezes
Pergunta/Tarefa:

Escreva uma função recursiva em Java que permite pesquisar um valor em uma árvore binária de busca (BST). Se o valor for encontrado, uma referência ao nó da árvore (um objeto da classe NoArvore, por exemplo) deverá ser retornado. Caso contrário, o valor null deverá ser retornado para indicar que não há nós na árvore contendo tal valor.

Sua saída deverá ser parecida com:

Informe um valor inteiro: 7
Informe um valor inteiro: 1
Informe um valor inteiro: 8
Informe um valor inteiro: 10
Informe um valor inteiro: 4

Informe o valor a ser pesquisado: 3
O valor não foi encontrado na árvore

Informe um valor inteiro: 8
Informe um valor inteiro: 2
Informe um valor inteiro: 35
Informe um valor inteiro: 4
Informe um valor inteiro: 7

Informe o valor a ser pesquisado: 4
O valor foi encontrado na árvore
Resposta/Solução:

Veja a resolução comentada deste exercício usando Java:

Código para NoArvore.java:

package estudos;

public class NoArvore {
  int valor; // valor armazenado no nó
  NoArvore esquerdo; // filho esquerdo
  NoArvore direito; // filho direito

  // construtor do nó
  public NoArvore(int valor){
    this.valor = valor;
  }
}

Código para ArvoreBinariaBusca.java:

package estudos;

public class ArvoreBinariaBusca {
  private NoArvore raiz; // referência para a raiz da árvore
  
  // método usado para inserir um novo nó na árvore
  // retorna true se o nó for inserido com sucesso e false
  // se o elemento
  // não puder ser inserido (no caso de já existir um 
  // elemento igual)
  public boolean inserir(int valor){
    // a árvore ainda está vazia?
    if(raiz == null){
      // vamos criar o primeiro nó e definí-lo como a raiz da árvore
      raiz = new NoArvore(valor); // cria um novo nó
    }
    else{
      // localiza o nó pai
      NoArvore pai = null;
      NoArvore noAtual = raiz; // começa a busca pela raiz
 
      // enquanto o nó atual for diferente de null
      while(noAtual != null){
        if(valor < noAtual.valor) {
          pai = noAtual;
          noAtual = noAtual.esquerdo;
        }
        else if(valor > noAtual.valor){
          pai = noAtual;
          noAtual = noAtual.direito;
        }
        else{
          return false; // um nó com este valor foi encontrado
        }
      }
       
      // cria o novo nó e o adiciona ao nó pai
      if(valor < pai.valor){
         pai.esquerdo = new NoArvore(valor);
      }
      else{
        pai.direito = new NoArvore(valor);
      }
    }

    return true; // retorna true para indicar que o novo nó
    // foi inserido
  }
  
  // método que permite pesquisar na árvore binária de busca
  public NoArvore pesquisar(int valor){
    return pesquisar(raiz, valor); // chama a versão recursiva
    // do método
  }

  // sobrecarga do método pesquisar que recebe dois 
  // parâmetros (esta é a versão recursiva do método)
  private NoArvore pesquisar(NoArvore noAtual, int valor){
    // o valor pesquisado não foi encontrado....vamos retornar null
    if(noAtual == null){
      return null;
    }
 
    // o valor pesquisado foi encontrado?
    if(valor == noAtual.valor){
      return noAtual; // retorna o nó atual
    }  
    // ainda não encontramos...vamos disparar uma nova 
    // chamada para a sub-árvore da esquerda
    else if(valor < noAtual.valor){
      return pesquisar(noAtual.esquerdo, valor);
    }
    // ainda não encontramos...vamos disparar uma nova 
    // chamada para a sub-árvore da direita
    else{
      return pesquisar(noAtual.direito, valor);
    }
  }
}

E aqui está o código para a classe que permite testar a árvore:

package estudos;

import java.util.Scanner;

public class Estudos {
  public static void main(String[] args) {
    Scanner entrada = new Scanner(System.in);  
      
    // vamos criar um novo objeto da classe ArvoreBinariaBusca
    ArvoreBinariaBusca arvore = new ArvoreBinariaBusca();
   
    // vamos inserir 5 valores na árvore
    for(int i = 0; i < 5; i++){
      System.out.print("Informe um valor inteiro: ");
      int valor = Integer.parseInt(entrada.nextLine());
      
      // vamos inserir o nó e verificar o sucesso da operação
      if(!arvore.inserir(valor)){
        System.out.println("Erro. Um elemento já contém este valor.");  
      }
    }
    
    // vamos pesquisar um valor na árvore
    System.out.print("\nInforme o valor a ser pesquisado: ");
    int valorPesquisa = Integer.parseInt(entrada.nextLine());
    // obtém um objeto da classe NoArvore a partir do 
    // método pesquisar() da classe ArvoreBinariaBusca
    NoArvore res = arvore.pesquisar(valorPesquisa);
    // o valor foi encontrado?
    if(res != null){
      System.out.println("O valor foi encontrado na árvore");
    }
    else{
      System.out.println("O valor não foi encontrado na árvore");  
    }
    
    System.out.println("\n");
  }
}



Mais Desafios de Programação e Exercícios e Algoritmos Resolvidos de Java

Veja mais Dicas e truques de Java

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: Delphi
6º lugar: C
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby

Anúncio Patrocinado
Chat de Sexo - Site para adultso - Maiores de 18 anos. Converse com pessoas de todo o Brasil, de forma discreta e anônima


© 2024 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 11 usuários muito felizes estudando em nosso site.