Utilizar Máscaras [MaskEdit]


O MaskEdit é um componente nativo muito útil em alguns casos, A utilização destas máscaras facilita para o usuário o preenchimento de algum campos, e um excelente recurso para estabelecer normas de digitação.
Exemplo: O campo de CEP, CNPJ, Telefone... não permite digitar letras, então devemos colocar o tipo de máscara que o campo deve aceita!
Temos o componente MaskEdit na paleta de componentes ou a propriedade EditMask dos fields dos campo de um DataSet.



A máscara é composta por 3 elementos básicos separados por ponto e vírgula ” ; “.

1. A regra da máscara;
2. Determina se os caracteres fixos da máscara serão salvos ou não;
3. Representa o carácter que será mostrado quando a máscara estiver em branco.

Exemplo: AAA;1;_

Veja abaixo os principais caracteres especiais que podem ser utilizados para definir um tipo de máscara:

A   Caracteres alfanuméricos (A-Z, a-z, 0-9) com preenchimento obrigatório. Ex: AAA;1;_
a   Caracteres alfanuméricos (A-Z, a-z, 0-9) com preenchimento opcional. Ex: aaa;1;_
0   Caracteres numéricos (0-9) com preenchimento obrigatório. Ex: 000;1;_
9   Caracteres numéricos (0-9) com preenchimento opcional. Ex: 999;1;_
L   Caracteres alfabéticos (A-Z, a-z) com preenchimento obrigatório. Ex: LLL;1;_
l    (Letra minúscula) Caracteres alfabéticos (A-Z, a-z) com preenchimento opcional. Ex: lll;1;_
>   Todos os caracteres alfabéticos digitados após este símbolo serão convertidos para maiúsculos. Ex:>aaa;0;_
<    Todos os caracteres alfabéticos digitados após este símbolo serão convertidos para minúsculos. Ex:<aaa;0;_
<>   Anula o uso dos caracteres > e <. Ex: >aaa<>aaa;0;_
\      Utilizado para marcar determinado caractere não especial como fixo, não podendo sobrescrevê-lo. Ex:!\(999\)000-0000;0;_
C  Exige preenchimento obrigatório com qualquer caractere para a posição. Ex: CCC;1;_
c   Permite qualquer caractere para a posição com preenchimento opcional. Ex: ccc;1;_
#   Caracteres numéricos (0-9) e os sinais de – ou + com preenchimento opcional. Ex: ###;1;_
:    Utilizado como separador de horas, minutos e segundos. Ex: !00:00:00;1;_
/    Utilizado como separador de dia, mês e ano. Ex: !99/99/9999;1;_
;   Separa os três campos da máscara.
_ Caractere usado normalmente nas posições do campo ainda não preenchidas.

As mascaras mais utilizadas são: 
CPF = ___.___.___-__
!999.999.999-99;0;(espaço)

Inscrição Estadual = __.___.___-_
!99.999.999-9;0;(espaço)
CNPJ = __.___.___/____-__
!99.999.999.999/9999-99;0;(espaço)

CGC = __.___.___/____-__
!99.999.999.999/9999-99;0;(espaço)
Telefone convencional = (__)___.__.__
!(99)9999-99-99;0;(espaço)

Telefone celular = (__)____.__.__
!(99)9999-99-99;0;(espaço)
Salario = R$__,__
!R$ 0.,00; 0.,00;(espaço)

CEP = _____.___
!99999-999;0;(espaço)
Data = __/__/____
!99/99/9999;0;(espaço)

Como utilizar o componente MaskEdit:

Como utilizar o EditMask nos fields:


FastReport no Delphi - Visualizar mais de um relatório ao mesmo tempo


Com o necessidade de juntar dois documento o FastReport tem essa opção é algo simples, então vamos no nosso cenário:


Teremos dois documento um o "
Contrato" e outro é um "Aditivo contratual", Vamos fazer dois chamados correto? Já que são documento diferentes um para o "Contrato" e outro para o "Aditivo contratual", mas  como sempre tem aquele cliente que quer imprimir os dois documentos ao mesmo tempo, então usaremos essa opção do FastReport para juntar os dois documentos em um único relatório.

Para isso, o FastReport possui ferramentas que permitem anexar vários em um único documento. O método frxReport.PrepareReport tem um parâmetro ClearLastReport: Boolean. Este parâmetro determina se as páginas do relatório criado anteriormente devem ser apagadas.

Vamos a nosso exemplo: 

O código dos botões para visualizar os documento unitários são normais:
procedure TFSistema.BtnAditivoClick(Sender: TObject);
begin
  frxReport.LoadFromFile('Aditivo.fr3');
  frxReport.PrepareReport;
  frxReport.ShowReport;
end;

