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

Mostrando postagens com marcador Quick Tips. Mostrar todas as postagens
Mostrando postagens com marcador Quick Tips. Mostrar todas as postagens

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)

Compactando arquivos com Delphi

compactacao arquivo delphi

Olá gente boa! No artigo de hoje, vamos aprender como implementar a compactação de arquivos, de forma nativa no Delphi.

Em versões mais antigas do Delphi, era comum utilizar a biblioteca "ZLib" presente na unit "System.ZLib", porém, utilizando essa biblioteca, tínhamos um problema, o arquivo compactado gerado não era compatível com outros aplicativos, como WinRar, 7Zip, etc, sendo assim, se o arquivo fosse enviado para alguém, este alguém não conseguiria abrir ou extrair este arquivo, a menos que, tivesse um aplicativo para isso, que utilizasse esta mesma biblioteca, para então conseguir abrir, visualizar e extrair.

Ora, isso não era interessante do ponto de vista usual, uma vez que, esta funcionalidade ficava "Delphi to Delphi", ou seja, só era possível descompactar usando um aplicativo, cuja implementação fosse feita com essa mesma biblioteca.

Nas versões novas do Delphi, surge a classe "TZipFile", presente na unit "System.Zip". Esta nova biblioteca, resolve o problema anterior.

A classe TZipFile é utilizada para criar e ler arquivos ".zip", ela dispõe de métodos para compactar e descompactar arquivos no formato .zip.

Ao implementar métodos para compactação e descompactação de arquivos usando a classe TZipFile, fica compatível com outros aplicativos do mercado, como o WinRAR, 7Zip por exemplo. Agora, você pode compactar arquivos, enviar para alguém, e este alguém, vai conseguir abrir e extrair esses arquivos sem problema algum, utilizando qualquer aplicativo que ele tenha instalado no computador para isso.

Muito bem, chega de teoria e vamos para a prática, segue abaixo o código para implementação da compactação de arquivos no Delphi:

compactando arquivos com delphi


Primeiro passo, é dar uses na unit 
"System.Zip" que contém a classe TZipFile, que vamos utilizar para esta implementação.
Feito isso, declaramos um método chamado "CompactarArquivos". Na implementação dele, declaramos três variáveis:

  • lArqZip: TZipFile -> que receberá uma instância da classe TZipFile;
  • lDestino: string -> que receberá o diretório onde será gerado o arquivo compactado;
  • lNome: string -> que receberá o nome do arquivo ZIP que será gerado;
Por meio do método Open, o arquivo é preparado para leitura ou gravação, e por parâmetro, passamos o local + nome do arquivo ZIP que será gerado. Note que neste método, no último parâmetro, estamos definindo que o arquivo será escrito/criado: zmWrite.

Através do método Add passamos por parâmetro o local + nome dos arquivos que serão adicionados no arquivo compactado ZIP.

Pronto, somente com essas linhas já teremos o arquivo ZIP gerado com os arquivos adicionados.

Note que não foi necessário chamarmos o método Close no final, visto que, o mesmo é chamado automaticamente na destruição do objeto.

Muito bem clipatequeiros, viram como é simples, fácil e prático? Agora, você pode usar esta implementação, modifica-la de acordo com suas necessidades, mais um recurso interessante que nos livra de ficar usando bibliotecas externas ou via linha de comando como outrora. Um grande abraço, que esta dica contribua de alguma maneira no seu dia a dia como programador.

Links:

- TZipFile - Embarcadero;

- Descompactando arquivos com Delphi;

(Por ClipaTec Informática)

4 de janeiro de 2023

Quick Tips - InputQuery com mais de um campo

janela inputquery delphi

Olá clipatequeiros, no artigo de hoje, mostraremos uma dica rápida sobre o método InputQuery do Delphi.
Há um tempo, recebemos questionamentos sobre a possibilidade do método InputQuery ter mais de um campo para entrada de dados. A resposta é SIM, isso é possível. Poucos sabem, até mesmo, alguns programadores que já trabalham com Delphi há anos.
Se olharmos para a UNIT que contem o método InputQuery, note que existem algumas assinaturas de sobrecarga para este método (três), inclusive, uma delas, pede por parâmetro, um array, e é exatamente essa assinatura que usaremos para mostrar que podemos ter uma janela do InputQuery com mais de um campo para entrada de dados.
Assinatura do método InputQuery que vamos utilizar:

