Anda di halaman 1dari 32

setembro 2008

setembro 2008

ndice
Editorial
Parabns a todos ns, que em 14 anos historia estiveram junto com o The Club superando grandes desafios, e para aqueles mais jovens que no conheceram o Clipper, e nem criou um relatrio no ReportSmith, mas que esto encarando os novos desafios com toda empolgao da juventude.

Coluna do Editor
Embarcando no Delphi 2009
No ltimo dia 10 de setembro a empresa Embarcadero Technologies realizou na cidade de So Paulo um seminrio que fez parte do Delphi tours, uma srie de seminrios realizados pelas principais cidades de todo pais, com o objetivo de apresentar comunidade de programadores Delphi o Commodore...

Delphi
SQLite com Delphi 2007

Gravando Imagens JPEG no SQLExpress 2005 usando dbExpress Crie um simples formulrio de Login Dephi por PHP

07 11 16

04

05

.NET
Gerenciando Transaes com Trasaction Scope no Asp.Net Aprendendo C# Criando um formulrio de envio de Email em Asp.

Dicas Delphi

Dicas ASP.NET
Formatando valores numricos com mscara Executando outros programas a partir da aplicao: Realizando converso de valores AscII para Char e Char para AscII Obtendo tamanho de disco e seu espao livre Abrindo um arquivo existem atravs da aplicao
setembro 2008

20 23

Gerar sequencia randomica de um array. Pesquisa incremental em um listbox Alterar cor e fonte do menu Marcar todos os itens de um dbgrid

25

Legenda
Iniciante Intermedirio Avanado

28

27
03

Parabns a todos ns, que em 14 anos historia estiveram junto com o The Club superando grandes desafios, e para aqueles mais jovens que no conheceram o Clipper, e nem criou um relatrio no ReportSmith, mas que esto encarando os novos desafios com toda empolgao da juventude. isto mesmo, est a edio n 168 que comemora o aniversrio de 14 anos do The Club. O tempo passou e o The Club quase uma debutante, com toda a jovialidade e curiosidade de um adolescente e a experincia de um velho programador, assim que toda equipe The Club se sente para continuar encarando os novos desafios. Neste ms trago para vocs um artigo sobre a experincia de participar do seminrio de apresentao do Delphi 2009 (Delphi tour) a comunidade de programadores Delphi, aonde falo sobre as algumas novidades da ferramenta, como tambm a impresso bastante positiva que sai do evento com relao nova ferramenta, e o foco da empresa Embarcadero Technologies com relao aos seus clientes. Uma novidade na revista o artigo de Luis Alexandre e Marcos, que fala sobre controle de acesso de usurio usando Delphi for PHP, neste artigo mostram de forma bastante simples como fazer um controle muito solicitado em diversos sites, embora seja um artigo relativamente simples fazem referencia deste da criao de funes em php at conexo a base de dados MySQL. Tambm na seo Delphi Alessandro Ferreira, consultor tcnico de muitos anos no The Club, est de volta com o artigo Gravando imagens JPEG no SQLExpress 2005 usando dbexpress no Delphi 2007, e Luis Alexandre dando continuidade aos artigos sobre a utilizao do banco de dados SQLite, mostra para gente como us-lo com o Delphi, atravs dos componentes Aduscom. Na seo .Net Fabiano Belmonte explica em seu artigo como utilizar o Transaction Scope, que uma ferramenta que pode ajudar muito no controle de transaes de aplicaes, e como configur-la para seu funcionamento adequado. Mostro tambm no artigo Aprendendo C# as diferenas entre a linguagem C# e Delphi, onde fao um comparativo dos operadores e sintaxe de cada linguagem de forma simples prtica para iniciantes em C# e com alguma experincia em delphi. E isto ai pessoal, desejo mais uma boa leitura a todos. Um grande abrao.
Marcos Csar Silva - Editor Chefe marcos@theclub.com.br
04
setembro 2008

Bem-vindo

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

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

Internet

Copyright The Club Megazine 2008 Diretor Tcnico Marcos Csar Silva Diagramao e Arte Vitor M. Rodrigues Reviso Marcos Csar Silva Colunistas Alessandro Ferreira Fabiano Belmonte Fellipe Capolupo Lus Alexandre de Oliveira Marcos Csar Silva Mauro SantAnna Victory Fernandes Impresso e acabamento:
GRILL - Grfica e Editora Rua So Paulo, n 447 Cep: 18740-00 - Taquarituba-SP Tel. (14) 3762-1345
Reproduo
A utilizao, reproduo, apropriao, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criaes intelectuais em cada publicao da revista The Club Megazine so terminantemente proibidos sem autorizao escrita dos titulares dos direitos autorais.

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

Coluna do Editor

Embarcando no Delphi 2009


Delphi tour - Seminrio de lanamento do Delphi 2009
Por Marcos Csar Silva
No ltimo dia 10 de setembro a empresa Embarcadero Technologies realizou na cidade de So Paulo um seminrio que fez parte do Delphi tours, uma srie de seminrios realizados pelas principais cidades de todo pais, com o objetivo de apresentar comunidade de programadores Delphi o Commodore, codinome do projeto da nova verso do Delphi, o Delphi 2009. E o The Club esteve l para conferir as novidades e as perspectivas de futuro para o novo produto da Embarcadero. um produto com a assinatura Codegear, unidade de negocio da Borland (adquirida este ano pela Embarcadero Technologies), comecei a sentir que alguma coisa estava mudando, o trem estava voltando pros trilhos, mostrando ser um produto mais leve e estvel, o Delphi 2007, com novos recursos em sua IDE e outras j inseridas em verses anteriores, voltava a ser atrativa novamente, mas ainda percebo um pouco de resistncia Andreano Lanusse principalmente dos scios mais antigos do The Club para a migrao, tendo em vista a grande mudana no ambiente, com relao verso 7 e suas antecessoras que foram um sucesso. Agora em 2008 com o timo nas mos da Embarcadero, o barco chamado Delphi mostra que estar novamente David I no caminho certo, foi o que ns do The Club vimos no seminrio apresentado por Andreano Lanusse (CodeGear/Embarcadero Product Line Manager & Evangelist Leader Latin America) e David Intersimone (David I, Chief Evangelist, CodeGear Products). O Novo Delphi vem a para no ficar atrs de nenhuma outra ferramenta, com muitas novidades como melhorias na linguagem, com a criao de Annonymous Methods (Mtodos annimos) e completo suporte a Unicode, novssimos componentes da VCL como botes e barras de progresso semelhante ao Windows Vista, Ribbon controls (Novo layout de menus de Microsoft Office 2007), para Web Suporte a AJAX e SilverLight, e o Novo DataSnap, com novos recursos de tirar o chapu para a equipe de desenvolvedores da Embarcadero, sem falar em novos recursos inseridos na nova IDE. No entrarei em maiores detalhes sobre os novos recursos ou features do Delphi 2009, pois este no o objetivo deste artigo, mas sim de outros artigos que viro por ai. Posso dizer que sa do seminrio muitssimo entusiasmado, entusiasmo este que foi confirmado quando fiz meus primeiros testes na verso
setembro 2008

