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 Tutoriais. Mostrar todas as postagens
Mostrando postagens com marcador Tutoriais. 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)

12 de maio de 2018

Cadastro Delphi POO + MVC + DAO - Camada View - Parte 6

delphi mvc poo camada view

Aooooo meu povo, finalmente chegamos ao penúltimo artigo da nossa série de cadastro Delphi POO + MVC + DAO. Estamos felizes por ter acendido uma pequena luz nessa escuridão, algumas pessoas tem interagido outras entraram em contato, e isso é muito gratificante. Neste artigo vamos finalizar as implementações da camada VIEW.
Sem perca de tempo, com o projeto aberto no Delphi, acesse a tela de cadastro de cliente, selecione a "StringGrid" e implemente o evento "OnDrawCell" assim:

delphi mvc poo camada view

Esta implementação apenas pinta os títulos das colunas da Grid, para ter um destaque visual, caso as descrições dos títulos das colunas não aparecer, acrescente esta linha após a linha 340:

Canvas.TextOut(Rect.Left, Rect.Top, Cells[ACol,ARow]);

Agora vamos implementar o evento "OnDblClick" da "StringGrid", este evento é acionado quando o usuário der um duplo-clique sobre algum registro, ele apenas chama o método "Detalhar":

delphi mvc poo camada view

OK, agora, implemente o evento "OnShow" do formulário de cadastro assim:

delphi mvc poo camada view

Simplesmente, ao abrir a tela de cadastro de cliente, o método "SetUp" será chamado, e as configurações básicas para o bom funcionamento da tela serão realizadas. 
Implemente o evento "OnKeyPress" da tela de cadastro desta maneira:

delphi mvc poo camada view

Este método verifica se a tecla "Enter" foi pressionada, caso sim, nós anulamos sua funcionalidade em seguida e chamamos a função "Tab", para que quando o usuário pressionar a tecla "Enter", ele consiga navegar entre os campos da tela.
Agora, vamos implementar os eventos "OnClick" dos seguintes botões:

Pesquisar

delphi mvc poo camada view

Novo

delphi mvc poo camada view

Detalhar

delphi mvc poo camada view

Excluir

delphi mvc poo camada view

Listar

delphi mvc poo camada view

Alterar

delphi mvc poo camada view

Gravar

delphi mvc poo camada view

Cancelar

delphi mvc poo camada view

Esta foi a parte mais simples, pois, apenas chamamos os métodos que já foram implementados nos botões. Desta maneira, finalizamos as implementações da camada VIEW, agora, no próximo artigo, vamos finalizar o projeto. Qualquer dúvida, só comentar, até o próximo, abraço.

Este artigo faz parte da série: CRUD Delphi POO + MVC + DAO;

(Por ClipaTec Informática)

11 de maio de 2018

Cadastro Delphi POO + MVC + DAO - Camada View - Parte 5

delphi mvc poo camada view

Olá clipatequeiros de plantão. Estamos em reta final desta série de artigos, e no artigo de hoje, vamos continuar implementando os métodos da camada VIEW. Com o projeto aberto no Delphi, implemente o método "Gravar":

delphi mvc poo camada view

Conforme vimos no início da parte 3 vamos usar o Field "FOperacao", o qual, uma de suas finalidades é nortear o método gravar, rapidamente explicando, quando o usuário clicar no botão "Novo", este campo recebe um valor de tipo enumerado "opNovo", e quando o usuário clicar no botão "Alterar", este campo recebe um valor "opAlterar", desta maneira, agora aqui dentro do método "Gravar", fazemos uma verificação, se o valor deste campo é "opNovo", então o método "Gravar" vai chamar o método de inserção, caso for "opAlterar", o método  de alteração será chamado.
Após o método Inserir ou Alterar for chamado, ao final da operação, se deu tudo certo, novamente chamamos o método de pesquisa para atualizar as informações.

Muito bem, agora implemente o método "Inserir":

delphi mvc poo camada view

Como você já deve estar habituado, não tem muito segredo, algumas linhas dispensa comentários e explicações. Basicamente um objeto do tipo "TCliente" é criado, e alimentado com as informações dos componentes que o usuário digitou, logo após, este objeto é enviado para a DAO por meio da Controller, onde as informações do mesmo será extraída e inserida na base de dados, se ocorrer algum erro, este erro é retornado dentro da variável "sErro" e exibida para o usuário como uma exceção.
Agora, vamos implementar o método que faz aquela mágica nos componentes para habilitar e desabilitar conforme a operação que está sendo realizada, então, mão na massa, implemente o método "HabilitarControles":

