the club - megazine · aprendendo c# gerenciando transações com trasaction scope no asp.net 23...

32
setembro 2008

Upload: dodiep

Post on 09-Nov-2018

227 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008

Page 2: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008

Page 3: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 03

LegendaIniciante

Intermediário

Avançado

Índice

Editorial

04 05

Coluna do Editor

No último dia 10 de setembro a empresa Embarcadero Technologies realizou na cidade de São Paulo um seminário que fez parte do Delphi tours, uma série de seminários reali-zados pelas principais cidades de todo pais, com o objetivo de apresentar à comunidade de programadores Delphi o “Commodore”...

Embarcando no Delphi 2009

Delphi

Crie um simples for-mulário de Login Dephi por PHP

SQLite com Delphi 2007

16

.NET

Aprendendo C#

Gerenciando Transações com Trasaction Scope no Asp.Net

23

Dicas Delphi

DicasASP.NET

Formatando valores numéricos com máscara

Executando outros programas a partir da aplicação:

Realizando conversão de valores AscII para Char e Char para AscII

Obtendo tamanho de disco e seu espaço livre

Abrindo um arquivo existem através da apli-cação

27

Gerar sequencia ran-domica de um array.

Pesquisa incremental em um listbox

Alterar cor e fonte do menu

Marcar todos os itens de um dbgrid

28

07Gravando Imagens

JPEG no SQLExpress 2005 usando dbExpress

Parabéns a todos nós, que em 14 anos historia esti-veram junto com o The Club superando grandes desafios, e para aqueles mais jovens que não conheceram o Clipper, e nem criou um relatório no ReportSmith, mas que estão encarando os no-vos desafios com toda empolgação da juventude.

11

20

Criando um for-mulário de envio de Email em Asp. 25

Page 4: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200804

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações: (14) 3732-1529 Suporte: (14) 3733-1588

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected] Informações: [email protected] Cadastro: theclub_cadastro

Skype Suporte: theclub_linha1 theclub_linha2

Copyright The Club Megazine 2008

Diretor TécnicoMarcos César Silva

Diagramação e ArteVitor M. Rodrigues

RevisãoMarcos César Silva

ColunistasAlessandro FerreiraFabiano BelmonteFellipe Capolupo

Luís Alexandre de OliveiraMarcos César SilvaMauro Sant´AnnaVictory Fernandes

Impressão e acabamento:GRILL - Gráfica e EditoraRua São Paulo, nº 447

Cep: 18740-00 - Taquarituba-SPTel. (14) 3762-1345

ReproduçãoA utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club Megazine” são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais.

Bem-vindo

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Marcos César Silva - Editor [email protected]

Parabéns a todos nós, que em 14 anos historia estiveram junto com o The Club superando grandes desafios, e para aqueles mais jovens que não conheceram o Clipper, e nem criou um relatório no ReportSmith, mas que estão encarando os novos desafios com toda empolgação da juventude. É isto mesmo, está é a edição nº 168 que comemora o aniversário 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 experiência de um velho programador, é assim que toda equipe The Club se sente para continuar encarando os novos desafios.

Neste mês trago para vocês um artigo sobre a experiência de participar do seminário de apresentação do Delphi 2009 (Delphi tour) a comuni-dade de programadores Delphi, aonde falo sobre as algumas novidades da ferramenta, como também a impressão bastante positiva que sai do evento com relação à nova ferramenta, e o foco da empresa Embarcadero Technologies com relação aos seus clientes. Uma novidade na revista é o artigo de Luis Alexandre e Marcos, que fala sobre controle de acesso de usuário 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 criação de funções em php até conexão a base de dados MySQL.

Também na seção Delphi Alessandro Ferreira, consultor técnico 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 utilização do banco de dados SQLite, mostra para gente como usá-lo com o Delphi, através dos componentes Aduscom.

Na seção .Net Fabiano Belmonte explica em seu artigo como utilizar o Transaction Scope, que é uma ferramenta que pode ajudar muito no controle de transações de aplicações, e como configurá-la para seu funcionamento adequado. Mostro também no artigo Aprendendo C# as diferenças entre a linguagem C# e Delphi, onde faço um comparativo dos operadores e sintaxe de cada linguagem de forma simples é prática para iniciantes em C# e com alguma experiência em delphi.

E isto ai pessoal, desejo mais uma boa leitura a todos.

Um grande abraço.

Page 5: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 05

Coluna do Editor