m perodo nebuloso e cheio de dvidas que teve inicio na minha percepo com o lanamento do Delphi 8, antes aclamada ferramenta de desenvolvimento, dava sinais de parecer uma Nau sem direo, nas verses seguintes sem grandes novidade que justificassem uma migrao, ou ao exemplo da verso 2006 que apresentavase pesada, e com inmeros bugs, principalmente nos recursos de desenvolvimento de aplicaes .Net , deixvamos ns delphianos cada vez mais preocupados com o futuro de nossa ferramenta de ganha po, e at nos sentindo rfos quando as primeiras notcias da venda pela Borland de seu principal produto comearam a aparecer. Com o lanamento do Delphi 2007 j sendo

05

Trial que pode ser baixado em http://cc.codegear. com/Free.aspx?id=25876, toda esta minha empolgao (nesta altura do artigo alguns devem j estar chamando de rasgao-de-seda), no se justifica somente pelas novidades apresentadas, mas principalmente pelas palavras de Andreano, que fez sentirmos que a Embarcadero est com o foco no foco dos clientes que somos todos ns desenvolvedores, e pela preocupao da empresa em lanar uma verso com o mnimo de defeitos possveis. Assim, acredito que esta ferramenta pode ser o grande cala boca que muitos de ns espervamos para aqueles que j consideravam o Delphi moribundo. Sabemos por experincia que uma migrao para uma nova verso muitas vezes trabalhosa, principalmente quando envolve a troca ou tambm a migrao de componentes de terceiros, mas sei tambm que nem sempre podemos colher novos benefcios sem regar nossa horta com um pouco de suor, desta forma convido o leitor a fazer o teste que fiz e avaliar a ferramenta tirando suas prprias concluses.

Andreano (Embarcadero), Marcos (The Club), David I (Embarcadero) e Vitor (The Club)

Marcos, Gildicley (Tecnocompany) scio do The Club a mais de 10 anos, e Vitor

06

setembro 2008

Delphi

SQLITE COM DELPHI 7


No peridico do ms passado abordei o artigo sobre o verstil SQLITE e algumas ferramentas de manipulao dessa biblioteca. Nesse ms irei apresentar a sute de componentes ADUCOM que tem como objetivo fazer a conexo Delphi SQLLite.

Download
Voc pode fazer o download da sute no site do TheClub em: http://www.theclub.com.br/revista/rev0908/ comp.rar

Instalao
A instalao relativamente simples. Descompacte o arquivo ASQLite3_2006_01_B.zip em um diretrio de sua escolha. Com o Delphi aberto, clique em File/Open abra o arquivo asqlite3D5. dpk e clique nos botes compile e install. O arquivo asqlitepkg3D5.dpk ser instalado automaticamente. Em Tools/ Enviroment Options/Library Path adicione o caminho onde descompactou o componente. No h necessidade de salvar o componente instalado.
Figura 1

Criando a aplicao com o SQLite 3


A priori, criaremos um simples arquivo de banco de dados utilizando o gerenciador de banco de dados SqliteSpy, que foi abordado na revista do ms anterior . Para criarmos um novo banco de

Figura 2
setembro 2008

07

dados clique em File/New DataBase. Crie um banco de dados chamado Clientes. Observe a figura 1. Aps isso, criaremos nossa tabela Clientes. Clique em file/New Sql. Observe a figura 2 com o comando DDL Create Table Clientes.
Figura 3