function InputQuery(const ACaption: string; const APrompts: array of string; var AValues: array of string; CloseQueryFunc: TInputCloseQueryFunc = nil): Boolean; overload;

Para isso, vamos trabalhar com array de genéricos, especializado em string.
O primeiro passo, é definir uma variável do tipo TArray de string, neste exemplo, trabalharemos com os dados como string. No código abaixo, chamamos esta variável do array de 'lDados'.
Após a declaração da variável, precisamos definir o tamanho do nosso array, isto é, definiremos quantas posições irá conter no array. É importante salientar que, o tamanho do array, deve corresponder à quantidade de campos que você deseja ter na janela do InputQuery, no nosso exemplo, teremos apenas três campos, sendo um campo para nome, E-Mail e telefone, sendo assim, teremos um array com três posições, onde, cada posição irá armazenar o dado de um campo.
O método usado para definirmos o tamanho do array é o SetLength, que pede por parâmetro o array e o tamanho dele.
Agora vem o pulo do gato, ao chamarmos o método InputQuery, utilizaremos a assinatura citada anteriormente, onde passaremos três parâmetros, o primeiro é o título da janela, o segundo é o array com os títulos dos campos que irão conter na janela, vale ressaltar que, por ser um array, devemos passar entre colchetes '[]', separados por vírgula. Note que, passamos três valores neste array de títulos dos campos, ou seja, deve ser exatamente a quantidade de elementos definidos no array, no nosso caso, três, para não ter estouro de posição. Por fim, o terceiro parâmetro é o nosso array.
Ao executar, a janela do InputQuery agora terá três campos, cada um, com o título que definimos na passagem do parâmetro, e repare que os campos aparecem na janela, na mesma ordem em que foram passados no parâmetro, é muito importante lembrar desse detalhe.
Estamos testando o retorno dessa função dentro de um IF, se o usuário clicar no botão OK, apenas exibiremos uma mensagem mostrando os dados que foram informados na janela, se o usuário clicar no botão CANCELAR, mostraremos uma mensagem dizendo que a operação foi cancelada, conforme o código abaixo.
Agora, note que ao recuperar os dados informados para exibir na mensagem, estamos acessando o array e suas posições, onde, a posição ZERO corresponde ao Nome, a posição UM corresponde ao E-Mail e a posição DOIS corresponde ao Telefone. Vale ressaltar que as posições de um array começa com ZERO.
Por isso é importante lembrar da ordem dos títulos dos campos passados por parâmetro, pois, na hora de ler os dados, a sequência é a mesma. Atente-se a isso para não ler dado de posição errada. Os dados armazenados no array, são referentes aos campos na ordem passada no parâmetro do InputQuery.
Muito bem, feito isso, chegamos ao final desta dica rápida, se você não conhecia, agora já sabe como criar uma janela de InputQuery com vários campos. É um recurso que pode ser muito útil quando precisamos capturar dados de forma rápida e simples.

Código:

codigo delphi inputquery

codigo delphi inputquery

codigo delphi inputquery


Links:

- TArray;
- InputQuery;
- TryStrToInt, InputBox e InputQuery no Delphi;

(Por ClipaTec Informática)

30 de janeiro de 2018

TDataSet: Método InsertRecord


Delphi TDataSet InsertRecord
Olá gente boa. Quero neste artigo de maneira bem sucinta, apresentar a vocês de maneira prática a usabilidade do método "InsertRecord".
O método "InsertRecord", pertence a classe TDataSet do Delphi, desta forma, todos os componentes que descendem desta classe, tais como TClientDataSet, TSQLDataSet, TFDQuery e outros, possuem este método.
Ele é muito útil quando queremos inserir um novo registro, ao invés de usarmos o "Append" ou "Insert" dos componentes descendentes de TDataSet, e em seguida passar campo a campo atribuindo seus respectivos valores, e no final chamar o "Post" para gravar em cache o registro, podemos simplesmente invocar o método "InsertRecord" passando por parâmetro os valores dos campos em suas respectivas ordens. O tipo do parâmetro deste método é um array. Este array precisa estar coerente com a quantidade de campos do TDataSet utilizado, isto é, não posso passar mais ou menos valores no parâmetro array do que a quantidade de campos presentes no TDataSet, caso contrário uma exceção (Argument out of range) será levantada.
Devemos nos atentar também para o fato de que, a ordem dos valores passados no parâmetro deve ser a mesma ordem dos campos, para não atribuir valores errados em campos errados. Se algum campo não será preenchido, você deve passar um valor nulo ou padrão, mas não poderá pulá-lo.
Agora vamos a um exemplo prático e simples para melhorar a compreensão. Imagine uma tela de configuração de permissões do usuário, na qual atribuímos ou removemos permissões a um determinado usuário. Vamos utilizar o método "InsertRecord" justamente para fazer estas atribuições ou remoções de permissões. Para isso, crie um novo projeto no Delphi e monte um layout parecido com este:

