VCL Style e Build Configurations no Delphi

Através deste artigo quero apresentar um novo recurso presente a partir da versão XE2 do Delphi, o VCL Style e sobre o recurso Build Configurations existente a partir da versão 2009 do Delphi.

Estrutura de organização dos diretórios no Linux

O Linux é projetado para rodar tanto em máquinas com bastante poder de processamento como em máquinas com configurações mínimas e baixo poder de processamento.

Como fazer um Extract MetaData com o IbExpert?

Vamos aprender a usar um recurso muito interessante da ferramenta IBExpert, o: extract metadata. Qual a utilidade dessa ferramenta?

Como desativar mensagem de expiração do Winrar

Se você usa o Winrar, um dos softwares mais utilizado para compactação de arquivos, então você já se deparou com aquela mensagem "chatíssima" de expiração.

Removendo senha de usuário no Windows

Acredito que alguém já deve ter passado pela desagradável situação de esquecer a senha do seu usuário do Windows, e pesou "Agora ferrou!". Pois é, aconteceu isso com um de nossos clientes, como resolver?


ClipaTec Informática

Receba novidades por e-mail. Digite seu e-mail abaixo e clique no botão "Cadastrar"

Delivered by FeedBurner

19 de junho de 2024

Regex - Introdução às Expressões Regulares

expressões regulares - regex

Fala dev! Provavelmente você já deve ter ouvido falar sobre expressões regulares ou regex, mas que diabos é isso? Para que serve?

Neste artigo, daremos uma introdução sobre o assunto, entender seus elementos e como aplicar esse recurso em validação de dados.

O que são Expressões Regulares?

Expressões regulares, também conhecida como regex ou regexp são sequências de caracteres que formam um padrão de busca. É um excelente recurso para buscar, manipular e validar texto com base em padrões específicos, ou seja, elas são utilizadas para corresponder strings ou partes de strings que seguem um determinado formato.

Sua origem se deu na década de 1950, e hoje são amplamente utilizadas em diversas linguagens de programação devido à sua capacidade de simplificar operações complexas de manipulação de strings.

Uma regex é composta de vários elementos, como caracteres literais, metacaracteres e quantificadores, que juntos definem o padrão a ser correspondido.

Principais elementos das Regex
  • Âncoras:
    • ^: Início da string.
    • $: Fim da string.
  • Metacaracteres:
    • .: Qualquer caractere, exceto nova linha.
    • \: Caractere de escape para caracteres especiais.
  • Quantificadores:
    • *: Zero ou mais ocorrências.
    • +: Uma ou mais ocorrências.
    • ?: Zero ou uma ocorrência.
    • {n}: Exatamente n ocorrências.
    • {n,}: n ou mais ocorrências.
    • {n,m}: Entre n e m ocorrências.
  • Grupos e Alternância:
    • () : Define um grupo.
    • | : Alternância (ou).
  • Classes de Caracteres:
    • \d: Qualquer dígito (0-9).
    • \w: Qualquer caractere de palavra (a-z, A-Z, 0-9, _).
    • \s: Qualquer espaço em branco (espaço, tab, nova linha).
    • [...]: Conjunto de caracteres. Exemplo: [abc] corresponde a 'a', 'b', ou 'c'.
    • [^...]: Conjunto negado de caracteres. Exemplo: [^abc] corresponde a qualquer caractere exceto 'a', 'b', ou 'c'.
  • Escape Sequences:
    • \\: Barra invertida literal.
    • \.: Ponto literal.
    • \D: Não dígito.
    • \W: Não caractere de palavra.
    • \S: Não espaço em branco.

Para que Servem as Expressões Regulares?

As expressões regulares são usadas para:

  • Validação: Verificar se um texto corresponde a um padrão específico, como endereços de e-mail, números de telefone, CPFs, etc.
  • Busca: Localizar ocorrências de padrões dentro de textos.
  • Substituição: Modificar texto substituindo padrões correspondidos por novos valores.
  • Extração: Extrair partes de um texto que correspondam a um padrão específico.

Quando Usar Expressões Regulares?

Utilize expressões regulares quando precisar de:

  • Verificação rápida e eficiente de formatos de entrada.
  • Manipulação complexa de strings que seria difícil de implementar com métodos tradicionais.
  • Processamento de grandes volumes de texto onde buscas e substituições precisam ser feitas rapidamente.

No entanto, evite usar regex quando:

  • Uma operação simples pode ser realizada sem regex.
  • A expressão regular se torna extremamente complexa, tornando o código difícil de ler e manter.
  • A performance é uma preocupação crítica e existem alternativas mais eficientes.

