Você está na página 1de 32

junho 2009

junho 2009

ndice
Editorial
Entre as muitas novidades do campo da informtica que surgem todo dia, a que est chamando...

Vitor M. Rodrigues

Delphi
Aplicao de outros idiomas em um mesmo projeto

04 10 24

Plataforma de Servios Azure

05 14 28

06 18

Delphi
Criando Interfaces e Mtodos de classe no Delphi 2009

Delphi
Lendo arquivos XML com TXMLDocument

Delphi
Diretivas de compilao - Parte II

.NET
- Verificar se falta algum Edit para preencher - Verificar se a impressora est ligada E mais...

Dicas Delphi
Aplicao de outros idiomas em um mesmo projeto

Desafio The Club


Caa-Palavras

Momento de Reflexo
No confunda modess com modem, o slot diferente.

Legenda
Iniciante Intermedirio Avanado
junho 2009

30
03

Bem-vindo
ntre as muitas novidades do campo da informtica que surgem todo dia, a que est chamando mais ateno no momento a plataforma Windows de Servios Azure, num artigo jogo rpido o consultor Vitor Rodrigues nos d uma viso geral desta plataforma em seu artigo de abertura nos mantendo atualizados das novidades que vem surgindo. Nos dias de hoje com a facilidade de comercializar sistemas pelo mundo a fora, consequentemente surge necessidade de criar aplicaes com idiomas diferentes, para isto podemos usar um recurso do Delphi que embora antigo, ainda muito pouco conhecido e explorado que a utilizao de idiomas diferentes na mesma aplicao. Em seu artigo o consultor Marco Antonio, aborda de forma simples como utilizar este recurso que pode ser muito til e produtivo. Neste ms o consultor Antonio Spitaleri Neto vem com o artigo Criando Interfaces e Mtodos de classe no Delphi 2009, neste artigo ele explora a linguagem Object Pascal usando conceitos de Orientao a objetos. No ltimo ano um dos assuntos mais discutidos na rea da programao foi o desenvolvimento de solues para Notas Fiscais Eletrnicas, como sabemos para comeo de conversa, um das primeiras coisas que o desenvolvedor precisa saber como manipular arquivos XML no Delphi, neste ms em seu primeiro artigo para nossa revista Jonas Kirch escreve sobre leitura de arquivos XML usando TXMLDocument, um artigo de referencia inicial bastante importante. Dando continuidade em seu artigo de Diretivas de Compilao, o consultor Lus Alexandre de Oliveira, finaliza a lista de opes de compilao, e tambm d continuidade ao artigo sobre Silverlight escrevendo o artigo SilverLight utilizando Datagrid. Aproveitem esta edio e continuem mandando sugestes de artigos para as prximas edies, um grande abrao a todos.

Av. Prof Celso Ferreira da Silva, 190 Jd. Europa - Avar - SP - CEP 18.707-150 Informaes: (14) 3732-1529 Suporte: (14) 3733-1588

http://www.theclub.com.br Cadastro: cadastro@theclub.com.br Suporte: suporte@theclub.com.br Informaes: info@theclub.com.br Skype Cadastro: theclub_cadastro Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

Internet

Copyright The Club Megazine 2009 Diretor Tcnico Marcos Csar Silva Diagramao e Arte Vitor M. Rodrigues Reviso Marcos Csar Silva Colunistas Antonio Spitaleri Neto Jonas Kirch Lus Alexandre de Oliveira Marco Antonio Armando Marcos Csar Silva Vitor M. Rodrigues Impresso e acabamento:
GRIL - Grfica e Editora Rua So Paulo, n 447 Cep: 18740-00 - Taquarituba-SP Tel. (14) 3762-1345
Reproduo
A utilizao, reproduo, apropriao, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criaes intelectuais em cada publicao da revista The Club Megazine so terminantemente proibidos sem autorizao escrita dos titulares dos direitos autorais.

Marcos Csar Silva - Editor Chefe marcos@theclub.com.br


04
junho 2009

Delphi marca registrada da Borland International, as demais marcas citadas so registradas pelos seus respectivos proprietrios.

vitor M. Rodrigues

Plataforma de Servios Azure


Plataforma de Servios Azure da Microsoft consiste em um grupo de tecnologias da nuvem, que fornece um conjunto especfico de servios para desenvolvedores de aplicativos. Muito se comenta sobre o Windows Azure e mesmo assim ainda existem pessoas pensando que se trata do Windows 7 o que no verdade. O Windows Azure apenas um dos componentes dessa plataforma para execuo de aplicaes na nuvem voltada aos desenvolvedores. Imagine voc programar e armazenar seus projetos diretamente na web, resumindo isso. A Microsoft fornece os datacenters com toda a estrutura de armazenamento, softwares e o mais importante, processamento. Isso faz com que os desenvolvedores no precisem se preocupar em adquirir mquinas com grande poder de processamento, instalar softwares e espao em disco. Voc precisar apenas de um computador com um browser e uma boa conexo de internet. O restante fica por conta da Microsoft. Confesso que quando comecei estudar sobre assunto fiquei com o p atrs. Afinal, estaramos nos tornando mais dependentes ainda. - E se ficarmos sem internet? essa foi a primeira questo levantada quando conversei com o pessoal aqui no escritrio sobre o assunto. - Que garantias teremos sobre a proteo de nossos projetos? essa foi outra questo bastante citada. Claro que so questes que devem ser