Nota do consultor
A linguagem de Definio de Dados DDL usa instrues para descrever o esquema das tabelas do banco de dados Tecle em F9 para executar a instruo. Vamos criar uma simples aplicao utilizando o Delphi 7 que utilizado pela maioria dos scios . Na unit1 do novo projeto insira o componetente ASQLite3DB que se encontra na aba Aducom SQLite3 . Observe a Figura 3. No object Inspector do componente, altere as seguintes propriedades: DataBase: DBClientes DefaultDir: C:\ DriverDll : Localize o arquivo SQLite3.dll ( Esta DLL se encontra no link http://www.sqlite.org/ download.html) Connected: true Observe as propriedades do componente na figura 4 Adicione o componente ASQLite3Table. No object Inspector do componete, altere a propriedade Connection adicione o valor da conexo ASQLite3DB1. Na propriedade TableName adicione Clientes. Altere a propriedade PrimaryAutoInc para true.

Figura 4

Observe propriedades do componente ASQLite3Table na figura 5 V na aba DataAccess e adicione os seguintes componente : DataSet Provider, ClientDataSet e um DataSource Na propriedade DataSet do componete DataSet Provider conecte com o componente ASQLite3Table1. Na propriedade ProviderName do componente ClientDataSet1 faa a conexo com o componente DataSetProvider1. Na propriedade DataSet do componente DataSource1 ligue com o componente ClientDataSet. Pronto, j podemos acessar os dados pelo ClientDataSet. Vamos adicionar os TFields do ClientDataSet . D um dulpo clique no ClientDataSet, selecione todos os TFields e arraste para o formulrio. Adicione um componente ToolBar no formulrio que se encontra na paleta Win 32. Dentro da Tollbar, adicione sete Speedbutton ( Incluir, Alterar, Excluir, Gravar, Cancelar, Sair). Altere a propriedade tag dos Speedbuttoms. Observem a tabela 1 .
Figura 5

Nota do consultor
Em PrimaryAutoInc definimos se nossa chave primria ser auto-incremento.

08

setembro 2008

Figura 6 procedure TForm1.DataSource1StateChange(Sender: TObject); begin BT_Inclui.Enabled := not (DataSource1.State [DSINSERT,DSEDIT]); BT_Alterar.Enabled := not (DataSource1.State [DSINSERT,DSEDIT]); BT_Excluir.Enabled := not (DataSource1.State [DSINSERT,DSEDIT]); BT_Grava.Enabled := DataSource1.State [DSINSERT,DSEDIT]; BT_Cancela.Enabled := DataSource1.State [DSINSERT,DSEDIT]; BT_Pesquisa.Enabled := not (DataSource1.State [DSINSERT,DSEDIT]); BT_Sair.Enabled := not (DataSource1.State [DSINSERT,DSEDIT]); end;

in in in in in in in

cdigo fonte 01

procedure Manutencao(Botao: Integer; Tabela: TClientDataSet);

cdigo fonte 02

Botes
BT_Incluir BT_Alterar BT_Excluir BT_Gravar BT_Cancelar

Tag
1 2 3 4 5

OnStateChange do Componente DataSource digite conforme cdigo fonte 1: necessrio criar um procedimento para realizar as operaes na tabela (Incluir, gravar, excluir e cancelar). O procedimento tambm ser responsvel para fechar o formulrio. Na unit do formulrio declare o procedimento conforme o cdigo fonte 2: Onde: Boto parmetro da tag do boto
setembro 2008

BT_Sair 6 Layout sugerido do formulrio de cadastro - figura 6: Continuando nossa implementao, no evento

09

Tabela - objeto TClientDataSet que ser passado como parmetro Tecle a combinao de teclas CTRL+SHIFT+C. Com isso, automaticamente a IDE do Delphi ir declarar o corpo para nossa procedure, onde faremos as implementaes conforme apresentadaono cdigo fonte 3: No evento OnClick do boto incluir digite o cdigo conforme o cdigo fonte 4. Para os demais botes vamos amarrar no mesmo evento do boto incluir. Observe que no evento do boto incluir chamamos o procedimento Manutencao passando como parmetro a tag do boto em questo e o cdsCliente. No evento OnShow do formulrio digite o cdigo conforme o cdigo fonte 5: Pronto, podemos realizar nossas operaes no SQLite utilizando o formulrio exemplo.

Concluso
Neste simples artigo, procurei demonstrar a implementao de um formulrio de cadastro com a sute de componentes da Aduscom para vincular o dados com a biblicoteca SQLite3 .

procedure TForm1.Manutencao(Botao: Integer; Tabela: TClientDataSet); begin case Botao of 1 : begin Tabela.Append; DBEdit2.SetFocus; end; 2 : begin Tabela.Edit; DBEdit2.SetFocus; end; 3 : begin if MessageDlg(Confirma a excluso?, mtConfirmation, [mbYes, mbNo], 0) = mrYes then Tabela.Delete; End; 4 : begin if MessageDlg(Confirma a gravao?, mtConfirmation, [mbYes, mbNo], 0) = mrYes then Tabela.Post; Tabela.ApplyUpdates(0); end; 5 : if MessageDlg(Cancelar a edio? , mtConfirmation, [mbYes, mbNo], 0) = mrYes then Tabela.Cancel; 6 : begin end; 7 : Close; end; end; cdigo fonte 03

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

procedure TForm1.bt_incluiClick(Sender: TObject); begin Manutencao((Sender as TSpeedButton).Tag, cdsCliente); end;

cdigo fonte 04

procedure TForm1.FormShow(Sender: TObject); begin cdsCliente.Open; end;

cdigo fonte 05

10

setembro 2008

Gravando Imagens JPEG no SQLExpress 2005 usando dbExpress


Consideraes iniciais
gravao de imagens em banco de dados sempre foi um assunto bastante solicitado nestes anos de suporte, com o passar do tempo com as mudanas de banco de dados e tecnologias de conexo, as rotinas de gravao tambm eram em muitos casos alteradas. Assim neste artigo falaremos a respeito de qual campo usar e de como gravar imagens do tipo JPEG em tabelas no SQLExpress 2005. A princpio, o que poucos usurios sabem que o campo IMAGE no SQLExpress 2005 na realidade um campo BLOB no qual podemos gravar qualquer tipo de dado em formato binrio, seja imagem, arquivos diversos, texto formatado, etc. Neste artigo irei demonstrar como utilizar este campo para armazenar imagens no formato JPEG e posteriormente estar carregando estas imagens do banco para um componente Image...

if exists (select * from dbo.sysobjects where id = object_id(N[dbo].[Imagens]) and OBJECTPROPERTY(id, NIsUserTable) = 1) drop table [dbo].[Imagens] GO CREATE TABLE [dbo].[Imagens] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [Descricao] [varchar] (50) COLLATE Latin1_ General_CI_AS NULL , [Imagem] [image] NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO

listagem 1

Definindo a tabela
Para comear, usando uma ferramenta de manuteno do banco como o Query Analyser, ou o SQL Server Management Studio Express (que pode ser encontrado no site da microsoft para Download) crie um banco de dados ou utilize um banco j existente no qual iremos criar uma tabela para utilizarmos neste projeto de exemplo. A listagem 1 apresenta o script desta tabela.

Definindo o projeto
Nosso prximo passo ser criar um novo projeto no Delphi e salv-lo. A figura 1 apresenta o layout sugerido e os componentes que sero necessrios

Figura 1 Layout sugerido.


setembro 2008

11

neste contexto. Aponte a conexo (SqlConnection) para o banco de dados que contm a tabela IMAGENS, depois ligue o SQLDataset (sdsImagens) ao SqlConnection, o DatasetProvider (dspProvider) aao sdsImagens, o Clientedataset (cdsImagens) ao DatasetProvider, e finalmente o DataSource (dsImagens) ao Clientedataset. No irei entrar em detalhes a respeito das configuraes destes componentes, pois foge do contexto deste artigo, mas veja a figura 2 as configuraes do SQLconnection e abaixo os parmetros da conexo: SchemaOverride=sa.dbo DriverName=MSSQL HostName=SERVIDOR\SQLEXPRESS DataBase=THECLUB User_Name= Password= BlobSize=-1 ErrorResourceFile= LocaleCode=0000 MSSQL TransIsolation=ReadCommited OS Authentication=True Prepare SQL=False
function LoadFromBlob(const AField: TField; const Stream: TStream): boolean; var ResultStr: string; PResultStr: PChar; begin Result := false; if (Assigned(AField)) and (Assigned(Stream)) then begin try ResultStr := AField.Value; PResultStr := PChar(ResultStr); Stream.Write(PResultStr^, Length(ResultStr)); Stream.Seek(0,0); Result := true; except end; end; end; function SaveToBlob(const Stream: TStream; const AField: TField): boolean; var FieldStr: string; PFieldStr: PChar; begin Result := false; if (Assigned(AField)) and (Assigned(Stream)) then begin try Stream.Seek(0,0); SetLength(FieldStr, Stream.Size); PFieldStr := PChar(FieldStr); Stream.Read(PFieldStr^, Stream.Size); AField.Value := FieldStr; Result := true; except end; end; end;

listagem 2 - Procedimentos para gravar e ler no campo IMAGE. no TField que for passado como parmetro e da mesma forma, ir retornar qualquer contedo armazenado via Stream. Prosseguindo, iremos implementar dois procedimentos especficos para gravar e ler JPEG, nos quais, iremos fazer uso dos procedimentos anteriormente criados, veja a listagem 3. O procedimento AddJpgToTable, como o prprio nome sugere ir receber o caminho (path) do arquivo JPEG e em qual field (campo) ele dever injetar o arquivo JPEG. Neste procedimento criamos um objeto TJpegImage que ir ler o arquivo em disco e um objeto TMemoryStream que ir receber a representao binria do arquivo carregado no

Figura 2

Observe que utilizamos um componente TImage e no TDBImage, pois iremos trabalhar com imagens JPEG e o TDBImage no d suporte a este formato.

gens no SQLServer. Como mencionei no incio deste artigo, o campo do tipo IMAGE no SQLExpress2005 possibilita armazenar qualquer formato de arquivo, desde que armazenado em formato binrio. Para isso, iremos implementar dois procedimentos: LoadFromBlob e SaveToBlob, ambos recebendo como parmetros um objeto TField que ir representar o campo no ClientDataSet e um objeto TStream que possibilitar gravar/ler em formato binrio, acompanhe a listagem 2. Vale ressaltar que os procedimentos LoadFromBlob e SaveToBlob no so exclusivos para gravar e ler imagens e sim, servem para armazenar qualquer tipo de contedo binrio que estiver

Procedimentos
Partiremos agora para a codificao dos procedimentos que iro nos auxiliar em gravar e ler ima12
setembro 2008

function AddJpgToTable(Imagem: String; Campo: TBlobField): boolean; var AJpeg: TJpegImage; MS: TMemoryStream; begin Result := false; AJpeg := TJpegImage.Create; MS := TMemoryStream.Create; try AJpeg.LoadFromFile(Imagem); AJpeg.SaveToStream(MS); Result := SaveToBlob(MS, Campo); finally AJpeg.Free; MS.Free; end; end; function LoadJpgFromTable(Campo: TBlobField; var AJpeg: TJpegImage): boolean; var MS: TMemoryStream; begin Result := false; AJpeg := TJpegImage.Create; MS := TMemoryStream.Create; try if (LoadFromBlob(Campo, MS)) then begin AJpeg.LoadFromStream(MS); Result := true; end; finally MS.Free; end; end; listagem 3 Procedimentos para gravar e ler JPEG.

TJpegImage e para finalizar, chamamos o SaveToBlob que ir atribuir do Stream para o campo. O procedimento LoadJpgFromTable recebe como parmetro o Field (campo) onde a imagem ser carregada e um objeto TJpegImage (por referncia) que ir devolver a imagem JPEG para ser apresentada no componente TImage. Dentro deste procedimento efetuamos a chamada do procedimento LoadFromBlob que ser o responsvel em acessar o campo e extrair a imagem no mesmo armazenada.

Teremos a necessidade de um objeto TJpegImage auxiliar, declare-o abaixo da sesso var de sua unit, veja a listagem 4.

var Form1: TForm1; temp: TJpegImage; implementation {$R *.dfm}

Listagem 4.

Finalizando a codificao
Iremos agora concluir a codificao do nosso projeto de exemplo efetuando a chamada aos procedimentos implementados anteriormente.

Este objeto temp poder ser instanciado na sesso initialization de nossa unit, a qual deve ser declara antes do end. Da mesma, confira na listagem 5.
setembro 2008

13

Dando continuidade, vamos efetuar a codificao do evento OnClick do btnProcurar que ser responsvel em acionar o OpenPictureDialog para permitir ao usurio procurar a imagem em disco, veja a listagem 6. Somente iremos permitir ao usurio procurar uma imagem em disco se a tabela estiver em modo de edio ou insero visto que a imagem selecionada ser adicionado ao campo imagem da tabela IMAGENS. Aps ser confirmada a seleo da imagem, fazemos a atribuio da mesma ao componente TImage para ser apresentada ao usurio e caso no seja informada nenhuma descrio no DBEdit_Descricao iremos atribuir o caminho e o nome da imagem como descrio. Neste momento, ainda no atribumos a imagem selecionada ao campo da tabela, a imagem por enquanto est apenas no componente TImage. A atribuio da imagem dar-se- no momento que o usurio resolver gravar o registro e o melhor local para isso o evento BeforePost do ClientDataset, veja a listagem 7. Se compilarmos e executarmos nosso projeto de exemplo neste momento, a imagem ser armazenada na tabela, porm, para podermos visualizar as imagens (referente cada registro armazenado na tabela ao navegar via DBNavigator) no componente TImage dever efetuar um controle de navegao para que a cada registro posicionado possamos obter a imagem do campo e apresent-la no TImage. Um timo local para isso o evento AfterScroll do componente ClientDataset (cdsImagens), pois este evento acionado imediatamente ao navegarmos pela tabela, acompanhe a listagem 8. Primeiro, verificamos o estado da tabela e somente iremos obter a imagem se a tabela estiver em modo browse e o contedo do campo imagem no for nulo. Estando estas duas condies satisfeitas, efetuamos a chamada do procedimento LoadJpgFromTable e caso o retorno seja verdadeiro atribumos a imagem ao TImage. Bem, estamos quase terminando! Lembra daquele objeto TJpegImage que declaramos e instanciamos anteriormente? Pois bem, iremos utiliz-lo agora. Na verdade, o tratamento a seguir apenas por uma questo de esttica. Quando o usurio for adicionar um novo registro clicando no boto (+) do DBNavigator, como o componente TImage no possui nenhuma ligao com a tabela ele ir continuar mostrando a imagem do registro anterior, e isso poderia confundir nossos experts
14
setembro 2008

initialization temp := TJpegImage.Create; finalization temp.Free; end.

listagem 5

procedure TForm1.btnProcurarClick(Sender: TObject); begin if dsImagens.State in [dsInsert, dsEdit] then if pDialog.Execute then begin imgEx.Picture.LoadFromFile(pDialog.FileName); if DBEdit_Desc.Text = then DBEdit_Desc.Text := pDialog.FileName; end; end; Listagem 6 OnClick do btnProcurar.

procedure TForm1.cdsImagensBeforePost(DataSet: TDataSet); begin if FileExists(pDialog.FileName) then AddJpgToTable(pDialog.FileName, cdsImagensImagem); end; Listagem 7 BeforePost do adsImagens.

procedure TForm1.cdsImagensAfterScroll(DataSet: TDataSet); var AJpeg: TJpegImage; begin if (DataSet.State = dsBrowse) and not (cdsImagensImagem.IsNull) then if LoadJpgFromTable(cdsImagensImagem, AJpeg) then imgEx.Picture.Assign(AJpeg); AJpeg.Free; end;

Listagem 8 AfterScroll do adsImagens.

usurios... Para evitar este problema, no evento AfterInsert do ClientDataSet iremos limpar a imagem existente no TImage. Voc pode estar se perguntando: Onde entra o objeto TJpegImage nisso? Respondo: Se o usurio adicionar um novo registro e salv-lo, o objeto TJpegImage no ter nenhuma finalidade, contudo, se o usurio adicionar um novo registro e cancelar, nosso TImage no ir retornar automaticamente para imagem anteriormente

apresentada, visto ele no ter nenhuma ligao com a tabela e por isso, no evento AfterInsert, antes de limpar o TImage armazenaremos a imagem atual no objeto JPegImage (temp) e caso ele venha a cancelar retornaremos a imagem ao TImage no evento AfterCancel do ClientDataSet O cdigo de ambos os eventos esto a seguir na listagem 9. Com isso finalizamos nosso projeto, compile, execute e se tudo estiver OK o resultado ser pa-

recido com o apresentado na figura 3.

Consideraes finais
Demonstrei neste artigo como salvar imagens JPEG em banco de dados SQLExpress. Como j mencionado anteriormente, estes procedimentos podem ser utilizados para ler e gravar qualquer tipo de arquivo que venha a necessitar guardar em seu banco de dados, bastando para isso, converte-lo em formato binrio. Abrao e sucesso todos,

procedure TForm1.cdsImagensAfterInsert(DataSet: TDataSet); begin temp.Assign(imgEx.Picture); imgEx.Picture := nil; end; procedure TForm1.cdsImagensAfterCancel(DataSet: TDataSet); begin imgEx.Picture.Assign(temp); end;

Listagem 9 AfterInsert e AfterCancel.

Alessandro Ferreira
Colaborador do The Club E adaptaes

Marcos Csar Silva Download


O projeto de exemplo referente este artigo est disponvel para download no endereo:

http://www.theclub.com.br/revista/ rev0908/sql2005jpg.zip.

figura 3

setembro 2008

15

Crie um simples formulrio de Login Dephi por PHP


Introduo
Nesse artigo irei criar uma pequena tela de login utilizando o banco de dados MYSQL, com o objetivo de criar um controle de acesso de usurios, restringindo pginas que no tenham permisso acesso para usurios no validados.

Criando o banco de dados para o controle de usurio


Na criao e manuteno do banco de dados utilizarei a ferramenta SQLMANAGER 2005 Lite for MySQL, onde podem fazer o download da verso freeware no seguinte endereo: http://www.sqlmanager.net/en/products/mysql/manager. Para criar o banco v em DataBase | Create Database como pode ver na figura 1.

Figura 2

Veremos como muito fcil criar um banco utilizando o Wizard da ferramenta. No campo DataBase Name apenas informe o nome do nosso banco de dados (Figura2), no caso ControleAcesso. Na figura 3 podemos verificar a configurao do HostName, UserName e Password. Ressalto que a senha definida no momento da instalao do MySQL. Clique em Next e Finish para finalizar a criao do banco de dados. Agora vamos criar a tabela de Usurios. Para isso clique com o boto direito do mouse em Tables, e selecione NewTable, ser aberto a janela para informar a estrutura da tabela, assim em Table Properties preencha a propriedade Table Name com
setembro 2008

USUARIOS, clique agora na aba Field, aonde poder adicionar campo a campo, aonde pode observar toda estrutura da tabela na figura 4. Uma alternativa mais simples usar a opo Show SQL Editor (F12) da Ferramenta, e executar (F9) o Script de criao da tabela abaixo:

CREATE TABLE USUARIOS ( ID_USUARIO int(11) NOT NULL, EMAIL varchar(200) default NULL, SENHA varchar(20)

Figura 1 16

default NULL, NOME varchar(50) default NULL, NIVEL int(11) default NULL, PRIMARY KEY (ID_ USUARIO) )

Como o objetivo no criar neste artigo um cadastro de usurios, iremos inserir o usurio atravs de instruo SQL, veja a instruo logo abaixo, onde podemos execut-la da mesma forma que foi mencionado no caso da tabela.

INSERT INTO USUARIOS (ID_USUARIO, EMAIL, SENHA, NOME, NIVEL) VALUES (1, alexandre@ theclub.com. br,123.456, Luis Alexandre, 1)

Figura 3

Conectando o Dephi PHP ao MySQL


Abra o Delphi for PHP e acesse o Data Explorer. Clique com o boto direito em MySQL e selecione a opo Register DataBase como pode observar a figura 5, assim ser exibida a janela Register Database, em ConnectionString digite Conexao, e em host digite localhost. Para autenticao devemos informar o usurio e senha do MySQL. No campo DataBase digite ControleAcesso que foi o nome que utilizamos na criao do banco, no passo anterior. Na figura 6 verificamos os campos preenchidos de forma correta.

Figura 4

Iniciando a Aplicao
No Delphi For PHP acesse o Menu File | New | Application . Ser criado assim um arquivo unit. php que iremos salvar com o nome de Acesso. php, em seguida salvaremos o projeto como o nome de ControleAcesso.phprj. Agora no objeto inspector altere sua propriedade Name da pagina Acesso.php para Acesso e Caption para Login de Usurio. recomendado criar nossa aplicao no diretrio C:\. Iremos criaar o layout da pgina Acesso.php, para isto adione 2 componentes Edits, 3 labels e 1 Button, e altere suas propriedade da forma que
setembro 2008

Figura 5

Figura 6

17

se seque, veja que mostros apenas a estrutura das propriedades alteradas no arquivo Acesso. xml.php, isto para facilitar o entendimento, mas estas propriedades devem ser alteradas no object Inpector para cada componente: Ver cdigo fonte 1. Criaremos agora os componentes de conexo como o banco de dados, para isto bastar ir no DataExplorer e arrastar a CONEXAO para a pagina, assim o componente dbControleAcesso1 sera criados automaticamente e devidamente configurado, adicione tambm o componente Query da paleta Data Access, alterre a seu nome para sqlUsuarios e ligue a propriedade Database do componente ao dbControleAcesso1. D para notar as semelhanas com o Delphi for win32. O layout final deve ser parecido com a figura 7. Finalmente iremos adicionar o evento Click no btnOk, veja a instruo com o codigo comentado: Ver cdigo fonte 2 Iremos criar mais uma form e cham-lo de Principal.php, para que aps o logon o seja feita o direcionamento para esta pgina (Veja figura 8). Nesta pagina iremos adionar o evento OnBeforeShow aonde iremos chamar a funo ValidarAcesso, e exbir no label o nome do usuario que colocamos na sesso veja abaixo o evento: Ver cdigo fonte 3. Para finalizar iremos criar uma Unit para a funo controle que valida se o usurio j est logado no site, onde caso contrrio, chama a pagina de controle de acesso, para isto v em File | New | Unit e a renomeie para Controle.php a unit deve ficar da seguinte forma:

<object class=Label name=Label3 > <property name=Alignment>agCenter</property> <property name=Caption>Controle de Acesso</ property> </object> <object class=Edit name=edEmail ></object> <object class=Edit name=edSenha > <property name=IsPassword>1</property> </object> <object class=Label name=Label1 > <property name=Caption>Email</property> <property name=Font> <property name=Size>12px</property> </property> </object> <object class=Label name=Label2 > <property name=Caption>Senha</property> <property name=Font> <property name=Size>12px</property> </property> </object> <object class=Label name=lbMensagem > <property name=Font> <property name=Color>#FF0000</property> <property name=Size>12px</property> </property> </object> <object class=Button name=btnOk > <property name=Caption>Ok</property> </object>

Listagem 1

<?php function ValidarAcesso() { if (!($_ SESSION[usuario])) { redirect(Acesso. php); } } ?>

Figura 7

18

setembro 2008

Lembrando que para que a funo seja visivel em outras pginas ela deve ser declara em cada pagina que ir ser feita a validao, para isto inclua o Controle.php atravs de Alt+F11 em cada uma delas antes de usar a funo ValidarAcesso. Agora basta executar o projeto (ter a tela de login da figura 9), digite usuario e senha, e acesse a pgina princiapal. Facil, no ??!!!

Concluso
Assim temos de forma bastante simples um controle de acesso ao nosso site, mesmo assim vimos conexo a base de dados, uso de funes e variveis de Sesso. Agora na prxima etapa poderemos implementar novos recurso como niveis de permisses de acesso, mas isto fica para um proximo artigo. Aos amigos um forte abraos e at a proxima.

O download do exemplo pode ser baixado em: http://www.theclub.com.br/revista/rev0908/ ControleAcessoPHP.zip

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

function btnOkClick($sender, $params) { //declarao das variveis $usuario = addslashes($this>edEmail->text); $password = addslashes($this>edSenha->text); $this->lbMensagem->caption = ; //atribuio da instruo SQL para o componente $this->sqlUsuarios->setSQL(Select * from usuarios where EMAIL = .$usuario. and SENHA = .$password. ); //Abre a consulta $this->sqlUsuarios->Open(); //verifica se algum registro foi retornado if ($this->sqlUsuarios->RecordCount > 0) { //Adiciona usuario na sesso $_SESSION[usuario] = $this>sqlUsuarios->NOME; //Redireciona a pagina para a pgina principal do site redirect(Principal.php); } else { $this->lbMensagem->caption = Usurio ou Senha invlida!; } $this->sqlUsuarios->Close(); }

Listagem 2

function PrincipalBeforeShow($sender, $params) { ValidarAcesso(); $this->lbUsuario->Caption = $_ SESSION[usuario]; }

Sobre o autor
Marcos Csar Silva, Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Tcnico do The Club, Bacharel em Cincia da Computao, MBA em Gesto Empresarial, Certificaes MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)
Figura 8
setembro 2008

Listagem 3

19

Introduo
Neste artigo vou explicar como utilizar o Transaction Scope, que uma ferramenta que pode ajudar muito no controle de transaes de sua aplicao. Tambm vou mostrar a configurao que dever ser feita nos servidores para que ele possa funcionar adequadamente, pois muitas pessoas se esquecem deste passo e acabam tendo inmeros problemas na implementao da funcionalidade em produo ou mesmo no ambiente de teste e desenvolvimento.

Vamos aos exemplos: Adicione a referncia no projeto ao System.Transaction.

O TransactionScope
.NET Framework 2.0 inclui o namespace System.Transactions que d um grande suporte a transaes distribudas gerenciadas pelo Transaction Manager, incluindo Banco de Dados e Servios de Mensagens(message queues). O namespace System.Transactions define a classe TransactionScope, que cria e gerencia transaes distribudas. Devido a sua facilidade de utilizao e eficincia, recomendado que voc utilize a classe de TransactionScope para facilitar o controle de transaes em sua aplicao, sem que seja necessrio (voc precise) interagir com a operao propriamente dita. O TransactionScope pode selecionar e gerenciar o ambiente de Transaes automaticamente. O System.Transactions fornece uma estrutura de transaes totalmente integrada ao .NET Framework, mas no se limitando ao ADO.NET. Utilizando o TransactionScope O TransactionScope iniciado quando se cria um novo objeto TransactionScope. altamente recomendado que a declarao do scope seja feito dentro da diretiva using, pois ela garante que o objeto dure somente o tempo necessrio para sua utilizao.
20
setembro 2008

Inclua a referencia na Classe:

Incluindo o TransactionScope no Bloco de Codigo: Completando a transao:


Para commitar a transao inserimos uma instruo que ser a ultima

linha do using. Obs: Caso ocorra algum problema na execuo do bloco de cdigo (dentro do using ) automaticamente a transao abortada e o Transaction Maneger executa o Roll Back das alteraes. RollBack: O RollBack executado automaticamente quando ocorrer qualquer exceo no bloco que est sendo executado dentro da transao. Exemplo de utilizao: No cenrio abaixo, temos uma transao onde gravamos informaes coletadas separadamente (endereo, dados pessoais, etc). Com o Transaction Scope temos a liberdade de gravar as informaes separadamente. Suponhamos que estamos gravan-do o cliente e aps gravar o Endereo e o Telefone do Cliente da um problema na gravao dos Dados pessoais do mesmo sendo assim o transactionScope faz o Roll Back de tudo! Voltando o objeto ao seu

estado original. Caso ocorra algum erro durante a gravao de algum desses mtodos o TrasactionScope faz o RollBack de tudo, como dito anteriormente. No havendo nenhum problema a transao completada normalmente.

A configurao do ambiente
Para que o transactionScope funcione no servidor precisamos fazer algumas configuraes, mais somente se o servidor for XP sp2 pra cima! Em Win2000 no precisamos mexer em nada!

Menu Iniciar Configuraes Painel de Controle Ferramentas administrativas.


Abra o Servio de Componentes (como na figura abaixo):

Clique com o boto direito do Mouse em Meu Computador(Como na figura Abaixo) e selecione a opo Propriedades.

setembro 2008

21

Na janela Clique na aba MSDTC e depois em Configuraes de Segurana.

Lembrando que essa configurao s deve ser feita em ambientes com sistema operacional Win XP ou Win Server2003. E a mesma deve ser feita tanto no servidor de WEB quanto no de Banco de Dados. Espero que este artigo contribua com o seu crescimento. Bons Cdigos...

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 financeiras (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 significativas no resultados e na qualidade do time de Desenvolvimento de muitas empresas por onde passou como (Saraiva.Com) e ferramentas como TFS (Team Foundation Server). Foi palestrante em eventos como Codificando. NET 2008 e outros eventos sobre Tecnologia .NET. Instrutor da e-TNIAX Group especialista em C#, ASP.NET e Silverlight. www.etniax.com.br

Habilite as opes:
- Acesso ao DTC de Rede. - Permitir Clientes Remotos - Permitir Administrao Remota - Permitir Entrada - Permitir Sada - Nenhuma Autenticao Necessria - Permitir Transaes do Protocolo TIP - Habilitar Transaes XA (como a figura abaixo)

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

Anuncie conosco

o: Solicite um orament

tro Skype: theclub_cadas .com.br E-mail: cadastro@theclub e: (14) 3732-1529 Fon

22

setembro 2008

o iniciar em qualquer linguagem de programao para que se consiga fazer uma aplicao por mais simples que seja, necessrios conhecer pelo menos algumas instrues e operadores bsicos da linguagem. Assim a forma mais rpida e prtica que encontrei para repassar para outros programadores a sintaxe da linguagem C# foi compar-la com uma linguagem j conhecida. Por motivos bvios escolhi a linguagem de programao Delphi para este procedimento. Assim veremos a seguir uma seqncia comparativa entre as duas linguagens, aonde o nvel de complexidade ir aumentado gradativamente ao longo deste artigo.

A
1.

2.

Instrues condicionais IFs, then e else

Exemplo em Delphi

Operadores

Veremos abaixo os operadores relacionais, lgicos e de atribuio bsicos das linguagens. 1.1. Operadores Relacionais Delphi Operao Igualdade Diferena Maior Maior ou Igual Menor Menor ou Igual 1.2. Operadores Lgicos Delphi Operao Negao Conjuno (Ou) Operador not and ! && || C# Operador Operador = <> > >= < <= == != > >= < <= C# Operador

procedure TForm1.Button1Click(Sender: TObject); var X:Integer; begin X := StrToInt(Edit1.Text); if X >= 10 then Showmessage(A varivel X maior ou igual a 10) else Showmessage(A varivel X menor 10); end;

Exemplo em C#

private void button1_Click(object sender, EventArgs e) { int X = Convert.ToInt32(textBox1. Text); if (X >= 10) MessageBox.Show(A varivel X maior ou igual a 10); else MessageBox.Show(A varivel X menor 10); }

Disjuno (E) or 1.2. Operadores de atribuio Delphi Operao Atribuiao Atribuio Adicional Operador := X= X+Y

C# Operador = += (X += Y )

Neste pequeno exemplo acima alm do uso da instruo condicional IF, operadores relacionais e de atribuio, vemos algumas outroas diferena entre as linguagens, observe: Em C# a declarao da variveis no tem uma seo expecifica como no delphi (var); Em C# para converter a string em interio usamos o mtodo ToInt32 da classe Convert, j no delphi apenas usamos a funo StrToInt;
setembro 2008

23

Em C# para exibir a mensagem usamos o mtodo Show da classe MessageBox, j no delphi apenas usamos a funo Messagebox; Em C# o a declarao da constante string est entre aspas, no delphi o mesmo feito entre apstrofres

4.

Laos (loops) usando while

Exemplo em Delphi

3.

Instruo condicional Case e Switch

Exemplo em Delphi

procedure TForm1.Button1Click(Sender: TObject); begin case RadioGroup1.ItemIndex of 0: Caption := Vermelho; 1: Caption := Amarelho; 2: Caption := Verde; else Caption := Azul; end; end;

procedure TForm1.Button2Click(Sender: TObject); var I:Integer; begin I := 1; while I <= 10 do begin Memo1.Lines.Add(Linha + IntToStr(I)); Inc(I) end; end;

Exemplo em C#

Exemplo em C#

private void button1_Click(object sender, EventArgs e) { switch (listBox1. SelectedIndex) { case 0: Text = Vermelho; break; case 1: Text = Vermelho; break; case 2: Text = Verde; break; default: Text = Azul; break; } }

private void button2_Click(object sender, EventArgs e) { int I = 1; while (I <= 10) { textBox1. AppendText(Linha + I.ToString()+ \r\n); ++I; } }

Neste exemplo percebemos bastante semelhana entre o while das linguagens, mas veja as seguintes diferenas dos exemplos: No Delphi no Memo uso Lines.Add j em C# uso o componente Textbox com o mtodo AppendText No Delphi usamos a funo Inc para incrementar a varivel I, j no C# usamos o operador matemtico ++ antes da varivel; Espero que este pequeno artigo sirva de referencia os programadores em delphi mas ainda iniciantes em C#, para se familiarizar com a nova linguagem. Ficamos por aqui hoje, espero voltar com mais artigos para iniciantes em C# em breve. At a prxima.

Neste exemplo comparamos as diferenas entre case no delphi e o switch, veja as seguintes diferenas: No delphi no existe a necessidade do comando Break aou contrrio do C#; No Delphi o valor padro que no satisfaa nenhuma condio fica relacionado ao else quanto que em C# temos a instruo Default;
24
setembro 2008

Sobre o autor
Marcos Csar Silva, Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Tcnico do The Club, Bacharel em Cincia da Computao, MBA em Gesto Empresarial, Certificaes MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

Criando um formulrio de envio de Email em Asp.Net


este artigo iremos criar um formulrio de envio de email muito usado em sites, com os mais diversos propsitos, deste de solicitao de pedidos de produtos ate envio de currculos, para isto no Visual Studio vamos em File | New Web Site, selecione a opo ASP.NET WebSite, e informe o caminho com o diretrio de criao do projeto(Imagem 1). Na pagina Default.aspx iremos criar o layout do envio de emails, para isto adicionei uma tabela com 5 linhas e 2 colunas, onde inclui um Textbox para digitao do email destinatrio, um para o assunto e outro para a mensagem, e uma boto Enviar, veja abaixo na imagem2 o resultado: Criaremos agora o arquivo de configurao que ter todas as informaes de autenticao para o envio do email, para isto em Solution Explorer, clique com o boto direito em no projeto e selecione a opo Add New Item, em Templates selecione a opo Web Configuration File (Web.config) (Figura 3), neste arquivo iremos acrescentar logo aps a seo </system.web> a seguinte seo com as configuraes de envio de email: cer Imagem 3

Imagem 1

<system.net> <mailSettings> <smtp from=marcos@theclub. com.br> <network host=smtp.theclub.com.br password=XXX.XXX userName=marcos@ theclub.com.br /> </smtp> </mailSettings> </system.net>

Imagem 2

Para criar a funo de envio de email adicione os seguintes namespaces:

using System.Net; using System.Net.Mail; using System.Net.Configuration;

Agora veja abaixo o codigo comentado, com a funo EnviaEmail e o evento de Button1_Click aonde executo a funo de envio de email:

Imagem 3
setembro 2008

25

public partial class _Default : System. Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // } public void EnviaEmail(Page Pagina, string Email, string Assunto, string Texto) { try { //Instruo para pegar as propriedade de envio de email do Web. Config

{ Pagina.Response.Write(@<scr ipt>javascript:alert(Um erro ocorreu no envio da email. Tente novamente. \r + e.Message + )</script>); } } protected void Button1_Click(object sender, EventArgs e) { EnviaEmail(this, tbPara.Text, tbAssunto.Text, tbMensagem.Text); } }