No último dia 10 de setembro a empresa Embarcadero Technologies realizou na cidade de São Paulo um seminário que fez parte do Delphi tours, uma série de seminários realiza-dos pelas principais cidades de todo pais, com o objetivo de apresentar à comunidade de programadores Delphi o “Commodore”, codi-nome do projeto da nova versão do Delphi, o Delphi 2009. E o The Club esteve lá para con-ferir as novidades e as perspectivas de futuro para o novo produto da Embarcadero.

Um período nebuloso e cheio de dúvidas que teve inicio na minha percepção com o lançamento do Delphi 8, antes aclamada ferra-

menta de desenvolvimento, dava sinais de parecer uma “Nau sem direção”, nas versões seguintes sem grandes novidade que justificassem uma migração, ou ao exemplo da versão 2006 que apresentava-se pesada, e com inúmeros bugs, principalmente nos recursos de desenvolvimento de aplicações .Net , deixávamos nós “delphianos” cada vez mais preocupados com o futuro de nossa ferramenta de “ganha pão”, e até nos sentindo órfãos quando as primeiras notícias da venda pela Borland de seu principal produto começaram a aparecer.

Com o lançamento do Delphi 2007 já sendo

Embarcando no Delphi 2009

Delphi tour - Seminário de lançamento do Delphi 2009

Por Marcos César Silva

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 estável, o Delphi 2007, com novos recursos em sua IDE e outras já inseridas em versões ante-riores, voltava a ser atrativa novamente, mas ainda per-cebo um pouco de resistência principalmente dos sócios mais antigos do The Club para a migração, tendo em vista a grande mudança no ambiente, com relação à

versão 7 e suas antecessoras que foram um sucesso.

Agora em 2008 com o ti-mão nas mãos da Embarcade-ro, o barco cha-mado Delphi mostra que es-tar novamente

no caminho certo, foi o que nós do The Club vimos no seminário apresentado por Andreano Lanusse

(CodeGear/Embarcadero Pro-duct Line Manager & Evan-gelist Leader Latin America) e David Intersimone (“David I”, Chief Evangelist, CodeGear Products). O Novo Delphi vem aí para não ficar atrás de nenhuma outra ferramenta, com muitas novidades como melhorias na linguagem, com a criação de Annonymous Methods (Métodos anônimos) e completo suporte a Unicode,

novíssimos componentes da VCL como botões 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 chapéu” para a equipe de desenvolvedo-res da Embarcadero, sem falar em novos recursos inseridos na nova IDE. Não entrarei em maiores detalhes sobre os novos recursos ou features do Delphi 2009, pois este não é o objetivo deste artigo, mas sim de outros artigos que virão por ai.

Posso dizer que saí do seminário muitíssimo entusiasmado, entusiasmo este que foi confirma-do quando fiz meus primeiros testes na versão

Andreano Lanusse

David I

Page 6: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200806

Trial que pode ser baixado em http://cc.codegear.com/Free.aspx?id=25876, toda esta minha em-polgação (nesta altura do artigo alguns devem já estar chamando de rasgação-de-seda), não 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 nós desenvolvedores, e pela preocupação da empresa em lançar uma versão com o mínimo de defeitos possíveis. Assim, acredito que esta ferramenta pode ser o grande “cala boca” que muitos de nós esperávamos para aqueles que já consideravam o Delphi “moribundo”.

Sabemos por experiência que uma migração para uma nova versão muitas vezes é trabalhosa, principalmente quando envolve a troca ou também a migração de componentes de terceiros, mas sei também que nem sempre podemos colher novos benefícios 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 próprias conclusões.

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

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

Page 7: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 07

Delphi

No periódico do mês passado abordei o artigo sobre o versátil SQLITE e algumas ferra-mentas de manipulação dessa biblioteca.

Nesse mês irei apresentar a suíte de com-ponentes ADUCOM que tem como objetivo fazer a conexão Delphi – SQLLite.

Download

Você pode fazer o download da suíte no site do TheClub em:

http://www.theclub.com.br/revista/rev0908/comp.rar

Instalação

A instalação é relativamente simples. Des-compacte o arquivo ASQLite3_2006_01_B.zip em um diretório de sua escolha. Com o Delphi aberto, clique em File/Open abra o arquivo asqlite3D5.dpk e clique nos botões compile e install. O arquivo asqlitepkg3D5.dpk será “instalado” automatica-mente.

Em Tools/ Enviroment Options/Library Path adicione o caminho onde descompactou o com-ponente.

Não há necessidade de salvar o componente instalado.

Criando a aplicação 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 mês anterior . Para criarmos um novo banco de

SQLITE COM DELPHI 7

Figura 1

Figura 2

Page 8: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200808

dados clique em File/New DataBase. Crie um banco de dados chamado Clientes. Observe a figura 1.