Exemplos Práticos

Vamos ver alguns exemplos práticos para reforçar a compreensão:

Validação de E-mail

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
  • ^[a-zA-Z0-9._%+-]+: Início da string seguido de um ou mais caracteres alfanuméricos ou ., _, %, +, -
  • @: Símbolo @.
  • [a-zA-Z0-9.-]+: Um ou mais caracteres alfanuméricos, . ou -.
  • \.: Ponto literal.
  • [a-zA-Z]{2,}$: Dois ou mais caracteres alfabéticos até o final da string.

Validação de Telefone (Formato US)

^\(\d{3}\) \d{3}-\d{4}$
  • ^\(: Início da string seguido por um parêntese esquerdo literal.
  • \d{3}: Três dígitos.
  • \) : Parêntese direito literal seguido de um espaço.
  • \d{3}-\d{4}$: Três dígitos, um hífen, e quatro dígitos até o final da string.

Validação de CPF (Brasil)

^\d{3}\.\d{3}\.\d{3}-\d{2}$
  • ^\d{3}: Três dígitos no início da string.
  • \.: Ponto literal.
  • \d{3}: Três dígitos.
  • \.: Ponto literal.
  • \d{3}: Três dígitos.
  • -: Hífen literal.
  • \d{2}$: Dois dígitos até o final da string.

Data (Formato DD/MM/YYYY)

^\d{2}/\d{2}/\d{4}$
  • ^\d{2}: Dois dígitos no início da string.
  • \.: Ponto literal.
  • \d{4}$: Quatro dígitos até o final da string.

Validação de Valor Monetário (Brasil)

^-?\d{1,3}(\.\d{3})*(,\d{2})?$|^-?\d+(,\d{2})?$
  • ^-?: Início da string seguido de um sinal negativo opcional.
  • \d{1,3}: Um a três dígitos.
  • (\.\d{3})*: Zero ou mais grupos de três dígitos precedidos por um ponto.
  • (,\d{2})?$: Uma vírgula seguida de dois dígitos (opcional) até o final da string.
  • |: Alternância (ou).
  • ^-?\d+(,\d{2})?$: Início da string seguido de um sinal negativo opcional, um ou mais dígitos, e uma vírgula seguida de dois dígitos (opcional) até o final da string.
Vamos decompor essa última expressão de forma mais detalhada:
  • ^:Âncora que indica o início da string.
  • -?: O hífen (-) seguido por um ponto de interrogação (?) indica que o sinal negativo é opcional.
  • \d{1,3}: \d corresponde a qualquer dígito (0-9). {1,3} significa que deve haver de 1 a 3 dígitos.
  • (\.\d{3})*: \. corresponde a um ponto literal. \d{3} significa três dígitos. O asterisco (*) indica que este grupo pode aparecer zero ou mais vezes.
  • (,\d{2})?: , corresponde a uma vírgula literal. \d{2} significa dois dígitos. O ponto de interrogação (?) indica que este grupo é opcional.
  • $: Âncora que indica o final da string.
  • |: Operador OR que separa duas alternativas.
  • ^-?\d+(,\d{2})?$: Segunda parte da expressão regular:
  • ^: Início da string.
  • -?: Sinal negativo opcional.
  • \d+: Um ou mais dígitos.
  • (,\d{2})?: Vírgula seguida por dois dígitos, opcional.
  • $: Final da string.

Conclusão

As expressões regulares são uma ferramenta extremamente útil para desenvolvedores e administradores de sistemas que precisam manipular texto de forma eficiente baseado em padrões. Compreender e utilizar regex pode melhorar significativamente a capacidade de validar, buscar, substituir e extrair informações de strings. A prática e o estudo contínuo são essenciais para dominar essa poderosa ferramenta.

Experimente criar suas próprias expressões regulares e veja como elas podem simplificar suas tarefas de manipulação de texto!

Dica: você pode testar as expressões regulares no site Regex101, divirtam-se! 😃

(Por ClipaTec Informática)

14 de junho de 2024

Paradigma de Programação Orientada a Objeto - O que é POO?

POO - Programação Orientada a Objetos

Olá caro leitor, se você é estudante ou atua na área de desenvolvimento de aplicações, já deve ter ouvido um desses termos: POO, Programação Orientada a Objetos, Orientação a Objetos ou Paradigma de Programação Orientada a Objetos.