Delphi TDataSet InsertRecord

No projeto acima, criei dois TClientDataSet temporários, cada um ligado em um TDataSource que está ligado em uma TDBGrid.
Apenas dois campos foram criados nos TClientDataSet temporários: "ID" (código da permissão) e "DESC" (descrição da permissão).
Adicionei dois TButton, um para atribuir e outro para remover. A primeira TDBGrid irá listar as permissões disponíveis, e a segunda, as permissões atribuídas ao usuário. A intenção é que, quando o usuário selecionar uma permissão na primeira TDBGrid e clicar no botão atribuir, a mesma será excluída da listagem para evitar que o usuário duplique uma mesma permissão atribuída, e será inserida na outra TDBGrid que estará listando as permissões atribuídas ao usuário. E ao clicar no botão remover, ocorrerá o processo inverso. Tudo isso será realizado por meio do método InsertRecord, ao qual invocaremos através do TClientDataSet.
Veremos como é bem simples e o código será bem "clean".
Vamos implementar um método que irá popular o TClientDataSet de permissões disponíveis com algumas permissões. No exemplo, vou definir estas permissões no próprio método, porém, você poderá fazer um loop lendo tais permissões de uma tabela do banco de dados por exemplo, e popular o TClientDataSet temporário. Para o nosso exemplo, declare o método "PopularPermissoes" no escopo "private" do formulário:

Delphi TDataSet InsertRecord

Implemente-o da seguinte maneira:

Delphi TDataSet InsertRecord

Note que apenas estou populando o TClientDataSet temporário com algumas permissões e no final apenas ativo os TClientDataSet temporários.
Muito bem, agora vamos chamar este método no evento "OnCreate" do formulário:

Delphi TDataSet InsertRecord

Agora vamos implementar o botão de atribuição, veja que simples:

Delphi TDataSet InsertRecord

Na linha 45, o TClientDataSet que listará as permissões atribuídas ao usuário recebe a permissão selecionada no TClientDataSet de permissões disponíveis por meio do método InsertRecord, passando por parâmetro os valores em sua ordem correta.
Na linha 46 apenas deletamos a permissão da listagem para evitar que o usuário atribua a mesma permissão duas vezes ou mais ao usuário.
Simples não? É só isso mesmo, ao executar a aplicação e testar, tu vai ver como vai funcionar perfeitamente.
Agora vamos implementar o botão de remoção:

Delphi TDataSet InsertRecord

Na linha 51 estamos voltando a permissão atribuída selecionada no TClientDataSet de listagem das permissões atribuídas ao usuário para a listagem das permissões disponíveis, e na linha 52, apenas excluímos a mesma das atribuições ao usuário.
Simples, teremos um efeito interessante e seguro. Você pode incrementar este projeto, adicionando mais um botão "Gravar atribuições" por exemplo, que ao concluir as atribuições ou remoções, o usuário clicará neste botão para persistir estas informações no banco de dados.
Muito bem, vou parando por aqui, espero ter contribuído de alguma forma, se tiverem alguma dúvida, deixe seu comentário que estaremos te ajudando. Um grande abraço e até o próximo.

(Por Welinton J. Dias)

27 de setembro de 2016

Code Insight: Help Insight

delphi language
Olá meu povo. Estamos hoje (27 de setembro de 2016) aqui para apresentar a vocês um recurso interessante, que provavelmente vocês já tenham notado ao usar alguma função no Delphi. Talvez vocês até já conhecem o recurso. Nosso objetivo hoje é mostrar como usá-lo. Afinal, de que estamos falando? Estamos falando de "Help Insight".
O Help Insight é um recurso do Delphi que permite termos uma breve histórico sobre qual a finalidade de um método, o que são cada um de seus parâmetros, retornos e observações.
Se você ainda não está entendendo do que se trata, dê uma olhadinha na imagem abaixo. Já viu essa janelinha aparecer quando se posiciona o mouse sobre um determinado método?
help insight delphi