Após isso, criaremos nossa tabela Clientes. Clique em file/New Sql. Observe a figura 2 com o comando DDL Create Table Clientes.

Nota do consultor

A linguagem de Definição de Dados DDL usa instruções para descrever o esquema das tabelas do banco de dados

Tecle em F9 para executar a instrução.Vamos criar uma simples aplicação utilizando o

Delphi 7 que é utilizado pela maioria dos sócios . Na unit1 do novo projeto insira o componeten-

te 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 proprie-dade Connection adicione o valor da conexão ASQLite3DB1. Na propriedade TableName adicione Clientes. Altere a propriedade PrimaryAutoInc para true.

Nota do consultor

Em PrimaryAutoInc definimos se nossa chave primária será auto-incremento.

Observe propriedades do componente ASQLi-te3Table 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 faça a conexão com o componente DataSetProvider1.

Na propriedade DataSet do componente Data-Source1 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 formulário.

Adicione um componente ToolBar no formulá-rio 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 3

Figura 4

Figura 5

Page 9: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 09

código fonte 01

Botões TagBT_Incluir 1

BT_Alterar 2

BT_Excluir 3

BT_Gravar 4

BT_Cancelar 5

BT_Sair 6Layout sugerido do formulário de cadastro

- figura 6:

Continuando nossa implementação, no evento

OnStateChange do Componente DataSource digite conforme código fonte 1:

É necessário criar um procedimento para realizar as operações na tabela (Incluir, gravar, excluir e cancelar). O procedimento também será responsável para fechar o formulário.

Na unit do formulário declare o procedimento conforme o código fonte 2:

Onde:

Botão – parâmetro da tag do botão

Figura 6

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

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

código fonte 02

Page 10: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200810

código fonte 03

código fonte 04

código fonte 05

Tabela - objeto TClientDataSet que será pas-sado como parâmetro

Tecle a combinação de teclas “CTRL+SHIFT+C”. Com isso, automaticamente a IDE do Delphi irá declarar o “corpo” para nossa procedure, onde faremos as implementações conforme apresenta-daono código fonte 3:

No evento OnClick do botão incluir digite o código conforme o código fonte 4.

Para os demais botões vamos “amarrar” no mesmo evento do botão incluir.

Observe que no evento do botão incluir “cha-mamos” o procedimento Manutencao passando como parâmetro a tag do botão em questão e o cdsCliente.

No evento OnShow do formulário digite o código conforme o código fonte 5:

Pronto, podemos realizar nossas operações no SQLite utilizando o formulário exemplo.

Conclusão

Neste simples artigo, procurei demonstrar a implementação de um formulário de cadastro com a suíte 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 exclusão?’, mtConfirmation, [mbYes, mbNo], 0) = mrYes then Tabela.Delete; End; 4 : begin if MessageDlg(‘Confirma a gravação?’, mtConfirmation, [mbYes, mbNo], 0) = mrYes then Tabela.Post; Tabela.ApplyUpdates(0); end; 5 : if MessageDlg(‘Cancelar a edição?’ , mtConfirmation, [mbYes, mbNo], 0) = mrYes then Tabela.Cancel; 6 : begin end; 7 : Close; end;end;

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

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

Sobre o autor

Luís Alexandre de Oliveira é Téc-nologo em Processamento de Dados ,graduado pela Faculdade de Técnologia de Sorocaba, Consultor técnico do The Club

Docente do curso técnico informática - Etec de Avaré e do curso Tecnologia em Redes de Computadores - Fatec Eduvale – Avaré

Page 11: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 11

listagem 1

Gravando Imagens JPEG no SQLExpress 2005

usando dbExpressConsiderações iniciais

A gravação de imagens em banco de dados sempre foi um assunto bastante solicitado nestes anos de suporte, com o passar do tempo

com as mudanças de banco de dados e tecnologias de conexão, as rotinas de gravação também 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 SQ-LExpress 2005. A princípio, o que poucos usuários sabem é que o campo IMAGE no SQLExpress 2005 na realidade é um campo BLOB no qual podemos gravar qualquer tipo de dado em formato binário, 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...

Definindo a tabela

Para começar, usando uma ferramenta de manutenção do banco como o Query Analyser, ou o SQL Server Management Studio Express (que pode ser encontrado no site da microsoft para Downlo-ad) 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 próximo passo será criar um novo proje-to no Delphi e salvá-lo. A figura 1 apresenta o layout sugerido e os componentes que serão necessários

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[Imagens]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 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

Figura 1 – Layout sugerido.

Page 12: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200812

listagem 2 - Procedimentos para gravar e ler no campo IMAGE.

neste contexto. Aponte a conexão (SqlConnection) para o ban-

