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

22 de fevereiro de 2018

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

crud delphi poo mvc dao

yupiiii, olá, olá clipatequeiros de plantão, bora dar continuidade nessa série. Neste artigo, vamos continuar implementando a camada DAO. Sem perca de tempo, com o projeto aberto no Delphi, crie um novo "Data Module", defina o "Name = DmCliente" e salve como "uDmCliente" dentro da pasta DAO.

Adicione quatro componentes "TSQLDataSet" e altere a propriedade "Name" de cada um para "sqlPesquisar", "sqlInserir", "sqlAlterar" e "sqlExcluir". Agora adicione um componente "TDataSetProvider", altere a propriedade "Name" para "dspPesquisar" e na propriedade "DataSet" aponte para o componente "sqlPesquisar". Agora adicione um componente "TClientDataSet", altere a propriedade "Name" para "cdsPesquisar" e na propriedade "ProviderName" aponte para o componente "dspPesquisar".


crud delphi poo mvc dao

OK, agora, precisamos alimentar os componentes TSQLDataSet com seus respectivos comandos SQL. Então, selecione o componente "sqlPesquisar" e na propriedade "CommandText" adicione a seguinte instrução SQL:


"select c.id, c.nome, c.telefone, cid.nome as cidade from cliente c left join cidade cid on (c.id_cidade = cid.id) where c.nome like :nome"


Agora precisamos configurar o tipo do parâmetro "nome" presente na nossa instrução SQL. Não vamos entrar em detalhes na explicação do SQL, basicamente estamos trazendo algumas informações do banco de dados referente ao cliente, dando opção de pesquisar por nome apenas. Você pode incrementar este SQL adicionando mais opções de pesquisa. Para configurar o parâmetro, clique no botão elíptico (botão com três pontinhos...) da propriedade "Params" do "sqlPesquisar". A janela que lista os parâmetros contidos no SQL será aberta, como só temos um "o nome", então apenas ele aparece. Clique sobre este parâmetro "nome" e na propriedade "DataType" selecione o tipo "ftString". Feito isso, pode fechar esta janela, porque agora nosso componente "sqlPesquisar" já sabe que o parâmetro "nome" é um parâmetro de entrada que receberá um valor do tipo "string (texto)" que será repassado e substituído no comando SQL.
Agora, clique com o botão direito do mouse sobre o componente "cdsPesquisar" e selecione a opção "Fetch Params", apenas para que este componente também tenha conhecimento do parâmetro "nome".
Show de bola, agora, selecione o componente "sqlInserir" e na propriedade "CommandText" dele, adicione a seguinte instrução SQL:

"insert into CLIENTE (ID, ID_CIDADE, NOME, CPF, RG, TELEFONE) values (:ID, ID_CIDADE, :NOME, :CPF, :RG, :TELEFONE)"

Agora, vá na propriedade "Params" para configurarmos o tipo dos parâmetros igual fizemos com o "sqlPesquisar". Segue o tipo de cada parâmetro: "ID = ftInteger; ID_CIDADE = ftInteger; NOME = ftString; CPF = ftString; RG = ftString; TELEFONE = ftString". Após ter configurado todos estes parâmetros, pode fechar a janela.
Selecione o componente "sqlAlterar" e na propriedade "CommandText" adicione o seguinte comando SQL:


"update CLIENTE set ID_CIDADE = :ID_CIDADE, NOME = :NOME, CPF = :CPF, RG = :RG, TELEFONE = :TELEFONE, where (ID = :ID)"

Configure os tipos dos parâmetros conforme fizemos no "sqlInserir". Muito bem, pra finalizarmos, selecione o componente "sqlExcluir" e na propriedade "CommandText" adicione o seguinte comando SQL:

"delete from CLIENTE where (ID = :ID)"

Configure o parâmetro "ID" para "ftInteger".

Ufa, finalmente chegamos ao fim de mais um artigo, no qual, configuramos todas as instruções SQL. No próximo artigo, vamos começar a implementação dos métodos na camada DAO. Esperamos vocês, até lá.
Este artigo faz parte da série Cadastro Delphi POO + MVC + DAO.

(Por ClipaTec Informática)

21 de fevereiro de 2018

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