O que é? Para que serve? Qual o objetivo deste paradigma? Vamos esclarecer essas dúvidas, nesse artigo introdutório. Sigam-me.

A programação orientada a objetos (POO) é um dos paradigmas de programação mais utilizados no desenvolvimento de softwares. Ao contrário dos paradigmas de programação procedimental ou funcional, a POO se concentra em criar objetos que representam entidades do mundo real, tornando o desenvolvimento de software mais intuitivo e modular. Neste post, vamos explorar os conceitos básicos da POO e entender como ela pode transformar a forma como você escreve e organiza seu código.

O Que é Programação Orientada a Objetos?

A POO é um paradigma de programação baseado em conceitos de "objetos", que são instâncias de "classes". Uma classe define a estrutura e o comportamento de um objeto. Em termos simples, uma classe pode ser vista como um molde ou uma planta, enquanto os objetos são as instâncias concretas criadas a partir desse molde.

Conceitos Fundamentais da POO

1. Classes e Objetos

  • Classe: Uma classe é uma blueprint(planta) que define as propriedades e comportamentos de um objeto. Ela contém atributos (dados) e métodos (funções).

Exemplo de classe em Java:

public class Pessoa {
    // Atributos (variáveis de instância)
    private String nome;
    private int idade;

    // Construtor padrão
    public Pessoa() {
        this.nome = "";
        this.idade = 0;
    }

    // Construtor com parâmetros
    public Pessoa(String nome, int idade) {
        this.nome = nome;
        this.idade = idade;
    }

    // Método getter para o nome
    public String getNome() {
        return nome;
    }

    // Método setter para o nome
    public void setNome(String nome) {
        this.nome = nome;
    }

    // Método getter para a idade
    public int getIdade() {
        return idade;
    }

    // Método setter para a idade
    public void setIdade(int idade) {
        if (idade >= 0) {
            this.idade = idade;
        } else {
            System.out.println("A idade não pode ser negativa.");
        }
    }

    // Método para exibir informações da pessoa
    public void exibirInformacoes() {
        System.out.println("Nome: " + nome);
        System.out.println("Idade: " + idade);
    }

    // Método principal para testar a classe
    public static void main(String[] args) {
        // Criando uma instância da classe Pessoa usando o construtor padrão
        Pessoa pessoa1 = new Pessoa();
        pessoa1.setNome("João");
        pessoa1.setIdade(25);
        pessoa1.exibirInformacoes();

        // Criando uma instância da classe Pessoa usando o construtor com parâmetros
        Pessoa pessoa2 = new Pessoa("Maria", 30);
        pessoa2.exibirInformacoes();
    }
}

  • Objeto: Um objeto é uma instância de uma classe. Ele possui as características e comportamentos definidos pela classe.
Exemplo de objeto em Java:

// Criando uma instância da classe Pessoa usando o construtor com parâmetros
Pessoa pessoa = new Pessoa("Maria", 30);
pessoa.exibirInformacoes();

2. Encapsulamento

Encapsulamento é o conceito de restringir o acesso direto a alguns atributos de um objeto, usando métodos públicos para interagir com esses atributos. Isso ajuda a proteger os dados e a ocultar a complexidade interna do objeto.

Exemplo de encapsulamento em Java:

// Método getter para o nome
public String getNome() {
    return nome;
}

// Método setter para o nome
public void setNome(String nome) {
    this.nome = nome;

}

3. Herança

Herança permite que uma classe herde atributos e métodos de outra classe. Isso promove a reutilização de código e a criação de hierarquias de classes.

Exemplo de herança em Java:

public class Fornecedor extends Pessoa {

    // Atributos específicos do Fornecedor

    private String empresa;

    private String cnpj;

    // Construtor padrão

    public Fornecedor() {

        super(); // Chama o construtor da classe Pessoa

        this.empresa = "";

        this.cnpj = "";

    }

    // Construtor com parâmetros

    public Fornecedor(String nome, int idade, String empresa, String cnpj) {

        super(nome, idade); // Chama o construtor da classe Pessoa

        this.empresa = empresa;

        this.cnpj = cnpj;

    }

    // Método getter para a empresa

    public String getEmpresa() {

        return empresa;

    }

    // Método setter para a empresa

    public void setEmpresa(String empresa) {

        this.empresa = empresa;

    }

    // Método getter para o CNPJ

    public String getCnpj() {

        return cnpj;

    }

    // Método setter para o CNPJ

    public void setCnpj(String cnpj) {

        this.cnpj = cnpj;

    }