co de dados que contém 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 Clien-tedataset. Não irei entrar em detalhes a respeito das configurações destes componentes, pois foge do contexto deste artigo, mas veja a figura 2 as configurações do SQLconnection e abaixo os pa-râmetros da conexão:

SchemaOverride=sa.dboDriverName=MSSQLHostName=SERVIDOR\SQLEXPRESSDataBase=THECLUBUser_Name=Password=BlobSize=-1ErrorResourceFile=LocaleCode=0000MSSQL TransIsolation=ReadCommitedOS Authentication=TruePrepare SQL=False

Figura 2

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

Procedimentos

Partiremos agora para a codificação dos proce-dimentos que irão nos auxiliar em gravar e ler ima-

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;

gens no SQLServer. Como mencionei no início deste artigo, o campo do tipo IMAGE no SQLExpress2005 possibilita armazenar qualquer formato de arquivo, desde que armazenado em formato binário. Para isso, iremos implementar dois procedimentos: Loa-dFromBlob e SaveToBlob, ambos recebendo como parâmetros um objeto TField que irá representar o campo no ClientDataSet e um objeto TStream que possibilitará gravar/ler em formato binário, acompanhe a listagem 2.

Vale ressaltar que os procedimentos Loa-dFromBlob e SaveToBlob não são exclusivos para gravar e ler imagens e sim, servem para armazenar qualquer tipo de conteúdo binário que estiver

no TField que for passado como parâmetro e da mesma forma, irá retornar qualquer conteúdo armazenado via Stream.

Prosseguindo, iremos implementar dois procedimentos específicos para gravar e ler JPEG, nos quais, iremos fazer uso dos procedimentos anteriormente criados, veja a listagem 3.

O procedimento AddJpgToTable, como o pró-prio nome sugere irá receber o caminho (path) do arquivo JPEG e em qual field (campo) ele deverá injetar o arquivo JPEG. Neste procedimento cria-mos um objeto TJpegImage que irá ler o arquivo em disco e um objeto TMemoryStream que irá receber a representação binária do arquivo carregado no

Page 13: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 13

listagem 3 – Procedimentos para gravar e ler JPEG.

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;

TJpegImage e para finalizar, chamamos o SaveTo-Blob que irá atribuir do Stream para o campo.

O procedimento LoadJpgFromTable recebe como parâmetro o Field (campo) onde a imagem será carregada e um objeto TJpegImage (por refe-rência) que irá devolver a imagem JPEG para ser apresentada no componente TImage. Dentro deste procedimento efetuamos a chamada do procedi-mento LoadFromBlob que será o responsável em acessar o campo e extrair a imagem no mesmo armazenada.

Finalizando a codificação

Iremos agora concluir a codificação do nosso projeto de exemplo efetuando a chamada aos procedimentos implementados anteriormente.

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

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

Listagem 4.

Este objeto “temp” poderá ser instanciado na sessão initialization de nossa unit, a qual deve ser declara antes do “end.” Da mesma, confira na listagem 5.

Page 14: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200814

listagem 5

Listagem 6 – OnClick do btnProcurar.

Listagem 7 – BeforePost do adsImagens.

Listagem 8 – AfterScroll do adsImagens.

usuários... Para evitar este problema, no evento AfterInsert do ClientDataSet iremos limpar a ima-gem existente no TImage. Você pode estar se per-guntando: Onde entra o objeto TJpegImage nisso? Respondo: Se o usuário adicionar um novo registro e salvá-lo, o objeto TJpegImage não terá nenhuma finalidade, contudo, se o usuário adicionar um novo registro e cancelar, nosso TImage não irá retornar automaticamente para imagem anteriormente

Dando continuidade, vamos efetuar a codifi-cação do evento OnClick do btnProcurar que será responsável em acionar o OpenPictureDialog para permitir ao usuário procurar a imagem em disco, veja a listagem 6.

Somente iremos permitir ao usuário procurar uma imagem em disco se a tabela estiver em modo de edição ou inserção visto que a imagem selecionada será adicionado ao campo imagem da tabela IMAGENS. Após ser confirmada a seleção da imagem, fazemos a atribuição da mesma ao com-ponente TImage para ser apresentada ao usuário e caso não seja informada nenhuma descrição no DBEdit_Descricao iremos atribuir o caminho e o nome da imagem como descrição.