delphi mvc poo camada view
C
Como você percebeu, este método vai habilitar ou desabilitar os controles (TEdit, TButton, etc) conforme a operação (Inserção, Alteração ou Navegação). Sem segredos nénom? Qualquer dúvida, deixe seu comentário.
Ufa, calma que já estamos quase concluindo nosso projeto por completo, daqui sete artigos chegaremos ao fim (kkkkkkkkkk) brincadeira, faltam poucos artigos. Brincadeiras a parte, agora vamos implementar o evento "OnClick" do botão "btnCliente". Este botão, está no formulário do menu principal, então, acesse ele, dê um duplo-clique sobre o botão "Cliente" e implemente desta forma:

delphi mvc poo camada view

Este botão simplesmente cria o formulário de cadastro de cliente na memória e exibe para o usuário, e quando for fechado, o mesmo é liberado da memória. É importante ressaltar que, você precisa fazer o formulário principal enxergar o formulário de cadastro, para isso, pressione "Alt + F11" e selecione o formulário de cadastro de cliente na lista, deixe a opção "Implementation" marcada e clique no botão "OK". É o famoso "Use Unit". Para finalizarmos este artigo, volte para o formulário de cadastro de cliente, selecione a "StringGrid" e implemente o evento "OnSelectCell" da seguinte maneira:

delphi mvc poo camada view






Conforme o usuário seleciona um registro na "StringGrid", o código do mesmo é armazenado no campo "IdSelecionado", conforme você observou durante as implementações, este campo é usado durante as chamadas de alguns métodos, como o método "CarregarCliente" por exemplo.
Gente boa, assim terminamos mais um artigo, esperamos vocês no próximo artigo, um dos últimos desta série espetacular. Até lá. Tchauuu brigadoooo.

Este artigo faz parte da série: CRUD Delphi POO + MVC + DAO;

(Por ClipaTec Informática)

10 de maio de 2018

Cadastro Delphi POO + MVC + DAO - Camada View - Parte 4

delphi mvc poo camada view

Salve, salve galera. De volta a nossa série, no artigo anterior havíamos implementado alguns métodos, neste artigo, daremos continuidade nas implementações dos métodos. Para tal, abra o projeto no Delphi e implemente o método "CarregarCliente" da seguinte forma:

delphi mvc poo camada view

Nas linhas 157 e 158 declaramos nossos objetos da classe TCliente e TClienteController.
Nas linhas 160 e 161 criamos as instâncias desses objetos na memória e nas linhas 176 e 177 liberamos da memória após o uso.

Na linha 163, invocamos o método "CarregarCliente" da classe TClienteController, que por sua vez, vai chamar o método "CarregarCliente" da DAO. Note que este método pede um objeto do tipo TCliente que será preenchido lá na camada DAO, e o código do cliente, cujas informações serão buscadas na base de dados para preencher o objeto.
Da linha 164 a 174, apenas estamos lendo as informações que estão no objeto "oCliente" que foi preenchido anteriormente, e jogando nos componentes da tela, para que o usuário possa ver essas informações.

Agora, vamos implementar o método "Alterar:

delphi mvc poo camada view

Este método, conforme observado, vai ler as informações que estão nos componentes da tela que foram preenchidos pelo usuário e alimenta o objeto com estas informações. Feito isso, este objeto preenchido é passado para o método "Alterar" da "TClienteController", que vai direcionar para a DAO, onde as alterações serão persistida na base de dados, caso ocorra algum erro, o mesmo é retornado pelo método através do parâmetro do tipo variável "sErro", que é exibido pela exceção (raise Exception).
Agora, o método "Listar":

delphi mvc poo camada view

Este método simplesmente ativa a aba de pesquisa.
Implemente o método "Excluir":

delphi mvc poo camada view
Clique na imagem para ampliar e vê-la completo

O método excluir também é bem simples. Na linha 196, estamos verificando se nossa "StringGrid" possui algum registro, caso contrário, uma exceção é suscitada informando que a tabela está vazia, portanto, não há o que excluir.
Caso tenha algum registro selecionado, capturamos o código dele e repassamos para o método "Excluir" da "TClienteController" que fara o resto, como você já sabe.
Após a exclusão, apenas chamamos o método de pesquisa novamente, para atualizar a "StringGrid", se isso não for feito, embora o registro seja excluído ele continuará listado na tabela, e isso pode causar uma dúvida ao usuário, que vai pensar que o registro não foi excluído.
Muito bem, assim chegamos ao final de mais um artigo, aguardamos você no próximo para darmos continuidade, já estamos quase no final desta série, continue conosco, um grande abraço.

Este artigo faz parte da série: CRUD Delphi + POO + MVC + DAO;

(Por ClipaTec Informática)

3 de março de 2018