    // Sobrescrevendo o método para exibir informações

    @Override

    public void exibirInformacoes() {

        super.exibirInformacoes(); // Chama o método da classe Pessoa

        System.out.println("Empresa: " + empresa);

        System.out.println("CNPJ: " + cnpj);

    }

    // Método principal para testar a classe

    public static void main(String[] args) {

        // Criando uma instância da classe Fornecedor usando o construtor com parâmetros

        Fornecedor fornecedor = new Fornecedor("Aparecido do Nada", 33, "ABC Ltda", "01.234.567/0001-89");

        fornecedor.exibirInformacoes();

    }

}

4. Polimorfismo

Polimorfismo permite que métodos em diferentes classes tenham o mesmo nome, mas comportamentos diferentes. Isso é útil para tratar objetos de diferentes classes de forma uniforme.

Exemplo de polimorfismo em Java:

public class Pessoa {

    // Método para exibir informações da pessoa
    public void exibirInformacoes() {
        System.out.println("Nome: " + nome);
        System.out.println("Idade: " + idade);
    }
}

public class Fornecedor extends Pessoa {

    // Sobrescrevendo o método para exibir informações

    @Override

    public void exibirInformacoes() {

        super.exibirInformacoes(); // Chama o método da classe Pessoa

        System.out.println("Empresa: " + empresa);

        System.out.println("CNPJ: " + cnpj);

    }

}

Vantagens da Programação Orientada a Objetos
  1. Modularidade: Código é organizado em classes e objetos, facilitando a manutenção e o entendimento.
  2. Reutilização de Código: A herança permite reutilizar código existente, economizando tempo e esforço.
  3. Flexibilidade e Extensibilidade: Novas funcionalidades podem ser adicionadas com menos impacto no código existente.
  4. Facilidade de Manutenção: Encapsulamento ajuda a proteger dados sensíveis e a modularizar o código, tornando a manutenção mais fácil.

Conclusão

A Programação Orientada a Objetos é um poderoso paradigma que ajuda a organizar e estruturar o código de uma maneira mais intuitiva e eficiente. Ao entender e aplicar conceitos como classes, objetos, encapsulamento, herança e polimorfismo, você pode desenvolver software mais robusto, reutilizável e fácil de manter. Se você está começando com POO, experimente implementar esses conceitos em seus projetos e veja como eles podem transformar a maneira como você escreve código.

Esperamos que este post tenha fornecido uma visão clara e útil sobre os fundamentos da POO. Fique à vontade para deixar suas perguntas e comentários abaixo!

(Por Welinton Dias)

5 de junho de 2024

REST APIs e Verbos HTTP: GET, PUT, POST e PATCH

REST API e verbos HTTP

Olá pessoal, salve, salve.

No artigo anterior abordamos sobre o conceito de API, para que serve e quando usar.

Ainda seguindo neste tema, vamos fazer uma introdução a REST API e daremos um pouco mais de enfase nos verbos HTTP, citados no artigo anterior.

As REST APIs (Application Programming Interfaces) são interfaces que permitem a comunicação entre sistemas utilizando os princípios da arquitetura REST (Representational State Transfer). As REST APIs são amplamente utilizadas no desenvolvimento de aplicativos web e móveis devido à sua simplicidade, escalabilidade e flexibilidade. Neste artigo, abordaremos os conceitos básicos das REST APIs e os principais verbos HTTP utilizados: GET, PUT, POST e PATCH.

Conceito de REST APIs

REST é um estilo de arquitetura de software que define um conjunto de restrições e propriedades baseadas no protocolo HTTP. Uma API RESTful permite que os sistemas se comuniquem de maneira padronizada e estateless, ou seja, cada requisição do cliente para o servidor deve conter todas as informações necessárias para entender e processar a solicitação.

Os recursos em uma API RESTful são representados por URIs (Uniform Resource Identifiers) e podem ser manipulados utilizando os verbos HTTP. Esses recursos podem ser dados de uma aplicação, como usuários, produtos, pedidos, entre outros.

Verbos HTTP

Os verbos HTTP (ou métodos) são usados para indicar a ação que deve ser realizada em um recurso. A seguir, discutimos os quatro verbos mais comuns: GET, PUT, POST e PATCH.

GET

O verbo GET é utilizado para solicitar a representação de um recurso. Quando um cliente envia uma requisição GET, ele está pedindo ao servidor que retorne os dados de um recurso específico. O uso do GET é seguro e idempotente, o que significa que a mesma requisição pode ser feita múltiplas vezes sem alterar o estado do recurso.