procedure TFSistema.BtnContratoClick(Sender: TObject);
begin
  frxReport.LoadFromFile('Contrato.fr3');
  frxReport.PrepareReport;
  frxReport.ShowReport;
end;
O código do botão para visualizar os documentos unidos e um pouco diferente:
procedure TFSistema.BtnAmbosClick(Sender: TObject);
begin
  frxReport.LoadFromFile('Contrato.fr3');
  frxReport.PrepareReport;
  frxReport.LoadFromFile('Aditivo.fr3');
  frxReport.PrepareReport(False);
  frxReport.ShowPreparedReport;
end;
Analisando o código acima a diferença e ter ambos os documento sendo carregados pelo LoadFromFile e ser preparado pelo PrepareReport, já a diferença e o PrepareReport com a propriedade False a partir do segundo carregamento, com isso se tivesse mais de dois arquivos os próximos também estariam com a propriedade False, logo após outra diferença mudamos o ShowReport pelo ShowPreparedReport;

Vamos ver como ficou: 


Fonte: https://www.fast-report.com/en/blog/353/show/

Primeiros passos com TestInsight


Vamos por passos, primeiro baixamos e instalamos o TestInsight, reinicie o IDE e recarregue o projeto. 
Após a instalação iremos encontrar o TestInsight instalado em menu View >> TestInsight;

Após instalação e verificação de onde se encontra o TestInsight eu normalmente salvo a tela no canto direito para melhor visualização quando executar os testes, isto no desktop do Delphi.


Agora vamos configurar o projeto para poder usa-lo: 
  • Primeiro passo: Abra o projeto e no Project Manager clique com o botão direito em cima do projeto em TestInsight Project;
  • Segundo passo: No mesmo Project Manager clique em Build;


Pronto, agora o TestInsight irá exibir os testes unitários que você já escreveu.

Testes unitários


Estou começando agora a utilizar os testes unitários então vamos aprender juntos como funciona esse trem? 

Testes unitários é uma grande facilidade, basicamente precisamos desenvolver uma função e executar verificando se o valor de saída e o esperado. Simples não? Mas não seria mais fácil e rápido testar nossa nova função manualmente sem precisar criar uma unit de teste? Sim seria mas os testes garantem que no futuro, quando alguém alterar essa função ou alguma outra função ou procedure que a compõem a mesma, o resultado dela continuara retornando o valor esperado.

Com o passar do tempo seu software terá centenas de funções sendo executadas com configurações para todo o lado, suas linhas de código estão extensas e logo o primeiro problema, como testar manualmente todas essas funções a cada versão gerada ao cliente? Quase humanamente impossível não é. Com isso vem os testes unitários na maioria das vezes levam apenas alguns segundos para testar todo seu software. Umas linhas de código a mais não vai falar a pena a longo prazo?



Delphi 2007/2009 - Assertion failure: "(!"SetThreadContext failed")"


Esse bugs está relacionado à depuração no Windows de 64 bits, e ocorre quando instala o Delphi 2007 e após compilar ou fechar o programa, apresenta a mensagem:
Assertion failure: "(!"SetThreadContext failed")"
in ..\win32src\thread32.cpp at line 412
Continue execution?

Para corrigir o erro, basta realizar o download do programa e executá-lo como administrador.

FastReport no Delphi - Subreport


Criaremos um relatório de pedidos, então iremos exibir de Titulo o nome do "Cliente" e "Número do Pedido" e abaixo os produtos. Vamos organizar o relatório jogando os produtos para um subreport e com os totais dos produtos. 

Vamos iniciar um novo projeto (File >> New >> Windows VCL Application);

Nesse projeto vamos utilizaremos: 

1 - TBitBtn; 
2 - TfrxDBDataset; 
1 - TfrxReport 
2 - TClientDataSet ( O componente de conexão de banco de dados de vocês );

Vamos alterar os nome das TfrxDBDataset, um se chamara frxDataset e será colocado a propriedade do DataSet a tabela cdsPedidos, o outro se chamara frxDataset2 e será colocado a propriedade do DataSet a tabela cdsPedidosProdutos. 

Agora vamos para o FastReport.

Dê dois cliques no componente frxReport para abri na forma de Designer, vamos iniciar (File >> New Report). Pronto criamos um novo documento ele nos trouxe como padrão ReportTitle1, MasterData1 e um PageFooter1, adicionar as tabelas no FastReport menu (Report >> Data);



Na banda MasterData1 vamos vincular com o DataSet FrxDataSet(cdsPedidos), apos vincular adicionar os campos "Número do pedido" e "Nome do cliente".


Obs: Quando exportado para Excel ou para alguma planilha se os componentes não estiverem bem alinhados acaba se criando linhas e colunas desnecessárias