levantadas, mas no podemos deixar isso se tornar uma parania. Se voltarmos uns 15 anos, vamos nos lembrar que quando falvamos em implantar um sistema em alguma empresa, uma das primeiras questes era. - E se acabar a energia como eu fico? isso acontecia principalmente em cidades do interior onde a queda de energia era uma constante. Os componentes da Plataforma de Servios Azure podem ser usados por aplicativos locais executados em uma variedade de sistemas, inclusive vrios tipos de sistemas operacionais Windows, dispositivos mveis ou outros. Esses componentes incluem: Windows Azure: Fornece um ambiente baseado no Windows para executar aplicativos e armazenar dados nos servidores dos centros de dados da Microsoft. Microsoft .NET Services: Oferece servios de infra-estrutura distribudos para aplicativos baseados em nuvem e locais. Microsoft SQL Services: Fornece servios de dados na nuvem baseados no SQL Server. Live Services: Atravs do Live Framework, fornece acesso aos dados a partir de aplicativos Live da Microsoft e outros. O Live Framework tambm permite sincronizar esses dados em estaes de trabalho e dispositivos, encontrando e fazendo o download de aplicativos, e muito mais. Fiquem atentos, pois essa parece ser uma tima sada para economizar em equipamentos e poupar tempo. Caso queiram saber mais sobre o Azure acesse a URL: http://www.microsoft.com/ azure/default.mspx Aquele abrao e beijo nas crianas!

junho 2009

05

Delphi

Aplicao de outros Idiomas em um mesmo Projeto

Neste artigo, ser demonstrado como o Delphi permite que um mesmo projeto, possa ser aplicado vrios idiomas (Ingls, Espanhol, etc). Para que o projeto de exemplo funcione corretamente, altamente recomendvel que as nomenclaturas dos componentes, quanto as Units, quando confeccionado pela primeira vez, acompanhe as descritas aqui. Assim num primeiro momento, daremos inicio, construindo nosso projeto. Abra o Delphi, clique em File New Application. Nomeie o form, na propriedade name como frmFuncionrios, e no caption do mesmo, insira Funcionrios. Completando, insira no form, um componente label, nomeando-o como lbNome e seu caption ser Nome, na sequncia, insira um Edit, e no Name, insira como edNome, e finalmente adicionaremos um componente Button, onde atribuiremos em Name, btSalvar, e em seu caption Salvar. Assim nosso projeto ficar como
06
junho 2009

na figura 1: Salve o projeto nomeando a Unit como unFuncionarios, e por fim o projeto Funcionarios. Neste ponto em diante, iremos trabalhar com os recursos de idioma, assim clicaremos em: Project Languages Add, aparecer a seguinte mensagem, conforme a figura 2:

Figura 1.

Figura 2.

Clicaremos em Yes, na sequncia ser apresentada a tela conforme a figura 3, clicaremos em Next, pois existe a opo de aplicar o recurso de idiomas a vrios projetos de uma vez s, mas no ser objeto neste artigo: Veja a imagem Figura 3 Posteriormente aparecer a tela conforme a figura 4, selecion Ingls (Estados Unidos), clique em Next:
Figura 3.

Veja a imagem Figura 4 O idioma selecionado ser mostrado na tela seguido do projeto ao qual ele ser aplicado, clique em Next, uma semelhante a figura 5, ser mostrada: Veja a imagem Figura 5 Uma nova tela ser apresentada, mostrando onde a instncia ser criada, de acordo com idioma selecionado, de acordo com a figura 6: Veja a imagem Figura 6 Finalmente, uma tela ser disponibilizada, clique em Finish, conforme a tela 7: Veja a imagem Figura 7 Ao clicar em Finish a mensagem: This project needs to be compiled for the Resource DLL Wizard to finish. Compile the Project?, clique em Yes para concluirmos a insero do recurso de Idioma . Ao trmino o compilador exibir o que foi processado no projeto, veja na figura 8:
Figura 5. Figura 4.

Figura 8 Por fim, o Delphi pedir para seja salvo um novo Project Group, salve como Idiomas. Abrindo o Windows Explorer, e abrindo a Pasta na qual foi salva o Projeto que criamos, verificare-

Figura 6.
junho 2009

07

Figura 9.

mos que foi criada uma nova pasta de nome ENU, a qual uma cpia do projeto original e conter as informaes do outro idioma nela inseridas. Continuando, feche o projeto. Clique em File Open e v para a pasta na qual esta nosso projeto e acesse a pasta ENU e abra o projeto Funcionarios.dpr. Clique agora em View Translator Manager abrir uma tela conforme a figura 9 abaixo: Veja a imagem Figura 9 Assim a cada coluna obedece a seguinte ordem: Coluna 1 ( Quadro Vermelho) Vermelho a condio inicial quando o quadrado estiver cinza e indica que houve alterao; alterao; Coluna 2 (ID ou Componentes do Form) - Indica a propriedade dos componentes do Form. No nosso caso alteraremos apenas as propriedades Caption; Coluna 3 (Portugus (Brasil) ) - Coluna com as propriedades do Projeto Original;

Agora iremos modificar a propriedade Caption de cada componente, de acordo com o idioma. Assim indo para a coluna ID, vamos localizar frmFuncionarios.Caption. Na coluna Ingls Estados Unidos, mude a propriedade Caption para Employee. Repita o mesmo para o componente frmFuncionario.lbNome, mudando para Name. Faremos o mesmo para o componente Button, alterando seu Caption para Save. Feita as alteraes como indicado, clique em View Project Manager, ser disponibilizada uma tela, semelhante a figura 10:

pressionar a tecla F9. Para rodar o projeto em ingls clique em Project Languages Set Active, e selecione Ingls(Estados Unidos) e posteriormente em Finish. Pressione F9 e veremos nosso projeto compilado em Ingls como na figura 11:

Figura 11

