| Últimas 20 atualizações de WESLEY YAMAZACK |
|
|
Veja neste artigo um tema não muito explorado e bem pouco conhecido por muitos programadores Delphi, o template. O template é um modelo, esqueleto, estrutura, ou seja, é algo pra você usar como base pra alguma coisa. Imagina você ficar digitando toda hora uma mesma estrutura, isso se torna ‘chato’ e trabalhoso, ficar repetindo o mesmo texto. Quando usamos um template, ele já faz este trabalho ‘chato’ e repetitivo. Usamos isso o tempo todo no Delphi, você usa isso, mas será que sabe que usa? Você sabia que tem como criar o seu próprio template? Iremos ver um exemplo clássico. Na figura abaixo podemos notar o template “for”.  Figura 1: Template básico Quando digitamos um código e este tem um template, como é o caso de quando digitamos o for, o template já monta toda estrutura, basta irmos digitando o texto for, depois pressionar o TAB, por exemplo, mudar o I para J, depois pressionamos o TAB, digitamos o valor inicial de 0 para 1, e por fim digitamos o final do nosso Loop, no caso está List.Count -1, poderíamos colocar Combobox1.Items.Count, e novamente pressionar a tecla TAB, automaticamente o template declara a variável J como Integer, isso é ser RAD, isso é Delphi, é rápido funcional e muito ágil.  Figura 2: Exemplo do template for finalizado Existem outros milhares de templates, experimente criar uma unit nova e pressione a tecla ctrl+J, e veja o que acontece. Conforme você vai digitando as letras, os templates são filtrados, pra você criar uma classe basta digitar ‘class’ e serão exibidos os templates que temos prontos para ‘class’. Isso auxilia e muito na produtividade e na criação de códigos mais rápido.  Figura 3: Exibindo os templates com ctrl+J Agora que sabemos o que é um template, e também sabemos que usamos o tempo todo no Delphi, vamos saber como criar um template para uma necessidade nossa. Para criar o nosso template precisamos acessar o menu File>New>Other>Other Files>Code Template, veja a imagem abaixo:  Figura 4: Criando o Code Templatece Neste exemplo iremos criar um Loop com While not eof e logo em seguida iremos utilizar o comando NEXT, para deixar o loop mais interessante. Veja o código que será criado pra você. Listagem 1: Código básico do Template
<?xml version="1.0" encoding="utf-8" ?>
<codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates"
version="1.0.0">
<template name="" invoke="manual">
<description>
</description>
<author>
</author>
<code language=""><![CDATA[]]>
</code>
</template>
</codetemplate>
Vamos ver na prática, pra deixar mais dinâmico e menos teórico, vamos lá. Passo 1 – Iremos ver como definir o nome do nosso template, geralmente o nome que colocamos em ‘name=’ é o mesmo nome que utilizamos para o arquivo .xml, iremos chamar de “WhileN”. Veja baixo onde devemos salvar este template. No Delphi 2009 este arquivo deverá ser salvo dentro da pasta:
C:\Arquivos de programas\CodeGear\RAD Studio\6.0\ObjRepos\Code_Templates\Delphi No Delphi 2010, XE, XE2 este arquivo deverá ser salvo dentro da pasta:
C:\Documents and Settings\<usuário>\Meus documentos\RAD Studio\code_templates\
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, vamos ver aqui um artigo de Delphi que ensina um componente não muito explorado pelos desenvolvedores, porém com a mudança de sistema operacional, ou seja, do Windows XP para o Vista e agora o Windows 7, este componente acabou
precisando de mais um recursos para funcionar, o componente em questão é o TAnimate, localizado na palheta Win32. Podemos encontrar este componente declarado na unit ComCtrls da nossa VCL.
Qual é o objetivo deste componente?
O objetivo é exibir uma animação quando estamos executando um determinado método muito demorado ou nem tanto, mas o intuído é avisar ao usuário que algo está sendo processado.
Figura 1. Demonstrando o exemplo
Vamos entender um pouco as propriedades deste componente
Propriedades
Active
Essa propriedade tem o objetivo de ativar ou desativar a animação do componente;
CommonAVI
Essa propriedade tem o objetivo de selecionarmos qual a animação que desejamos visualizar, com base em animações predefinidas. Podemos notar que esta propriedade é do tipo TCommonAVI que nada mais é do que um Enumerado com as
seguintes opções: aviNone, aviFindFolder, aviFindFile, aviFindComputer, aviCopyFiles, aviCopyFile, aviRecycleFile, aviEmptyRecycle, aviDeleteFile;
FileName
Essa propriedade tem o objetivo de definir um .avi personalizado(junto com o código fonte deste post você pode encontrar um .avi para fazer o teste. Além também de poder criar os seus próprios .avi)
Repetitions
Essa propriedade tem o objetivo definir o número de vezes que a animação irá ser executada, caso esteja como 0, ela será ficará em repetição contínua. Caso você defi
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal gostaria de mostrar nesse artigo uma visão geral e como funcionam os componentes visuais e não visuais de acesso a dados. Vamos mostrar os exemplos usando os famosos componentes DBWare(DBEdit, DBComobobox, DBGrid, DBText,
etc...), além de usar o DBExpress para ilustrar os exemplos, mas os conceitos são aplicados as outras tecnologias de acesso a dados, como BDE, ADO, etc. A ideia é mostrar como funciona todo o processo da ligação de cada componente um no outro.
Vamos ilustrar com base no formulário abaixo:
Figura 1: Formulário de exemplo.
Como podemos notar na figura acima temos duas divisões no nosso formulário: Componentes não visuais e Componentes visuais.
O que é um componente?
Componente é utilizado na famosa indústria de software como referencia para reutilização de um Objeto que por sua vez expõe uma ou mais interfaces para clientes de maneira padronizada.
O que são componentes visuais?
Componentes visuais são componentes que podemos visualizar em tempo de execução. Por exemplo, DBEdit, DBComobobox, DBGrid, DBText, Button, Edit, StringGrid, Label, etc. Estes são visíveis em tempo de execução e designer.
O que são componentes não visuais?
Componentes não visuais são componentes que não podemos visualizar em tempo de execução. Por exemplo, ClientDataSet, SQLDataSet, XMLTransform, DataSource, etc. Estes são visíveis apenas em tempo de designer. Caso você compile o projeto, os
componentes da seção amarela(SQLConnection, SQLDaSet, DataSetProvider, ClientDataSet e DataSource), não vão aparecer de maneira alguma, os demais sim.
Agora que sabemos o que são componentes, visuais ou não, podemos iniciar os estudos de cada um deles, vou falar de forma rápida e resumida, não vou me alongar muito na explicação de cada um deles:
DBExpress
SQLConnection: Responsável pela comunicação da aplicação com o Banco de Dados
SQLDataSet, SQLQuery, SQLTable: Responsável por fazer e trazer as requisições no SQLConnection, nele que incluímos os comandos de, Select, Insert, Delete e Update.
DataAccess: Deste ponto em diante se aplica a qualquer componente de acesso a dados, ou seja, TTable, TQuery, AdoTable, AdoQuery etc.
DataSetProvider: Este componente funciona como um tradutor, ou seja, ele interpreta os comandos solicitados pelo ClientDataSet e faz uma tradução para o SQLTable, SQLQuery, TTable, TQuery, etc, a mesma forma que ele
traduz os dados trazidos do banco de dados para o ClientDaset.
ClientDataSet: Nele podemos fazer cache de dados trazidos do nosso banco de dados, alterar, incluir, excluir e navegar nas informações em memória, isso mesmo, em memoria, pois depois que o mesmo carrega as informações,
você pode continuar trabalhando sem a necessidade de conexão direta com o banco de dados, ou seja, os dados estão em memoria armazenados
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, hoje venho mostrar uma curiosidade que temos dentro da unit SysUtils, a classe TLanguages. Ela tem a finalidade de armazenar as linguagens que o sistema operacional suporta. Veja
abaixo a sua estrutura.
Listagem 1: Estrutura de languages
{ This stores the languages that the system supports }
TLanguages = class
private
FSysLangs: array of TLangRec;
class destructor Destroy;
function LocalesCallback(LocaleID: PChar): Integer; stdcall;
function GetExt(Index: Integer): string;
function GetID(Index: Integer): string;
function GetLCID(Index: Integer): LCID;
function GetName(Index: Integer): string;
function GetNameFromLocaleID(ID: LCID): string;
function GetNameFromLCID(const ID: string): string;
function GetCount: integer;
public
constructor Create;
function IndexOf(ID: LCID): Integer;
property Count: Integer read GetCount;
property Name[Index: Integer]: string read GetName;
property NameFromLocaleID[ID: LCID]: string read GetNameFromLocaleID;
property NameFromLCID[const ID: string]: string read GetNameFromLCID;
property ID[Index: Integer]: string read GetID;
property LocaleID[Index: Integer]: LCID read GetLCID;
property Ext[Index: Integer]: string read GetExt;
end platform;
Agora como podemos usar esta classe? Usando uma maneira bem simples vou ilustrar o seu uso. Iremos precisar de uma aplicação e um formulário, feito isso no seu formulário a
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, recebi um e-mail de um amigo, perguntando o seguinte:
“Wesley como eu posso fazer para criar uma tela de navegação com o TDateTimePicker, onde ao clicar no botão que represente ">" ele avance 1 mês, e quando clicar no "<" ele retroceda 1 mês.”
Pensando nisto, eu fiz um layout básico e montei uma estrutura com o seguinte.
Listagem 1: Lista de Componentes
Label1: TLabel;
Label2: TLabel;
EdtDataFinal: TDateTimePicker;
BtnMesProximo: TBitBtn;
BtnMesAnterior: TBitBtn;
EdtDataInicial: TDateTimePicker;
Veja como ficou meu layout
Figura 1. Layout
A minha ideia foi a seguinte, sempre pegar o último dia do mês(Data Final) e não alterar o dia inicial( Data Inicial ), mas isso você pode modificar sem problemas.
Iniciaremos Declarar uses na unit DateUtils.
Listagem 2: Declarando uses em DataUtils
unit uFrmPrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComCtrls, DateUtils;
Bom temos 2 TBitBtn, o primeiro se chama BtnMesProximo e o segundo BtnMesAnterior, vamos
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, hoje estou me aventurando no mundo do PHP. Gostaria de começar falando de uma das coisas mais importantes da programação orientada a objetos, mas isso não é só para o PHP, mas também para Delphi, Java, .NET, entre outras linguagens, a CLASSE.
O que é uma classe ?
A classe é uma estrutura ou esqueleto que abstrai um conjunto de objetos contendo características similares. Uma determinada classe define o comportamento de seus objetos usando métodos e modificando seus estados como os atributos.
Mas muita atenção as classes não são diretamente suportadas em todas as linguagens de programação, sendo necessária para que esta linguagem seja considerada orientada a objetos.
Agora depois de um pouco de classe, método e atributos, vamos ver isso na prática.
Como eu crio uma classe?
Primeiramente vamos precisar ter um servidor PHP instalado. Eu uso o “wamp”, a sua instalação é bem tranqüila, basta você baixar, executar o instalador e pronto. O mesmo irá criar uma pasta, se você instalar como padrão, “C:\wamp”.
Agora para aqueles que estão começando, você pode usar o NetBeans, como é o meu caso ou para os mais aventureiros o Bloco de Notas, isso mesmo pessoal, o bloco de notas! Lembrando apenas que existem outros softwares que trabalham com PHP, ok?
Sendo assim abra o seu Bloco de Notas, ou alguma outra ferramenta, no meu caso estou usando o NetBeans para PHP( criando um projeto PHP e depois uma Classe PHP), vamos salvar o mesmo com o nome Cliente-class.php, mas antes de sair salvando vamos primeiro criar uma pasta chamada “cliente” dentro de “C:\wamp\www”, sendo assim seu arquivo estará da seguinte forma “C:\wamp\www\cliente\ cliente-class.php”.
Este é um padrão que eu tenho usado para diferenciar os arquivos que contem classes dos demais arquivos, apenas por questão de organização mesmo!
Neste momento vamos codificar na ferramenta escolhida a seguinte estrutura para criação da nossa primeira classe em PHP.
Listagem 1: Criando uma classe em PHP
<?php
class Cliente{
}
?>
Você deve estar pensando “Cri
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, venho escrevendo mais um artigo sobre Delphi, onde neste artigo vamos falar sobre o XML, na verdade vamos ver como importar um XML para o Delphi.
Introdução
Para isso vamos precisar sem sombra de dúvidas de um XML. Para facilitar a vida de todos, vou criar aqui um pequeno XML. Basta copiar e colar o mesmo num bloco de notas e salvar com o nome
ExemploXML.xml, ou algum outro nome de sua preferência.
Listagem 1: Criando o XML
<?xml version="1.0" encoding="ISO8859-1" ?>
<MENSAGEM>
<AVISO>
<DE>Wesley</DE>
<PARA>Henrylle</PARA>
<CABECALHO>Entregar Vìdeo Aula</CABECALHO>
<CORPO>Estou aguardando a entrega das vídeos</CORPO>
</AVISO>
<AVISO>
<DE>Wesley</DE>
<PARA>Rafael Silva</PARA>
<CABECALHO>Entregar Artigo</CABECALHO>
<CORPO>Estou aguardando a entrega dos artigos</CORPO>
</AVISO>
<AVISO>
<DE>Rafael Silva</DE>
<PARA>Wesley</PARA>
<CABECALHO>Re: Entregar Artigo</CABECALHO>
<CORPO>Seguem os artigos conforme combinado</CORPO>
</AVISO>
<AVISO>
<DE>Henrylle</DE>
<PARA>Wesley</PARA>
<CABECALHO>Re: Entregar Vìdeo Aula</CABECALHO>
<CORPO>Seguem as vídeo aulas conforme combinado</CORPO>
</AVISO>
</MENSAGEM>
Nota: Não é o objetivo explicar o que é um XML ou sua estrutura.
Agora sejamos práticos, vamos ao Delphi, criando um formulário com o seguinte layout, e salvando o seu form com o nome de uFrmPrincipal.pas.
Observe que temos neste formulário:
- 5 TLabeledEdit (EdtPara, EdtDe, EdtCabecalho, EdtCorpo)
- 1 TOpenDialog (OpenDialog1 )
- 1 TBitBtn ( BtnCarregarXML)
- 1 TListBox ( LstbxDados )
- 1 TXMLDocument (XMLDocument1 )
Figura 1. Layout do Formulário.
Vou descrever agora qual será minha ideia resumidamente:
- 1 - Iremos clicar no BtnCarregarXML
- 2 - Logo em seguida fazemos a criação de uma classe, chamada TMensagem, com a mesma estrutura do XML
- 3 - Será criado vários objetos do tipo TMensagem, e estes vão ser armazenados no LstbxDados
- 4 - Quando selecionarmos um item no nosso LstbxDados os dados vão ser exibidos nos TLabeledEdit
Agora que vimos o roteiro vamos implementar.
Criando a Classe TMensagem
Listagem 2: Declarando a Classe TMensagem
unit uFrmPrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls, Buttons, E
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, hoje queria partilhar com os amantes do Delphi um artigo que é bastante simples, porém ele auxilia muito em migrações de componentes.
Como assim?
Supondo que há 3 anos você fez um projeto em Delphi com DBEdit, DBCombobox, e outros DB's, ou seja, os conhecidos DBWare. Hoje você já consegue trabalhar Orientado a Objetos e decide migrar o sistema mas não gostaria de confeccionar o
Layout do Sistema novamente, e queria modificar todos os DBEdits, DBCombobox e os outros DB's para Edits, Combobox, etc.
É uma tarefa extremamente simples de se fazer, mas requer muita atenção. Vamos ao exemplo de como fazer isso.
Criando um Formulário com 3 Componentes DBEdits e 1 DBCombobox, veja o layout :
Figura 1. Layout do Exemplo.
Note que não fiz ligação de DataSource e outros componentes, pois isso não é necessário.
Agora e a mágica?
Vocês poderiam falar, poxa é só apagar e colocar os Edits. Mas e ae? TabOrder, tamanho e posição? Fazer tudo novamente?
Vem a dica agora. Clique com o botão direito do mouse sobre qualquer área varia do formulário, e localiza a opção View as Text.
Figura 2. View as Text.
O que é isso?
O layout do nosso formulário fica armazenado nos arquivos de extensão .DFM. Experimente abrir este arquivo no "BLOCO DE NOTAS", você irá ver exatamente a mesma coisa que o View as Text.
Listagem 1: Texto completo do arquivo .DFM
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Cadastro de Cliente'
ClientHeight = 225
ClientWidth = 518
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -20
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 120
TextHeight = 24
object Label1: TLabel
Left = 129
Top = 131
Width = 33
Height = 24
Caption = 'CPF'
end
object Label2: TLabel
Left = 101
Top = 43
Width = 61
Height
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, hoje venho mostrar uma rotina interessante para aqueles que querem trabalhar com mensagens do sistema operacional. Como sabemos o sistema operacional conversa através de mensagens, e o Delphi consegue interpretar, capturar,
entender estas mensagens. Vou fazer uma simulação bem simples desta vez.
Vamos precisar de um Formulário e nele um TRichEdit
Figura 1. Layout do Formulário
Esta bem simples pois o objetivo não é o layout mas sim a funcionalidade.
Neste momento vamos dar uses na unit Clipbrd
Listagem 1: Nossa unit deverá esta neste estilo
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Clipbrd;
type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
Listagem 2: Com a uses declarada agora vamos implementar um método para poder "escutar" quando alguma coisa for adicionada no Clipboard( nosso famoso CTRL + c ).
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Clipbrd;
type
TForm1 = clas
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, venho neste artigo mostrar um pouco mais sobre o nosso Delphi. Desta vez iremos ver como podemos fazer uma lista de objetos, usando o TList e uma classe criada. No nosso exemplos
vamos criar inicialmente a classe TCliente, para isso vamos precisar de uma nova unit, salve a mesma com o nome de Cliente.pas. Iremos criar apenas os métodos básicos de uma lista, como Count, Add e
Remove.
Listagem 1: Código da unit Cliente ao ser criada
unit Cliente;
interface
implementation
end.
Até aqui tudo bem, agora vamos preparar a nossa classe. Observe que declarei a classe TCliente herdando de ? TObject!!!
Logo em seguida declarei as propriedades da classe, IDCliente, Nome,CNPJ, neste momento vou pressionar as teclas “CTRL+SHIF+C” para o Delphi possa preparar meus métodos gets e sets.
Listagem 2: Declaração das propertys da classe TCliente
unit Cliente;
interface
Type
TCliente = class
private
{ private declarations }
protected
{ protected declarations }
public
{ public declarations }
property IDCliente: Integer;
property Nome: String;
property CNPJ: String;
published
{ published declarations }
end;
implementation
end.
Como o objetivo do artigo não é mostrar validação nos métodos vou remover o “LIXO” gerado pelo Delphi, então nosso código ficará assim:
Listagem 3: Implementando e Excluindo código desnecessário
unit Cliente;
interface
Type
TCliente = class
private
FCNPJ: String;
FIDCliente: Integer;
FNome: String;
{ private declarations }
protected
{ protected declarations }
public
{ public declarations }
property IDCliente: Integer read FIDCliente write FIDCliente;
property Nome : String read FNome write FNome;
property CNPJ : String read FCNPJ write FCNPJ;
published
{ published declarations }
end;
implementation
end.
Até aqui nada de mais criamos a classe TCliente e seus atributos.
Vamos ver agora a criação da nossa lista de Clientes, para isso vamos criar outra unit e salvar a mesma como ListaCliente.pas.
Listagem 4: Código da unit ListaCliente ao ser criada
unit ListaCliente;
interface
implementation
end.
Com a nossa unit criada agora vamos poder declarar nossa classe e seus métodos. Muito importante é lembrar, sempre, de declarar USES quando formos utilizar objetos/classes que estão em outras
Units.
Listagem 5: Declarando Classe e Métodos
unit ListaCliente;
interface
uses Classes, Cliente, Dialogs; {Observe que aqui fizemos referencias
as duas classes necessárias para fazer o Exemplo }
Type
TListaCliente = class
private
{ private declarations }
FListaClientes : TList;
protected
{ protected declarations }
public
{ public declarations }
constructor Create;
procedure Adicionar(pCliente: TCliente);
procedure Remover(Index: Integer);
function Count: Integer;
published
{ pu
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, vamos a um artigo muito interessante onde temos o objetivo de separar os dados encontrados em um Listbox usando um determinado delimitador.
Para construção deste exemplo, vamos precisar ter em uma aplicação em Delphi e nela adicionar 1 TListBox, 1 TButton e 1 TStringGrid.
Figura 1. Layout do Formulário.
Objetivo é no Listbox carregar um arquivo .txt(poderíamos usar um TStringList para isso). Segundo ponto é ao clicar no Button as informações serem separadas num TStringGrid.
Consideração: Vou fazer de forma bem básica para que todos possam desfrutar da explicação, vou usar variáveis locais, mas não há necessidade disso, ok ?
Vou usar um layout de txt (basta você copiar e colocar o conteúdo abaixo na propriedade Items do TListBox) da seguinte forma:
20:05|segunda-Feira|E:\Arq.rar
17:22|terça-Feira|C:\Arquivos de progrmas\App2.exe
10:10|quarta-Feira|E:\Arq.txt
13:30|quinta-Feira|C:\windows\App3.exe
Podemos notar que temos um char que separa os "fields" em cada linha, no caso seria o "|". Sendo assim, precisamos separar em linhas e colunas os dados de cada Item do TListBox.
Neste ponto já temos o layout montado e texto a ser separado no nosso TListbox, vamos agora então a implementação e explicação do Código.
No evento onClick do TButton vamos implementar o seguinte código:
procedure TFrmPrincipal.Button1Click(Sender: TObject);
var
Dados : TStringList;
{Foi criada uma StringList para auxiliar na separação dos dados}
i : Integer; {Esta variável serve para controlar o nosso LOOP e
definir qual será a linha onde iremos "escrever" o conteúdo no TStringGrid.}
Hora, Dia, Diretorio : String; {Observe que foram criadas 3 variáveis
para armazenar os dados "Temporariamente" em memória}
begin
{Estou instanciando o nosso TStringList, pois caso não seja feito
teremos um erro muito comum, ACCE
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá pessoal, vamos a mais um artigo sobre SQL, neste vou mostrar uma situação muito intrigante que aconteceu comigo na época, precisei fazer um relatório e concatenar os dados de endereço dos clientes cadastrados, até ai tudo bem. Fiz uma coisa muito simples fui concatenando os dados C.Endereco || C.Numero || C.CEP || C.Complemento || C.Bairro.
Muito simples não é? Mas o problema estava nos clientes que não tinham por exemplo o complemento, o select retornava o seguinte.
O problema era que o cliente Douglas Claudio tinha Endereço, Número, CEP, Bairro. A única informação que não estava no cadastro do mesmo era a de Complemento. O problema é que quando o campo é nulo o Firebird não consegue concatenar com valores nulos, para isso exite uma função chamada COALESCE.
Esta função tem como objetivo retornar a primeira expressão não nula entre seus argumentos.
Sintaxe :
COALESCE (expression [ ,...n ] )
Agora que vimos a introdução e a sintaxe vamos ver como consegui resolver meu problema.
Select Original :
SELECT C.Endereco || C.Numero || C.CEP || C.Complemento || C.Bairro
FROM CLIENTE C
Select Modificado :
SELECT C.Endereco || C.Numero || C.CEP ||
COALESCE(C.Complemento, '') || C.Bairro
FROM CLIENTE C
Veja que coloquei apenas a função COALESCE ao lado do Complemento, no meu caso foi feito assim pois todos outros campos são obrigatórios então nunca teria um Cliente sem Endereco, Numer, CEP e Bairro agora o complemento ele não é obrigatório e nem pode ser.
Então é isso pessoal, obrigado pela atenção e um abraço.
Wesley Y
-->">
|
|
|
|

Olá galera, nesta Quick Tips, irei mostra como podemos redimensionar uma DBGrid de acordo com o tamanho das colunas e do espaço ocupada por esta DBGrid no formulário. Pensando sempre e reaproveitamento de código vamos criar uma unit e salvar ela
como uFuncoes.pas . e nela declararmos uses em Grids, DBGrids , além de criarmos também uma procedure chamada AutoSizeDBGrid.
unit uFuncoes;
interface
uses Grids, DBGrids;
procedure AutoSizeDBGrid(const xDBGrid: TDBGrid);
implementation
procedure AutoSizeDBGrid(const xDBGrid: TDBGrid);
var
I, TotalWidht, VarWidth, QtdTotalColuna : Integer;
xColumn : TColumn;
begin
// Largura total de todas as colunas antes de redimensionar
TotalWidht := 0;
// Como dividir todo o espaço extra na grade
VarWidth := 0;
// Quantas colunas devem ser auto-redimensionamento
QtdTotalColuna := 0;
for I := 0 to -1 + xDBGrid.Columns.Count do
begin
TotalWidht := TotalWidht + xDBGrid.Columns[I].Width;
if xDBGrid.Columns[I].Field.Tag <> 0 then
Inc(QtdTotalColuna);
end;
// Adiciona 1px para a linha de separador de coluna
if dgColLines in xDBGrid.Options then
TotalWidht := TotalWidht + xDBGrid.Columns.Count;
// Adiciona a largura da coluna indicadora
if dgIndicator in xDBGrid.Options then
TotalWidht := TotalWidht + IndicatorWidth;
// width vale "Left"
VarWidth := xDBGrid.ClientWidth - TotalWidht;
// Da mesma forma distribuir VarWidth para todas as colunas auto-resizable
if QtdTotalColuna > 0 then
VarWidth := varWidth div QtdTotalColuna;
for I := 0 to -1 + xDBGrid.Columns.Count do
begin
xColumn := xDBGrid.Columns[I];
if xColumn.Field.Tag <> 0 then
begin
xColumn.Width := xColumn.Width + VarWidth;
if xColumn.Width < xColumn.Field.Tag then
xColumn.Width := xColumn.Field.Tag;
end;
end;
end;
end.
Feita a nossa unit vamos criar agora um Formulário juntamente com um DBGrid, ligado a um DataSet, esta parte vou deixar com vocês, particularmente criei um ClientDataSet com XML mesmo, apenas para ilustrar. Agora vamos ao que interessa neste form
nos eventos onCreate e onResize, vamos implementar os código abaixo.
Listagem 2: Serve para termos como base uma tag inicial para cada Field
procedure TFrmPrincipal.FormCreate(Sender: TObject);
var
I: Integer;
begin
For I := 0 to CDSPadrao.FieldCount - 1 do
CDSPadrao.Fields[i].Tag := 30;
AutoSizeDBGrid(DBGrid1);
end;
Listagem 3: Todo momento que nosso formulário for redimensionado o evento irá calcular o tamanho de cada coluna
procedure TFrmPrincipal.FormResize(Sender: TObject);
begin
AutoSizeDBGrid(DBGrid1);
end;
Fico por aqui ate à próxima Quick Tips. Baixe o exemplo completo neste post.
Um abraço
Wesley Y
wyamazack@lithic.com.br
-->">
|
|
|
|
Olá galera, vamos a este artigo que tem como objetivo mostrar como podemos descobrir o Algarismo Romano a partir de um determinado número.
Vamos iniciar incluindo em nossa classe do formulário uma function chamada ValorParaRomano.
Veja sua declaração como deveria ficar.
Listagem 1: Declaração da function ValorParaRomano
type
TForm1 = class(TForm)
private
{ Private declarations }
function ValorParaRomano(pValor: Integer): string;
public
{ Public declarations }
end;
Neste momento vamos implementar a mesma usando o CTRL + SHIF + C, em cima da declaração.
Objetivo: Implementar a function que irá fazer a conversão do formato de número para Algarismo Romano.
Listagem 2: Implementação da function ValorParaRomano
function TForm1.ValorParaRomano(pValor: Integer): string;
const
Numeros: array[1..13] of Integer =
(1, 4, 5, 9, 10, 40, 50, 90, 100,
400, 500, 900, 1000);
Romanos: array[1..13] of string =
('I', 'IV', 'V', 'IX', 'X', 'XL',
'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
var
i: Integer;
begin
Result := '';
for i := 13 downto 1 do
while (pValor >= Numeros[i]) do
begin
pValor := pValor - Numeros[i];
Result := Result + Romanos[i];
end;
end;
Com a nossa functiona criada, vamos precisar agora incluir em nosso formulário um TButton, e um TMemo. Coloque ambos em qualquer parte do seu formulário, não vamos nos prender ao Layout neste momento.
Veja como a classe agora esta ficando.
Listagem 3: Inclusão do TMemo e do TButton
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
function ValorParaRomano(pValor: Integer): string;
{ Private declarations }
public
{ Public declarations }
end;
Agora para que o exemplo esteja completo, vamos ao evento onClick do nosso TButton, e testar a nossa function adicionando o resultado obtido no TMemo, adicionando anteriormente.
Listagem 4: Implementação do evento onClick do TButton
procedure TForm1.Button1Click(Sender: TObject);
begin
with Memo1.Lines do
begin
Clear;
Add('15 = ' + ValorParaRomano(15));
Add('986 = ' + ValorParaRomano(986));
Add('1000 = ' + ValorParaRomano(1000));
end;
end;
Com este código podemos facilmente converter qualquer valor para romano sem dor de cabeça, e sem tabela para fazer a formatação do valor final.
Fico por aqui e até a próxima.
Um abraço
Wesley Y
www.lithic.com.br
-->">
|
|
|
|
Olá galera, vamos a este artigo que tem como objetivo mostrar como podemos modificar o separador de milhar e também o formato de moeda.
Estes são configurados pelo Windows, no Delphi existem variáveis que armazenam estas informações, e como sabemos variáveis podem ter seus valores modificados diferentemente de constantes , sendo assim podemos modificar em nossos projetos o formato de moeda por exemplo de R$ para U$$ ou qualquer outro formato desejado.
Vamos iniciar incluindo algumas procedures na nossa class do formulário criado.
Listagem 1: Declaração das procedures
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure ExibirMoeda;
procedure ExibirSeparadorMilhar;
public
{ Public declarations }
end;
Neste momento vamos implementar as mesmas usando o CTRL + SHIF + C, em cima de uma das declarações.
Agora vamos a implementação das procedures
Listagem 2: Implementação da procedure ExibirMoeda
procedure TForm1.ExibirMoeda;
begin
ShowMessage('Atual CurrencyString : ' + CurrencyString);
CurrencyString := 'U$$';
ShowMessage('Modificado CurrencyString : ' + CurrencyString);
end;
Listagem 3: Implementação da procedure ExibirSeparadorMilhar
procedure TForm1.ExibirSeparadorMilhar;
begin
ShowMessage('Atual ThousandSeparator : ' + FormatFloat('###,##0.#0', 1000000));
ThousandSeparator := '-';
ShowMessage('Modificado ThousandSeparator : ' + FormatFloat('###,##0.#0', 1000000));
end;
Agora para usarmos as procedures vamos fazer de maneira bem simples, coloque um TButton, e no evento onClick do mesmo implemente a chamada de todas as procedures, o problema é que você irá ver diversos ShowMessages, se preferir faça um de cada vez.
Listagem 5: Implementação do evento onClick do TButton
procedure TForm1.Button2Click(Sender: TObject);
begin
ExibirMoeda;
ExibirSeparadorMilhar;
end;
Como todos sabem existem diversos formatos de moeda e diversas formas de exibição de valores, muitas vezes fazemos conversões e mais conversões para formar um valor monetário ou um separador de milhar mudar de “.” para “ ” evitando erros na passagem de parâmetros para o Banco de Dados, com estas variáveis fica muito mais fácil trabalhar, pois a qualquer momento basta mudar o formato e pronto tudo já esta funcionando perfeitamente novamente. Mudou o Servidor Banco de Dados MySQL para Firebird não precisa sair varrendo o código fonte procurando conversões de moedas para tirar o “.” ou salvar a moeda de outro formato pois não esta rodando mais no Brasil, e agora foi vendido para uma empresa Norte Americana. Com isso ajuda bastante.
Fico por aqui e até a próxima.
Um abraço
Wesley Y
www.lithic.com.br
-->">
|
|
|
|
Olá galera, vamos a este artigo que tem como objetivo mostrar como podemos modificar separadores e formato de Data no Delphi.
Vamos iniciar incluindo algumas procedures na nossa class do formulário criado.
Listagem 1: Declaração das procedures
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure ExibirSeparadorData;
procedure ExibirFormatoDataPequeno;
procedure ExibirFormatoDataGrande;
public
{ Public declarations }
end;
Neste momento vamos implementar as mesmas usando o CTRL + SHIF + C, em cima de uma das declarações.
Agora vamos a implementação das procedures
Objetivo: Modificar o separador “/” por “-”
Listagem 2: Implementação da procedure ExibirSeparadorData
procedure TForm1.ExibirSeparadorData;
begin
ShowMessage('Atual DateSeparator : ' + DateToStr(Now));
DateSeparator := '-';
ShowMessage('Modificado DateSeparator : ' + DateToStr(Now));
end;
Objetivo: Modificar o formato curto da Data
Listagem 3: Implementação da procedure ExibirFormatoDataPequeno
procedure TForm1.ExibirFormatoDataPequeno;
begin
ShowMessage('Atual ShortDateFormat : ' + DateToStr(Now));
ShortDateFormat := 'yyyy-mm-dd';
ShowMessage('Modificado ShortDateFormat : ' + DateToStr(Now));
end;
Objetivo: Modificar o formato longo da Data
Listagem 4: Implementação da procedure ExibirFormatoDataGrande
procedure TForm1.ExibirFormatoDataGrande;
var
DataAtual : TDateTime;
NovoFormato : string;
begin
DataAtual := StrToDate('12/01/2012');
// Exibindo Normal
DateTimeToString(NovoFormato, 'dddddd', DataAtual);
ShowMessage('12/01/2012 usando original = '+NovoFormato);
// Exibindo Modificado
LongDateFormat := 'dddd dd ''de'' mmmm yyyy';
DateTimeToString(NovoFormato, 'dddddd', DataAtual);
ShowMessage('12/01/2012 usando novo formato = '+NovoFormato);
end;
Agora para usarmos as procedures vamos fazer de maneira bem simples, coloque um TButton, e no evento onClick do mesmo implemente a chamada de todas as procedures, o problema é que você irá ver diversos ShowMessages, se preferir faça um de cada vez.
Listagem 5: Implementação do evento onClick do TButton
procedure TForm1.Button1Click(Sender: TObject);
begin
ExibirSeparadorData;
ExibirFormatoDataPequeno;
ExibirFormatoDataGrande;
end;
Desta forma podemos trabalhar com diversos Bancos de Dados, sem nos preocupar com o formato de data que iremos passar pra ele, por exemplo, o mySQL usa 2012-01-12, já o Firebird usa 12.01.2012. Resolvendo assim problemas de conversos e formações excessivas em nosso código.
Fico por aqui e até a próxima.
Um abraço
Wesley Y
www.lithic.com.br
-->">
|
|
|
|
Olá galera, vamos a este artigo que tem como objetivo mostrar como podemos modificar os formatos de hora no Delphi, de maneira bem simples podemos trocar o “:” por “-” ou qualquer outro caractere desejado.
Vamos iniciar incluindo algumas procedures na nossa class do formulário criado.
Listagem 1: Declaração das procedures
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure ExibirSeparadorHora;
procedure ExibirFormatoHoraPequeno;
procedure ExibirFormatoHoraGrande;
public
{ Public declarations }
end;
Neste momento vamos implementar as mesmas usando o CTRL + SHIF + C, em cima de uma das declarações.
Agora vamos a implementação das procedures
Objetivo: Modificar o separador “:” por “-”
Listagem 2: Implementação da procedure ExibirSeparadorHora
procedure TForm1.ExibirSeparadorHora;
begin
ShowMessage('Atual TimeSeparator : ' + TimeToStr(Now));
TimeSeparator := '-';
ShowMessage('Modificado TimeSeparator : ' + TimeToStr(Now));
end;
Objetivo: Modificar o formato curto da Hora
Listagem 3: Implementação da procedure ExibirFormatoHo
...
Exibição do post interrompida. Para ler conteúdo completo, clique aqui
|
|
|
|
Olá galera, vamos a este artigo que tem como objetivo mostrar como podemos descobrir o nome do seu computador e, além disso, mudar o nome do mesmo.
Vamos iniciar colocando em nosso formulário 4 componentes, sendo 2 TLabeledEdit(LblEdtNomeAtual, LblEdtNovoNome), e 2 TButton(BtnNomeAtual, BtnNovoNome), mudamos os nomes para facilitar o entendimento.
Ficando da seguinte maneira :
Agora vamos precisar declarar duas function na seção private da classe do nosso formulário.
Listagem 1: Declaração das functions
type
TForm1 = class(TForm)
BtnNovoNome: TButton;
LblEdtNovoNome: TLabeledEdit;
LblEdtNomeAtual: TLabeledEdit;
BtnNomeAtual: TButton;
private
function LoadComputerName: string;
function PostComputerName(pNewName: string): Boolean;
{ Private declarations }
public
{ Public declarations }
end;
Neste momento vamos implementar as mesmas usando o CTRL + SHIF + C, em cima de uma das declarações.
Agora vamos a implementação das duas functions
Listagem 2: Implementação da function LoadComputerName
function TForm1.LoadComputerName: string;
var
buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: Cardinal;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
Windows.GetComputerName(@buffer, Size);
Result := StrPas(buffer);
end;
Listagem 3: Implementação da function PostComputerName
function TForm1.PostComputerName(pNewName: string): Boolean;
var
ComputerName: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: Cardinal;
begin
StrPCopy(ComputerName, pNewName);
Result := Windows.SetComputerName(ComputerName);
end;
Neste momento vamos implementar o evento onClick do BtnNomeAtual.
Listagem 4: Implementação do BtnNomeAtual
procedure TForm1.BtnNomeAtualClick(Sender: TObject);
begin
LblEdtNomeAtual.Text := LoadComputerName;
end;
Neste momento vamos implementar o evento onClick do BtnNovoNome.
Listagem 5: Implementação do BtnNovoNome
procedure TForm1.BtnNovoNomeClick(Sender: TObject);
begin
PostComputerName(LblEdtNovoNome.Text);
ShowMessage('Reinicie o computador para ver o resultado');
end;
Observe que ao passar o nome do computador coloquei um ShowMessage, pois é exatamente isso que temos que fazer pra ver o resultado, reiniciar o computador.
Obs : Funciona no Windows XP e Windows Vista, no Windows 7 houve mudanças no registro por isso a função de PostName, não irá funcionar.
Fico por aqui e até a próxima.
Um abraço
Wesley Y
www.lithic.com.br
-->">
|
|
|
|
Olá galera, vamos a esta Quick Tip que tem como objetivo mostrar o tempo que o computador foi inicia, mostrando número de dias, horas, minutos e segundos.
Para isso vamos precisar declarar uma function na seção private da classe do nosso formulário.
Listagem 1: Declaração da function
type
TForm1 = class(TForm)
private
{ Private declarations }
function LigadoEm: string;
public
{ Public declarations }
end;
Neste momento vamos implementar a mesma usando o CTRL + SHIF + C, em cima da declaração da function LigadoEm.
Listagem 2: Implementação da function LigadoEm
function TForm1.LigadoEm: string;
const
Ticks_Dia: Integer = 1000 * 60 * 60 * 24;
Ticks_Hora: Integer = 1000 * 60 * 60;
Ticks_Numero: Integer = 1000 * 60;
Ticks_Segundo: Integer = 1000;
var
t: Longword;
d, h, m, s: Integer;
begin
t := GetTickCount;
d := t div Ticks_Dia;
Dec(t, d * Ticks_Dia);
h := t div Ticks_Hora;
Dec(t, h * Ticks_Hora);
m := t div Ticks_Numero;
Dec(t, m * Ticks_Numero);
s := t div Ticks_Segundo;
Result := 'Ligado em : ' + IntToStr(d) + ' Dias ' + IntToStr(h) + ' Horas ' + IntToStr(m) +
' Minutos ' + IntToStr(s) + ' Segundos';
end;
Agora para testar a mesma vou usar o evento onCreate do formulário para ver como funciona.
Listagem 3: Usando a function LigadoEm
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := LigadoEm;
end;
Fico por aqui e até a próxima.
Um abraço
Wesley Y
www.lithic.com.br
-->">
|
|
|
|
Olá galera, vamos a esta Quick Tip que tem como objetivo mostrar uma maneira de impedir o fechamando do nosso projeto com o uso do ALT + F4.
Para isso vamos precisar declarar uma procedure na seção private da classe do nosso formulário.
Listagem 1: Declaração da procedure
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure AppMessage(var Msg: TMSG; var HAndled: Boolean);
public
{ Public declarations }
end;
Neste momento vamos implementar a mesma usando o CTRL + SHIF + C, em cima da declaração da procedure AppMessage.
Listagem 2: Implementação da procedure AppMessage
procedure TForm1.AppMessage(var Msg: TMSG; var HAndled: Boolean);
begin
Handled := False;
case Msg.Message of
WM_SYSKEYDOWN:
if Msg.wParam = VK_F4 then
Handled := True; // Bloqueia o ALT+F4
end;
end;
Por final vamos ver como usar a nossa procedure, para isso vamos implementar o evento onCreate do Formulário, onde vamos fazer um Method Pointer apontando o onCreate para o AppMessage, para isso veja o seguinte código.
Listagem 3: Implementação do onCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := AppMessage;
end;
Quando você executar o seu projeto, tente fechar o mesmo usando ALT+F4, veja que nada irá acontecer. Você pode melhorar o código dando uma mensagem para o usuário da seguinte maneira.
Listagem 4: Incrementando a procedure AppMessage
procedure TForm1.AppMessage(var Msg: TMSG; var HAndled: Boolean);
begin
Handled := False;
case Msg.Message of
WM_SYSKEYDOWN:
if Msg.wParam = VK_F4 then
begin
Handled := True; // Bloqueia o ALT+F4
ShowMessage('Tecla ALT+F4 foi bloqueada pelo administrador.');
end;
end;
end;
Fico por aqui e até a próxima.
Um abraço
Wesley Y
www.lithic.com.br
-->">
|
|
|
| |
|