the club - março 2009 (datasnap)

Upload: bsguerra91

Post on 10-Feb-2018

227 views

Category:

Documents


2 download

TRANSCRIPT

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    1/32maro 2009

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    2/32maro 2009

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    3/32maro 2009 03

    LegendaIniciante

    Intermedirio

    Avanado

    ndice

    Editorial

    04

    Delphi

    Aprimorando o desempenho de um Banco de Dados

    .NET

    Trabalhando com dynamic Data

    Controls

    Dicas Delphi

    30

    Avar Auto Run do CD-ROM

    28

    05Posso dizer quea partir do ms deAgosto do ano pas-sado onde assumi a

    direo da revista TheClub Megazine, todasnossas edies foramfeitas com o objetivode levar umc o n t e d ocheio de no-vidades ...

    24

    Desafio

    The CLub

    Teste seus conhe-cimentos.

    DataSnap 2009 - ParteI Introduo

    10

    Zlib - Construndo um compactador de arquivos no Delphi

    13Delphi Prism com LINQ

    15

    Criptografar Strings

    Ver se existe Midia no Drive

    Ver impressora conectada

    Localizar Arquivos no Windows

    Mostrar as fontes True Types instaladas no Windows

    O ASP.NET ulmamente vem revolucio-nou o desenvolvimento de aplicaes paraweb oferecendo uma plataforma robusta ealtamente produva elevando o potencial dos

    desenvolvedores com excelenterecursos como: GridView, Data-Controls, Validators , WebPartsentre outros.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    4/32maro 200904

    Bem-vindo

    Delphi marca registrada da Borland International,as demais marcas citadas so registradas

    pelos seus respectivos proprietrios.

    Marcos Csar Silva - Editor Chefe

    [email protected]

    Posso dizer que a partir do ms de Agosto do ano passado onde assumia direo da revista The Club Megazine, todas nossas edies foram feitas

    com o objetivo de levar um contedo cheio de novidades e recursos apli-cveis no dia-a-dia do programador. Este ms nos do The Club camosmuito satisfeitos com o resultado desta edio, pois acreditamos que naspaginas desta edio para qualquer que seja o leitor, com certeza novida-des sero encontradas. Assim continuando a seqncia de artigos sobre anova ferramenta da Embarcadero, o Delphi Prism, Luiz Alexandre com seuartigo Delphi Prism com Linq (Language Integrate Query), nos mostrasmais algumas funcionalidades da ferramenta num artigo bastante completoque apresenta conceitos do Linq, que podem ser aplicados inclusive emum aplicao C#.

    Sabemos da importncia de velocidade e performance em nossas apli-

    caes, desta forma o consultor Marco Antonio Armando em seu artigoAprimorando desempenho de banco de dados, demonstra em dicas sim-ples, mas de grande importncia na aplicao, como escrever consultasSQL visando obter a melhor ecincia do banco de dados.

    Entre as muitas novidades apresentadas pela Embarcadero no lanamen-to do Delphi 2009, encontramos os novos avanos na tecnologia DataSnapque chamaram bastante a ateno, neste ms trago o artigo DataSnap2009 - Introduao onde mostro como cou simples e funcional criar umservidor de mtodos DataSnap, mostrando o poder de uma tecnologiaque embora lanadas a muito tempo ainda uma grande caixa preta para

    muitos programadores, e que agora aps um perodo de estagnao datecnologia, foi remodelada pela Embarcadero sendo lanada nesta novaverso com novos recursos e independente da tecnologia COM.

    Uma necessidade comum nas aplicaes a compactao de arquivoseja para backup de dados ou envio de arquivo pela internet, assim oconsulto Antonio Spitaleri escreveu o artigo Zlib Construindo um com-pactador de Arquivos no Delphi onde usando a Unit ZLib.pas nativa doDelphi demonstra como realizar este procedimento sem o uso de nenhumcomponente de terceiros.

    Ao longo dos anos surgiu no mercado necessidades como a criao detelas automticas de cadastro, com o lanamento do Service Pack 1 do .NET3.5, foi disponibilizando dentro do ASP.NET um novo conjunto de controlesconhecido como Dynamic Data Controls que tem objetivo de montar astelas para as aes bsicas. Assim este ms Fabiano Belmont aborda esteassunto com seu novo artigo Trabalhando com Dynamic Data Controls.

    Que todos tenham uma boa leitura e apreciem os artigos sem mode-rao.

    Av. Prof Celso Ferreira da Silva, 190

    Jd. Europa - Avar - SP - CEP 18.707-150

    Informaes: (14) 3732-1529

    Suporte: (14) 3733-1588

    Internethttp://www.theclub.com.br

    Cadastro: [email protected]

    Suporte: [email protected]

    Informaes: [email protected]

    Skype Cadastro: theclub_cadastro

    Skype Suporte: theclub_linha1

    theclub_linha2

    Copyright The Club Megazine 2008

    Diretor TcnicoMarcos Csar Silva

    Diagramao e Arte

    Vitor M. Rodrigues

    Reviso

    Marcos Csar Silva

    Colunistas

    Antonio Spitaleri Neto

    Fabiano Belmonte

    Lus Alexandre de OliveiraMarco Antonio Armando

    Marcos Csar Silva

    Impresso e acabamento:

    GRIL - Grfca 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 ClubMegazine so terminantemente proibidos sem autorizao

    escrita dos titulares dos direitos autorais.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    5/32maro 2009 05

    Delphi

    Entre as muitas novidades apresentadaspela Embarcadero no lanamento do Delphi

    2009, encontramos os novos avanos na tec-nologia DataSnap que chamaram bastante aateno. O DataSnap embora possa pareceruma tecnologia nova e cheia de mistriosnasceu juntamente com o lanamento do

    Delphi 3, inicialmente conhecida comotecnologia MIDAS ( Mul-Tier DistributedApplicaon Services), teve seu nome alte-rado para Datasnap quando no lanamentodo Delphi 6 passou a contar com suporte a

    SOAP/XML HTTP.Um dos principais avanos concebido

    nesta nova verso foi desvinculao doDatasnap da tecnologia COM, independn-cia esta esperada a logo prazo por muitosdesenvolvedores que ira simplicar em muitoo processo de desenvolvimento. Embora quevale ressaltar que foi manda toda compa-bilidade com verses anteriores.

    N

    este artigo ire demonstrar com

    criar um servidor de mtodose uma aplicao cliente que ir

    consumir os mtodos disponveispelo servidor.

    Criao do Servidor Datasnap

    No RAD Studio Delphi 2009 para criar uma apli-cao servidora Datasnap o primeiro passo criar

    uma aplicao VCL Forms Applicaons comumenteulizada, para isto v em New Projects selecione a

    opo VCL Forms Applicaons (Imagem 1).Ser criado a unit principal que salvaremos

    com o nome de unServer.pas e o projeto que sal-varemos como Server.dpr, iremos tambm alterar a

    propriedade Name do form criado frmServer.Veja a imagem 1.

    Imagem 1 Criando VCL Forms Applicatons

    Parte IIntroduo

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    6/32maro 200906

    Neste momento irei adicionar os componen-tes servidor Datasnap, para isto em Tool Paleeselecione a opo DataSnap Server e inseria noformulrio os componente TDSServer, TDSTCPSer-verTransport e um TDSServerClass1 como podever na Imagem 2.

    Imagens 2 Componentes Inseridos no formulrio

    Uma vez inserido os componentes necessriocongurar a propriedade Server dos componentesDSTCPServerTransport 1 e DSServerClass11 paraDSServer1. Uma dica importante neste momento observar a propriedade Port que se encontradano componente TDSTCPServerTransport, o numeroda porta dever ser nico por aplicao servidora

    para evitar que mais de uma aplicao respondana mesma Porta.

    Imagem 3 Criando o Server Module

    Criaremos agora o Server Module, que ser

    nosso DataModule da aplicao DataSnap, ou me-

    lhor um TProviderDataModule que ira servir como

    um provedor de mtodos e dados da aplicao

    Servidora. Para criar o Server Module v em New

    Itens e selecione o item Server Module (Imagem

    3), e salve-o como unServerModule;

    Veja a imagem 3.

    Apenas para finalidade de demonstrao

    irei criar um mtodo que ir retorna a verso do

    projeto, para isto no cdigo fonte do TDSServerMo-

    dule1, na seo public da classe declare a funcon

    PegaVersao e em implementaon insira o cdigofonte da funo como pode ver abaixo:

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    7/32maro 2009 07

    type TDSServerModule1 =class(TDSServerModule) private { Privatedeclarations } public function

    PegaVersao:string; end;var

    DSServerModule1:TDSServerModule1;

    implementation

    {$R *.dfm}

    { TDSServerModule1 }

    functionTDSServerModule1.PegaVersao: string;beginResult := Verso 1.0;end;

    Agora voltaremos ao form frmServer e adicio-

    ne a uses unServerModule com Alt+F11 (Imagem

    4) e no componente DSServerClass1, adicione o

    evento OnGetClass e insira o cdigo abaixo:

    procedure TfrmServer.

    DSServerClass1GetCl

    ass(DSServerClass:

    TDSServerClass;

    var PersistentClass:

    TPersistentClass);

    begin

    PersistentClass :=

    TDSServerModule1

    end;

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    8/32maro 200908

    Imagem 4 - Adicionando a uses unServerModule

    Compile o projeto com a opo Run Without

    Debugging Shift+Ctrl+ F9 assim ser criado oexecutvel Server.exe sem a opo de debug, no

    prendendo a sua execuo com a IDE do Delphi,

    neste momento apenas minimize o executvel do

    projeto servidor, pois o mesmo dever estar em

    execuo para responder ao projeto cliente que

    iremos criar.

    Criao do Cliente DataSnap

    O prximo passo antes de criar a aplicaocliente e salver o grupo de projetos em Project

    Manager, para isto clique com o boto direito

    do Mouse sobre o Arquivo de Grupo de projetos

    e selecione Save Projet Group As salve como

    DataSnapProjectGroup.groupproj, salvo o arquivo

    volte a clicar sobre o Grupo de Projetos e selecione

    Add New Project selecione a opo VCL Forms Ap-

    plicaons para criarmos a aplicao cliente, salve a

    unit como unClient.pas renomeando a propriedade

    Name do formulrio para frmClient, e salvando o

    projeto como Client.dproj.

    O prximo passo adicionar os componentes

    de conexo, para isto em Tool Palee selecione o

    componente TSQLConnecon e adicione no for-

    mulrio frmClient, assim no SQLConnecon1 em

    sua propriedade Driver selecione o item Datasnap,

    observe que esta propriedade no Object Inspector

    tem Subpropriedades , coloque na subpropriedade

    HostName o valor localhost e em port 211, e no

    esquea de alterar a propriedade LoginPrompt para

    false como pode var na imagem 5

    Imagem 5 Propriedades do SQLConnecton1

    Agora Clique com o boto direito no mouse

    sobre o componente SQLConnecon1 e selecionea opo Generate DataSnap client classes (Imagem6), para que seja criado pelo DataSnap proxy ge-nerator a unit de classes cliente correspondente

    ao mtodos disponveis na aplicao servidora,salve-a como unClientClass.pas. Outra dica im-portante, cerque-se que a aplicao servidoraesta rodando, caso contrrio a classe no sergerada com sucesso.

    Imagem 6 Criando as classes cliente

    Para que possamos testar, adicione no formfrmClient a uses unClientClass (Alt+F11) e coloqueum componente Label para receber o retorno domtodo e um Buon para disparar a execuo, noevento OnClick do boto adicione o cdigo quepode ver abaixo, para que desta forma quando for

    executado o clique no boto ser criado a classeTDSServerModule1Client gerada na etapa anterior

    e ento ser executado o mtodo desejado daclasse, que neste caso o PegaVersao;

    implementation

    uses unClientClass;

    {$R *.dfm}

    procedure TfrmClient.Button1Click(Sender:TObject);varServerModule:TDSServerModule1Client;

    beginServerModule :=TDSServerModule1Client.

    Create(SQLConnection1.DBXConnection);try Label1.Caption :=ServerModule.PegaVersao;finally ServerModule.Free;end;

    end;

    Variao da Aplicao Cliente Da-taSnap

    Para deixarmos mais evidente que a cone-xo est sendo feita atravs do driver DBXClientexisndo uma integrao direita com DataSnap edbExpress, iremos ulizar a mesma funo da apli-cao Server, s que desta vez sem a declarao daclasse TDSServerModule1Client como foi feito noprocesso anterior. Para isto adicione o componenteTSqlServerMethod que se encontra em Tool Palee

    -> dbExpress no formulrio frmClient, altere a suapropriedade SQLConnecon para SQLConnecon1e em ServerMethodName observe que ser listadatodos os mtodos da aplicao Server, selecioneassim o item que nos interessa que o TDSSer-verModule1.PegaVersao (Imagem 6). Adicionemais um componente TLabel e outro TBuon, noevento Onclick deste novo boto coloque o cdigoabaixo responsvel por executar o mtodo:

    procedure TfrmClient.Button2Click(Sender:TObject);

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    9/32maro 2009 09

    Sobre o autor

    Marcos Csar Silva, Consultor de

    Sistemas na consultoria de sistemas DataSmarte Consultor Tcnico do The Club, Bacharel em

    Cincia da Computao, MBA em Gesto Empre-

    sarial, Certicaes MCAD (Microsoft Certied

    Application Developer) e MCSD.NET (Microsoft

    Certied Solution Developer .NET)

    begin SqlServerMethod1.ExecuteMethod; Label2.Caption :=SqlServerMethod1.ParamByName(ReturnParameter).

    AsString;end;

    Imagem 7 Selecionado o mtodo

    Quando selecionamos o ServerMethodNameno componente SqlServerMethod1, automaca-mente a propriedade params deste componente

    foi preenchida, neste nosso caso exisa apenas oparmetro de retorno (Result) chamado por padrocomo ReturnParameter, Caso nosso mtodo vesseparmetros de entrada (Imput), estes parmetros

    seriam tambm adicionados em Params, e deve-riam ter uma valor para eles atribudos antes dachamada do mtodo ExecuteMethod do compo-nente SqlServerMethod1 da seguinte forma:

    SqlServerMethod1.ParamByName(Parametro1).AsInteger := 10;

    ConclusoVimos como ficou muito mais simples e

    prco a criao de aplicao Mulcamadas, nodependendo de nenhuma outra tecnologia para

    seu funcionamento. Em nosso prximo encontroiremos ver como usar a tecnologia Datasnap para

    acesso a banco de dados.

    Download:

    www.theclub.com.br/revista/rev0309/datas-nap2009.rar

    Referencia:

    h t t p : / / b l o g s . e m b a r c a d e r o . c o m /andreanolanusse/2008/10/16/exemplos-da-tasnap-dbexpress-e-outros-recursos-do-delphi-2009/

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    10/32maro 200910

    Entre as inmeras units presentes no Del-

    phi, sem dvida uma que poucos conhecem a zlib. Essa unit contm classes que tornampossvel a criao de objetos que realizam acompactao de arquivos.

    Nesse argo, estarei mostrando passo a passocom construir um compactador de arquivos bemsimples ulizando Delphi e a zlib. Mos a obra!

    Preparando a Aplicao

    Inicie um novo projeto no Delphi, e inclua naunit do form a unit zlib.

    Insiram no formulrio os seguintes compo-nentes:

    2 edits(palheta standard);4 buons(palheta standard);2 labels(palheta standard);1 opendialog(palheta dialogs);

    Altere as propriedades name dos componen-

    tes conforme segue:

    Formulrio:frmcompactador.Edits: edtarquivo,edtdesno.

    Buons: btncompacta,btndescompacta,btnselecionaarq,btndesno;

    Finalizando, insira ao lado das edits edtarquivoe edtdesno duas labels com as propriedades cap-on como arquivo e desno respecvamente.

    O formulrio dever ficar com a seguinteaparncia:

    Veja a Figura 01.

    Realizando a codifcao

    Chegou a hora de inserirmos o cdigo neces-srio para que o nosso compactador funcione.No

    evento onclick do btnselecionaarq digite:

    procedure Tfrmcompactador.btnselecionaarqClick(Sender:TObject);begin OpenDialog1.Execute; edtarquivo.Text:=OpenDialog1.FileName;end;

    Nesse evento estamos abrindo a caixa de di-

    logo abrir do windows, selecionando um arquivo e

    colocando seu caminho na edtarquivo.

    No evento onclick do btndesno digite:

    Figura 01.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    11/32maro 2009 11

    procedure Tfrmcompactador.btndestinoClick(Sender:TObject);begin OpenDialog1.Execute; edtdestino.Text:=ExtractFilePath(OpenDialog1.

    FileName);end;

    Aqui estamos selecionando um arquivo eextraindo atravs da funo extracilepath seucaminho j que apenas o caminho que ser u-lizado.Esse caminho ir ser exibido na edtdesno.

    Agora a parte mais importante, que a codi-cao que ir realizar a compactao do arquivoselecionado. nessa parte que estaremos ulizando

    as classes da zlib que realizam a compactao.

    No evento onclick do btncompacta digite:

    procedure Tfrmcompactador.btncompactaClick(Sender:TObject);var FileIni, FileOut:TFileStream; Zip: TCompressionStream;

    nomearq:string;begin try try nomearq:=InputBox(Compactar,Digite um nomepara o arquivo,); FileIni:=TFileStream.Create(edtarquivo.Text, fmOpenRead andfmShareExclusive); FileOut:=TFileStream.

    Create(nomearq+.zip, fmCreate orfmShareExclusive);

    Zip:=TCompressionStream.Create(clMax, FileOut); Zip.CopyFrom(FileIni,FileIni.Size); except Raise Exception.Create(No foi possvel

    compactar o arquivo); abort; end; finally Zip.Free; FileOut.Free; FileIni.Free; end;end;

    Fileini recebe o arquivo a ser compactado no

    formato stream para ser processado pelo objetozip, que realiza a compresso e coloca o resultadono objeto leout, este lmo tambm do poilestream.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    12/32maro 200912

    Sobre o autor

    Antonio Spitaleri Neto

    Consultor Tcnico The club

    [email protected]

    Repare que caso algum erro ocorra, o processo

    de compresso interrompido e enviada uma

    mensagem ao usurio de que a compresso no

    foi possvel.

    A chamada funo inputbox no incio do

    evento permite que o usurio escolha o nome de-

    sejado para o arquivo depois de compactado.

    Os arquivos compactados com a unit zlib pos-

    suem a extenso .zip que uma das extenses de

    arquivos compactados mais ulizada atualmente.

    O objeto mais importante de nosso aplica-

    vo o zip, do po tcompressionstream.A classetcompressionstream da unit zlib que contm os

    cdigos que permitem a compresso de arquivos.

    Alm da classe Tcompressionstream, a zlib

    tambm possui a classe tdecompressionstream,

    que como o nome sugere, realiza a descompresso

    de arquivos.

    Apesar de no ser o foco do argo, estarei

    mostrando um pequeno exemplo de cdigo para

    descompactao que pode ser inserido no eventoonclick do btndescompacta:

    procedure Tfrmcompactador.

    btndescompactaClick(Sender:TObject);var FileIni, FileOut:TFileStream; DeZip:TDecompressionStream; i: Integer; Buf: array[0..1023]ofByte; nomearq:string;begin

    try try nomearq:=InputBox(Descompactar,Digite um nome e a extenso doarquivo,); FileIni:=TFileStream.Create(edtarquivo.Text, fmOpenRead andfmShareExclusive); FileOut:=TFileStream.Create(nomearq,fmCreate or

    fmShareExclusive);

    DeZip:=TDecompressionStream.Create(FileIni); repeati:=DeZip.Read(Buf,SizeOf(Buf)); if i 0 then

    FileOut.Write(Buf, i); until i

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    13/32maro 2009 13

    No dia a dia, uma preocupao paradesenvolvedores de bancos de dados, sem

    sombra de dvidas, a performance nal

    dos mesmos.

    Neste sendo, muitos programadores se

    confundem no que tange a diferena entre

    um ajuste de banco de dados versus ajuste

    de uma instruo SQL.

    Assim desmiscando, temos:

    O ajuste de um banco de dados signica

    o processo de ajustar o banco de dados real, ou

    seja, fatores como: alocao de memria, uso de

    disco, CPU, etc. No podemos nos esquecer tam-

    bm que o ajuste tambm compreende a estrutura

    do banco de dados, como tabelas e ndices.

    O ajuste de uma instruo SQL, o pro-

    cesso ajustar uma instruo SQL, como consultas,

    inseres, etc., com o objevo de rar o mximo

    proveito possvel em performance e conabilida-de.

    APRIMORANDO

    O DESEMPENHO

    DE UM BANCO DE DADOS

    Ajuste de uma instruo SQL

    O ajuste de uma instruo SQL, visa construir

    instrues com excelncia, visando obter resulta-

    dos com eccia. A formatao de uma instruorepresenta um papel crucial na performance

    nal, neste contexto o ajuste da clausulas FROM

    E WHERE so vitais, pois so essas duas clausulas

    das quais dependero a forma em que o servidor

    de bancos dados ir process-la.

    Embora possa ser roneiro em nosso co-

    diano, a construo de instrues SQLs, requerateno, e alguns pr requisitos fundamentais, eisalguns deles:

    Levar em conta sempre a legibilidade;

    Posicionamento das tabelas na clusula

    FROM;

    Posicionamento de condies restrivas

    na clusula WHERE;

    Posicionamento de condies de JOIN na

    clusula WHERE;

    LEGIBILIDADE

    Quando se pensa em ajuste de uma instruo

    SQL, o primeiro passo a se levar em conta a legi-

    bilidade da mesma, a m de que que bem escrita,

    e facilite a vida de quem alm do desenvolvedor

    que a escreveu, possa discerni-la de forma rpida

    e segura.

    Para isto relacionaremos abaixo algumas

    parcularidades que tornam uma instruo de

    forma legvel:

    Inserir uma clusula FROM em uma li-nha separada da clusula SELECT, e clusula WHERE

    separada da clusula FROM:

    SELECT ID_CODIGO, NOME, CPF

    FROM CLIENTES

    WHERE NOME = GILSON

    O uso de tabulaes ou espaos e reco-

    mendvel quando um argumento de uma clusula,excedem uma linha.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    14/32maro 200914

    Quando da necessidade de utilizar

    vrias tabelas em uma instruo, o uso de aliases

    indispensvel.

    SELECT C.ID_CODIGO, C.NOME,V.ID_CODIGO, V.VALORFROM CLIENTES C, VENDAS V

    Inicie sempre uma nova linha na instru-

    o, caso haja a necessidade de se trabalhar com

    vrias colunas na instruo SELECT, isto tambm se

    aplica as clusulas FROM e WHERE.

    SELECT C.ID_CODIGO,C.NOME,C.CPF,

    C.TELEFONE,V.ID_CODIGO,V.VALOR,FROM CLIENTES C,VENDAS VWHERE C.ID_CODIGO =V.ID_CODIGO

    Veremos abaixo, um exemplo clssico de como

    muitos desenvolvedores escrevem uma instruo

    SQL, onde no se leva em conta a legibilidade:

    SELECT C.ID_CODIGO,C.NOME, C.CPF, C.TELEFONE,C.CIDADE, P.ID_CODIGO,P.NUM_PEDIDO, P.VALOR,P.QTDEFROM CLIENTES C, PEDIDOS PWHERE C.ID_CODIGO = P.ID_CODIGO AND C.CIDADE = SAOPAULO AND P.VALOR > 100

    Agora levando em conta os princpios da legibi-

    lidade, vamos reescrever a instruo acima:

    SELECT C.ID_CODIGO,C.NOME,C.CPF,C.TELEFONE,C.CIDADE,P.ID_CODIGO,P.NUM_PEDIDO,P.VALOR, P.QTDE

    FROM CLIENTES C,PEDIDOS PWHERE C.ID_CODIGO = P.ID_CODIGOAND C.CIDADE = SAO PAULOAND P.VALOR > 100

    Podemos observar que as duas instrues

    retornaram o mesmo nmero de registros, e no

    tero nenhuma diferena na sua performance, mas

    para quem as lerem, far uma grande diferena,

    principalmente se esvermos desenvolvendo um

    projeto de grande porte, que envolvam muitos

    desenvolvedores.

    ORDEM ADEQUADA DE CONDIES

    DE JUNO:Quando trabalhamos com mais de duas ta-

    belas em uma instruo SQL, a tabela base dever

    locada no lado direito de uma juno numa clusula

    WHERE, onde a unio dever ser feita sempre pri-

    meiramente com a menor tabela e posteriormente

    dever ser efetuada com as maiores, vejamosmelhor no exemplo abaixo:

    SELECT

    FROM TABELA1 (TABELA MENOR) TABELA2 TABELA3 (TABELA MAIOR)WHERE TABELA1. =TABELA3.TABELA2. =TABELA3.

    BUSCANDO A CONDIO RESTRITIVA

    Buscar a condio mais restritiva o foco

    principal, visando um mo desempenho em uma

    consulta SQL.

    Assim podemos denir uma condio restri-

    va, como a forma de ulizarmos em uma clusula

    WHERE de uma instruo que retorne uma menor

    quandade de registros.

    Para isto importante saber como o omi-

    zador do banco de dados opera para executar a

    instruo, pois alguns banco por exemplo lem da

    parte inferior da clusula WHERE para cima, assim

    devemos colocar a condio mais restriva por

    lmo, pois a primeira condio que lida pelo

    omizador do banco ulizado.

    Abaixo vejamos a sintaxe bsica:

    FROM TABELA1

    TABELA2 TABELA3WHERE TABELA1.= TABELA3. ANDTABELA2. =TABELA3.

    AND CONDIO 1

    AND CONDIO 2

    Se por ventura, na implementao ulizada, na

    sua documentao, no mencionar como o omiza-

    dor funciona quanto a condies de restrio, para

    que possamos escrever instrues que interajam

    de maneira mais eciente com o banco de dados,

    a melhor forma, seria executar as consultas crono-

    metrando o seu tempo de execuo, vericando se

    o omizar l a clusula WHERE, de cima para baixo,

    ou de baixo para cima.

    Posteriormente, devemos organiz-las de

    forma que as condies restrivas respondam de

    maneira concernente ao omizador.

    muito comum, no suporte do THE CLUB, os

    scios muitas vezes, apresentarem muita preocu-

    pao e dvidas quanto a conexo a ser escolhida

    para desenvolvimento de uma aplicao, isto sem

    dvida requer uma escolha correta, mas nunca no

    podemos de nos esquecer que, banco de dados

    bem construdos, e instrues SQLs bem escritasnos pouparo de muitos problemas, e nos retor-

    naro, um resultado nal muito mais proveitoso,

    principalmente aos olhos de nossos clientes.

    Um abrao e at a prxima.

    Sobre o autor

    Marco Antonio Armando

    Consultor Tcnico The club

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    15/32maro 2009 15

    Todos os aplicavos, exceto os triviais,

    precisam processar dados. Historicamente,

    a maioria dos aplicavos fornece um lgica

    prpria para realizar essas operaes. Mas

    essa estratgia pode fazer o cdigo em um

    aplicavo tornar-se excessivamente amarrado

    estrutura dos dados que ele processa. E se

    houver mudanas no esquema de banco de

    dados, talvez voc necessite realizar umnmero signicavo de alteraes no cdigo

    que trata os dados. A proposta da LINQ

    abstrair o mecanismo que um aplicavo u-

    liza para consultar dados a parr do prprio

    cdigo do aplicavo.

    A LINQ fornece uma sintaxe e semnca muito

    semelhantes da SQL, com vantagens parecidas.

    Voc pode mudar a estrutura dos dados em consul-

    ta sem precisar alterar o cdigo que a realiza.

    A LINQ tem como objevo simplicar con-

    sultas a informaes em collecons, arrays, assim

    como informaes baseadas em base de dados,

    XML e objetos.

    Atualmente o LINQ suporta

    Linq to objectsLinq to SQL

    Linq to xml

    O diagrama acima apresenta umaviso geral do LINQ , seus provedores eas fontes de dados acessveis:

    LINQ TO OBJECTS

    Tem como objevo simplicar consultas ainformaes em collecons, arrays, assim comoinformaes baseadas em base de dados, XMLe objetos

    Atualmente o LINQ suporta:

    LINQ to ObjectsLINQ to SQL

    LINQ to XML

    Delphi Prism suporta LINQ atravs de :

    Sequences e Query ExpressionsLambda ExpressionsExpressions TreesExtension MethodsAnonymous Types

    Type Inference

    Vamos entender como funciona o LINQ

    QUERY EXPRESSIONS

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    16/32maro 200916

    Permite executar querys em coleo deobjetos.

    Vamos contruir um exemplo prco. V nomenu File --> New --> Project . No treeview a es-querda escolha Delphi Prism. Selecione o templateWindows Aplicaon .(Imagem 1)

    Clique em ok.No form Principal adicione um buon e um

    listbox. Seu layout car assim (Imagem 2):Clique duas vezes no boto do formulrio.Adicione no evento do boto o seguinte trecho decdigo (trecho 1)

    method MainForm.btnok_Click(sender: System.Object; e: System.EventArgs);begin

    var words :Array of string:=[ola,Delphi Prism, linq,TheClub,Alexandre];

    var shortwords:=From word in wordswhere Word.Length

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    17/32maro 2009 17

    mento em SQL

    Vamos efetuar o mapeamento objeto relacio-

    nal, criar um contexto de dados (DataContext) e

    consultar um banco de dados SQL Server com LINQ

    To SQL via cdigo .

    Mapeando classes para Tabelas

    O conceito de mapeamento objeto Relacional

    (ORM) no uma novidade. Um ORM pode ser

    visto como um classe (endade) que possui pro-

    priedades ou campos que mapeiam para as colunas

    de um banco de dados.

    O mapeamento para uma tabela possui dois

    elementos bsicos:

    1. TableAribute - mapeia a classe para atabela no banco de dados;

    2. ColumnAribute - mapeia cada proprie-

    dade para uma coluna do banco de dados;

    Para mapear a classe para uma tabela usamos

    o TableAribute com argumentos nomeados para

    associar a classe com a tabela.

    Abra o Visual Studio 2008 e crie um novo

    projeto do po Windows Applicaon com o nome

    ExemploLInq.

    A seguir inclua uma referncia ao LINQ To SQL

    clicando com o boto direito sobre o nome do

    projeto e selecionando Add Reference;

    A seguir na janela Add Reference selecione, na

    aba .NET, System.Data.Linq e clique no boto OK.

    Veja a imagem 4;

    Com isso j temos tudo pronto para iniciaro projeto.

    Vamos criar um banco de dados com o Studio

    Express. No object Explorer clique duas vezes em

    seucomputador\sqlexpress. Com o boto direito

    do mouse em DataBase, acesse new DataBase. Em

    databaseName coloque Categorias.

    Clique em OK e pronto,nosso banco j esta

    criado.

    Veja a imagem 5.

    Imagem 4

    Imagem 5

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    18/32maro 200918

    Clique duas vezes em CATEGORIAS e clique

    com o boto direito do mouse em tables.

    Adicione a primeira tabela conforme imagem

    6

    Faa o mesmo procedimento para adicionar a

    table SUBCATEGORIA.

    Veja a imagem 7.

    Faa o mesmo procedimento para criar umatabela de contatos

    Vamos criar o diagrama do banco de dados.

    Clique em DataBase Diagrams com o boto direitodo mouse e adicione um novo.

    Nosso relacionamento car assim:

    Veja a imagem 8.

    Nosso objevo ser efetuar o mapeamentoobjeto relacional com as tabelas Contato Categoria

    e Subcategoria .

    No menu Project | Add New Item selecione otemplate Class e informe o nome Categoria.PAS.Clique em add. Nesta classe iremos denir o mape-amento entre as tabelas do banco de dados.

    Abra a classe e inclua a seguinte declarao :

    System.Data.linq,System.Data.Linq.Mapping,

    Agora inclua o seguinte cdigo(Listagem1) queir criar o mapeamento para as tabelas Categoriase SubCategorias para os campos denidos:

    namespace ExemploLInq;

    interface

    uses System.Collections.Generic, System.Linq, System.Data.linq, System.Data.Linq.Mapping,

    System.Text;

    type [Table(Name:=

    Imagem 6.

    Imagem 7.

    Imagem 8.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    19/32maro 2009 19

    CATEGORIAS)]Categorias = public class

    Public[Column(IsPrimaryKey:=true,Name:=CATEGORIAID)] PropertyCategoriaID:Integer;

    [Column(Name:=NOME)] PropertyCatNome:String; End;

    [Table(Name :=SUBCATEGORIAS)] Subcategorias = class Public[Column(IsPrimaryKey:=true,Name:=SUBCATEGORIAID)]

    PropertySubcategoriaID:Integer; [Column(Name:=NOME)] PropertySubcatNome:String;[Column(Name:=CATEGORIAID)] propertyCategoriaID:Integer;

    [Association(OtherKey:=CategoriaID)]

    Property Categorias:EntitySet;

    End;implementationend.

    Se trabalharmos com join podemos represen-t-las atravs de Associaes .

    ENTIDADES PODEM ESTAR RELACIONADOSATRAVS DO ATRIBUTO DE ASSOCIAO (Joins)

    Observe que z classe que verica a associaoentre Subcategorias e Categorias de um produto.

    Vamos mapear a tabela contatos.Crie uma

    outra classe Contatos .Listagem 1

    namespace ExemploLInq;

    interface

    uses System.Collections.Generic,

    System.Linq, System.Data.linq, System.Data.Linq.Mapping, System.Text;

    type

    [Table(Name:=CONTATOS)]Contatos = Class

    Public[Column(IsPrimaryKey:=true,Name:=CONTATOID)] Propertycontatoid:Integer;[Column(Name:=Nome)] Property

    ContatoNome:String; End;implementation

    end.

    Na classe principal Main.pas adicione umDataGridView que se encontra na seo Datado ToolBox. Adicione tambm dois buons eum textbox que se encontra na seo CommonControls. O textbox ter o caminho do banco.Adicione em uses :

    System.Linq,System.Data.Linq,System.Data.Linq.Mapping,

    O formulrio car assim:

    No evento Clique do boto Query com Joins

    adicione o script abaixo:

    Adicione em uses System.Data.Linq,

    method MainForm.Joins_

    Click(sender: System.Object;

    e: System.EventArgs);

    var

    Path :String :=

    System.IO.Path.

    GetFullPath(tbDataBase.

    text);

    // inicializao da varivel

    para pegar o banco de dados

    db:DataContext := new

    DataContext(path);

    cats:Table :=

    db.GetTable();

    subcats:Table:=db.

    GetTable();

    Begin

    Var query:= from cat in cats

    join subcat in

    subcats

    on cat.

    CategoriaID equals subcat.

    CategoriaID

    order by

    cat.CatNome select new

    class (cat.CatNome,subcat.

    SubcatNome);

    dataGridView1.DataSource :=

    query;

    end;

    Temos quatro variveis,sendo a primeira

    armazenado o caminho do banco e a segunda

    armazenda um DataContext que faz a conexo com

    o banco . As varaveis categoria e subcategoria so

    do po table e atravs do mtodo getTable elas

    referenciam seu po genrico.

    Em query temos os alias categoria e subca-

    tegoria representando as variaveis categorias e

    subcategorias respecvamente.

    Em on categoria.CategoriaID equals subcate-

    goria.CategoriaID feito o join. Os registros soordenados em order by Categoria.Nome.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    20/32maro 200920

    O resultado retornado numa nova classe (

    select new class (categoria.Nome,subcategoria.

    Nome)

    Atribuimos o resultado query que um

    collecon em um DataGridView.

    Nota do consultor.

    A classe DataContext uma classe LINQ

    to SQL que atua como uma ponte entre o

    banco de dados SQL Server e as classes das

    entidades LINQ To SQL mapeadas para o

    banco de dados. Ela contm a informao e os

    mtodos para efetuar a conexo com o banco

    de dados e manipular os dados.

    Da mesma forma , no boto query simples

    adicione o cdigo abaixo:

    method MainForm.Simples_

    Click(sender: System.

    Object; e: System.

    EventArgs);

    Var

    Path :String :=

    System.IO.Path.

    GetFullPath(tbDataBase.text);

    // inicializao da

    varivel para pegar o

    banco de dados

    db:DataContext := new

    DataContext(path);

    // Criao do Contexto

    begin

    Var contato:=

    from contato indb.GetTable()

    where

    contato.contatonome =

    JOSE

    select

    contato;

    dataGridView1.DataSource

    := contato; // atribuo a

    collection ao datasource

    end;

    LINQ TO XML

    O LINQ to XML um provedor de dados LINQ

    que implementado no namespace System.Xml.

    LINQ a parr da verso 3.5 da plataforma .NET. Ele

    fornece um modelo de programao que permite

    ler, construir e escrever dados XML. Voc pode usar

    LINQ To XML para realizar consultas LINQ sobre

    dados no formato XML que podem ser retornados

    do arquivo de sistemas, de uma URL HTTP remota,

    de um web service ou parr de qualquer XML emmemria existente.

    Observe a hierarquia da classe linq to XML.

    Veja a Imagem 9.

    As principais classes do link to xml so:

    XDocument Atua como um

    container para a rvore XML e deve ser usado

    somente se necessrio. Voc pode salvar o docu-mento com um arquivo XML.

    XElement Permite criar elemento s

    , modificar o contedo dos elementos (incluir,

    remover, modicar elementos lhos), modica os

    atributos dos elementos , salvar como um arquivo

    XML.

    XAttribute Usado para criar um par

    nome/valor no interior de um elemento do arquivo

    XML.

    XName Representa um nome com-

    pleto XML consisndo de um objeto XNamespacee do nome local.

    XComment Representa um

    comentrio XML.

    XDocumentType Representa um

    documento XML DTD - Document Type Defini-

    on.

    XProcesingInstruction Re pr es en ta o

    processamento de uma instruo de um documen-

    to XML.

    XTest Representa um n Texto.

    XDeclaraon Representa uma

    declarao XML.

    O LINQ TO XML gera arquivos xml diretamen-

    te a parr das classes. Isso implica em reduo

    de linha de cdigo em at 4 vezes. Outro ponto

    importante que o XML at ento no nha boa

    integrao com as linguagens, sendo necessrio

    o uso de diversas APIs.

    Vamos criar um pequeno exemplo desse

    poderoso recurso ulizando um array de livros.

    Crie um novo projeto em files->new projet windowapplicaon

    Adicione dois textbox e dois buons. O layout

    car assim:

    Veja a Imagem 10

    Para criar documentos completos XML voc

    deve primeiro instanciar o objeto XDocument e

    ento incluir o elemento XElement, XAtribue ou

    outra endade que o documento necessita. Cliqueno boto gerar XML e adicione o cdigo abaixo

    Imagem 9.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    21/32maro 2009 21

    Var

    xml:System.Xml.Linq.

    XElement;

    beginxml:=

    new xElement(Clientes,

    new xElement(Cliente,

    new

    xAttribute(codigo,1),

    New

    XElement(nome,

    Alexandre),

    NewXElement(email,

    [email protected])),

    New

    XElement(cliente,

    New XAttribute(codigo,

    2),

    New XElement(nome,

    Antonio),

    New XElement(email,

    [email protected])));

    textBox1.Text:=

    xml.ToString();

    xml.Save(c:\

    teste.xml);

    end;

    Imagem 10.

    O arquivo xml foi atribuido para o textbox1

    . Foi ulizado o mtodo toString para converso

    de tipos. Um arquivo teste.xml foi gerado no

    diretrio raiz.

    No boto consultar xml adicione o cdigo

    abaixo.

    var xml := XElement.

    Load(c:\teste.xml,

    LoadOptions.SetBaseUri

    or LoadOptions.

    SetLineInfo);

    begin

    var consulta := fromv in xml.Elements

    where

    v.Attribute(codigo).

    Value = 2

    select v;

    For each cons in

    consulta do

    textBox2.Text:=

    cons.ToString;

    end;

    Na varivel xml foi atribuido o contedo

    do arquivo teste.xml por intermdio da classe

    XElement.

    O LoadOpon possui quatro opes . None :

    todas as linhas desnecessrias,linhas em branco e

    linhas de informaes, do arquivo XML no sero

    carregadas. PreserveWhitespace: essa opo de-

    ne que todas as linhas em branco do arquivo XML

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    22/32maro 200922

    sero preservadas. SetBaseUri : essa opo dene

    o preenchimento da propriedade BaseUri. SetLi-

    neInfo: essa opo habilita o preenchimento da das

    informaes de linha, essa informaes pode ser

    recuperadas atravs da interface IXmlLineInfo.

    Na varivel consulta atribumos os elementos

    do arquivos onde o atributo cdigo seja igual a 2.

    Observe o resultado da consulta.

    Veja a imagem 11.

    Concluso

    Com esses exemplos d para se ter uma dia

    do poder do Linq para manipulao de objetos,

    consultas e de arquivos xml. A Linq promete, so-

    bretudo ser uma nova forma de trabalho de dados

    em memria.

    Imagem 11.

    Referncias:

    hp://www.microso.com/brasil/msdn/Tecnologias/arquitetura/LINQ.mspx

    hp://msdn2.microso.com/en-us/neramework/aa904594.aspx

    hp://msdn2.microso.com/en-us/vcsharp/aa336746.aspxhp://weblogs.asp.net/scogu/archive/2007/05/19/using-linq-to-sql-part-1.aspxhp://blogs.embarcadero.com/pawelglowacki/2005/09/22/21244

    hp://blogs.teamb.com/craigstuntz/2007/03/28/33565/hp://msdn.microso.com/pt-br/library/system.xml.linq.aspxhp://edn.embarcadero.com/br/arcle/39135Microso Visual C# Passo a Passo - John Sharp

    Sobre o autor

    Lus Alexandre de Oliveira Tc-nologo 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

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    23/32maro 2009 23

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    24/32maro 200924

    O ASP.NET ulmamente vem revolucio-

    nou o desenvolvimento de aplicaes para

    web oferecendo uma plataforma robusta e

    altamente produva elevando o potencial

    dos desenvolvedores com excelente recursos

    como: GridView, DataControls, Validators ,

    WebParts entre outros.

    A

    o longo dos anos, outras necessi-

    dades foram surgindo no mercado

    como a criao de telas automcas

    de cadastro conhecidas atualmente

    como Scaold bastante populares com o Ruby

    on Rails.

    J faz algum tempo que a Microsoft vem

    invesndo em linguagens dinmicas e agora, com

    o lanamento do Service Pack 1 do .NET 3.5, foi

    disponibilizando dentro do ASP.NET um novo con-

    junto de controles conhecido como Dynamic Data

    Controls que tem objevo de montar as telas para

    as aes bsicas de qualquer CRUD (Create, Read,

    Update, Delete).

    Trabalhando com Dynamic

    Data Controls

    Logo aps instalar o Service Pack 1 do Visual

    Studio 2008, vai aparecer, conforme apresentado

    na gura abaixo, mais um novo po de projeto web

    para o .NET 3.5 chamado de Dynamic Data

    Veja na imagem 1.

    Aps criar seu novo projeto, verifique nas

    referncias e vai observar que ele traz as os novos

    namespaces System.Web.DynamicData e System.

    Web.DynamicData.Design.

    A funcionalidade Dynamic Data Controls tra-

    balha em conjunto com o LINQ TO SQL e EnesFrameWork, pois ele precisa de uma interface de

    acesso a dados que ser ulizada para gerar as

    funcionalidade em tempo de execuo.

    Bem agora para connuarmos com o exemplo

    precisamos de uma base de dados e um diagrama

    LINQ que ser ulizado pela aplicao. Vou ulizar

    um banco de dados .mdb so SQLExpress que j

    tenho pronto.

    Veja a imagem 2.

    Agora vou criar o Diagrama LINQ e adicionaras tabelas que desejo trabalhar em meu projeto,para isso basta clicar com o lado direto do mouse

    no projeto, selecionar a opo add new item, eselecionar o DataClasses.dbml do LINQ. Como naimagem abaixo.

    Veja a imagem 3.

    Imagem 2.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    25/32maro 2009 25

    Imagem 1.

    Imagem 3.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    26/32maro 200926

    Feito isso, agora vamos arrastar as tabelas que

    iremos ulizar no projeto para o diagrama do LINQ.

    Como na imagem abaixo.

    Agora vem a parte mais simples do projetoque ser a implementao propriamente dita, ou

    seja onde colocamos a mo na massa, mais que

    tranqilo que com esta ferramenta trabalharemos

    muito pouco pois a idia e que tudo seja gerado em

    tempo de execuo. Para isso temos que congurar

    o Dynamic Data para ulizar o LINQ to SQL e gerar

    automaticamente as telas de manipulao das

    tabelas do diagrama.

    O primeiro lugar que vamos alterar e no ar-

    quivo global.asax nele devemos localizar o mtodoRegisterRoutes() e dentro do mesmo modique a

    linha Model.RegisterContext adicionando o nome

    do diagrama gerado pelo LINQ que para o nosso

    exemplo que foi DataClassesDataContext alterando

    o valor de ScaoldAllTables para true

    Veja a Imagem 5.

    OBS: Esta linha geralmente vem comentada

    dentro do arquivo global.asax devemos descomen-

    ta-la e fazer as alteraes necessrias

    Imagem 4.

    Imagem 5.

    Pronto acabamos nosso projeto! Voc pode

    estar se perguntando, nossa mais no z quase

    nada...

    Para ver o resultado basta rodar sua aplicao,

    e voc ver as paginas de lista, insero, deleo e

    edio prontas para ulizao. Como nas imagens

    abaixo.

    Aqui temos o menu principal com acesso atodas as paginas do sistema:

    Veja a imagem 6.

    Ao Clicar no link de Produtos olha que legal,teremos um grid com os produtos cadastrados,onde as colunas do Grid so as mesmas colunasda Tabela, e o mais interessante e o ltro que foigerado automacamente de acordo com as Chavesda tabela de Produtos, tem tambm a paginaodo Grid e tudo isso sem escrever nenhuma linha decdigo, temos tambm links para edio e deleodo produto e isso acontece para todas as tabelas

    relacionadas no diagrama.

    Note zemos esse projeto em 45 min.

    Veja a imagem 7.

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    27/32maro 2009 27

    Sobre o autor

    Fabiano Belmonte

    Senior Architect da InfoMoney.com, especialista em aplicaes e-Business com larga experincia em

    B2B (Submarino.Com e Saraiva.Com). Trabalha h 5 anos com a tecnologia .Net, aplicando conhecimentos

    nas diversas reas: instituies nanceiras (sistema SPB), e-Commerce, gerenciamento logstico entre

    outras. Trabalhando com Visual Studio desde suas primeiras verses, responsvel pela implementao de

    uma Metodologia de trabalho e melhoras signicativas no resultados e na qualidade do time de Desen -

    volvimento de muitas empresas por onde passou como (Saraiva.Com) e ferramentas como TFS (Team

    Foundation Server).

    Foi palestrante em eventos como Codicando. NET 2008 e outros eventos sobre Tecnologia .NET.

    Voc pode estar se perguntando e o layoutcomo ca, no gostei desse, esta fora do padroda minha empresa ou do meu site, no temproblema ele e feito todo em cima de CSS, vocpoder customizar tudo, pode tambm gerarpaginas personalizadas editar somente o GRID deProdutos, a ferramenta e bem Flexvel. Agora vocprecisa tomar cuidado para que sua customizaono te leve a fazer tudo do zero ai vale mais apenafazer de outra maneira. Esta ferramenta trar maiorbenecio se ver pouca customizao.

    Espero ter ajudado.

    Imagem 6..

    Imagem 7.

    Bons Cdigos...

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    28/32maro 200928

    Dicas DELPHI

    Avar Auto Run do CD ROM

    // Declare Registry na seoUSES.

    procedureSetCDAutoRun(AAutoRun:Boolean);const DoAutoRun : array[Boolean] ofInteger = (0,1);var Reg:TRegistry;begintry

    Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.KeyExists(System\CurrentControlSet\Services\Class\CDROM) then

    begin if Reg.OpenKey(System\CurrentControlSet\Services\Class\CDROM, FALSE) then

    begin Reg.

    WriteBinaryDataAutoRun,DoAutoRun[AAutoRun], 1); end;

    end; finally Reg.Free; end; ShowMessage(Esta alterao sser ativada aps a reinicializaodo PC.);end;

    Criptografar Strings

    function Criptografar( const Str1:string): String;var Mascara,Str2: String; PonM, PonS: Byte;

    begin

    Mascara := #$%$#13#12; Str2 := ; PonM := 1; for PonS:=1 to length(Str1) do

    beginAppendStr( Str2, Chr(Ord(Str1[PonS]) XorOrd(Mascara[PonM])));Inc( PonM);if PonM>Length(Mascara) thenPonM:=1;end;Result := Str2;end;

    Ver se existe Midia no Drive

    function DiskInDrive(Drive: Char):Boolean;varErrorMode: word;beginDrive: = UpCase(Drive);

    if not (Drive in [A..Z]) thenraise EConvertError.Create(Not avalid drive ID);ErrorMode := SetErrorMode(SEM_FailCriticalErrors);tryif DiskSize(Ord(Drive) - $40) = -1thenDiskInDrive := FalseelseDiskInDrive := True;finally

    SetErrorMode(ErrorMode);end;end;

    Ver Impressora Conectada

    Function ImpresConect(Porta:Word):B

    oolean;

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    29/32maro 2009 29

    ConstPortas :Byte = $02;VarRes :Byte;Begin Asmmov ah,Portas;mov dx,Porta;

    Int $17;mov Res,ah;end;Result := (Res and $80) = $80;end;

    Localizar Arquivos no Windows

    procedure TForm1.Button1Click(Sender: TObject);beginwith TDDEClientConv.Create(Self) dobeginConnectMode := ddeManual;ServiceApplication := explorer.exe;SetLink( Folders,AppProperties);OpenLink;ExecuteMacro([FindFolder(, C:\Windows)], False);CloseLink;Free;end;end

    Mostrar as fontes True Types instaladas no Windows

    unit Unit1;

    interface

    uses Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs, StdCtrls;

    type

    TForm1 = class(TForm) Label1: TLabel; ListBox1: TListBox; Button1: TButton; procedure ListBox1Click(Sender:TObject);

    procedure Button1Click(Sender:TObject); private { Private declarations } public { Public declarations } end;

    var Form1: TForm1;

    implementation

    {$R *.DFM}

    // Evento OnClick do componente ListBoxprocedure TForm1.ListBox1Click(Sender:TObject);begin

    // A linha abaixo atribui a propriedadeCaption do// componente Label o nome da fonteselecionada no// componente ListBox

    Label1.Caption := ListBox1.Items[ListBox1.ItemIndex];

    // A linha abaixo muda a fonte de letrade acordo// com a fonte selecionada nocomponente Listbox

    Label1.Font.Name := ListBox1.Items[ListBox1.ItemIndex];end;

    // Evento OnClick do componente Buttonprocedure TForm1.Button1Click(Sender:TObject);begin

    // Carrega as fontes instaladas noWindows para// o componente ListBox ListBox1.Items := Screen.Fonts;

    end;

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    30/32maro 200930

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    31/32maro 2009

  • 7/22/2019 The Club - Maro 2009 (DataSnap)

    32/32