Neste momento, ainda não atribuímos a ima-gem selecionada ao campo da tabela, a imagem por enquanto está apenas no componente TImage. A atribuição da imagem dar-se-á no momento que o usuário 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á arma-zenada na tabela, porém, para podermos visualizar as imagens (referente cada registro armazenado na tabela ao navegar via DBNavigator) no componente TImage deverá efetuar um controle de navegação para que a cada registro posicionado possamos ob-ter 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 es-tiver em modo “browse” e o conteúdo do campo imagem não for nulo. Estando estas duas condições satisfeitas, efetuamos a chamada do procedimento LoadJpgFromTable e caso o retorno seja verdadeiro atribuímos a imagem ao TImage.

Bem, estamos quase terminando! Lem-bra daquele objeto TJpegImage que declaramos e instanciamos anteriormente? Pois bem, iremos utilizá-lo agora. Na verdade, o tratamento a seguir é apenas por uma questão de estética. Quando o usuário for adicionar um novo registro clicando no botão (+) do DBNavigator, como o componente TImage não possui nenhuma ligação com a tabela ele irá continuar mostrando a imagem do registro anterior, e isso poderia confundir nossos “experts”

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

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;

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

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;

apresentada, visto ele não ter nenhuma ligação com a tabela e por isso, no evento AfterInsert, an-tes 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 código de ambos os eventos estão a seguir na listagem 9.

Com isso finalizamos nosso projeto, compile, execute e se tudo estiver OK o resultado será pa-

Page 15: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 15

Listagem 9 – AfterInsert e AfterCancel.

recido com o apresentado na figura 3. Considerações 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 binário.

Abraço e sucesso à todos,

Alessandro FerreiraColaborador do The Club

E adaptaçõesMarcos César Silva

Download

O projeto de exemplo referente este arti-go está disponível para download no endereço:

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

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;

figura 3

Page 16: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200816

Introdução

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 usuários, restringindo páginas que não tenham permissão acesso para usuários não validados.

Criando o banco de dados para o controle de usuário

Na criação e manutenção do banco de dados utilizarei a ferramenta SQLMANAGER 2005 Lite for MySQL, onde podem fazer o download da versão freeware no seguinte endereço: http://www.sql-manager.net/en/products/mysql/manager.

Para criar o banco vá em DataBase | Create Database como pode ver na figura 1.

Crie um simples formulário de Login Dephi por PHP

Veremos como é muito fácil criar um banco uti-lizando o Wizard da ferramenta. No campo DataBa-se Name apenas informe o nome do nosso banco de dados (Figura2), no caso ControleAcesso.

Na figura 3 podemos verificar a configuração

do HostName, UserName e Password. Ressalto que a senha é definida no momento da instalação do MySQL. Clique em Next e Finish para finalizar a criação do banco de dados.

Agora vamos criar a tabela de Usuários. Para isso clique com o botão direito do mouse em Tables, e selecione NewTable, será aberto a janela para informar a estrutura da tabela, assim em Table Pro-perties preencha a propriedade Table Name com Figura 1

Figura 2

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 opção

Show SQL Editor (F12) da Ferramenta, e executar (F9) o Script de criação da tabela abaixo:

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

Page 17: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 17

Figura 3

Figura 4

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

Como o objetivo não é criar neste artigo um cadastro de usuários, iremos inserir o usuário atra-vés de instrução SQL, veja a instrução 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, ‘[email protected]’,’123.456’, ‘Luis Alexandre’, 1)

Conectando o Dephi PHP ao MySQL

Abra o Delphi for PHP e acesse o Data Explorer. Clique com o botão direito em MySQL e selecione a opção 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 autenticação devemos informar o usuário e senha do MySQL. No campo DataBase digite “ControleAcesso” que foi o nome que utilizamos na criação do banco, no passo anterior. Na figura 6 verificamos os campos preenchidos de forma correta.

Figura 5

Figura 6

Iniciando a Aplicação

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 Usuário”. É recomendado criar nossa aplicação no diretório C:\.

Iremos criaar o layout da página Acesso.php, para isto adione 2 componentes Edits, 3 labels e 1 Button, e altere suas propriedade da forma que

Page 18: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200818

Listagem 1

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 código fonte 1.

Criaremos agora os componentes de conexão como o banco de dados, para isto bastar ir no DataExplorer e arrastar a CONEXAO para a pagina, assim o componente dbControleAcesso1 sera cria-dos automaticamente e devidamente configurado, adicione também 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 semelhanças 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 instrução com o codigo comentado:

Ver código fonte 2

Iremos criar mais uma form e chamá-lo de Prin-cipal.php, para que após o logon o seja feita o dire-cionamento para esta página (Veja figura 8). Nesta pagina iremos adionar o evento OnBeforeShow aonde iremos chamar a função ValidarAcesso, e exbir no label o nome do usuario que colocamos na sessão veja abaixo o evento:

Ver código fonte 3.