Concluso
Como podemos observar, o Delphi nos oferece essa excelente opo quando necessitamos desenvolver uma mesma aplicao em vrios idiomas, o que em um mundo globalizado, como vivemos hoje, circunstncia que poderemos nos deparar. Espero ter ajudado. At uma prxima oportunidade.

Figura 10 Coluna 4 (Status) - Indica se est traduzido, se no est traduzido ou ento se no ser traduzido; Coluna 5 (Ingls (Estados Unidos)) - Essa coluna utilizaremos para fazer alteraes das propriedades Caption dos componentes; Clique com o boto direito do mouse sobre Funcionarios.exe, e clique em Compile. Repita essa mesma operao para Funcionarios.ENU. Finalizando nosso trabalho, vamos compilar os projetos para verificar o resultado. Assim para rodar o projeto em Portugus basta apenas

Sobre o autor
Marco Antonio Armando Consultor Tcnico The club

08

junho 2009

junho 2009

09

Criando Interfaces e Mtodos de classe no Delphi 2009


A plataforma de desenvolvimento Delphi 2009 e sua linguagem Object Pascal oferecem total suporte ao desenvolvimento utilizando o paradigma de orientao a objeto, porm esse suporte ainda pouco utilizado em sua totalidade pelos desenvolvedores que utilizam o Delphi. Isso decorre do fato de que alm do Delphi j oferecer recursos de orientao a objeto encapsulados em sua VCL que facilitam a vida do programador, a programao orientada a objeto abrange uma gama extensa de conceitos que talvez no despertem o interesse dos especialistas em automao comercial.

Interfaces
Quando se utiliza classes e herana se consegue at certo ponto uma padronizao do sistema j que se pode criar uma classe base com poucos atributos e mtodos e conforme a necessidade estender as funcionalidades dessa classe nas classes descendentes. Porm a padronizao esbarra em um problema: As classes descendentes no esto obrigadas a seguir a risca o escopo da superclasse, isso pode deixar o sistema um pouco complexo para os programadores encarregados de executar a manuteno do mesmo. Nesse contexto, a utilizao de interfaces pode ser uma possvel soluo para o problema apresentado. E o que so interfaces? Interfaces so como classes, porm com duas diferenas fundamentais: A primeira que os mtodos declarados na interface so obrigatoriamente abstratos, ou seja, sero implementados apenas nas classes descendentes. A segunda que as classes descendentes da interface so obrigadas a implementar todos os mtodos prototipados na interface, ou seja, a interface como um contrato

que as classes descendentes precisam seguir, isso pode ser extremamente til em termos de padronizao do sistema. Com o uso de interfaces, podemos definir um escopo base em nosso sistema e assim tornar o esquema de classes mais organizado. Imaginemos agora que precisssemos criar um mdulo para um sistema comercial que fosse extensvel, ou seja, outros programadores poderiam acrescentar funcionalidades extras ao mdulo, de acordo com a necessidade. Com classes e herana at poderamos fazer isso, porm, conforme o mdulo fosse sendo estendido, a no obrigatoriedade do seguimento de uma regra faria com que a manuteno ficasse confusa e o acrscimo de novas funcionalidades mais difcil.Com interfaces, definiramos um escopo base e assim as classes que viessem a ser includas teriam que seguir esse escopo. Sem dvida em termos de padronizao um grande ganho. claro que a princpio fica um tanto abstrato imaginar as situaes em que o uso de interfaces seria produtivo, isso porm ficar mais claro

Entre os conceitos presentes na orientao a objeto dois que raramente so foco do interesse dos programadores sem dvida so as interfaces e os mtodos de classe. Nesse artigo estarei mostrando como podemos criar e utilizar interfaces e mtodos de classe no Delphi 2009 e explicando melhor o que so esses conceitos e assim procurar desmitific-los um pouco.
10
junho 2009

medida que o programador for se familiarizando com a idia de por trs da utilizao da orientao a objeto em seus projetos. Para simplificar, estarei mostrando a seguir como declaramos interfaces e como elas devem ser utilizadas, isso j ser til para que a idia seja melhor compreendida.Mos a obra: A declarao de interfaces no Delphi muito semelhante declarao de classes, no exemplo vamos implementar uma interface denominada ICalculadora que como o nome sugere, conter mtodos e propriedades que sero utilizados em clculos. Veja a declarao:

( value : double ); procedure calculate ( x, y : double ); property result : double read getResult write setResult; end;

por implementar os mtodos prototipados. Sero duas classes: TSoma e TDivisao.Vamos ao cdigo:

importante lembrar que todas as assinaturas de mtodos em uma interface so pblicas, alm disso, no existem variveis ou atributos internos apenas mtodos e propriedades. Outra considerao, talvez a mais importante, os mtodos da interface so apenas prototipados, nunca implementados, a tarefa de implementao ser delegada as classes descendentes da interface. Iremos agora criar as classes que faro referencia a interface Icalculadora e sero as responsveis

type ICalculadora = Interface function getResult : double; procedure setResult

TSoma = class ( TInterfacedObject, ICalculadora ) private fResult : double; protected function getResult : double; procedure setResult ( value : double ); procedure calculate ( x, y : double ); end; TDivisao = class ( TInterfacedObject, ICalculadora ) private fResult : double; protected function getResult : double; procedure setResult ( value : double ); procedure calculate ( x, y : double ); end;

Como podemos observar alm da interface ICalculadora, as classes tambem herdam de TInterfacedobject que a classe que define o comportamento das interfaces e suas classes descendentes em Delphi. Agora temos que implementar os mtodos separadamente em cada classe j que, como dito anteriormente, as classes precisam seguir o contrato definido na interface. Veja a implementao dos mtodos:

function TSoma.getResult: double; begin result := Self.fResult; end; procedure TSoma. setResult(value: double); begin