Isso é o help insight. Seria interessante se pudéssemos fazer isso com nossos métodos não? Facilitaria muito a compreensão, quando outro programador usar algum método que implementamos e até mesmo pra nós, visto que depois de alguns anos sem alterar uma função que nós mesmos criamos, é comum esquecermos alguns detalhes. Então este recurso seria muito útil, e a boa notícia é que é possível criarmos nossos "help insight", e vamos mostrar como fazê-lo.
Quando não implementamos este recurso, o Delphi mostra um padrão, que se atêm apenas aos tipos dos parâmetros e detalhes técnicos.
Em algumas versões do Delphi, simplesmente clique no menu "Tools\Options\Code Insight" que uma janela será aberta, uma espécie de winzard que vai ajudá-lo a implementar o recurso. Porém, em versões mais novas, por exemplo no XE8, não temos mais este "winzard", portanto, temos que criar na "unha".
Para isso, precisamos compreender pelo menos as principais tags utilizadas. É utilizado um padrão parecido com o usado no XML, portanto, abre-se a tag com o comando desejado e no final, fecha-se a tag. Isso é extremamente necessário para que o help insight habilite a janela com os comentários.
Então vamos conhecer alguns elementos XML usados, pelo menos os mais usados.
help insight delphi



Estas tags são as mais utilizadas, porém, existem outras, que você pode conferir no Help do Delphi, basta pesquisar por help insight.
Uma observação importante, é que estes comentários devem ser feitos acima da declaração do método, posterior a três barras.
Muito bem, agora vamos para um exemplo prático. Crie um novo projeto no Delphi, e declare o seguinte método:
help insight delphi

Pressione as teclas "Shift + Ctrl + C" para implementarmos o nosso método. Implemente-o da seguinte maneira:
help insight delphi

Como vocês devem ter observado, esta é uma função muito complexa, tanto que vamos precisar criar um help para quem for utilizá-la. Só que não né? Brincadeiras a parte. É uma função bem básica, porém, eficiente para exemplificar o que queremos.
Vá até a declaração do método, e implemente os seguintes comentários, conforme mostra a imagem:
help insight delphi

Note que foi utilizado as três barras antes de cada comando, e no final, as tags estão sendo fechadas. Se esquecer de fechar uma se quer, o recurso não vai funcionar, sendo assim, caso você for testar e não funcionar, pode voltar aos comentários que provavelmente você esqueceu de fechar alguma tag ou escreveu um comando errado.
Agora vejamos o recurso funcionando na prática, ao posicionar o cursor do mouse sobre a chamada do nosso método, repare que agora a janela do help insight não é a padrão do Delphi e sim a nossa que criamos.
help insight delphi

Aqui finalizamos mais este artigo, use e abuse, até o próximo. Grande abraço.

(ClipaTec Informática)

18 de julho de 2016

TryStrToInt, InputBox e InputQuery no Delphi

Ola clipatequeiros! Suave na nave?
Neste artigo vamos apresentar a vocês três recursos presentes no Delphi que podem ser úteis em algum momento nos projetos de vocês. Vem com a gente que vocês vão se dar mal kkkkk zoeira gente! Cola com a gente que vocês vão brilhar. Let's go!!!
Para prosseguirmos, crie um novo projeto e coloque nele três "LabeledEdit" e três "Button". Segue a propriedade "Name" de cada um:

  • TLabeledEdit: edtNumero, edtInfoBox, edtInfoQuery;
  • TButton: btnConverter, btnInputBox, btnInputQuery;

No final teremos algo como isso:

delphi

Vamos começar falando sobre a função "TryStrToInt", que por sinal, muita gente não conhece, e é bem útil.

TryStrToInt