Para finalizar iremos criar uma Unit para a fun-ção controle que valida se o usuário já está logado no site, onde caso contrário, 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:

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

<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>

Figura 7

Page 19: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 19

Listagem 2

Listagem 3

function btnOkClick($sender, $params) { //declaração das variáveis $usuario = addslashes($this->edEmail->text); $password = addslashes($this->edSenha->text); $this->lbMensagem->caption = “”; //atribuição da instrução 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 sessão $_SESSION[‘usuario’] = $this->sqlUsuarios->NOME; //Redireciona a pagina para a página principal do site redirect(‘Principal.php’); } else { $this->lbMensagem->caption = “Usuário ou Senha inválida!”; } $this->sqlUsuarios->Close(); }

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

Lembrando que para que a função seja “vi-sivel” em outras páginas ela deve ser declara em cada pagina que irá ser feita a validação, para isto inclua o Controle.php através de Alt+F11 em cada uma delas antes de usar a função ValidarAcesso. Agora basta executar o projeto (terá a tela de login da figura 9), digite usuario e senha, e acesse a página princiapal. Facil, não é??!!!

Conclusão

Assim temos de forma bastante simples um controle de acesso ao nosso site, mesmo assim vimos conexão a base de dados, uso de funções e variáveis de Sessão. Agora na próxima etapa po-deremos implementar novos recurso como niveis de permissões de acesso, mas isto fica para um proximo artigo.

Aos amigos um forte abraços e até a proxi-ma.

O download do exemplo pode ser baixado em:

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

Sobre o autor

Marcos César Silva, Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Técnico do The Club, Bacharel em Ciência da Computação, MBA em Gestão Empre-sarial, Certificações MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

Sobre o autor

Luís Alexandre de Oliveira é Téc-nologo em Processamento de Dados ,graduado pela Faculdade de Técnologia de Sorocaba, Consultor técnico do The Club

Docente do curso técnico informática - Etec de Avaré e do curso Tecnologia em Redes de Computadores - Fatec Eduvale – Avaré

Figura 8

Page 20: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200820

Introdução

Neste artigo vou explicar como utilizar o Transaction Scope, que é uma ferramenta que pode ajudar muito no controle de transações de sua aplicação. Também vou mostrar a configuração que deverá ser feita nos servidores para que ele possa funcionar adequadamente, pois muitas pessoas se esquecem deste passo e acabam tendo inúmeros problemas na implementação da funcionalidade em produção ou mesmo no ambiente de teste e desenvolvimento.

O TransactionScope

O .NET Framework 2.0 inclui o namespace System.Transactions que dá um grande suporte a transações distribuídas geren-ciadas pelo Transaction Manager, incluindo Banco de Dados e Serviços de Mensagens(message queues).

O namespace System.Transactions define a classe TransactionScope, que cria e gerencia transações distribuídas.

Devido a sua facilidade de utilização e eficiência, é recomendado que você utilize a classe de TransactionScope para facilitar o controle de transações em sua aplicação, sem que seja necessário (você precise) interagir com a operação propriamente dita.

O TransactionScope pode selecionar e gerenciar o ambiente de Transações automaticamente.

O System.Transactions fornece uma estrutura de transações totalmente integrada ao .NET Framework, mas não se limitando ao ADO.NET.

Utilizando o TransactionScopeO TransactionScope é iniciado quando se cria um novo objeto Transac-

tionScope.É altamente recomendado que a declaração do scope seja feito dentro da

diretiva using, pois ela garante que o objeto dure somente o tempo necessário para sua utilização.

Vamos aos exemplos:Adicione a referência no projeto ao System.Transaction.

Inclua a referencia na Classe:

Incluindo o TransactionScope no Bloco de Codigo:

Completando a transação:Para “commitar” a transação inserimos uma instrução que será a ultima

Page 21: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 21

linha do using. Obs: Caso ocorra algum problema na execução do bloco de código (dentro

do using ) automaticamente a transação é abortada e o Transaction Maneger executa o Roll Back das alterações.

RollBack:O RollBack é executado automaticamente quando ocorrer qualquer exce-

ção no bloco que está sendo executado dentro da transação.

Exemplo de utilização:

No cenário abaixo, temos uma transação onde gravamos informações coletadas separadamente (endereço, dados pessoais, etc). Com o Transaction Scope temos a liberdade de gravar as informações separadamente. Suponha-mos que estamos gravan-do o cliente e após gravar o Endereço e o Telefone do Cliente da um problema na gravação 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 gravação de algum desses métodos o

TrasactionScope faz o RollBack de tudo, como dito anteriormente. Não havendo nenhum problema a transação é completada normalmente.

A configuração do ambiente

Para que o transactionScope funcione no servidor precisamos fazer algumas configurações, mais somente se o servidor for XP sp2 pra cima! Em Win2000 não precisamos mexer em nada!

Menu IniciarConfiguraçõesPainel de ControleFerramentas administrativas.

Abra o Serviço de Componentes (como na figura abaixo):

Clique com o botão direito do Mouse em Meu Computador(Como na figura Abaixo) e selecione a opção Propriedades.

Page 22: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200822

Sobre o autor

Fabiano BelmonteSenior Architect da InfoMoney.com, especialista em aplicações e-Busi-

ness com larga experiência em B2B (Submarino.Com e Saraiva.Com). Trabalha há 5 anos com a tecnologia .Net, aplicando conhecimentos nas diversas áreas: instituições financeiras (sistema SPB), e-Commerce, gerenciamento logístico entre outras. Trabalhando com Visual Studio desde suas primeiras versões, responsável pela implementação 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

Na janela Clique na aba MSDTC e depois em Configurações de Segu-rança.

Habilite as opções:

- Acesso ao DTC de Rede. - Permitir Clientes Remotos - Permitir Adminis-tração Remota - Permitir Entrada - Permitir Saída - Nenhuma Autenticação Necessária - Permitir Transações do Protocolo TIP - Habilitar Transações XA (como a figura abaixo)

Lembrando que essa configuração 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 Códigos...

Anuncie

conosco

Solicite um orçamento:

Skype: theclub_cadastro

E-mail: [email protected]

Fone: (14) 3732-1529

Anuncie na revista e ganhe um

banner publicitário no site do The Club

Page 23: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 23

Ao iniciar em qualquer linguagem de programação para que se consiga fazer uma aplicação por mais simples que seja, é necessários conhecer pelo menos algumas instruções e operadores básicos da linguagem. Assim a forma mais rápida

e prática 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 programação Delphi para este procedimento. Assim veremos a seguir uma seqüência comparativa entre as duas linguagens, aonde o nível de complexidade irá aumentado gradativamente ao longo deste artigo.

1. Operadores

Veremos abaixo os operadores relacionais, lógicos e de atribuição básicos das linguagens.

1.1. Operadores Relacionais

Delphi C#

Operação Operador Operador

Igualdade = ==

Diferença <> !=

Maior > >

Maior ou Igual >= >=

Menor < <

Menor ou Igual <= <=

1.2. Operadores Lógicos

Delphi C#

Operação Operador Operador

Negação not !

Conjunção (Ou) and &&

Disjunção (E) or ||1.2. Operadores de atribuição

Delphi C#

Operação Operador Operador

Atribuiçao := =

Atribuição Adicional X= X+Y += (X += Y )

2. Instruções condicionais IFs, then e else

Exemplo em Delphi

procedure TForm1.Button1Click(Sender: TObject);var X:Integer;begin X := StrToInt(Edit1.Text); if X >= 10 then Showmessage(‘A variável X é maior ou igual a 10’) else Showmessage(‘A variável 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 variável X é maior ou igual a 10”); else MessageBox.Show(“A variável X é menor 10”); }