Concluso
Esta uma forma prtica de envio de e-mail, acredito que a funo seja til em diverses caso, podendo estar presentes, naqueles arquivos de funes bsicas que acostumamos criar e compartilhar entre nossas aplicaes.

Configuration config = WebConfigurationManager.OpenWebConfi guration(HttpContext.Current.Request.ApplicationPath);

MailSettingsSectionGroup settings = new MailSettingsSectionGroup(); settings = (MailSettingsSectionGroup)config. GetSectionGroup(system.net/ mailSettings); string smtp = settings.Smtp. Network.Host; string from = settings.Smtp. From; MailMessage Message = new MailMessage(from, Email); Message.Subject = Assunto; Message.BodyEncoding = System.Text.Encoding.UTF8; Message.IsBodyHtml = true; Message.Body = Texto; SmtpClient SmtpMail = new SmtpClient(smtp); //Criao de credencial para envio de e-mail com autenticao SmtpMail.Credentials = new NetworkCredential(settings.Smtp. Network.UserName, settings.Smtp.Network. Password); SmtpMail.Send(Message); } catch (Exception e)

Sobre o autor
Marcos Csar Silva, Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Tcnico do The Club, Bacharel em Cincia da Computao, MBA em Gesto Empresarial, Certificaes MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

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

Anuncie conosco