Exemplo:

GET /api/usuarios/123

Essa requisição pode retornar os dados do usuário com o ID 123.

POST

O verbo POST é utilizado para criar um novo recurso no servidor. Quando um cliente envia uma requisição POST, ele está enviando dados ao servidor para que um novo recurso seja criado. Diferentemente do GET, o POST não é idempotente; múltiplas requisições POST podem resultar na criação de vários recursos.

Exemplo:

POST /api/usuarios

Content-Type: application/json

{

  "nome": "João",

  "email": "joao@example.com"

}

Essa requisição cria um novo usuário com o nome "João" e o email "joao@example.com".

PUT

O verbo PUT é utilizado para atualizar completamente um recurso existente ou para criar um novo recurso se ele não existir. Quando um cliente envia uma requisição PUT, ele está fornecendo uma representação completa do recurso que deve ser armazenada no servidor. O PUT é idempotente, o que significa que múltiplas requisições PUT com os mesmos dados não devem alterar o estado do recurso após a primeira aplicação.

Exemplo:

PUT /api/usuarios/123

Content-Type: application/json

{

  "nome": "João",

  "email": "joao@example.com"

}

Essa requisição atualiza completamente os dados do usuário com o ID 123.

PATCH

O verbo PATCH é utilizado para aplicar modificações parciais a um recurso. Diferentemente do PUT, que requer uma representação completa do recurso, o PATCH permite que apenas as mudanças necessárias sejam enviadas. O PATCH também é idempotente.

Exemplo:

PATCH /api/usuarios/123

Content-Type: application/json

{

  "email": "joao_novo@example.com"

}

Essa requisição atualiza apenas o email do usuário com o ID 123, mantendo os outros atributos inalterados.

Conclusão

Entender os verbos HTTP GET, PUT, POST e PATCH é fundamental para trabalhar com REST APIs de maneira eficaz. Cada verbo tem seu propósito específico e, quando utilizado corretamente, pode garantir uma comunicação clara e eficiente entre o cliente e o servidor. As REST APIs são uma peça central na arquitetura de sistemas modernos, proporcionando uma maneira padronizada e escalável de interação entre diferentes componentes e serviços.

(Por ClipaTec Informática)

30 de maio de 2024

O que é API (Interface de Programação de Aplicações)?

api



Olá clipatequeiros, salve, salve.
Você já deve ter ouvido falar sobre API, mas afinal, o que é? Para que serve? Onde usar?
O uso de API's tem sido muito alto ultimamente, então, vamos sanar essas dúvidas neste artigo.
Este artigo será parte de uma série de artigos sobre API, vamos explorar alguns tipos de API's e ver na prática como funciona. Então bora lá?

O que é uma API?

API, ou Application Programming Interface (Interface de Programação de Aplicações), pode ser definida como um conjunto de regras e definições que permitem a comunicação entre diferentes software. As APIs definem os métodos e dados que as aplicações podem utilizar para interagir umas com as outras, facilitando a integração e a troca de informações entre diferentes serviços e plataformas.

Como Funcionam as APIs?

As APIs funcionam como contratos de serviço entre duas aplicações: uma que oferece o serviço (provedor da API) e outra que o consome (cliente da API). Esses contratos especificam como os dados devem ser solicitados e fornecidos, geralmente através de chamadas HTTP em APIs baseadas na web.

Principais Componentes de uma API

  1. Endpoint: Um URL específico onde um recurso está disponível. É o ponto de contato para a comunicação com a API.
  2. Verbos HTTP: Métodos que definem a ação a ser realizada sobre os recursos. Os principais verbos são:
    • GET: Recuperar dados de um recurso.
    • POST: Criar um novo recurso.
    • PUT: Atualizar completamente um recurso existente.
    • PATCH: Atualizar parcialmente um recurso existente.
    • DELETE: Remover um recurso.
  3. Parâmetros: Dados adicionais enviados com a requisição, como parâmetros de consulta (query parameters), parâmetros de caminho (path parameters), e cabeçalhos (headers).
  4. Corpo da Requisição/Resposta: Dados enviados na requisição ou recebidos na resposta, geralmente em formatos como JSON ou XML.