crud delphi poo mvc dao

Salve galera, continuando nossa série de cadastro Delphi POO + MVC + DAO, no artigo de hoje iremos iniciar a implementação da camada DAO.
Para isso, com o projeto aberto no Delphi, clique no menu "File/New/Other...", e na lista que aparece ao lado esquerdo da janela "New Items", selecione a opção "Delphi Files" e ao lado direito nos itens disponíveis, clique em "Data Module". Desta maneira um novo "Data Module" será criado.
Este será o nosso Data Module de conexão. Ele será utilizado apenas como um container para o componente "SQLConnection", visto que estaremos trabalhando com a engine de acesso a dados DBX (DBExpress).
Para cada módulo do sistema, um Data Module será criado, sendo assim, teremos a camada DAO bem dividida.
Muito bem, altere a propriedade "Name" deste Data Module para "DmConexao" e salve-o  com o nome "uDmConexao" para a "Unit" dentro da pasta DAO.
Antes de adicionarmos o componente de conexão, vamos criar a nossa definição de conexão, isso é possível, por meio da janela "Data Explorer". Faremos isso para não ter que criar um arquivo INI para poder gravar/ler o caminho do banco de dados para configurá-lo e conectá-lo em nossa aplicação, utilizaremos o arquivo próprio da DBX, o "DBXConnections.ini", que é carregado automaticamente pelo componente.

Para criar nossa definição de conexão, acesse a janela "Data Explorer", expanda o item "dbExpress" e localize o subitem "Firebird", visto que, estaremos utilizando o banco Firebird nesta aplicação exemplo.

crud delphi poo mvc dao


Clique com o botão direito sobre ele e escolha a opção "Add New Connection":

crud delphi poo mvc dao

Ao fazer isso, uma janela será aberta pedindo que seja definido um nome para esta definição de conexão, digite "CadCliente" e pressione o botão "OK".

crud delphi poo mvc dao

Uma segunda janela é aberta, nela precisamos indicar o local onde se encontra o banco de dados, o usuário do banco de dados e a senha do banco de dados. Lembrando que o usuário e senha padrão do Firebird é "SYSDBA" e "masterkey" respectivamente. Para se certificar que está tudo certo, clique no botão "Test Connection", se aparecer a mensagem "Test connection succeeded", pode clicar no botão "OK" da mensagem e da janela, porque sua conexão está configurada. Caso ocorrer algum erro, poste ai nos comentários que estaremos lhe ajudando a resolver.

crud delphi poo mvc dao


Muito bem, agora que já temos a nossa configuração de conexão pronta, basta adicionar no Data Module (DmConexao) um componente "TSQLConnection". Renomeie a propriedade "Name" dele para "sqlConexao", "LoginPrompt = False", em "ConnectionName" aponte para a definição de conexão que acabamos de criar, ou seja, "CadCliente" e "LoadParamsOnConnect = True", esta última propriedade é importante estar como "True", para que a aplicação sempre que iniciada, carregue o arquivo "dbxconnections.ini" e configure a conexão com o banco automaticamente. É importante ressaltar que todas as definições de conexão que são feitas pela janela "Data Explorer" são gravadas neste arquivo INI padrão.

crud delphi poo mvc dao

É isso aeeeeeee, a parte de conexão com o banco de dados já está pronta, no próximo artigo, iremos criar a DAO Cliente. Até lá, abraços.

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

(Por ClipaTec Informática)

19 de fevereiro de 2018

Cadastro Delphi POO + MVC + DAO - Camada View (Layout) - Parte 2

delphi mvc crud poo layout view