o: Solicite um orament

tro Skype: theclub_cadas .com.br E-mail: cadastro@theclub Fone: (14) 3732-1529

26

setembro 2008

setembro 2008

27

Dicas DELPHI
GERAR SEQUENCIA RANDOMICA DE UM ARRAY
Const { Tabela AscII Numeros 0-9 correposnde ao intervalo da tabela de 48 - 57 Caracteres maisculos A-Z correposnde ao intervalo da tabela de 65 - 90 Caracteres minsculos a-z correposnde ao intervalo da tabela de 97 - 122} TabelaAscII: Array[1..36] of Integer = (48,49,50,51,52,53,54,55,56,57, 65,66,67,68,69,70,71,72,73,74,75,76 ,77,78,79,80,81,82,83,84,85,86,87,88,89 ,90); function RetonaSequenciaRandomica(Taman ho:Integer):String; var Form1: TForm1; implementation uses Math; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin caption := RetonaSequenciaRandomica(10); end; function RetonaSequenciaRandomica(Tamanh o:Integer):String; var Count:Integer; begin for Count := 1 to Tamanho do Result := Result + Chr(RandomFrom(TabelaAscII)); end; S: Array[0 ..255] of char; begin StrPCopy(S, Edit1.Text); with ListBox1 do ItemIndex := Perform(LB_ SELECTSTRING, 0, LongInt(@S)); if (ListBox1.ItemIndex < 0) or (ListBox1.Items[ListBox1.ItemIndex] <> Edit1.Text) then ListBox1.ItemIndex := -1; end;