Neste pequeno exemplo acima além do uso da instrução condicional IF, operadores relacionais e de atribuição, vemos algumas outroas diferença entre as linguagens, observe:

• Em C# a declaração da variáveis não tem uma seção expecifica como no delphi (var);

• Em C# para converter a string em interio usamos o método ToInt32 da classe Convert, já no delphi apenas usamos a função StrToInt;

Page 24: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200824

4. Laços (loops) usando while

Exemplo em Delphi

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#

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 semelhança entre o while das lin-guagens, mas veja as seguintes diferenças dos exemplos:

No Delphi no Memo uso Lines.Add já em C# uso o componente Textbox com o método AppendText

No Delphi usamos a função Inc para incrementar a variável I, já no C# usamos o operador matemático ++ antes da variável;

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 próxima.

• Em C# para exibir a mensagem usamos o método Show da classe MessageBox, já no delphi apenas usamos a função Messagebox;

• Em C# o a declaração da constante string está entre aspas, no delphi o mesmo é feito entre apóstrofres

3. Instrução 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;

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; } }

Neste exemplo comparamos as diferenças entre case no delphi e o switch, veja as seguintes diferenças:

• No delphi não existe a necessidade do comando Break aou contrário do C#;

• No Delphi o valor padrão que não satisfaça nenhuma condição fica relacionado ao else quanto que em C# temos a instrução Default;

Sobre o autorMarcos César Silva, Consultor de Sistemas na consultoria de

sistemas DataSmart e Consultor Técnico do The Club, Bacharel em Ciência da Computação, MBA em Gestão Empresarial, Certificações MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