Esta função é utilizada para tentar converter um valor "String" em "Inteiro". É necessário fazermos este tipo de tratamento no sistema quando em algum momento precisamos ler um valor inteiro digitado em um "Edit", por exemplo, a idade de um cliente, geralmente, tratamos esta informação como sendo inteira, porém, se o usuário digitar uma letra, vai gerar aquele erro chato "is not a valid integer value.", atire a pedra quem nunca se deparou com este miserável kkk.
Porque isso acontece? Porque o "Edit" contém valor "String" e se atribuirmos o valor dele para uma variável "Inteiro" vai gerar este erro, caso a função "StrToInt" não conseguir converter o valor digitado. Obviamente que temos a propriedade "NumberOnly" do "Edit" que quando ativada (igual a True) nem permite o usuário digitar letra, isso evita programação. Mas, para este exemplo ficar claro, suponhamos que não exista esta propriedade e você precisa garantir a conversão do dado "String" digitado para "Inteiro". Se usarmos a função "StrToInt", funciona perfeitamente caso o valor digitado seja possível converter para "Inteiro", caso contrário vai gerar aquele erro lindo que citamos acima. 
Para resolver essa questão, temos que fazer um tratamento via programação. E para este tratamento, a maioria usa o "Try...Except", sendo assim, se não for possível converter o valor, vai cair no bloco de exceção onde terão as tratativas, seja mandar uma mensagem de erro gerado pela classe de exceção, ou alterar para um valor padrão, ou coisa do tipo. Acontece, que não é interessante criar um bloco de tratamento "Try...Except" para uma informação tão simples como esta. Seria uma alocação de recursos desnecessária. 
Legal, é aí que entra em cena a nossa querida função "TryStrToInt". O que ela faz? Vamos lá.
Esta função pede dois parâmetros, onde o primeiro é o valor a ser convertido, e o segundo, a variável que vai receber o valor de saída, que é o valor convertido. Se tudo isso ocorrer bem, a função retornará "True", ou seja, o valor foi convertido com sucesso e já está na variável de saída. Caso não seja possível converter o valor, a função retornará "False", então, apenas geramos uma mensagem simples ao usuário dizendo por exemplo que o valor digitado não é válido.
Legal, bacana. Não usamos o bloco "Try...Except" que faria uma consulta completa na classe de exceção, com isso, menos recursos alocado, mais praticidade, código limpo.
Claro que, se você deseja tomar outras decisões, com mais personalizações, então é melhor que se use o "Try...Except" mesmo.
Muito bem minha gente. Da mesma forma, existem funções como esta para outros tipos de dados, vamos listar as mais usadas:

  • TryStrToBool()
  • TryStrToCurr()
  • TryStrToDate()
  • TryStrToDateTime()
  • TryStrToFloat()


Use, teste e divirta-se. Abaixo temos um exemplo onde vamos converter o valor digitado no "Edit" para "Inteiro", para isso, basta dar um duplo-clique sobre o botão "Converter - btnConverter" e implementá-lo da seguinte forma:

trystrtoint delphi


InputBox

Muito bem. Eis ai outra função sensacional. Sabe quando você precisa que o usuário te informe uma única informação? Muitos tem o trabalho de criar um novo formulário onde vai ter apenas um "Edit" e os botões "Ok" e "Cancelar". Um trampo lascado apenas para receber uma informação do usuário. Por exemplo, supomos que ao finalizar uma venda, o sistema peça para informar o CPF do cliente.
Legal, pra você não ter que criar um formulário só pra isso, existe esta linda função no Delphi que vai solucionar este problema.
A função "InputBox" é utilizada para pegar uma informação digitada pelo usuário e armazenar em uma determinada variável. Valeu ressaltar que o valor que ela retorna que fora digitado, é sempre "String". Se você precisa de um valor de outro tipo, basta apenas convertê-lo posteriormente.
Esta função pede três parâmetros, onde o primeiro é uma "String" que aparecerá no título da janela, o segundo é uma "String" que vai aparecer ao lado de um campo de entrada e o terceiro é um valor padrão. Segue algumas considerações sobre o valor padrão, quando definido:

  • Ao abrir a janela, o campo de entrada já vem preenchido com ele;
  • Se você não apagar o valor padrão do campo, a função vai retorná-lo independente se você clicar em "Ok" ou "Cancel";
  • Se você apagar e clicar em "Cancel" ele retornará o valor padrão;
  • Se você apagar e clicar "Ok" ele vai retornar o valor vazio;
  • Se você digitar algo e clicar em "Ok", ela retorna o que você digitou;
  • Se você digitar algo e clicar em "Cancel" ela retorna o valor padrão;


Segue abaixo um exemplo de uso, para implementar, basta dar um duplo-clique sobre o botão "InputBox - btnInputBox":

inputbox delphi


InputQuery

Esta função é praticamente idêntica à anterior. A diferença é que ela retorna "True" quando o usuário clica no botão "Ok" e "False" quando o usuário clica no botão "Cancel".
A vantagem é que se o usuário clicar em "Cancel", o valor digitado é perdido, sendo assim, não altera o anterior, como acontece com o "InputBox".
Se clicar em "Ok", ai sim, o valor da variável é alterado. Segue o exemplo abaixo, para implementar, basta clicar duas vezes sobre o botão "InputQuery - btnInputQuery":