Então vamos alinhar os componentes utilizando a propriedade Align. E aumentar a fonte, pintar a os campos (Memos) em outra cor para dar uma destacada no titulo.


Pronto. Agora temos o cabeçalho de cada pedido pronto! Vamos para nosso subreport com nossos produtos.

Na palheta da lateral vamos procurar o subreport, vamos clicar nele e depois clicar onde desejamos colocar, em nosso exemplo vamos colocar alinhado abaixo do titulo dos pedidos dentro do mesmo MasterData1 que já estávamos utilizando. Ao fazer isto ira criar uma nova tela onde vamos trabalhar os nossos itens, perceba em cima que temos agora duas abas. lembrando de deixar o left do subreport 0 para ficar alinhado ao titulo! 


Começamos a trabalhar em nosso nova aba agora, vamos adicionar um Header1 e um MasterData vinculada a tabela FrxDataSet2, e os campos de "Produto", "Quantidade" e "Valor" com seus respectivos cabeçalhos.


Vamos para nosso totalizador por item! Vamos adicionar um Footer1 e nele os campos para exibir nossos somatórios. 


Vamos ver como ficou o resultado de nosso relatório de pedidos? 

TabOrder com o enter [UniGui]


Essa é uma dica bem simples, utilizar o enter para navegar entre os campos. Com o unigui temos a opção NavigateKeys do TMainForm! E com essas propriedades podemos definir o enter como objeto para navegação entre campo sem a utilização de código.

Vamos então para a propriedade NavigateKeys e vamos marcar as propriedades Enabled = True. Na propriedade Next vamos setar a "fleg" Key para 13 (Código do enter). No Prior a "fleg" Key = 13 e na propriedade ShiftState marcamos ussShith = True. Representação abaixo:


Dica bem simples que eu estava utilizando código escrito para isso e consegui "me livrar" do código com as propriedades combinadas

Erro "Canvas does not allow drawing" ao tentar gerar relatório


Os Drivers  da impressora não estão instalados ou não esta sendo localizados corretamente. Geralmente ocorre em acesso remoto.

Opção 01: Em caso de acesso remoto:
  1. Abra o aplicativo do Windows "Área de Trabalho Remota"
  2. Clique no botão "Opções>>"
  3. Acesse a aba "Recursos Locais"
  4. Em "Dispositivo e recursos Locais". Desmarque o campo "Impressoras"
  5. Reinicie o Sistema para pegar as informações corretas

Opção 02: Em caso de acesso local:
  1. Abra o Windows "Painel de Controle";
  2. Clique no botão "Dispositivos e Impressoras";
  3. Verifique se a impressora padrão e validar se não for adicione uma valida;
  4. Reinicie o Sistema para pegar as informações corretas

Menu lateral nativo [UniGui]


Vamos dar continuidade com o nosso projetinho do post anterior e agora vamos fazer um menu lateral, com apenas componentes UniGui, usando os componentes UniMenuItems, UniTreeMenu e UniNativeImageList.

1 - Na tela Main vamos colocar nossos 3 componentes UniMenuItems, UniTreeMenu e UniNativeImageList.


2 - No componente UniTreeMenu na "Properties > SourceMenu" vamos vincular o UniMenuItems;


3 - No componente UniMenuItems na "Properties > Images" vamos vincular o UniNativeImageList;


4 - Vamos colocar no UniMenuItems o chamado de nessas telas; 


5 - No UniNativeImageList vamos colocar as imagens que queremos que se apresenta no menu; Eu acrescentei algumas imagens só para teste o vinculo e feito pelo "Properties > ImageIndex";



Agora vamos compilar para verificar como ficou nosso menu lateral;




Menu lateral nativo [UniGui]


Vamos dar continuidade com o nosso projetinho do post anterior e agora vamos fazer um menu lateral, com apenas componentes UniGui, usando layout client e frame. Iniciamos com a criação de um frame (ao invés de criar o frame pode ser feito tudo no uplPrincipal mas por questão de organização optei por colocar em um frame) e renomeamos com o nome Menu.Frame.


1 - No frame vamos alterar a "Properties > Layout > Fit" e a "Properties > AlignmentControl > uniAlignmentClient";


2 - Dentro deste frame vamos colocar Um UniPanel com o nome de uplPrincipal e alterar a "Properties > Align > alLeft" e a "Properties > Layout > accordion";


3 - Dentro do uplPrincipal colocaremos outros Seis UniPanel; 


4 - Para alterar o titulo dos menus e só colocar na "Properties > Title";


5 - Acrescente o frame no Main principal e coloque a "Properties > Align > alLeft";


Veremos como ficou nosso menu compilando o nosso projeto F9;


Agora e só colocar os botões de chamada dentro dos paneis

Espero ter ajudado a dar uma luz no menu lateral simples