Tipos de APIs

  1. APIs Web (HTTP/REST): Utilizam o protocolo HTTP e seguem os princípios REST (Representational State Transfer), que permitem a manipulação de recursos usando URLs.
  2. APIs SOAP: Utilizam o protocolo SOAP (Simple Object Access Protocol), um protocolo baseado em XML que permite a troca de informações estruturadas.
  3. APIs de Biblioteca: Conjunto de funções e rotinas expostas por uma biblioteca de software para ser utilizada por outras aplicações.
  4. APIs de Sistema Operacional: Permitem que programas interajam com o sistema operacional, como APIs do Windows ou do Linux.

Exemplos de Uso de APIs

  1. Integração de Serviços: Um aplicativo de viagens pode usar APIs de diferentes companhias aéreas para mostrar opções de voos em tempo real.
  2. Autenticação: Serviços como OAuth permitem que aplicações autentiquem usuários através de contas de outros serviços (ex.: login com Google ou Facebook).
  3. Mapas e Geolocalização: APIs como Google Maps permitem incorporar mapas e funcionalidades de geolocalização em aplicativos.
  4. Pagamentos Online: APIs de pagamento, como PayPal ou Stripe, permitem processar transações financeiras de forma segura.

Vantagens das APIs

  1. Modularidade: Permite que diferentes partes de um sistema sejam desenvolvidas e atualizadas independentemente.
  2. Reutilização: Funcionalidades podem ser reutilizadas em diferentes aplicações, economizando tempo e recursos.
  3. Interoperabilidade: Facilita a comunicação entre sistemas diferentes, possibilitando a integração de serviços de terceiros.
  4. Eficiência: Automatiza processos e troca de informações, melhorando a eficiência operacional.

Conclusão

As APIs são fundamentais para a arquitetura de software moderna, permitindo a integração de serviços e a criação de ecossistemas de aplicações conectadas. Elas facilitam a comunicação entre diferentes sistemas, promovendo a reutilização de funcionalidades e a interoperabilidade entre plataformas.

(Por ClipaTec Informática)

19 de janeiro de 2023

Quick Tips - Delphi: como minimizar a aplicação na bandeja do Windows?

TrayIcon delphi


Olá minha gente, salve, salve.

Você já deve ter usado algum aplicativo, que ao minimizar, vai para a bandeja do Windows, logo ali, perto do relógio.

Se você deseja implementar este recurso na sua aplicação e não sabe como fazer isso no Delphi, na dica de hoje, vamos aprender como fazer.

Geralmente, esse recurso é mais utilizando em aplicações do tipo serviço, mas, este recurso pode ser aplicado em qualquer aplicação.

Vamos imaginar o seguinte cenário, para facilitar o entendimento do recurso:

Suponha que você tem um ERP integrado a um app mobile, no qual, o ERP, precisa sincronizar determinados dados com o app mobile, por exemplo, pedidos feitos no app, precisam ser recebidos no ERP.

Para possibilitar esse sincronismo de dados, imaginemos que possui um serviço que deve ficar em execução, sendo ele, o responsável por este sincronismo, portanto, o mesmo não pode ser fechado.

O usuário pode fechar o serviço por engano, ou como dizia o chaves "sem querer querendo", se isso ocorre, após poucos minutos, ele vai te ligar, disparando uma torrente de xingamentos com todos os palavrões existentes 😤, e dizendo que seu produto é uma porcaria porque os pedidos feitos no app mobile não estão aparecendo no ERP, é sério, isso acontece as vezes, o usuário faz coisas que até Deus duvida, acredite.

Uma maneira de evitar esse tipo de situação, é programar um recurso que quando o usuário clicar para fechar ou minimizar a aplicação ou serviço, a mesma seria sempre minimizada na bandeja do Windows, sendo assim, continuaria em execução em segundo plano, evitando essa ligação amorosa do usuário 😤Legal, mas como fazer isso no Delphi? Sigam-me os bons...

O que é a bandeja do sistema (System Tray - Systray)?

Em síntese, é uma área de notificação, também conhecida como área de status e barra de menus, dependendo do sistema operacional em uso, que fica localizado geralmente na barra de tarefas do sistema operacional, contendo ícones que permitem aos usuários acesso à aplicações, serviços ou funções do sistema, como por exemplo, spooler da impressora, volume do sistema, conexões de rede, relógio, antivírus e etc.

Os ícones podem indicar status de determinados processos que estão em execução no computador. Ao passar o mouse sobre os ícones, dar um duplo clique ou ainda, por meio do clique com o botão direito do mouse, é possível visualizar o status, acessar a aplicação ou serviço e até configurar, controlar o aplicativo associado.