ALTERAR COR E FONTE DO MENU


procedure TForm1.N1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean); begin if Selected then ACanvas.Brush.Color := clHighlight else ACanvas.Brush.Color := clMenu; ACanvas.FillRect(ARect); ACanvas.Font.Color := clRed; ACanvas.Font.Style := [fsBold]; InflateRect(ARect, -5, -5); ACanvas.TextOut(ARect.Left+2, ARect. Top,Consultas); end; procedure TForm1.N1MeasureItem(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer); begin Width := 100; Height := 25; end; // Alterar a propriedade OwnerDraw para True

PESQUISA INCREMENTAL EM UM LISTBOX


procedure TForm1.Edit1Change(Sender: TObject); var 28
setembro 2008

VERIFICA E ALTERA FORMATO DATA NO WINDOWS


procedure TForm1.Button1Click(Sender: TObject); var

FormatoData: PChar; FormatoDataBuff: array[0..10] of Char; begin FormatoData := Pchar(Edit1.text); SetLocaleInfo(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, FormatoData); GetLocaleInfo( LOCALE_USER_DEFAULT, LOCALE_SSHORTDATE, FormatoDataBuff, 10); Caption:=FormatoDataBuff; ShortdateFormat := FormatoDataBuff; label1.caption := DateToStr(date); end;