Cadastro Delphi POO + MVC + DAO - Camada Controller

crud delphi poo mvc dao camada controller

Oi, tudo bem com vocês? Estamos quase acabando nossa série por completo. No artigo de hoje, iremos implementar a camada Controller que é bem simples.
Sem delongas, com o projeto aberto no Delphi, crie uma nova unit e salve com o nome "uClienteController" dentro da pasta "controller".
Vamos precisar criar uma classe "TClienteController" com seus métodos, segue a implementação (não esqueça das uses):

crud delphi poo mvc dao camada controller
Agora, pressione a tecla de atalho "Shift + Ctrl + C" e implemente os métodos da seguinte maneira:

crud delphi poo mvc dao camada controller
crud delphi poo mvc dao camada controller

Note que criamos os métodos exatamente iguais a camada DAO em sua assinatura, pois como você já sabe, a camada Controller, vai ser apenas uma intermediária entre a View e DAO, ela é responsável por definir o fluxo de dados, de onde vem e para onde vai, sendo assim, ela apenas chama os métodos da DAO, repassando os mesmos parâmetros, e após a execução dos métodos na DAO, ela captura o retorno e envia para quem está chamando o método, neste caso, será a View.
Pronto, acabou. Mas já? Só isso? Tem certeza? Simmmm. Acabou hehehe. Então isso é um tchau, até o próximo artigo, onde retornaremos a camada View, só que agora, para implementar os métodos, visto que nas parte 1 e parte 2 da View já publicados apenas criamos o layout da tela de CRUD Cliente. Até lá, abraço.

Este artigo faz parte da série CRUD Delphi POO + MVC + DAO;

(Por ClipaTec Informática)

2 de março de 2018

Cadastro Delphi POO + MVC + DAO - Camada DAO - Parte 5

crud delphi poo mvc dao

Fala gente boa, no artigo de hoje, concluiremos finalmente a camada DAO Cliente. No artigo anterior, implementamos os métodos "CarregarCliente" e "Inserir". Neste artigo, iremos implementar os métodos "Alterar" e "Excluir", finalizando esta camada.
O método "Alterar" é muito semelhante ao método "Inserir" em sua estrutura, o que muda, é apenas a instrução SQL que está inserida no componente "sqlAlterar":

crud delphi poo mvc dao

Da linha 41 a 49 estamos lendo as propriedades do objeto "oCliente" passado por parâmetro, recuperando seus valores e atribuindo aos parâmetros do SQL. Na linha 51 tentamos persistir estas alterações no banco, se não houver falha, na linha 52 retornamos True, caso contrário, cairá no bloco de exceção, onde capturamos o erro e atribuímos ao parâmetro varável "sErro" e retornamos False.
Qualquer dúvida em relação ao entendimento dos códigos, deixe seu comentário para que possamos ajudá-lo.
Agora vamos implementar o método "Excluir":

crud delphi poo mvc dao

Este método é o mais simples, porque, para excluirmos um determinado cliente, apenas precisamos saber qual é o código dele, então o método pede por parâmetro o código do cliente a ser excluído, este valor é alimentado na instrução SQL de "delete" conforme a linha 93, o restante do método, dispensa comentários, visto que é a mesma coisa dos métodos anteriores.
Muito bem, finalmente e felizmente concluímos a camada DAO Cliente. No próximo artigo, vamos dar inicio na implementação da camada "Controller".
É importante observar, que não estamos exibindo nenhuma mensagem dentro da camada DAO, pois, as mensagens estão sendo repassados por meio de um parâmetro de saída, que é uma variável, esta mensagem é retornada para a camada Controller que vai retornar para a camada View que finalmente, irá exibir na tela para o usuário. Simples assim.
Antes de encerrarmos este artigo, precisamos definir que tanto a tela de cadastro de cliente quanto o Data Module de cliente, sejam criados no momento em que formos utilizá-los, ou seja, eles não serão criados automaticamente na memória assim que a aplicação for iniciada. Para isso, clique no menu "Project/Options", clique no item "Forms" listado ao lado esquerdo, selecione o "DmCliente" e "FrmCadastrarCliente", em seguida, clique no botão com o símbolo ">" para incluí-los na lista de "Available Forms". Clique no botão "OK" e pronto, agora, eles não serão mais criados automaticamente assim que a aplicação for iniciada, iremos criá-los e destruí-los em tempo de execução, no momento em que precisarmos.


crud delphi poo mvc dao
Clique na imagem para ampliar o tamanho.


Até o próximo artigo, abraço, beijo me liga.

Este artigo faz parte da série Cadastro Delphi POO + MVC + DAO;


(Por ClipaTec Informática)