A bandeja do sistema está disponível nos sistemas operacionais, seja desktop ou móvel(Windows, Mac OS, Linux,  Android e iOS). No caso do Windows, geralmente fica no canto inferior direito, no Linux, geralmente fica no canto superior direito, tudo depende do sistema operacional em uso, podendo inclusive, alterar sua posição.

No Windows, a bandeja do sistema podem ter alguns comportamentos, como por exemplo:

  • Ao clicar duas vezes no ícone inicia o programa correspondente;
  • Exibir uma caixa de diálogo;
  • Ao passar o mouse sobre um ícone, uma mensagem pop-up ou status do processo poderá ser exibida;
  • Ao clicar com o botão direito do mouse em um ícone, pode abrir um menu de opções, controle de volume e etc.

Mas agora, chega de lero lero, cremos que ficou bem entendido a questão, agora vamos partir para a prática no Delphi.

Minimizando uma aplicação na bandeja do Windows com Delphi

No Delphi, o componente responsável por permitir essa implementação é o "TrayIcon", presente na unit "Vcl.ExtCtrls.TTrayIcon".

Este componente, cria um ícone na bandeja do sistema ao lado do relógio. Ele possui eventos para cliques do mouse, propriedades para menus e animação do ícone, além de métodos para mostrar dicas de balão.

Com o Delphi aberto, crie um novo projeto e adicione dois componentes: TTrayIcon(ícone de bandeja) e TApplicationEvents(eventos do aplicativo).

O objetivo do nosso exemplo é, quando o usuário minimizar o aplicativo, o formulário será oculto e o ícone de bandeja será carregado. Ao passar o mouse sobre o mesmo, será exibido um balão de dicas e ao dar um duplo-clique, o aplicativo será restaurado para a tela.

Então, mãos a obra, os códigos estão bem comentados, dispensando explicações massantes.

No evento "OnCreate" do formulário principal, implemente-o da seguinte maneira:

minimizando aplicativo bandeja windows com delphi

Agora, selecione o componente TApplicationEvents e no evento "OnMinimize", implemente assim:

minimizando aplicativo bandeja windows com delphi
Por fim, selecione o componente TTrayIcon e codifique o evento "OnDblClick":

minimizando aplicativo bandeja windows com delphi








Muito bem, só rodar a aplicação e testar. Assim chegamos ao final de mais uma dica rápida, um abraço, até a próxima.


Links

- TTrayIcon - Embarcadero;

(Por ClipaTec Informática)

16 de janeiro de 2023

Quick Tips - Delphi: Trabalhando com os métodos EncodeDate e DecodeDate

encode decode date

Olá gente boa, tudo bem com vocês?

Na dica rápida de hoje, vamos abordar sobre dois métodos que podem ser úteis em suas rotinas do dia a dia. Estamos falando dos métodos "EncodeDate" e "DecodeDate".

EncodeDate

O método EncodeDate, presente na unit System.SysUtils, é uma função que, passados por parâmetro separadamente o dia, mês e ano, retornará uma data completa do tipo TDateTime.

Em determinados momentos, as vezes se torna necessário desmontarmos uma data, para efetuar cálculos ou qualquer outro tratamento com datas, como por exemplo, calcular o dia útil de uma determinada data para vencimento de faturas geradas no sistema em uma rotina de faturamento de venda por exemplo, e após isso, precisamos montar novamente a data com o dia correto. 

Em um cenário como esse, entra em ação o método EncodeDate, que faz justamente isso, ele monta uma data completa, unindo o dia, mês e ano passados por parâmetro.

Algumas considerações acerca do método EncodeDate são:

  • O valor referente ao ano passado por parâmetro, deve ser de 1 a 9999;
  • O valor referente ao mês passado por parâmetro, é considerado válido de 1 a 12;
  • O valor referente ao dia, podem ir de 1 a 28, 29, 30 ou 31, dependendo do mês passado por parâmetro, por exemplo, para o mês 02 (fevereiro), podemos ter um cenário de 1 a 28 ou 1 a 29, dependendo do ano, se for bissexto;
Se os valores não estiverem dentro do intervalo, isto é, caso algum valor seja inválido, uma exceção será levantada.

Para vermos o funcionamento desse método na prática, criamos um exemplo que pede ao usuário informar um dia, mês e ano, e no final, o algoritmo exibirá a data completa (montada), de acordo com os dados informados. Segue o código:

encode date


Temos quatro variáveis, sendo uma para o dia, mês e ano do tipo Word, e uma para a data completa que será montada pela função, do tipo TDate (para considerarmos apenas a data, sem a hora), mas poderia ser do tipo TDateTime também, sem nenhum problema.