with DBGrid1.DataSource.DataSet do begin First; for vlLinha := 0 to RecordCount - 1 do begin DBGrid1.SelectedRows. CurrentRowSelected := True; Next; end; end; DBGrid1.SelectedRows.Refresh; end;

MARCAR TODOS OS ITENS DE UM DBGRID

procedure TForm1.FormActivate(Sender: TObject); var vlLinha: Integer; begin

setembro 2008

29

Dicas ASP.NET
Formatando valores numricos com mscara
private void button1_Click(object sender, System.EventArgs e) { double Valor = 1500; label1.Text = Valor. ToString(#,##0.00); } { int i = ((int)A); textBox1.Text = i.ToString(); }

Obtendo tamanho de disco e seu espao livre


using System.IO; private void button3_Click(object sender, EventArgs e) { DriveInfo di = new DriveInfo(C); textBox1.Text = Tamanho Total da Unidade C: igual a + Convert.ToString(di. TotalSize/1000000000) + Gb ; textBox2.Text = Espao livre da Unidade C: igual a + Convert. ToString(di.TotalFreeSpace / 1000000000) + Gb ; }

Executando outros programas a partir da aplicao:


Declarar o namespace:

using System.Diagnostics; private void button1_Click(object sender, EventArgs e) { //Chamando a calculadora do windows Process.Start(Calc.exe, string. Empty); //Chamando o Notepad do windows Process.Start(Notepad.exe, string. Empty); }

Abrindo um arquivo existem atravs da aplicao

Realizando converso de valores AscII para Char e Char para AscII

private void button1_Click(object sender, EventArgs e) { char s = ((char)65); textBox1.Text = s.ToString(); } // Converte A para 65 private void button2_Click(object sender, EventArgs e) 30
setembro 2008

private void button3_Click(object sender, EventArgs e) { System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo.FileName = Notepad; proc.StartInfo.Arguments = C:\\ Theclub.txt; proc.Start(); proc.WaitForExit(); }

observer que neste exemplo usamos a instruo WaitForExit que tem o objetivo de deixar a aplicao em segundo plano, no podendo ser acessada ate que o notepad ou outro aplicao chamada seja encerrada

setembro 2008

setembro 2008