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
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
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,
New
XElement(cliente,
New XAttribute(codigo,
2),
New XElement(nome,
Antonio),
New XElement(email,
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
Top Related