Page 25: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 25

Neste artigo iremos criar um formulário de envio de email muito usado em sites, com os mais diversos propósitos, deste de solicitação de pedidos de produtos ate envio de currículos, para isto no Visual Studio vamos em File | New Web Site,

selecione a opção ASP.NET WebSite, e informe o caminho com o diretório de criação 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 digitação do email destinatário, um para o assunto e outro para a mensagem, e uma botão “Enviar”, veja abaixo na imagem2 o resultado:

Criaremos agora o arquivo de configuração que terá todas as informações

de autenticação para o envio do email, para isto em Solution Explorer, clique com o botão direito em no projeto e selecione a opção Add New Item, em Templates selecione a opção Web Configuration File (Web.config) (Figura 3), neste arquivo iremos acrescentar logo após a seção </system.web> a seguinte seção com as configurações de envio de email: cer Imagem 3

<system.net><mailSettings> <smtp from=”[email protected]”> <network host=”smtp.theclub.com.br” password=”XXX.XXX” userName=”[email protected]” /> </smtp> </mailSettings></system.net>

Para criar a função de envio de email adicione os seguintes namespa-ces:

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

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

Criando um formulário de envio de Email em Asp.Net

Imagem 1

Imagem 2

Imagem 3

Page 26: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200826

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 { //Instrução para pegar as propriedade de envio de email do Web.Config

Configuration config = WebConfigurationManager.OpenWebConfiguration(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); //Criação de credencial para envio de e-mail com autenticação SmtpMail.Credentials = new NetworkCredential(settings.Smtp.Network.UserName, settings.Smtp.Network.Password); SmtpMail.Send(Message); } catch (Exception e)

{ Pagina.Response.Write(@”<script>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); }}

Conclusão

Esta é uma forma prática de envio de e-mail, acredito que a função seja útil em diversões caso, podendo estar presentes, naqueles arquivos de funções básicas que acostumamos criar e compartilhar entre nossas aplicações.

Sobre o autorMarcos César Silva, Consultor de Sistemas na consultoria de

sistemas DataSmart e Consultor Técnico do The Club, Bacharel em Ciência da Computação, MBA em Gestão Empresarial, Certificações MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

Anuncie

conosco

Solicite um orçamento:

Skype: theclub_cadastro

E-mail: [email protected]

Fone: (14) 3732-1529

Anuncie na revista e ganhe um

banner publicitário no site do The Club

Page 27: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 27

Page 28: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200828

Dicas DELPHIGERAR SEQUENCIA RANDOMICA DE UM ARRAY

Const { Tabela AscII Numeros 0-9 correposnde ao intervalo da tabela de 48 - 57 Caracteres maiúsculos A-Z correposnde ao intervalo da tabela de 65 - 90 Caracteres minúsculos 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(Tamanho:Integer):String;var Form1: TForm1;implementationuses Math;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin caption := RetonaSequenciaRandomica(10);end;function RetonaSequenciaRandomica(Tamanho:Integer):String;var Count:Integer;begin for Count := 1 to Tamanho do Result := Result + Chr(RandomFrom(TabelaAscII));end;

PESQUISA INCREMENTAL EM UM LISTBOX

procedure TForm1.Edit1Change(Sender: TObject);var

S: Array[0 ..255] of char;beginStrPCopy(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

VERIFICA E ALTERA FORMATO DATA NO WINDOWS

procedure TForm1.Button1Click(Sender: TObject);var

Page 29: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008 29

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;

MARCAR TODOS OS ITENS DE UM DBGRID

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

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;

Page 30: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 200830

Dicas ASP.NETFormatando valores numéricos com máscara

private void button1_Click(object sender, System.EventArgs e){ double Valor = 1500; label1.Text = Valor.ToString(“#,##0.00”);}

Executando outros programas a partir da aplicação:

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);}

Realizando conversão 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)

{ int i = ((int)’A’); textBox1.Text = i.ToString(); }

Obtendo tamanho de disco e seu espaço 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 = “Espaço livre da Unidade C: é igual a “ + Convert.ToString(di.TotalFreeSpace / 1000000000) + “ Gb “; }

Abrindo um arquivo existem através da aplicação

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 instrução WaitForExit que tem o objetivo de deixar a aplicação em segundo plano, não podendo ser acessada ate que o notepad ou outro aplicação chamada seja encerrada

Page 31: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008

Page 32: The Club - megazine · Aprendendo C# Gerenciando Transações com Trasaction Scope no Asp.Net 23 Dicas Delphi Dicas ASP.NET ... sintaxe de cada linguagem de forma simples é prática

setembro 2008