Após pedir ao usuário para informar cada um desses dados, os mesmos são guardados dentro de suas respectivas variáveis.

Em seguida, chamamos o método EncodeDate repassando esses dados entrados por parâmetro, e o retorno dessa função, será armazenado na variável lData.

Por fim, exibimos na tela a data gerada. Simples, fácil e prático.

Ok, se tem como encodar uma data, também tem como decodar. É nosso próximo assunto.

DecodeDate

Este método, também presente na unit System.SysUtils, faz o inverso do método anterior. Esta procedure, recebe por parâmetro uma data completa, e a mesma é desmontada pelo método, e esse desmembramento é devolvido dentro dos demais parâmetros para dia, mês e ano, que também devem ser passados por parâmetro, ou seja, o método quebra e retorna os valores para dia, mês e ano separadamente, de uma determinada data passada por parâmetro do tipo TDateTime.

  • Se o ano da data for negativo, os valores para dia, mês e ano será ZERO;
Para exemplificarmos na prática, criamos um algoritmo que lê a data atual do computador, e desmonta essa data, para exibirmos em uma mensagem de maneira extensa, segue o código:

decode date

Ao chamarmos o método DecodeDate, passamos por parâmetro, uma chamada para a função Date que retornará para o parâmetro a data atual do computador, logo em seguida, passamos uma variável para ano, mês e dia, que são do tipo Word.
Note que este método é uma procedure, ou seja, não retorna valor. Os valores separados para o dia, mês e ano são devolvido dentro das respectivas variáveis passadas por parâmetro, isso ocorre porque, este método, requer passagem por referência, sendo assim, as variáveis passadas por parâmetro serão manipuladas diretamente dentro do método DecodeDate, ao final de sua execução, as mesmas já vão conter os valores separados.
Por fim, apenas exibimos o conteúdo delas em uma mensagem impressa no console, agregando uma frase personalizada.
Muito bem clipatequeiros de plantão, assim chegamos ao final dessa dica, codifique os exemplos e teste.
Em algum momento esses métodos serão úteis pra você. Alguns programadores por desconhecerem esses métodos, ao precisar separar o mês de uma data por exemplo, recorrem aos famosos métodos Copy e Pos, mas esse malabarismo todo cai por terra, com a utilização desses métodos nativos apresentados nesse artigo.
Um grande abraço, e até a próxima.

Links

- EncodeDate - Embarcadero;
- DecodeDate - Embarcadero;
(Por ClipaTec Informática)

12 de janeiro de 2023

Descompactando arquivos com Delphi

descompactacao arquivo delphi


Ola clipatequeiros, tudo bem com vocês?
No artigo anterior, abordamos como implementar a compactação de arquivos com o Delphi de forma nativa, usando a classe TZipFile. Vemos o quão é simples, fácil e prático.
No artigo de hoje, vamos fazer o processo inverso, vamos aprender a descompactar arquivos ZIP usando a mesma classe de forma nativa.
Para isso, declaramos o método "DescompactarArquivos", cuja implementação segue abaixo:

descompactando arquivos com delphi


A implementação é bem parecida com o método de compactação. Importante salientar que, é necessário dar uses na unit "System.Zip".
Declaramos quatro variáveis:
  • lArqZip: TZipFile - > que receberá a instância da classe TZipFile;
  • lOrigem: string -> que receberá o diretório onde se encontra o arquivo ZIP;
  • lDestino: string -> que receberá o diretório de destino, onde os arquivos contidos no arquivo ZIP serão extraídos;
  • lNome: string -> que receberá o nome do arquivo ZIP que será decompactado;
Por meio do método Open estamos preparando o arquivo para ser lido ou escrito. Como vamos fazer a descompactação do arquivo, então, note que agora, no último parâmetro deste método, estamos usando um indicador para leitura: zmRead, para indicar que estaremos lendo um arquivo ZIP criado anteriormente.
Após isso, basta chamar o método ExtractAll passando o diretório de destino por parâmetro, onde os arquivos serão extraídos. Este método, extrai todos os arquivos contidos no arquivo ZIP.
Por fim, chamamos o método Close para fechar o arquivo, embora, como ressaltamos no artigo anterior não se faz necessário chamar este método explicitamente, visto que, antes do objeto ser destruído, automaticamente o método Close é invocado pela biblioteca.
Assim chegamos ao fim de mais um tutorial, agora, só utilizar onde quiser dentro do seu sistema.

Links:


(Por ClipaTec Informática)