junho 2009

11

self.fResult := value; end; function TDivisao. getResult: double; begin result := Self.fResult; end; procedure TDivisao. setResult(value: double); begin Self.fResult := value; end; procedure TSoma. calculate(x, y: double); begin setResult ( x + y ); end; procedure TDivisao. calculate(x, y: double); var r : double; begin if ( y = 0 ) then begin setResult ( 0 ); raise exception. Create ( Diviso por zero ); end; setResult ( x / y ); end;

Figura 01

exemplo conforme mostrado na figura 01: No evento onclick do boto calcular faa:

da propriedade result da interface. Apesar do exemplo simples, o leitor j poder constatar que o uso de interfaces um recurso valioso quando se trabalha com orientao a objetos.

Repare que o mtodo calculate implementado de forma independente nas duas classes. A interface define apenas a assinatura do mtodo e a implementao fica por conta das classes descendentes. Vamos agora criar um pequeno projeto para ilustrar o uso da interface ICalculadora e de suas duas classes descendentes: Inicie uma nova aplicao no Delphi 7 e inclua uma nova unit, salve a unit do formulrio com o nome default e a unit includa no projeto como uninterface. Na uninterface, coloque as declaraes da interface ICalculadora e das classes TSoma e TDiviso conforme mostrado no artigo. Agora, monte o nico formulrio do nosso
12
junho 2009

procedure TForm1. btncalcularClick(Sender: TObject); var x, y: double; calc : ICalculadora; begin x := strToFloat ( edit1.text ); y := strToFloat ( edit2.text ); try case grpOp.itemIndex of 0 : calc := TSoma.Create; 1 : calc := TDivisao.Create; end; calc.calculate( x, y ); showMessage ( floatToStr ( calc.result ) ); except raise end; end;

Mtodos de classe
Quando se trabalha com orientao a objeto, os mtodos so parte fundamental do desenvolvimento do sistema, utilizando o encapsulamento, agrupamos mtodos e os dados que eles necessitam para funcionar em classes e depois, atravs de instncias dessa classe, utilizamos esses mtodos. Claro que a boa prtica de programao nos diz que, uma vez que um mtodo de uma classe no precise mais ser utilizado, devemos liberar a instncia da classe de memria. At a sem segredos, porm a necessidade de liberarmos de memria a instncia da classe a cada vez que o mtodo no mais necessrio pode se tornar um incoveniente em determinadas situaes. Imagine que em seu projeto exista um mtodo em uma classe que faa a leitura de um arquivo de configurao e que esse mtodo fosse utilizado vrias vezes no projeto, nesse panorama estaramos diante de um problema: Toda vez que precisssemos utilizar o mtodo teramos que criar uma instncia da classe, utilizar o mtodo e aps isso liberar de memria a instncia criada. Imagine ter de fazer isso vrias vezes, sem dvida no seria uma boa estratgia de programao. Os mtodos de classe so uma boa alternativa nesses casos. Esses mtodos especiais no requerem que uma instncia da classe ao qual pertencem

Criamos a varivel calc do tipo ICalculadora para servir como uma referncia genrica todas as classes que descendem da interface, com a varivel calc tambm obtemos o resultado atravs

seja criada para que possamos utiliz-los. Sem dvida no caso citado anteriormente o uso de mtodos de classe vem de encontro ao problema da inprodutividade que instanciar e liberar de memria a instncia da classe criada. Um bom exemplo de uso dos mtodos de classe em Delphi a classe TObject, a classe mais alta na hierarquia das classes Delphi. Como se trata da classe mais bsica, muitos de seus mtodos precisam ser utilizados sem que uma instncia de TObject seja criada, devido a isso esse mtodos so declarados como mtodos de classe. claro que o uso de mtodos de classe boa estratgia, porm deve ser utilizada em casos que a situao e as boas prticas de programao exigem. Assim como o uso das interfaces, a utilizao de mtodos de classe se bem aproveitada sem dvida deixar o cdigo de seus projetos muito mais limpo e organizado. Vamos agora a um pequeno exemplo para ilustrar a situao anteriormente exposta. Um mtodo de leitura em um arquivo de configurao que verifica se uma varivel de ambiente e caso essa varivel esteja com o valor true, o mtodo retorna alguns valores desse arquivo de configurao. Esse mtodo ser utilizado no aplicativo a cada vez que um formulrio for ativado, devido a isso o nosso mtodo ser declarado como um mtodo de classe para que no precisemos instanciar e liberar de memria a classe que contm o mtodo. Mos a obra! Primeiro, a declarao da classe com o mtodo:

Repare na declarao do mtodo, inclumos a palavra class antes da declarao para indicar que esse um mtodo de classe e ser utilizado sem que uma instncia da classe TRead seja criada.

quando trabalhamos com orientao a objeto entre esses mtodos de classe e os mtodos tradicionais, chamados mtodos de instncia que requerem um objeto criado para serem utilizados.Essa diferenciao tambm de grande importncia quando vamos planejar as classes de nosso sistema

Vamos agora implementao do mtodo:

Concluso
Class function TRead.learq uivo(variavelambiente:bool ean):string; Var arquivo:tinifile; valor:string; Begin If variavelambiente then Begin arquivo:=tinifile. create(configuracao. ini); valor:=arquivo.readstrin g(confvalor,confvalo r,); Result:=valor; End; End;