Salve galera, neste artigo, vamos continuar implementando a camada "view", desta forma, finalizando nosso layout de CRUD. No artigo anterior, montamos a aba de pesquisa, e agora montaremos a aba de manutenção de dados.
Para isso, abra o projeto no Delphi, clique na aba "tbDados" e adicione 8 componentes "TLabelEdEdit", e renomeie a propriedade "Name" deles respectivamente para: "edtCodigo", "edtNome", "edtRG", "edtCPF", "edtCodigoCidade", "edtCidade", "edtEstado" e "edtTelefone". Após isso, expanda a propriedade "EditLabel" de cada um deles e, altere a propriedade "Caption" para um da sua escolha, seguindo a mesma ordem anterior, sugerimos: "Código", "Nome", "RG", "CPF", "Cód. Cidade", "Cidade", "Estado" e "Telefone".
All right, agora, insira um componente "TPanel", renomeie as seguintes propriedades: "Name = pnlCadBtns", "Align = alBottom", "BevelOuter = bvNone" e "Color = $00ADD2FC". Dentro deste "pnlCadBtns" adicione quatro componentes "TButton", e renomeie as propriedades "Name" respectivamente para: "btnListar", "btnAlterar", "btnGravar" e "btnCancelar". Agora o mesmo para as propriedades "Caption" de cada um: "Listar", "Alterar", "Gravar" e "Cancelar".
Legal, feito isso, no final teremos um layout parecido com este:

delphi mvc crud poo layout view


Muito galera, chegamos ao fim deste artigo, o layout está concluído, você pode adotar este mesmo padrão para implementar outros cadastros que você incrementar neste projeto futuramente, pode até trabalhar com herança visual e de código, desta maneira usufruindo de todos os recursos da POO dentro do Delphi. Um forte abraço e até o próximo artigo, onde iremos iniciar a implementação da camada DAO. Até lá.

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

(Por ClipaTec Informática)

7 de fevereiro de 2018

Cadastro Delphi POO + MVC + DAO - Camada View (Layout) - Parte 1

delphi mvc dao view layout

Salve galera, dando continuidade a nossa série de "Cadastro Delphi POO + MVC + DAO", neste artigo iremos implementar a camada view no que se refere a layout, os códigos serão implementados em artigos posteriormente.
Legal, abra o projeto no Delphi, e já vamos fazer uma alteração em nosso "FrmPrincipal", altere a propriedade "Color" do formulário conforme a tabela:

delphi mvc dao view layout

Muito bem, agora vamos criar nossa tela de cadastro, para isso, vá até o menu "File/New/VCL Form - Delphi". Salve o mesmo dentro da pasta view com o nome "uFrmCadastrarCliente". Agora, altere as propriedades deste novo formulário de acordo com a tabela:

delphi mvc dao view layout

Legal, agora vamos inserir alguns componentes e configurá-los, então, insira um "TPanel", um "TPageControl" e um "TButton", e altere as propriedades deles exatamente na mesma ordem da tabela abaixo:
Obs: O TButton deve ser adicionado dentro do TPanel.

delphi mvc dao view layout

Certo, agora, clique com o botão direito do mouse dentro do componente "pgcPrincipal" e selecione a opção "New Page", repita o procedimento mais uma vez, desta forma, teremos duas abas, "TTabSheet1" e TTabSheet2", renomeie a propriedades delas respectivamente para "tbPesq" e "tbDados".
Neste projeto, não criaremos duas telas, uma para pesquisa e outra para manutenção dos dados do cliente, tudo será feito na mesma tela, e como já observado, vamos separar a pesquisa da manutenção através das abas que acabamos de criar.
Agora, clique na aba "tbPesq" e insira dois componentes TPanel dentro dela, e altere as propriedades conforme a tabela abaixo:

delphi mvc dao view layout

Perfeito, agora, coloque dentro do "pnlFiltro" um componente "TLabeledEdit", renomeie a propriedade "Name" dele para "edtPesq", expanda a propriedade "EditLabel", e altere a subpropriedade "Caption" para "Digite para pesquisar".
Ainda dentro do "pnlFiltro", adicione mais um componente, um TButton, e altere as propriedades dele para "Name = btnPesquisar" e "Caption = Pesquisar".
Agora, dentro do "pnlPesqBtns" insira três TButton, e altere as propriedades deles respectivamente para: "Button1: Name = btnNovo; Caption = Novo", "Button2: Name = btnDetalhar; Caption = Detalhar" e "Button3: Name = btnExcluir; Caption = Excluir";

No final de tudo, teremos um layout parecido com este:


delphi mvc dao view layout



Bom galera, vamos parando por aqui, no próximo artigo, iremos montar a aba de manutenção de dados, concluindo assim, o layout do nosso cadastro, para seguirmos com as implementações dos códigos.

