Professional Documents
Culture Documents
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
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)
06
setembro 2008
Delphi
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
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
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
cdigo fonte 04
cdigo fonte 05
10
setembro 2008
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
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.
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
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;
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-
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;
Alessandro Ferreira
Colaborador do The Club E adaptaes
http://www.theclub.com.br/revista/ rev0908/sql2005jpg.zip.
figura 3
setembro 2008
15
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
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
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.
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
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.
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
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!
Clique com o boto direito do Mouse em Meu Computador(Como na figura Abaixo) e selecione a opo Propriedades.
setembro 2008
21
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)
Anuncie conosco
o: Solicite um orament
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.
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.
Exemplo em Delphi
3.
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)
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
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.
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)
Anuncie conosco
o: Solicite um orament
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;
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;
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(); }
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); }
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