Mtodos de classe so um recurso valioso da orientao a objeto, porm importante lembrar que nem todos os mtodos includos nas classes de um sistema podem ser declarados dessa forma apenas para poupar cdigo. O programador deve analisar com cuidado quais mtodos so mais adequados para serem utilizados como mtodos de classe. Geralmente, mtodos que no utilizam ou dependem de atributos de sua classe e que iro ser utilizados em vrios eventos so os mais indicados para serem mtodos de classe. J mtodos que fazem uso de atributos da classe ao qual pertencem e que fazem chamadas a outros mtodos da mesma classe devem ser declarados com mtodos de instncia. Com relao as interfaces, devemos ter em mente que para utilizarmos esse conceito devemos antes fazer um desenho das classes do sistema e detectar a possvel necessidade dessas classes seguirem uma regra de negcio. Caso haja essa necessidade, a criao de uma interface altamente recomendada para conter essa regra de negcio. Nesse artigo procurei atravs de exemplos simples mostrar que esses dois conceitos: Mtodos de classe e interfaces, so relativamente simples de se utilizar e so de grande ajuda em nossos projetos.

Para chamarmos esse mtodo nos eventos necessarios, bastaria fazer:

TRead. learquivo(nomevariavel);

TRead=class Class function learqu ivo(variavelambiente:boole an):string; End;

Repare que com apena uma linha realizamos a chamada ao mtodo da classe sem a necessidade de instanci-la. Isso tambm mostra a diferena que existe

Espero que tenham gostado e at a prxima!

Sobre o autor
Antonio Spitaleri Neto
Consultor Tcnico The club antonio@theclub.com.br
junho 2009

13

Introduo:
tualmente com o avano da tecnologia cada vez mais ns desenvolvedores temos a necessidade de trabalhar com arquivos xml. O caso mais recente o XML da Nota Fiscal Eletrnica e com base nisso vamos mostrar como ler essas informaes usando o componente TXMLDocument.

Primeiro vamos criar um projeto novo e adicionar os seguintes componentes: Label1 : TLabel; edArquivo : TEdit; btnAbrir :TButton; OpenDialog1 : TOpenDialog; btnDados : TButton; Memo1 : TMemo;

Figura1. Layout do formulrio.

Podemos montar algo semelhante a figura 1. Agora vamos configurar o boto btnAbrir, que ser usado para escolher o arquivo xml. No evento OnClick adicione o seguinte cdigo:
14
junho 2009

if OpenDialog1.Execute then edArquivo.Text := OpenDialog1.FileName;

O prximo passo configurar o boto btnDados que ser responsvel por mostrar os Produtos da Nota Fiscal Eletrnica presentes no arquivo xml selecionado, e apresenta-los no Memo1. Para isso vamos colocar o seguinte cdigo no evento OnClick: Veja o Cdigo 01.

Agora na clausula uses do projeto vamos adicionar a unit XMLDoc e XMLIntf

var oXML : TXMLDocument; noNota,noDet,noProd : IXMLNode; vCodProd,vCodBarra,vNomeProd : string; begin if edArquivo.Text = then begin MessageDlg(Primeiro selecione o arquivo XML.,mtInformation,[mbOk],0); Exit; end; oXML := TXMLDocument.Create(self); Try oXML.LoadFromFile(edArquivo.Text); Memo1.Lines.Clear; // dados da nota noNota := oXML.DocumentElement.childNodes.First.ChildNodes.First.ChildNodes. FindNode(ide); Memo1.Lines.Add(---------------------------------------------------------); Memo1.Lines.Add( DADOS DA NOTA FISCAL); Memo1.Lines.Add(---------------------------------------------------------); Memo1.Lines.Add(Nro Nota :+noNota.ChildNodes[nNF].Text); Memo1.Lines.Add(Srie: +noNota.ChildNodes[serie].Text); Memo1.Lines.Add(---------------------------------------------------------); Memo1.Lines.Add( PRODUTOS); Memo1.Lines.Add(---------------------------------------------------------); // dados dos produtos noDet := oXML.DocumentElement.childNodes.First.ChildNodes.First.ChildNodes. FindNode(det); noDet.ChildNodes.First; // looping na tag <det> do xml repeat noProd := noDet.ChildNodes.FindNode(prod); // pega os dados do produto e armazena nas variaveis. if noProd <> nil then begin vCodProd := noProd.ChildNodes[cProd].text; if noProd.ChildNodes[cEan].IsTextElement then vCodBarra := noProd.ChildNodes[cEan].text; vNomeProd := noProd.ChildNodes[xProd].text; // adiciona o produto no memo Memo1.Lines.Add( +vCodProd+ - +vCodBarra+ - +vNomeProd ); end; // vai para a proxima ocorrncia <det> noDet := noDet.NextSibling; until noDet = nil; Except oXML.Free; end; end;

Cdigo 01
junho 2009

15

Com isso finalizamos nossa aplicao. O resultado deve ser semelhante ao da figura2. Veja a Figura 02.

Concluso:
Nesse artigo vimos como ler os dados de um xml usando o componente TXMLDocument. O exemplo usado pode ser facilmente adaptado para gerar rotinas de entrada das Mercadorias no Estoque, muito til no dia a dia em aplicaes para automao comercial.

Sobre o autor
Jonas Kirch
membro da equipe de desenvolvimento da Office System Informtica Ltda, que atua no mercado h mais de 15 anos e possui diversas solues na rea de TI ( www.officesystem.com.br )
Figura2. Aplicao final.

16

junho 2009

DIRETIVAS DE COMPILAO
Bem, chegamos a segunda e ltima parte sobre as principais diretivas de compilao.
{$ExtendedSyntax on} unit Unit1; procedure TForm1. Button1Click(Sender: TObject); begin GetValue; end; function TForm1.GetValue: Integer; begin Result:= 1; end;

Parte II