inputquery delphi


Show galera, simples, rápido e eficiente, esperamos que seja útil pra vocês em algum momento. Comente, compartilhe e siga-nos. Estamos juntos Everrr! Abraço e até o próximo.

Links:


(Por ClipaTec Informática)

21 de janeiro de 2015

Abordagem sistêmica - O que é sistema?

sistema transito
Olá gente, vamos ao primeiro artigo deste ano (2015) que promete muita novidades e variados assuntos neste blog que você sempre acompanha. Neste artigos vamos fazer uma breve introdução a respeito de sistemas de informação, o que é?

No dia a dia ouvimos ou até mesmo já dizemos as seguintes frases:


  • O sistema do banco está fora do ar
  • O sistema de trânsito está muito ruim
  • O sistema político está em decadência
  • O sistema digestivo, etc.

Note que em todos estes exemplos temos a palavra "sistema" que sempre está acompanhada de outra que a qualifica. O sistema está inserido em um ambiente, que é a parte externa onde o mesmo está.
Todo e qualquer sistema possui elementos característicos vinculados que interagem entre si contribuindo para o objetivo do sistema, por exemplo, em um sistema de trânsito temos os elementos: pedestres, veículos, motoristas, ruas, placas, sinalizações, semáforos, agente de trânsito, etc.
Então como podemos definir a palavra "sistema"?

Existem diversas definições para isso, algumas bastante abrangentes e outras generelizadas, por exemplo:

"Conjunto de partes coordenadas, que concorrem para a realização de um conjunto de objetivos" (DIAS & GAZZANEO, 1989:4).

"Um sistema é um conjunto de objetos unidos por alguma forma de interação ou interdependência" (CHIAVENATO, 1983:515).

"Sistema pode ser definido como um conjunto de elementos interdependentes que interagem com objetivos comuns formando um todo" (BALLESTERO ALVAREZ, 1990:17).

"Conjunto de elementos, entre os quais haja alguma relação. Disposição das partes ou elementos de um todo, coordenados entre sí, e que formam uma estrutura organizada" (FERREIRA, 1988:471).

Em nossa área de TI, vamos considerar sistema como sendo um conjunto de entidades relacionadas, que interagem entre sí, buscando atingir um objetivo.

(Por ClipaTec Informática)

15 de julho de 2014

Trabalhando com TClientDataSet - Quick Tips

quick tips
Olá galera, salve, salve.
Nesse artigo vamos dar algumas dicas sobre o componente TClientDataSet.
Quando trabalhamos com TClientDataSet, na hora de inserir o registro, grande parte dos programadores já vão direto para a parte de colocar a tabela em modo de inserção, em seguida, atribuir os dados para os campos do dataset. Acontece muito de as vezes ocorrer o famoso erro de dataset fechado, não é possível realizar uma inserção ou edição de dados de um dataset, se o mesmo estiver fechado. Nós podemos resolver este problema facilmente apenas fazendo uma pequena verificação antes. Temos que verificar se o dataset está ativo ou não, se ele não estiver ativo (aberto), então, damos um "Open" nele.

Veremos abaixo, um exemplo de inserção de dados num ClientDataSet.

If not(ClientDataSet.Active) then
     ClientDataSet.Open;

ClientDataSet.Append;
ClientDataSetCAMPO1.AsInteger := Valor1;
ClientDataSetCAMPO2.AsString := Valor2;
...
ClientDataSet.Post;

Então, antes de realizarmos qualquer operação com o ClientDataSet, primeiro verificamos se o mesmo está ativo, se não estiver, abrimos ele, em seguida colocamos em modo de inserção, e alimentamos os campos.
No final, chamamos o método "Post" para salvar o registro no ClientDataSet.
Vale ressaltar que o "Post" não salva o registro no banco, e sim no cache do ClientDataSet. Para que o registro seja persistido no banco de dados, é necessário chamar o método "ApplyUpdates" no evento "AfterPost" do ClientDataSet.
Assim finalizamos esta dica de hoje, que server mais para iniciantes, pois sempre recebemos vários mensagens de leitores sobre este erro, fazendo essa adaptação em sua implementação, você já evita que o erro de dataset fechado ocorra.

Abraço e até a próxima.
(Por ClipaTec Informática)