A parte de layout sempre é mais chatinha mesmo de montar, pois ocupa muito tempo, já dizia alguém muito sábio: ou você é um programador excelente ou um excelente designer, os dois não dá. Realmente galera, é meio que impossível ser excelente nas duas coisas kkk. Por este motivo não estamos caprichando em um layout muito top, mas é um layout simples, limpo e fácil de usar, isso é o que importa. Até o próximo artigo, um forte abraço.

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

(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)

29 de janeiro de 2018

Cadastro Delphi POO + MVC + DAO - Camada Model

cadastro delphi poo mvc dao camada model

Olá gente boa, esperamos que esteja tudo bem com vocês. Aqui estamos para mais um artigo da nossa série de cadastro Delphi POO + MVC + DAO.
Como prometido no artigo anterior, iniciaremos nossas implementações pela camada Model.
Quando vamos implementar o padrão MVC, sempre vem aquela pergunta: por qual camada devo começar?
Na verdade não existe uma receita, o que é crucial neste momento, é entender como funciona a lógica do MVC, porque em determinados momentos, ficaremos alternando entre uma camada e outra, portanto, se você não entendê-lo, certamente ficará perdido e não saberá o que fazer. Se você ainda tem dúvidas sobre o padrão MVC, sugerimos que leia novamente o segundo artigo desta série, e se a dúvida ainda persistir, deixe seu comentário lá no artigo que te ajudaremos.
Muito bem, para facilitar um pouco a implementação do MVC, a primeira camada a ser desenvolvida será a Model. A sequencia ficou assim: Model, DAO, View, Controller. Entretanto, apenas a camada Model conseguiremos implementar completamente sem precisar ficar navegando entre camadas, as demais, em determinados pontos teremos que parar, ir para outra camada, depois voltar, e assim até que todas as implementações de todas as camadas estejam completas. Na prática isso será melhor assimilado.
Muito bem, como você já aprendeu aqui, a camada Model, neste caso ficará apenas com as definições das classes, bem como, as regras de negócio. Lembrando que as regras de negócio, resumidamente explicando, nada mais é que, as estruturas que são definidas e o controle das operações da empresa.
Legal, abra o Delphi e logo em seguida o projeto que criamos no artigo anterior. Feito isso, clique no menu "File/New/Unit - Delphi". Repare que uma nova "Unit" foi criada, salve-a com o nome "uClienteModel" dentro da subpasta "model" do projeto.

Vamos criar nossa classe "Cliente", e apenas uma regra de negócio onde iremos restringir a gravação de clientes, impedindo que os mesmos sejam gravados sem preencher as informações: nome e telefone.
Os métodos não serão implementados na classe, faremos isso por meio do padrão DAO. É bom lembrar que existem diversas maneiras de implementar o MVC, tudo vai depender do ponto de vista do programador, o que é importante é saber as responsabilidades de cada camada, sendo assim, se você pesquisar por cadastro em MVC no Delphi, vai encontrar diversos artigos e cada um implementando de um jeito diferente. Aqui mostraremos uma forma de implementá-lo, caberá a você acatar ou não a forma que estaremos utilizando.

Segue a implementação completa da camada Model:

delphi mvc poo camada model

delphi mvc poo camada model

Na "linha 6" damos "uses" na unit "System.SysUtils", porque abaixo utilizaremos uma constante padrão do Delphi que representa "vazio", estamos falando da constante "EmptyStr".
Na "linha 8" adicionamos o comando "type", para que possamos definir nossa classe. Na "linha 9" começamos a criar nossa classe "Cliente", com suas respectivas propriedades e métodos.
A regra de negócio começa na "linha 36", onde faremos validações por meio dos métodos "set" para verificar se as propriedades nome e telefone estão preenchidas, caso contrario, a operação é abortada, impedindo que o cliente fique sem tais informações.
Muito bem, feito isso, só salvar. No próximo artigo, continuaremos nossas implementações, por ora, nossa camada Model está finalizada. Lembrando que, por ser um projeto exemplo, implementaremos apenas o cadastro de cliente. A partir desse modelo, você poderá implementar os demais cadastros.
Um grande abraço e até o próximo artigo.

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

(Por ClipaTec Informática)