$EXTENDEDSYNTAX
Diretiva obsoleta, mantida apenas para compatibilidade retroativa. Permite definir uma chamada de funo como se fosse uma chamada de procedure e ignorar o resultado da funo. Tambm permite suporte para strings terminadas em nulo. O mesmo que {$X+|-}. {$EXTENDEDSYNTAX on} ou {$EXTENDEDSYNTAX off} Exemplo: Antes do nome da unit adicione {$ExtendedSyntax on}. Exemplo:

Agora para chamar uma funo como se fosse uma procedure, altere {$ExtendedSyntax Off} para {$ExtendedSyntax on} .

$H
Controla o significado da palavra reservada string quando usada sozinha em uma declarao de tipo. Se habilitada {$H+}, converte-a em um tipo AnsiString; se desabilitada {$H-}, em ShortString, ou seja, cria-se dois tipos de string com o mesmo cdigo.

junho 2009

17

procedure TForm1. Button2Click(Sender: TObject); var // Define uma string curta {$H-} littleString: string; // Define uma string longa {$H+} bigString : string; begin // Exibe o tamanho de uma string curta ShowMessageFmt(String pequena = %d,[SizeOf(littleString)]); // Exibe o tamanho de uma string longa ShowMessageFmt( String longa = %d,[SizeOf(bigString)]); end;

var i,j: Integer; begin var i,j: Integer; begin // Hints ativado {$Hints On} // atribui-se i a um valor conhecido i := 234; end;

Exibio do hint: [Hint] Unit1.pas(40): Value assigned to i never used [Hint] Unit1.pas(34): Variable j is declared but never used in TForm1. FormCreate Exemplo com Hint desativado

$Hints
Emite (on) ou no (off) mensagens de dicas quando detectar variveis e atribuies no utilizadas, laos for ou while que nunca sero executados e assim por diante. Exemplo $ Hints on - gera mensagem que a varivel j nunca ser utilizada

var i,j: Integer; begin // Hints desativado {$Hints off} // atribui-se i a um valor conhecido i:= 234; end;

18

junho 2009

$J
O mesmo que $WRITEABLECONST.

$I NomedoArquivo
Inclui o arquivo especificado na compilao (extenso defautl = pas)

$ L nomearquivo
Efetua a linkedio do arquivo OBJ especificado com o programa ou unit que estiver sendo compilada. Utilizado para linkeditar cdigo escrito em outras linguagens para procedures e funes declaradas como external.

$IfDef
Compila o cdigo fonte at encontrar a diretiva {$Else} ou {$ENDIF} se o nome especificado no estiver definido. Exemplo:

$LINK nomedoarquivo
O mesmo que {$L nomearquivo}

var text: string; begin // modo teste {$Define modoteste} text:= Estamos no modo teste; // Exibe um valor se estamos em modo texto {$IfDef modoteste} ShowMessage(teste = +text); {$EndIf} // desativa modo teste {$UnDef modoteste} // Exibe um valor se estamos em modo texto {$IfDef modoteste} ShowMessage(teste = +text); {$Else} ShowMessage(No estamos em modo teste); {$EndIf} end;

$MINENUMSIZE
Define o armazenamento mnimo de tipos enumerados

{$MINENUMSIZE 1} OU {$MINENUMSIZE 2}OU {$MINENUMSIZE 4}


Exemplo:

type {$MinEnumSize 1} TCars1 = (Rover, Jaguar, Honda); //1 byte

junho 2009

19

TFruit1 = (Banana=255, Apple, Pear); // excede 1 byte {$MinEnumSize 4} TCars2 = (Ford, Nissan, Vauxhall); // 4 bytes TFruit2 = (Orange=255, Plum, Grape); 4 bytes Begin ShowMessage(TCars1 size = +IntToStr(SizeOf(TCars1))); ShowMessage(TFruit1 size = +IntToStr(SizeOf(TFruit1))); ShowMessage(TCars2 size = +IntToStr(SizeOf(TCars2))); ShowMessage(TFruit2 size = +IntToStr(SizeOf(TFruit2))); end;

Exemplo Captura de overflows

$O e $Optimization
Efetua a otimizao do cdigo de mquina gerado. Corresponde opo ProjetcOptionCompilerCode GenerationOptimization. {$O+} ou {$O-}

$OVERFLOWCHECKS
Verifica a ocorrncia de estouro (overflow) em operao com inteiros. Normalmente utilizada junto diretiva {$R+|-}. A utilizao da diretiva $Q torna mais lenta a execuo e aumenta o tamanho do programa. Deve ser utilizada somente para depurao. {$Q+} ou {$Q-}

var Mumero: Byte; begin // verificao de overflow {$OverFlowChecks On} // um byte pode conter 255 Mumero:= 255; ShowMessage(Mumero = + IntToStr(numero)); // Mas se exceder 255 ocorrer uma exceo Inc(Mumero); ShowMessage(Mumero = +IntToStr(numero)); end; Exemplo: Ignorando OverFlow var Mumero: Byte; begin // verificao de overflow {$OverFlowChecks off} // um byte pode conter 255 Mumero:= 255; ShowMessage(Mumero = + IntToStr(numero)); Inc(Mumero); ShowMessage(Mumero = +IntToStr(numero)); end;

20

junho 2009

$R
Verifica a ocorrncia de estouro de ndices em matrizes e strings. A utilizao desta diretiva torna a execuo mais lenta e aumenta o tamanho do programa. Deve ser utilizada somente para depurao. {$R+} ou {R$-} Exemplo: Verificando problemas com arrays

// observe o ndice for i := 0 to 5 do begin Vetor[i] := Elemento +IntToStr(i); ShowMessage(Vetor[+IntToStr(i )+] = +Vetor[i]); end;

$RUNONLY (somente para .dpk)


Indica que o pacote onde a diretiva aparece deve ser compilado como pacote runtime. {$RUNONLY on} ou {$RUNONLY off}

var vetor: array[1..5] of string; i: Integer; begin // ativo a checagem {$R+} //observe o ndice for i := 0 to 5 do Begin Vetor[i] := Elemento +IntToStr(i); ShowMessage(Vetor[+IntToStr(i )+] = +Vetor[i]); end; end; Exemplo ignorando o problema com vetor var vetor : array[1..5] of string; i : Integer; begin // desativo a checagem {$R-}

$U
Gera cdigo que detecta a falha de projeto do processador Pentium em diviso de ponto-flutanate. {$U +} ou {$U-}

$Warnings
Gera mensagens de advertncia quando forem detectadas variveis no inicializadas, resultado de funes ausentes, construes de objetos abstratos e assim por diante. {$WARNINGS ON) ou ($WARNINGS OFF)

junho 2009

21

$WRITEABLECONST
Permite a atribuio a constant tipadas. O mesmo que $J. {$WRITEABLECONST on} ou {$WRITEABLECONST off}

{$ENDIF}
A princpio, o cdigo entre {$IFDEF} e {$ELSE} ser simplesmente ignorado pelo compilador, porque a diretiva NOLOGIN no existe ainda. Somente o cdigo entre {$ELSE} e {$ENDIF} ser executado, que seria o cdigo regular para ambiente de produo. Basta escrever NOLOGIN no campo Conditional defines de Project | Options, dar um Build no seu projeto e a diretiva {$IFDEF NOLOGIN} ser avaliada como verdadeira pelo compilador. A o cdigo entre {$IFDEF} e {$ELSE} ser compilado e o cdigo entre {$ELSE} e {$ENDIF} que ser ignorado. Dessa forma podemos configurar o programa sem alterar o cdigo e sem deixar vestgios do cdigo de testes no executvel de produo. importante entender que as diretivas de compilao so interpretadas em tempo de compilao, no de execuo. As diretivas de compilao condicional s podem ser definidas nas opes do projeto (Conditional defines) ou no prprio cdigo. O uso de diretivas de compilao til quando precisamos frequentemente ativar e desativar blocos de cdigo. importante aproveitarmos ao mximo os recursos da ferramenta para podermos ganhar o mximo de produtividade.

$X
O mesmo que {$EXTENDEDSYNTAX } Para finalizar, segue uma simples rotina para desabilitar um formulrio de autenticao que em fase de desenvolvimento se torna uma grande chateao. {$IFDEF NOLOGIN}

CodigoUsuario := 1; NomeUsuario := Meu Nome; {$ELSE} if not Login(CodigoUsuario, NomeUsuario) then begin ShowMessage(Usuario invlido); Application.Terminate; end;

Sobre o autor
Lus Alexandre de Oliveira Tcnologo em Processamento de Dados ,graduado pela Faculdade de Tcnologia de Sorocaba, Consultor tcnico do The Club.
Docente do curso tcnico informtica - Etec de Avar e do curso Tecnologia em Redes de Computadores - Fatec Eduvale Avar

22

junho 2009

junho 2009

23

SILVERLIGHT
Uma das coisas mais bacanas do Silverlight so os controles de formulrio. Na edio anterior utilizamos alguns objetos como o TextBox e o Button. Existem vrios controles, e nesse artigo vou demonstrar a utilizao do controle DataGrid. Crie um novo projeto em Silverlight (Silverlight Application). Vamos cham-lo de DataGrid e clicar em Ok. Para o tipo de projeto escolha Web Site e clique em OK. No arquivo Page.xaml, v para o source XAML e posicione o cursor dentro da tag<Grid>. V para a Tollbox, escolha o objeto DataGrid e clique duas vezes sobre ele ou clique - arraste, como mostra a Figura 1. Fazendo isso a tab DataGrid inserida no XAML e feita a referncia ao System.Windows. Controls.Data. Veja a Imagem 1

Imagem 1

24

junho 2009

Na tag UserControl vamos colocar a altura com 400px e a largura com 900 px e criar o handler do evento load atravs do parmetro Loaded (utilize o Intellisense). Por fim, vamos informar o name do DataGrid como dgClient. Seu cdigo xaml ficar como mostra a listagem. Veja a Listagem 1 Vamos criar uma nova classe chamada Cliente dentro da namespace DataGrid para servir de mapeamento. Na classe vamos definir o get e o set para cada campo do registro cliente. Veja a listagem 2. Veja a Listagem 2. De volta classe Page, vamos criar uma lista, chamada source, para receber os dados de um lao de repetio. Vamos criar uma varivel source baseado numa classe que manipula a lista de valores. Logo em seguida fazemos um loop para adicionar os registros na nossa lista de clientes. Por fim, a lista referenciada como source do DataGrid. Veja o cdigo na listagem 3.

<UserControl xmlns:data=clr-namespace:System. Windows.Controls;assembly=System.Windows.Controls. Data x:Class=DataGrid1.Page xmlns=http://schemas.microsoft.com/winfx/2006/ xaml/presentation xmlns:x=http://schemas.microsoft.com/ winfx/2006/xaml Width=900 Height=400 > <Grid x:Name=LayoutRoot Background=White> <data:DataGrid x:Name=dbClientes> </data:DataGrid> </Grid> Listagem 1 Cdigo xaml com o DataGrid

public class Dados { public public public public

string Nome { get; set; } string Sobrenome { get; set; } int Idade { get; set; } bool Disponivel { get; set; }

} Listagem 2 .Classe Cliente

junho 2009

25

public Page() { InitializeComponent(); List<Dados> source = new List<Dados>(); int itemsCount = 100; for (int i = 0; i < itemsCount; i++) { source.Add(new Dados() { Nome = Primeiro, Sobrenome = Ultimo nome, Idade = i, Disponivel = (i % 2 == 0) }); } dbClientes.ItemsSource = source; }

Veja a Listagem 3 Por fim vamos customizar o DataGrid, v ao arquivo Page.xaml. Observe a listagem 4 com o cdigo xaml. Veja Listagem 4. Vamos compilar (CTRL + F5) e ver o resultado na Imagem 2. Veja a Imagem 2 Nesse artigo ficou claro que simples e que podemos codificar de forma semelhante ao ASP. NET. ou no Windows Forms. Fontes: Desenvolvendo para Web usando Visual Studio 2008 Editora Brasport. http://silverlight.net/GetStarted/

Listagem 3 data:DataGrid x:Name=dbClientes AutoGenerateColumns=True GridLinesVisibility=None HeadersVisibility=All RowBackground=Cornsilk AlternatingRowBackgrou nd=LemonChiffon ColumnWidth=85 RowHeight=30 IsReadOnly=True CanUserResizeColumns=False > </data:DataGrid> Listagem 4 Efeitos na DataGrid

Sobre o autor
Lus Alexandre de Oliveira Tcnologo em Processamento de Dados ,graduado pela Faculdade de Tcnologia de Sorocaba, Consultor tcnico do The Club.
Docente do curso tcnico informtica - Etec de Avar e do curso Tecnologia em Redes de Computadores - Fatec Eduvale Avar Imagem 2 DataGrid Customizado 26
junho 2009

junho 2009

27

Dicas DELPHI
Verificar se falta algum Edit para preencher Validar UF
function CheckForBlankText : Boolean ; // Declare-a na clausula Private do form // var n : LongInt ; begin Result := false ; for n := 0 to ( ComponentCount - 1 ) do begin if ( components[n].ClassType = TEdit ) then begin if TEdit (components[n]).text = then begin Result := true ; Exit; end; end ; end ; End; function ValidarEstado(Dado : string) : boolean; const Estados = SPMGRJRSSCPRESDFMTMS GOTOBASEALPBPEMARN CEPIPAAMAPFNACRRRO; var Posicao : integer; begin Result := true; if Dado <> then begin Posicao := Pos(UpperCase(Dado), Estados); if (Posicao = 0) or ((Posicao mod 2) = 0) then begin Result := false; end; end; end;

Validar PIS

Verificar se a impressora est ligada

function tbTestLPT(Port: byte): boolean; var Pto : Word; Rdo : byte; begin Pto := Port -1; asm MOV DX,Pto MOV AX,$0200 {AH := $02 : Leer el estado de la impresora} INT $17 MOV Rdo,AH {Guarda el estado en AL} end; Result := Rdo = 144; end;

function vpis(Dado: String):boolean; var i, wsoma, wm11, wdv, wdigito: integer; begin if Trim(Dado) <> then begin wdv := StrToInt(copy(Dado, 11, 1)); wsoma := 0; wm11 := 2; for i := 1 to 10 do begin wsoma := wsoma + (wm11 * StrToInt(Copy(Dado, 11 -i, 1))); if wm11 < 9 then wm11 := wm11 + 1 else wm11 := 2; end; wdigito := 11 - (wsoma mod 11);

28

junho 2009

if wdigito > 9 then wdigito := 0; if wdv = wdigito then begin Application.MessageBox(O valor informado vlido!, Aviso!, mb_IconStop+mb_ok); vpis := True; end else begin Application.MessageBox(O valor informado no vlido!, Ateno!, mb_IconStop+mb_ok); vpis := false; end; end; end;

Var i : Integer; begin // Para trocar as cores dos botoes do RadioGroup for i := 0 to RADIOGROUP1.Items. Count-1 do begin TRadioButton(RADIOGROUP1. Controls[i]).Font.Color := clGreen; TRadioButton(RADIOGROUP1. Controls[i]).Font.Style := [fsBold]; end; TRadioButton(RADIOGROUP1. Controls[RADIOGROUP1.ItemIndex]). Font.Color := clRed; TRadioButton(RADIOGROUP1. Controls[RADIOGROUP1.ItemIndex]). Font.Style := [fsBold]; end;

Verificar ultimo dia til do ms Tirar os espaos no inicio e final de uma string
function UltimoDiaDoMes( MesAno: string ): string; var sMes: string; sAno: string; begin sMes := Copy( MesAno, 1, 2 ); sAno := Copy( MesAno, 4, 2 ); if Pos( sMes, 01 02 03 04 05 06 07 08 09 10 11 12 ) > 0 then UltimoDiaDoMes := 31 else if sMes <> 02 then UltimoDiaDoMes := 30 else if ( StrToInt( sAno ) mod 4 ) = 0 then UltimoDiaDoMes := 29 else UltimoDiaDoMes := 28; end;

Function Trim(J:String):String; Export; Begin While J[Length(J)]=#32 do Dec(J[0]); If Length(J)>1 then While (J[1]= ) do Begin Delete(J,1,1); If Length(J)<=1 then J:=; end; Result:=J; end;

Trocar as cores dos botes de um RadioGroup


No Object Inspector na propriedade Font coloque a cor verde.

e um Anuncie na revista e ganh site do The Club banner publicitrio no

Anuncie conosco

to: Solicite um oramen

procedure TForm1. RADIOGROUP1Click(Sender: TObject);

Skype: theclub_cadastro lub.com.br E-mail: cadastro@thec Fone: (14) 3732-1529

junho 2009

29

30

junho 2009

junho 2009

junho 2009

Você também pode gostar