Você está na página 1de 63

IntelliSense

Um recurso muito interessante no VS o IntelliSense, ele ajuda muito durante o desenvolvimento de uma aplicao pois agiliza a digitao de cdigo. Ele apresenta uma lista de opes disponveis de acordo com o contexto, permitindo selecionar um item de forma muito prtica e eliminando a necessidade de memorizar nomes de propriedades, mtodos, palavras-chave da linguagem etc. Por exemplo, ao digitar as iniciais do ID do boto criado no exemplo anterior, o IntelliSense entra em ao apresentando uma lista de sugestesFigura 12, ao selecionar o boto e digitar um ponto, uma lista de propriedades do boto ser apresentada, conforme a Figura 13. O recurso tambm pode ser usado atravs do pressionamento das teclas CTRL + Espao.

PostBack
Um Postback ocorre sempre que h uma requisio ao servidor Web para troca de informaes. Normalmente, quando clicamos em um boto (existem outros controles que tambm podem efetuar Postbacks), informaes so enviadas do browser para o servidor para ento serem analisadas. O servidor processa essas informaes, gera um novo contedo (pgina) e devolve ao browser. Por exemplo, imagine uma pesquisa de clientes. Quando digitamos as iniciais do nome de um cliente em uma caixa de texto e clicamos em pesquisar, o texto que voc digitou enviado ao servidor, o que causa um Postback. O servidor Web processa essa pesquisa e retorna os dados dos clientes encontrados na prpria pgina, geralmente em um Grid.

Para entender melhor como funciona o PostBack, adicione um novo controle Label e modifique a Propriedade ID para lblPostback. Para que o Label apresente se a pgina executou um PostBack ou no, vamos utilizar o importante evento Page_Load, que executado quando a pgina carregada. Para acessar o evento basta dar um duplo clique na pgina em modo Design. Codifique o evento conforme a Listagem 4.

Listagem 4. Verificando se a aplicao executou um PostBack


//Evento que acionado quando a pgina carregada protected void Page_Load (object sender, EventArgs e) { //Verifica se um PostBack if (IsPostBack) { //Caso seja um PostBack ele apresenta //a mensagem no Label lblPostback.Text = "outras execues"; } else { //Caso no seja um PostBack ele apresenta // a mensagem o Label lblPostback.Text = "Primeira execuo"; } }

Veja que aqui usamos um teste na propriedade IsPostback da pgina. Ela funciona de forma simples: se a pgina est sendo carregada pela primeira vez, seu valor falso, se a pgina est sendo carregada pela segunda vez em diante, isto , em resposta a um PostBack (como o clique no boto), seu valor true. Neste momento se voc executar o projeto pela primeira vez o Label vai aparecer com a mensagem Primeira execuo. Clique no boto e a pgina ser enviada e retornar, o PostBack ser executado e a mensagem outras execues ser apresentada no Label. Vamos criar outro exemplo onde a pgina vai iniciar apresentando a hora atual, ao selecionar um item em um componente DropDownList (Figura 14) a hora ser atualizada executando o PostBack. O DropDownList um componente que permite selecionar um item dentre uma lista de opes.

Adicione-o em nosso projeto da mesma forma que adicionamos os componentes anteriores, localize um boto com o sinal de maior e clique nele (Figura 15). Uma janela chamada DropDownList Tasks aparecer, marque a opo Enable AutoPostBack para deixar automtico o PostBack do DropDownList, ou seja, a cada opo da lista que for selecionada a pgina ser enviada e retornar com os dados para serem tratados.Para adicionar opes no componente, clique em Edit Items, clique no boto Add para adicionar alguns itens, digitando na propriedade Text um valor qualquer (Figura 16.)

Figura 15.

Habilitando o AutoPostBack do DropDownList

Figura 16.

Inserindo itens no DropDownList

Para que a hora atual seja apresentada na pgina, adicione um Label com a propriedade ID igual lblHora. Vamos utilizar o evento Page_Load novamente conforme o cdigo na Listagem 5. Execute o projeto e veja que ao selecionar um item no DropDownList a hora atualizada.Observe que aqui usamos o tipo DateTime para recuperar a hora no servidor. Now representa o momento atual, enquanto ToLongTimeString formata o texto representando a hora.

Listagem 5. Atualizando a hora


//Evento que acionado quando a pgina carregada protected void Page_Load(object sender, EventArgs e) { //Apresenta a hora no controle Label lblHora.Text = DateTime.Now.ToLongTimeString(); }

Debug
Para finalizar o artigo no poderia deixar de falar de um dos recursos mais importantes do VS, a depurao do cdigo fonte para encontrar erros e reduzir o nmero de bugs no projeto. Localize o cdigo:

lblTitulo.Text = txtNome.Text; Posicione o cursor no incio da linha, aperte a tecla F9, perceba que uma bolinha vermelha chamada breakpoint foi adicionada no lado esquerdoFigura 17. Ela indica um ponto onde a aplicao deve parar a execuo, para que dados possam ser analisados.

Para executar a aplicao em modo de debug, localize o menu do VS chamado Debug e clique em Start Debugging, ou aperte F5, ou ainda clique na seta verde localizada na barra de ferramentas. Uma mensagem vai aparecer na tela na primeira vez que voc executar o debug em uma aplicao, conforme a Figura 18. Ela informa que o debug no est configurado no arquivo Web.config, apenas confirme.

Digite algo no TextBox, clique no boto e veja que no ponto que inserimos o breakpoint a linha ficou amarela e apareceu uma seta amarela. Neste momento podemos analisar a aplicao em execuo. Localize no canto direito inferior do VS a janela Immediate Window, nesta janela podemos visualizar o contedo de objetos e at modificar suas propriedades. Por exemplo, digite txtNome.Text e tecle Enter, na linha de baixo ser apresentado o valor que voc inseriu no TextBox. Se voc quiser modificar o contedo da propriedade Text basta digitar txtNome.Text = qualquer texto e teclar Enter. Aperte a tecla F11 ou localize no menu Debug o Step Into para avanar a execuo linha a linha da sua aplicao. Vamos ver agora outra forma de depurar o projeto. Durante a execuo do debug no canto inferior esquerdo do VS temos a janela Locals e Watch, em Locals temos todos os objetos utilizando em nossa aplicao e em Watch podemos inserir os objetos e assistir as mudanas que eles sofrem enquanto debugamos a aplicao. Para fazer um teste selecione o objeto txtNome junto com a propriedade Text e com o mouse arraste e solte para dentro da janela Watch, conforme aFigura 19. Note que apresentado o nome, valor e o tipo da propriedade do objeto. Se voc modificar a propriedade Text novamente na janela Immediate Window o valor ficar em vermelho na janela Watch. Voc pode inserir diversos objetos na janela Watch e monitorar ao mesmo tempo.

O SQL Server Management Studio


O SQL Server Management Studio inclui ferramentas grficas para administrao de banco de dados em um rico ambiente de desenvolvimento. O Management Studio permite acessar e gerenciar o mecanismo de Banco de Dados, atravs dele teremos a capacidade de escrever instrues TransactSQL ou T-SQL (a implementao Microsoft do SQL standard). Para abrir o SQL Server Management Studio, v ao menu iniciar escolha Todos os Programas / Microsoft SQL Server 2008e escolha SQL Server Management Studio. Aps executado o Management Studio ir apresentar a tela exibida na Figura 11. Nessa tela temos duas opes, escolher o tipo de autenticao Windows Authentication (o SQL usa o usurio logado no Windows) ou SQL Server Authentication (nativa). No caso da ltima opo teremos que informar a senha definida na instalao do SQL Server 2008 Express. Clique em Connect em seguida.

O Microsoft SQL Server Management Studio uma ferramenta poderosa e flexvel. A Figura 12 mostra sua interface. Podemos observar que existe uma janela, localizada na lateral esquerda, chamada Object Explorer. Essa janela permite a navegao em todos os itens presentes na instncia do SQL Server 2008. Essa janela trar inicialmente uma estrutura do tipo tree view contendo como n raiz a instncia no qual fizemos a conexo. Abaixo dessa instncia podemos ver diretrios que agrupam e organizam os demais objetos, tais como: bases de dados, usurios, objetos do servidor, objetos de gerenciamento, entre outros.

O nosso primeiro passo ser criar a nossa base de dados, ou database, que ser o nosso repositrio para as tabelas do nosso modelo de Blog. Para isso, clique com o boto direito sobre o item Databases, escolhendo a opo New Database. Ser exibida uma janela conforme podemos ver naFigura 13. Basicamente, precisamos informar o nome da nossa base de dados. Escreva NetEasyBlog e em seguida clique no boto Ok. Atravs dessa tela tambm seria possvel definir outras configuraes do nosso database, como o tamanho dos arquivos de dados e log, algumas opes de segurana, entre outros. Contudo, para o nosso exemplo as configuraes padro so suficientes.

O novo database NetEasyBlog ser exibido dentro da estrutura Databases, conforme podemos notar na Figura 14. Se expandirmos essa estrutura veremos todos os objetos que podemos criar dentro de nossa base de dados. Como dissemos anteriormente, o SQL Server 2008 uma poderosa plataforma para armazenamento de dados. O SQL Server Management Studio um ambiente integrado para acessar, configurar, gerenciar e administrar todos os componentes do SQL Server. Ele combina um amplo grupo de ferramentas grficas com cinco editores de script avanados para dar acesso ao SQL Server para os desenvolvedores e administradores a todos os recursos da plataforma. Sendo assim, podemos criar, alm de tabelas, outros objetos: views, stored procedures, triggers, ndices, entre outros.

Faremos agora a criao da nossa primeira tabela. possvel fazermos a criao de forma grfica, bastando para isso clicar com o boto direito no diretrio Tables e em seguida escolher a opo New Table. Preencheremos o painel de criao de tabela conforme descrito na Tabela 2. Note que precisamos informar qual o tipo de dado queremos para cada coluna. importante uma definio correta dos tipos de dados, pois isso influencia diretamente na forma como o SQL Server far o armazenamento dos registros e tambm influenciar na performance das consultas.

O passo seguinte definir qual a nossa chave primria (ou primary key), podemos faz-lo selecionando a linha que contm o campo IdCategoria e clicando com o boto direito sobre a seta indicadora, conforme podemos ver na Figura 15. Devemos ento escolher a opo Set Primary Key. Isso far com que o SQL Server atribua o campo IdCategoria como chave da tabela Categoria. Uma vez que definimos um campo como chave o SQL Server cria uma restrio para esse campo, garantindo que um registro seja nico. Esse campo no poder ter o mesmo valor em mais de uma linha.O resultado final da criao da tabela Categoria atravs da interface grfica do Management Studio pode ser conferido na Figura 16. Para salvar a tabela, basta clicar no cone com um disquete e dar o nome de Categoria.

Nota: Observe na janela Properties direita do Management que definimos a coluna IdCategoria como sendo a coluna Identity. Isso far com que os valores para o campo sejam definidos automaticamente pelo BD (autoincremento).

A forma como criamos a tabela Categoria no a nica forma disponibilizada pelo SQL Server Management Studio. Desenvolvedores so mais familiarizados com a escrita de comandos do tipo DML (Data Manipulation Language) e DDL (Data Definition Language). Isso porque a escrita atravs de comandos d uma chance de utilizarmos um editor de textos, o que significa que o cdigo pode ser armazenado ou salvo em arquivos conhecidos como scripts. Um arquivo de texto utilizado para escrevermos comandos Transct-SQL salvo atravs do Management Studio possui a extenso .SQL.Para iniciarmos o editor de texto do Management Studio podemos utilizar o boto destacado pela primeira seta da Figura 17. Uma vez aberto, podemos executar os comandos Transct-SQL atravs do boto destacado pela segunda seta da Figura 17, ou ainda pressionando a tecla F5.

nossos cdigos Transact-SQL - Executamos nossas queries utilizando o boto destacado, ou pressionando F5

Figura 17.

O boto New Query cria um novo arquivo para escrevermos

A mesma tabela Categoria poderia ser criada atravs de comandos T-SQL conforme mostra a Figura 18. O comando CREATE TABLE indica que um bloco de comando para criao de uma tabela foi iniciado. Devemos ento informar o nome da tabela e em seguida os campos que fazem parte da mesma. Note que primeiramente informamos o nome da coluna seguido do tipo de dado, e depois informamos a obrigatoriedade do campo (NOT NULL ou NULL). Na linha 6 podemos ver o comando CONSTRAINT que acrescenta uma regra para a tabela, informando ao SQL Server que o campo IdCategoria ser a chave primria.

Outro comando importante o IDENTITY que define o campo IdCategoria como sendo do tipo autoincremento. Um campo definido como IDENTITY far o controle do seu valor, incrementando automaticamente o seu valor a cada insero de novo registro na tabela. Esse o tipo de campo mais utilizado para chaves-primrias por ser pouco oneroso para o banco em termos de espao e facilmente indexvel. importante sempre ficarmos atentos caixa de seleo destacada naFigura 19. Ele indicar sobre qual database os comandos sero executados. Devemos escolher o database NetEasyBlog para executarmos os comandos que veremos a seguir. A Listagem 1 exibe todos os comandos necessrios para criao das tabelas do database, incluindo a tabela Categoria.

Listagem 1. Script para criao das tabelas da base de dados do Blog


CREATE TABLE [dbo].[Categoria] ( [IdCategoria] [int] IDENTITY(1,1) NOT NULL, [Descricao] [varchar](50) NOT NULL, [DataCriacao] [datetime] NOT NULL, CONSTRAINT [PK_Categoria] PRIMARY KEY CLUSTERED ( [IdCategoria] ASC ) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Tag] ( [IdTag] [int] IDENTITY(1,1) NOT NULL, [Descricao] [varchar](30) NOT NULL, CONSTRAINT [PK_Tag] PRIMARY KEY CLUSTERED ( [IdTag] ASC ) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Autor] ( [IdAutor] [int] IDENTITY(1,1) NOT NULL, [Nome] [varchar](50) NOT NULL, [Email] [varchar](80) NULL, CONSTRAINT [PK_Autor] PRIMARY KEY CLUSTERED ( [IdAutor] ASC

) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Post] ( [IdPost] [int] IDENTITY(1,1) NOT NULL, [Titulo] [varchar](50) NOT NULL, [Conteudo] [text] NOT NULL, [DataPublicacao] [datetime] NOT NULL, [IdAutor] [int] NOT NULL, [IdCategoria] [int] NULL, CONSTRAINT [PK_Post] PRIMARY KEY CLUSTERED ( [IdPost] ASC ) ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO CREATE TABLE [dbo].[PostTags] ( [IdPost] [int] NOT NULL, [IdTag] [int] NOT NULL, CONSTRAINT [PK_PostTags] PRIMARY KEY CLUSTERED ( [IdPost] ASC, [IdTag] ASC ) ) ON [PRIMARY] GO CREATE TABLE [dbo].[Comentario] ( [IdComentrio] [int] IDENTITY(1,1) NOT NULL, [IdPost] [int] NOT NULL, [NomeLeitor] [varchar](50) NOT NULL, [EmailLeitor] [varchar](50) NOT NULL, [DataCriacao] [datetime] NOT NULL, [Comentario] [varchar](500) NOT NULL, CONSTRAINT [PK_Comentario_1] PRIMARY KEY CLUSTERED ( [IdComentrio] ASC ) ) ON [PRIMARY] GO

Listagem 2. Script para criao das contraints do banco


ALTER TABLE [dbo].[Comentario] ADD CONSTRAINT [DF_Comentario_DataCriacao] DEFAULT (getdate()) FOR [DataCriacao] GO ALTER TABLE [dbo].[Post] ADD CONSTRAINT [DF_Post_DataPublicacao] DEFAULT (getdate()) FOR [DataPublicacao] GO ALTER TABLE [dbo].[Comentario] WITH CHECK ADD CONSTRAINT [FK_Comentario_Post] FOREIGN KEY([IdPost]) REFERENCES [dbo].[Post] ([IdPost]) GO ALTER TABLE [dbo].[Comentario] CHECK CONSTRAINT [FK_Comentario_Post] GO ALTER TABLE [dbo].[Post] WITH CHECK ADD CONSTRAINT [FK_Post_Autor] FOREIGN KEY([IdAutor]) REFERENCES [dbo].[Autor] ([IdAutor])

GO ALTER TABLE [dbo].[Post] CHECK CONSTRAINT [FK_Post_Autor] GO ALTER TABLE [dbo].[Post] WITH CHECK ADD CONSTRAINT [FK_Post_Categoria] FOREIGN KEY([IdCategoria]) REFERENCES [dbo].[Categoria] ([IdCategoria]) GO ALTER TABLE [dbo].[Post] CHECK CONSTRAINT [FK_Post_Categoria] GO ALTER TABLE [dbo].[PostTags] WITH CHECK ADD CONSTRAINT [FK_PostTags_Post] FOREIGN KEY([IdPost]) REFERENCES [dbo].[Post] ([IdPost]) GO ALTER TABLE [dbo].[PostTags] CHECK CONSTRAINT [FK_PostTags_Post] GO ALTER TABLE [dbo].[PostTags] WITH CHECK ADD CONSTRAINT [FK_PostTags_Tag] FOREIGN KEY([IdTag]) REFERENCES [dbo].[Tag] ([IdTag]) GO ALTER TABLE [dbo].[PostTags] CHECK CONSTRAINT [FK_PostTags_Tag] GO

Aps executar o script devemos observar a janela Messages do Management Studio, localizada na parte inferior do editor de textos. Caso o script no contenha erros e no haja algum impedimento (por exemplo, tabelas j criada), ser exibida a mensagem Command(s) completed successfully.. Uma vez criadas as tabelas, os dados j podem ser inseridos. Contudo devemos antes definir algumas regras para os relacionamentos entre as tabelas. A Listagem 2 mostra todos os comandos que precisam ser executados para a criao dessas regras. Por exemplo, veja que temos uma constraint entre a tabela Post e a tabela Autor, indicando o relacionamento.

Dica: O comando GetDate, usado no cdigo, retorna a data atual do servidor. Como resultado teremos o nosso database completo com todas as tabelas necessrias para o Blog. Podemos conferir o resultado no diagrama exibido na Figura 20. Este diagrama pode ser criado no Management Studio clicando com o boto direito na janela Object Explorer no item DatabaseDiagrams e escolhendo a opo New Database Diagram.

A Figura 21 mostra a janela Add Table, onde podemos adicionar as tabelas que devero fazer parte do diagrama.

Fazendo uso do banco de dados


Agora estamos habilitados a utilizar o nosso banco de dados. Faremos algumas incluses e alguns testes, utilizando comandos do tipo DML (Data Manipulation Language). Abra um novo arquivo de script e insira alguns dados, utilizando como referncia a Listagem 3. A Figura 22 mostra os registros que sero inseridos na database.

Listagem 3. Inserindo alguns registros nas tabelas


INSERT INTO Tag (Descricao) VALUES (Programao) INSERT INTO Tag (Descricao) VALUES (Linguagens) INSERT INTO Tag (Descricao) VALUES (Tutorial)

GO INSERT INTO Categoria (Descricao, DataCriacao) VALUES(SQL Server, GETDATE()) INSERT INTO Categoria (Descricao, DataCriacao) VALUES(.NET Easy, GETDATE()) GO INSERT INTO Autor (Nome, Email) VALUES (Lendro Daniel, contato@leandrodaniel.com) GO INSERT INTO Post (Titulo, Conteudo, DataPublicacao,IdAutor, IdCategoria) VALUES (Tutorial SQL Server 2008 Express, Contedo do post, GETDATE(), 1, 1) GO INSERT INTO PostTags (IdPost, IdTag) VALUES (1, 1) INSERT INTO PostTags (IdPost, IdTag) VALUES (1, 3) GO INSERT VALUES INSERT VALUES GO INTO Comentario (IdPost, NomeLeitor, EmailLeitor,DataCriacao, Comentario) (1, Bruno Daniel, bruno@mail.com, GETDATE(), Post interessante!) INTO Comentario (IdPost, NomeLeitor, EmailLeitor,DataCriacao, Comentario) (1, Peg Sue, peg@mail.com, GETDATE(), Good!)

Veremos agora algumas situaes onde as constraints garantiro a consistncia das informaes. Execute a query a seguir e observe que um erro ser exibido no painel Messages (essa query no ser executada com sucesso como consequncia da criao da constraint que garantem a consistncia das informaes armazenadas): DELETE Categoria

Msg 547, Level 16, State 0, Line 1 A instruo DELETE conflitou com a restrio do REFERENCE "FK_Post_Categoria". O conflito ocorreu no bando de dados "NetEasyBlog", tabela "dbo.Post", column IdCategoria. A instruo foi finalizada.

Isso ocorre porque definimos um relacionamento entre a tabela Categoria e Post que impede que registros da tabela Categoria sejam apagados caso haja algum relacionamento de uso pela tabela Post. A seguir vemos outro exemplo de query que no seria executada com sucesso, pois no existe uma Tag com o ID = 6:

INSERT INTO Post (Titulo, Conteudo, DataPublicacao, IdAutor, IdCategoria) VALUES (Tutorial Management Studio, Contedo do post, GETDATE(), 1, 6)

UMA INTRODUO AO WINDOWS FORMS

Para que serve Aplicativos desktop so a maioria no ambiente Windows, muito utilizados na rea comercial e automao. Dessa forma, este artigo serve para introduzir o leitor no uso da tecnologia atravs da criao de um exemplo simples.

Em que situao o tema til Este artigo focado para o pblico iniciante em aplicaes Windows Forms com o .NET. Traz informaes teis para quem est aderindo a esta plataforma e precisa saber quais devem ser os componentes e suas propriedades envolvidas na criao de uma aplicao.

Aplicaes Desktop, conhecidas at pouco tempo como aplicaes Win32, dominaram o mercado de automao comercial. Aplicaes desenvolvidas com Visual Basic ou Delphi ofereciam (e oferecem) ao usurio enormes recursos para realizao de seus processos, de forma fcil, rpida e, porque no dizer bela, com telas muito bem elaboradas. Com a chegada do Windows Vista, os desenvolvedores (os mais antigos claro) comeam a reviver algo que passaram h uma dcada, quando manter uma aplicao D.O.S. executando em um ambiente Windows comeava a ficar cada vez mais difcil. At quando aplicaes Win32 executaro perfeitamente em um ambiente Windows atualizado? A plataforma .NET , sem dvida alguma, a melhor opo, tambm, para ambientes desktop, atravs de suas aplicaes Windows, com seus Windows Forms. Note que desenvolver uma aplicao com Windows Forms, no significa dizer que ela exclusivamente para Desktop, ela pode ser apenas uma interface que trabalha atravs de Web Services para recuperao e manuteno de dados. Quanto linguagem, possvel escolher Visual Basic, Delphi ou C#, dentre outras. claro que h uma mudana, de certa forma radical, de paradigma, principalmente no que diz respeito ao acesso a dados. Este artigo apresenta uma introduo ao desenvolvimento de uma aplicao desktop, trazendo os componentes necessrios para a criao de uma janela principal para uma aplicao, assim como diferenciao entre interfaces SDI e MDI para aplicaes com janelas.

Aplicaes MDI, SDI e TBI


MDI (Multiple Document Interface) uma caracterstica de aplicaes que possuem suas janelas sempre amarradas a uma janela principal. Esta janela principal tambm conhecida como MDI Parent, MDI Container, Parent Window ou Parent Form. Em portugus encontram-se tradues na literatura como Janela Pai ou Proprietria. SDI (Simple Document Interface) j tem uma caracterstica diferenciada, onde toda janela independente, no ficando limitada a sua exibio rea cliente disponibilizada pela Parent Window. J o TBI (Tabbed Document Interface) uma caracterstica que surgiu nos ltimos anos, atravs dos browsers, que comea a ser utilizada em aplicaes desktop tambm. A Tabela 1 apresenta exemplos das caractersticas MDI, SDI e TBI.

Antes de apresentar a implementao de aplicaes SDI ou MDI, ser trabalhada a criao da aplicao em si, mas importante ter estes conceitos em mente.

Criando e configurando o projeto


Acesse o Visual Studio e crie uma nova soluo selecionando os menus File > New Project > Other Project Types > Visual Studio Solutions e escolha a opo Blank Solution. Uma soluo pode conter nela vrios projetos. Pode-se pensar em ter uma soluo com um projeto para a camada de apresentao, um para a camada de negcios e um para a camada de persistncia por exemplo. No Solution Explorer (Ctrl-Alt-L) clique com o boto direito do mouse sobre o nome da soluo criada.

Nota: Caso a soluo no aparea selecione os menus Tools > Options > Projects and Solutions e marque a opo Always show solution. No menu popup exibido escolha a opo Add > New Project. Na linguagem Visual C# escolha a opo Windows e ento Windows Forms Application. O projeto criado com um formulrio vazio (Form1.cs). Elimine-o, pressionando a tecla Del com o arquivo selecionado.

Criando uma janela principal para a aplicao


A maioria das aplicaes possui uma janela, onde as opes da mesma so exibidas, por menus ou barras de ferramentas. Desta forma, vamos criar uma janela que cumpra este objetivo. Clique novamente com o boto direito do mouse, agora sobre o nome do projeto e escolha a opo Add > Windows

Form e d a este novo formulrio o nome FormJanelaPrincipal.cs. Ser preciso configurar algumas propriedades para este formulrio. Tenha certeza de estar com o formulrio selecionado e pressione F4 para visualizar a guia Properties. Siga a Tabela 2. Aps estas configuraes, abra o arquivo Program.cs no Solution Explorer e altere o nome Form1 para FormJanelaPrincipal. Salve seu projeto e pressione F5 para execuo de sua aplicao. Seu formulrio dever ser exibido ocupando toda a rea de trabalho, no dever permitir mudar seu tamanho, estar exibindo o cone escolhido ao lado esquerdo da barra de ttulos e tambm o ttulo informado.

Criando menus,barra de tarefas e de status


Uma vez criado e configurado o formulrio responsvel pela janela principal, preciso inserir neste formulrio os meios de acesso s opes da aplicao. Na Toolbox (Ctrl+Alt+X), na categoria Menus & Toolbars selecione e arraste para o formulrio o componente ToolStripContainer e voc ter em sua janela algo semelhante ao apresentado pela Figura 1. O ToolStripContainer um componente composto de cinco painis que podem ser utilizados tambm como containers, nas bordas so dispostos instncias de ToolStripPanel e na rea central um ToolStripContentPanel. A ideia que nas bordas sejam inseridos menus, barras de tarefas e barras de mensagens, compondo assim uma janela padro de aplicaes desktop. O ToolStripContainer permite que os painis das bordas aceitem docking, ou seja, que controles possam ser postos neles.

A visibilidade dos painis por default ativa, como mostra o popup da SmartTag da Figura 1. possvel alterar estes valores tambm por cdigo e na janela de propriedades (F4) atravs das propriedades TopToolStripPanelVisible, BottomToolStripPanelVisible, LefToolStripPanelVisible e RightToolStripPanelVisible. A rea central do ToolStripContentPanel tem o objetivo de receber o contedo a ser apresentado ao usurio, desta forma, a ideia que este painel

ocupe realmente toda a rea disponibilizada pela janela, desta forma, clique no link Dock Fill in Form que aparece na SmartTag ou configure a propriedade Dock dele para Fill, como mostra a Figura 2. Aps estas configuraes feitas sua janela deve estar semelhante apresentada pelaFigura 3.

Nota: SmartTag (ou Tasks), vista na Figura 2, uma janela suspensa que o VS apresenta com opes comuns para configurao de um controle.

Figura 2.

Configurando o dock do ToolStripContainer

Figura 3.

ToolStripContainer ocupando toda a rea da janela

Dica: possvel verificar atravs do apresentado pela Figura 3 que nem todas as bordas tm os painis expandidos, mas isso facilmente resolvido clicando no boto que existe no centro de cada borda. Clicando neste boto ele recolhe e expande o painel.

preciso agora adicionar ao ToolStripContainer um menu, uma barra de tarefas e uma barra de mensagem/status. Isso possvel atravs dos componentes: MenuStrip, ToolStrip e StatusStrip respectivamente. Estes componentes esto na mesma categoria que o ToolStripContainer na ToolBox. Arraste primeiro o MenuStrip para o TopStripPanel, depois, para o mesmo Panel, arraste o ToolStrip e para finalizar, arraste para o BottomStripPanel o StatusStrip. Vamos agora configurar os controles inseridos no ToolStripContainer, comeando pelo MenuStrip. Ao clicar no componente MenuStrip exibido um container com o texto Type Here. Neste local possvel inserir um tipo de item ao menu, como ToolStripMenuItem (que o padro para os menus), ComboBox ou um TextBox. Usaremos o ToolStripMenuItem. Para isso, basta digitar o ttulo do menu na caixa em que solicitado. Digite Cadastros e note que aberto abaixo do novo item de menu campos para menus suspensos. Crie um item do menu suspenso chamado Clientes e outro Fornecedores. Ao lado do menu Cadastros crie um outro chamado Relatrios e abaixo dele Contas a Receber e Contas Pagar.

Para inserir botes a sua barra de tarefas clique na mesma e ser exibido a voc um ComboBox. Expandindo este componente exibida uma relao de vrios componentes possveis de serem inseridos em sua barra de tarefa.

Tabela 3.

Configurao do Button da barra de tarefas

Vale a pena testar cada um deles, porm nos concentraremos no Button. Insira um Button em sua barra de tarefas e veja na Tabela 3 as propriedades a serem configuradas. Insira na barra de tarefas outro Button, agora com o ToolTipText Acesso ao relatrio de contas a pagar. Para inserir um componente barra de status o processo o mesmo utilizado para a insero na barra de tarefas. A variao de componentes possveis um pouco inferior, mas a investigao igualmente interessante.Neste exemplo ser feito uso do StatusLabel. As propriedades a serem configuradas para este componente so apenas duas: (Name) com o valor lblStatus e Text que deve ficar vazia. Neste momento sua tela deve estar semelhante apresentada na Figura 4.

Figura 4.

Janela principal com strips inseridos e configurados

Clique na barra de tarefas, sobre a linha de pontos vertical e arraste a barra de tarefas para as laterais da janela, veja que elas acabam se fixando nas laterais, sem que voc tenha tido a necessidade de escrever nenhuma linha de cdigo. Este comportamento, porm, pode no ser o desejado por voc. Para proibir este tipo de comportamento, clique na Smart Tag da ToolStrip e atribua o valor Hidden para GripStyle, como mostra a Figura 5.

Figura 5.

Desabilitando o Grip

Criando novos formulrios


Crie em seu projeto um novo formulrio, da mesma forma que fizemos anteriormente, d a ele o nome FormClientesCRUD.cs, configure o formulrio de acordo a Tabela 4. Com as mesmas configuraes apresentadas na Tabela 4, crie agora outro formulrio, chamado FormFornecedoresCRUD.cs, alterando apenas o valor da propriedade Text, mudando a palavra Clientes para Fornecedores.

Tabela 4.

Configurao do formulrio FormClientesCRUD

Implementando o acesso aos formulrios atravs da janela principal


Existem dois tipos de janelas quando se trabalha com aplicaes desktop, as janelas do tipo Modal e as no modais (Modalless). As modais so aquelas em que o acesso s janelas que estejam atrs delas negado, at que esta janela seja fechada. J as janelas Modalless so janelas que podem ser exibidas e a ativao de uma delas pode ser feita sem a necessidade de se fechar a que esteja ativa no momento.

No formulrio principal, acesse o item de menu Clientes, dentro de Cadastros e na janela de Propriedades, na guia Events, d duplo clique na caixa em branco ao lado do evento Click. No editor de cdigos, digite o cdigo apresentado pela Listagem 1. Siga o mesmo procedimento para o acesso Janela de Fornecedores (o cdigo visto na Listagem 2).

Listagem 1. Evento Click do menu de acesso ao cadastro de clientes


private void clientesToolStripMenuItem_Click(object sender, EventArgs e) { FormClientesCRUD formClientesCRUD = new FormClientesCRUD(); formClientesCRUD.Show(); }

Listagem 2. Evento Click do menu de acesso ao cadastro de fornecedores


private void fornecedoresToolStripMenuItem_Click(object sender, EventArgs e) { FormFornecedoresCRUD formFornecedoresCRUD = new FormFornecedoresCRUD(); formFornecedoresCRUD.Show(); }

Teste sua aplicao (pressione CTRL + F5) e acesse os formulrios atravs dos menus. Veja que mesmo com uma janela aberta possvel acessar o menu na janela principal e acessar uma outra janela. Caso voc acesse a mesma janela preciso saber que da forma que o cdigo est implementado, o formulrio ser instanciado a cada vez que se deseja acessar e isso pode ser custoso. Como este exemplo trabalha com janelas Modalless interessante alterar esta implementao. O primeiro passo declarar uma varivel que represente a classe do formulrio (um atributo classe) e ento, quando for acessar o formulrio, verificar se a janela j no foi instanciada antes de cham-la, como apresentado pelo cdigo implementado pela Listagem 3.

Listagem 3. Alterao na chamada a uma janela atravs do menu


private FormClientesCRUD formClientesCRUD; private FormFornecedoresCRUD formFornecedoresCRUD; private void clientesToolStripMenuItem_Click(objectsender, EventArgs e) { if (formClientesCRUD == null) formClientesCRUD = new FormClientesCRUD(); formClientesCRUD.Show(); } private void fornecedoresToolStripMenuItem_Click(objectsender, EventArgs e) { if (formFornecedoresCRUD == null) formFornecedoresCRUD = new FormFornecedoresCRUD(); formFornecedoresCRUD.Show(); }

Dica: H situaes em que no seja permitido que o usurio acesse outra janela da aplicao enquanto no terminar uma atividade especfica. Sendo assim preciso proibir que ele acesse as janelas atrs da atual. Isso muito simples, basta que ao invs de se chamar o mtodo Show() seja chamado o mtodo ShowDialog().

Mudando de SDI para MDI


No exemplo criado anteriormente, uma janela criada, como a de Clientes, vista como uma janela independente. Faa um teste, altere no formulrio da janela principal a propriedade WindowState para Normal, execute sua aplicao e chame as janelas criadas (Clientes e Fornecedores). Veja que as janelas so independentes e podem ser arrastadas para qualquer parte da rea de trabalho (Desktop). Essa a caracterstica de aplicaes SDI e isso em algumas situaes pode no ser uma boa poltica. Desta forma, vamos alterar a aplicao para que faa uso dos recursos de uma aplicao MDI. O primeiro ponto saber que o controle ToolStripContainer no pode ser utilizado em aplicaes MDI, desta forma os strips devem ser colocados diretamente no formulrio e perde-se a capacidade de ancoragem dos strips nas laterais da pgina, mesmo visualizando o Grip nas strips. Retire o ToolStripContainer de sua janela principal ou crie uma outra. Para no perder as barras e menus criados, mova-os para fora do ToolStripContainer de modo que fiquem associados ao formulrio. Para o formulrio principal, configure especificamente a propriedade daTabela 5.

Observe a atribuio formClientesCRUD.MdiParent = this abaixo da criao do objeto. Esta atribuio define como janela pai do formulrio criado o formulrio atual, que neste caso a janela principal. A ltima linha tem a responsabilidade de desabilitar o item do menu do respectivo evento, para que o usurio no possa criar novamente a janela antes que ela seja fechada. Execute sua aplicao e procure mover a janela de clientes dentro da principal e voc ver que ela no sai dos limites da rea cliente, ocultando a parte que no couber nos limites, como mostra a Figura 6.

Veja que ambas as janelas ficam abertas e visveis, permitindo a visualizao de mais de uma janela ao mesmo tempo e isso realmente muito bom. Uma vez acessado um formulrio, sua opo de menu desabilitada, como visto pelo cdigo das Listagens 4 e 5, desta forma, preciso pensar em como tornar o menu ativo novamente e, isso pode ser feito no momento em que a janela fechada, como mostra a implementao da Listagem 6. Veja que o cdigo da Listagem 6 traz a implementao para o evento FormClosed do formulrio de clientes. Este cdigo obtm o primeiro menu do MainStripMenu definido na janela principal (MdiParent), que o Cadastro e ento obtido o primeiro item de menu, que Clientes e ento este item tornado habilitado novamente. importante que a propriedade MainMenuStrip do formulrio que representa a janela principal tenha atribudo a ela o menu principal. Mas como chamar novamente uma janela que j foi aberta e teve sua opo de acesso via menu, desabilitada, sem ter que fechar esta janela para novamente habilitar o menu? O prximo item trata esta situao e algumas outras.

Listagem 6. Habilitando menu para criao de janela


private void FormClientesCRUD_FormClosed(object sender, FormClosedEventArgs e) { (MdiParent.MainMenuStrip.Items[0] as ToolStripMenuItem) .DropDownItems[0].Enabled = true; }

Criando um menu para as janelas ativas em uma aplicao MDI


Em algumas aplicaes MDI comum verificar como ltimo menu na barra um menu chamado Janela ou Window. Neste menu aparece uma relao de todas as janelas ativas e opes para organizar as mesmas dentro da Janela MDI parent. Crie um novo menu ao lado do de Relatrios, d a ele o nome mnuJanelas e na propriedade Text informe o valor Janelas (ou Window). Agora, selecione o MenuStrip e na propriedade MdiWindowListItem selecione este novo menu criado. Execute sua aplicao, abra os dois formulrios de cadastro e clique no menu Window, ele dever estar semelhante ao apresentado pela Figura 7.

Em aplicaes MDI, onde vrias janelas abertas ao mesmo tempo ficam todas dentro da regio destinada a elas no Parent Form, preciso poder organizar estas janelas. Inclua no menu Window (ou Janela) as opes Cascata, Lado a Lado e Fechar Janela Atual (veja que existe um separador antes da ltima opo, para inseri-lo, coloque um hfen na propriedade Text), como mostra a Figura 8.

A implementao para os itens criados no menu apresentado pelaFigura 8 pode ser vista na Listagem 7. Para criar os manipuladores para os eventos mostrados, voc pode simplesmente dar um duplo clique sobre os itens de menu, isso equivale a acionar a janela de propriedades e dar um duplo clique no lado do evento Click.

Dica: Voc pode configurar o Click dos botes da barra de tarefas para simplesmente apontarem para os mesmos mtodos dos itens de menu, para no reescrever cdigo. Para isso, basta selecionar o boto, ir at os eventos na janela de Propriedades e escolher na caixa suspensa do evento Click o respectivo mtodo.

Execute sua aplicao, abra os dois formulrios, v no meu Window (ou Janela) e teste as novas opes. Existem outras possibilidades de layout, que certamente voc notou ao digitar o texto.

Listagem 7. Cdigo para organizao das janelas


private void cascataToolStripMenuItem_Click(objectsender, EventArgs e) { LayoutMdi(MdiLayout.Cascade); } private void ladoALadoToolStripMenuItem_Click(objectsender, EventArgs e) { LayoutMdi(MdiLayout.TileVertical); } private void fecharToolStripMenuItem_Click(object sender,EventArgs e) { ActiveMdiChild.Close(); }

PRIMEIROS PASSOS COM A LINGUAGEM C#


Para que serve Os fundamentos do C# e seus elementos bsicos so usados em qualquer tipo de aplicao, quer seja um simples programa de console, como os que sero apresentados neste artigo, a aplicaes Windows Client (Windows Forms, WPF etc.), aplicaes Web, Web Services etc. Em todos estes tipos de programas os elementos bsicos do C# so usados intensivamente e o seu conhecimento desde o incio facilita o trabalho do programado Em que situao o tema til Muitas vezes aparecem situaes nas tarefas de programao em que um problema aparentemente simples de se resolver comea a dar mais

trabalho do que o esperado. Isto se deve muitas vezes a uma falta de conhecimento mais profundo dos elementos bsicos de uma linguagem de programao. Com os elementos apresentados aqui, espera-se que algumas tarefas sejam simplificadas e tragam ao desenvolvedor uma produtividade maior, podendo servir de referncia para consultas posteriores. Os programas de computador so ferramentas usadas para resolver problemas do dia-a-dia para as pessoas. Podemos escrever um programa em um 100 nmero de linguagens, cada uma delas tendo suas regras prprias, seu controle de fluxo de programa, seus tipos de dados suportados e classe de programa que mais se apropria a resolver. Com o lanamento do framework .NET pela Microsoft, uma nova linguagem surgiu: o C#. Esta linguagem que tem caractersticas parecidas com outras linguagens como C++ e Java, uma linguagem orientada a objetos que permite que todas as classes do framework .NET sejam usadas e consequentemente todos os recursos desta plataforma estejam acessveis ao programador. possvel escrever vrios tipos de aplicaes com C# quer sejam programas de console, que o ponto de partida para este artigo, at aplicativos mais complexos como Web Services, aplicaes Web entre outros. Uma vez que o C# est vinculado com o framework .NET, o ponto mais importante conhecer as classes e recursos desta plataforma, o que no dispensa o programador de conhecer as particularidades da linguagem. Para fazermos nosso estudo iremos utilizar o Visual Studio 2008. Faremos uso de aplicaes console para poder focar mais na linguagem do que na criao de elementos da interface, sendo que estes podero ser tratados em uma ocasio futura visto que a criao de interfaces com o usurio um assunto extenso. Aos poucos, iremos expondo os principais elementos da linguagem e acrescentando complexidade atravs de cdigos de exemplo.

Criando um programa no Visual Studio


Os programas no Visual Studio so tratados como projetos. Cada programa deve ser criado como um projeto em separado. Vrios projetos podem ser agrupados dentro de uma soluo (Solution). Vamos comear criando uma solution na qual criaremos nossos projetos. Abra o Visual Studio e atravs dos menus File > New > Project (Figura 1), abra a janela para criar uma nova solution. Observe na Figura 2 as configuraes feitas para criar a nova solution.

Figura 1.

Criando um novo projeto

Figura 2.

Janela para criao do novo projeto

Uma vez escolhidas as opes, o Visual Studio exibe uma tela para que seja escrito o cdigo j com o primeiro modelo de programa console que podemos usar. A Figura 3 demonstra como ficou o modelo ao terminarmos de criar o projeto.

Se voc nunca usou o Visual Studio vou destacar alguns elementos importantes nesta interface: - Aba de edio de arquivo: localizada abaixo das barras de ferramentas, esta aba mostra todos os arquivos da soluo que esto abertos. Geralmente um programa pode ter vrios arquivos, cada um sendo usado para armazenar uma classe, formulrio ou poro especfica do cdigo. Voc pode alternar entre estas pginas atravs do teclado usando CTR+TAB; - Janela Solution Explorer: mostra todos os projetos componentes da solution e tambm os arquivos e pastas que fazem parte da mesma. Funciona como uma janela do Windows Explorer, sendo que muitas opes esto disponveis ao clicar sobre um elemento com o boto direito do mouse. Um programa do tipo console em C# no ir possuir elementos de interface com o usurio, sendo esta feita atravs de uma janela do prompt de comandos do Windows. Ento, vejamos a estrutura bsica deste programa na Listagem 1.

Listagem 1. Estrutura bsica de um programa console


1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace CSharpFundamentos 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 } 12 } 13 }

A linguagem C# orientada a objetos. Logo, tudo o que fizermos nela ser feito usando os conceitos deste tipo de programao. Mesmo quando estamos fazendo um simples programa de console, usaremos classes e o programa em si precisar ser definido dentro de uma classe. Neste programa estamos importando os principais namespaces do framework atravs das instrues using que devem ser includas no comeo do programa. Existem muitos destes namespaces e cada classe dever fazer uso de elementos especficos. Para comearmos o nosso programa o Visual Studio j incluiu aqueles que so os mais comuns. Podemos deixar como est. O nosso programa possui ele prprio um namespace indicado logo abaixo dos usings. Este elemento pode ser omitido em programas mais simples, mas existem casos como, por exemplo, quando formos criar uma biblioteca de classes (class library) que usualmente representada pelos arquivos DLL do Windows, em que o uso de namespaces facilitar a organizao separando as classes conforme sua funcionalidade. Como foi dito, cada programa em C# ele prprio uma classe ento, logo abaixo da indicao do namespaces, colocamos a identificao da classe. Finalmente, como se trata de uma aplicao do tipo console, precisamos ter o mtodo principal que se torna o ponto de entrada do programa. Isto indicado atravs da criao de um mtodo (funo da classe) do tipo esttico (static) que no faz nenhum tipo de retorno (void) nomeado como Main, este nome deve ser seguido sempre que criarmos mtodo principal de uma aplicao console. Um ponto fundamental da linguagem C# que ela case sensitive, ou seja, faz diferenciao entre maisculas e minsculas logo: using diferente de Using e main no ser considerado ponto de entrada do programa sendo necessrio seguir a sintaxe Main. Nos exemplos que forem colocados neste artigo observe cuidadosamente este detalhe.

Exibindo dados no console


Uma primeira tarefa a ser feita possibilitar exibio de dados no programa para o usurio. C# possui vrias formas de fazer isto, na Tabela 1seguem os principais mtodos, todos eles da classe Console. Escreva o programa da Listagem 2 para verificar o funcionamento destes mtodos.

Tabela 1.

Mtodos para entrada de dados pelo console

Listagem 2. Escrevendo no console


1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace CSharpFundamentos 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 // posiciona o cursor 12 Console.SetCursorPosition(0, 0); 13 // escreve o texto na posio 14 Console.Write("Canto Superior Esquerdo"); 15 Console.SetCursorPosition(55, 0); 16 Console.Write("Canto Superior Direito"); 17 Console.SetCursorPosition(0, 24); 18 Console.Write("Canto Inferior Esquerdo"); 19 Console.SetCursorPosition(56, 24); 20 Console.Write("Canto Inferior Direito"); 21 // interrompe a execuo do programa 22 // aguarda o pressionamento do ENTER 23 Console.ReadLine(); 24 } 25 } 26 }

O programa posiciona o cursor do console em uma posio e escreve um texto ali. Aps fazer isso, interrompe a execuo do programa e aguarda at que seja pressionada a tecla ENTER para que quando estiver sendo executado a partir do Visual Studio pela tecla F5, seja possvel visualizar o contedo da janela do programa. A sua execuo deve resultar em algo parecido com o da Figura 4.

Uma tarefa muito comum em programas do tipo console ler alguma informao que foi passada pelo usurio e exibir esta na tela. A Listagem 3d um exemplo disto. Altere o seu programa e execute para que possamos a partir deste, vermos outros elementos da linguagem C#.
9 static void Main(string[] args) 10 { 11 Console.Write("Informe o seu nome por favor: "); 12 // muda a cor de fundo do texto 13 Console.BackgroundColor = ConsoleColor.White; 14 // muda a cor do texto 15 Console.ForegroundColor = ConsoleColor.Black; 16 // recebe uma entrada de texto e armazena 17 string Nome = Console.ReadLine(); 18 19 Console.ResetColor(); 20 Console.WriteLine("Usuario conectado: {0}", Nome); 21 Console.ReadKey(); 22 }

No exemplo da Listagem 3 apresentamos um texto para o usurio solicitando que ele digite o nome, na linha seguinte (13), para darmos um efeito diferente mudamos a cor de fundo do console e a cor do texto. Em seguida, armazenamos a entrada do console em uma varivel do tipo string atravs da instruo Console.ReadLine. Na linha seguinte, retornarmos as cores originais do console e apresentamos o contedo da varivel Nome na tela. O resultado do programa deve ser parecido com o da Figura 5.

Nota: Observe na Linha 17 da Listagem 3 a sintaxe de declarao de uma varivel no C#: <tipo> nomevariavel = valor inicial

Note que na instruo Console.WriteLine, escrevemos uma mensagem e concatenamos o texto inserindo um parmetro representado pelas chaves {} e um algarismo. Com o C# possvel fazer concatenao de dados para uma sada atravs do uso de uma expresso seguindo o seguinte padro: Console.WriteLine(<string> {parmetro<0>} {parmetro<1>} {parmetro<n>}, parmetro<0>, parmetro<1>, ... parmetro <n>)

Entenda da seguinte forma: - As aspas indicam que dentro delas definida a mensagem a ser exibida; - Para mostrar valores de parmetros, coloque dentro das aspas o nmero do parmetro (iniciando sempre em zero) envolvido pelas chaves {} e, aps fechar a string com as aspas, coloque os parmetros no mesmo nmero que foi includo dentro da string. Vamos dar continuidade aos nossos estudos no C#, examinando agora os operadores da linguagem.

Operadores de atribuio
Operadores de atribuio so usados para armazenar um valor para as variveis de memria. O mais comum e utilizado o de igualdade (=), como podemos conferir na linha 13 da Listagem 3. A Tabela 2 mostra outros operadores.

Listagem 3. Lendo dados do usurio


9 static void Main(string[] args) 10 { 11 Console.Write("Informe o seu nome por favor: "); 12 // muda a cor de fundo do texto 13 Console.BackgroundColor = ConsoleColor.White; 14 // muda a cor do texto 15 Console.ForegroundColor = ConsoleColor.Black; 16 // recebe uma entrada de texto e armazena 17 string Nome = Console.ReadLine(); 18 19 Console.ResetColor(); 20 Console.WriteLine("Usuario conectado: {0}", Nome); 21 Console.ReadKey(); 22 }

Operadores matemticos
Os operadores matemticos so usados para executar operaes aritmticas no C#. Veja a lista na Tabela 3.

Armazenando os dados - tipos de variveis


Todos os programas tero pelo menos dois elementos fundamentais: dados a serem processados e a lgica de processamento destes dados. A lgica de processamento consiste no algoritmo a ser usado para a resoluo do problema propriamente dito, j os dados representam valores a serem manipulados. Em todas as linguagens de programao os dados so armazenados na memria atravs de variveis. No C# isto ocorre da mesma forma, sendo que existem dois grandes tipos de variveis conforme o tipo de armazenamento feito: tipos armazenados por valor e por referncia. Tipos armazenados por valor ou Value Types so aqueles em que o dado armazenado diretamente na memria. Ao se criar uma cpia destes dados, cria-se outra varivel sem vnculo nenhum com a varivel anterior. J os tipos por referncia fazem uma referncia a um endereo da memria onde os dados so armazenados e ao copiarmos o contedo de uma varivel para outra, estes ficam interligados e modificaes feitas em uma varivel alteram o valor da cpia desta.

Tipos por valor


Os tipos de dados por valor do C# so os dados nativos como aqueles usados para armazenamento de nmeros inteiros e de ponto flutuante e tipos definidos por usurios como as structs. Na Tabela 4 temos exemplos de tipos nmeros de valor. Observe nessa tabela que temos o tipo nativo do .NET Framework (tipo) e o equivalente em C# (Sintaxe C#), que funciona como um alias.

Com relao aos tipos de dados numricos, um ponto importante a ser observado a faixa de dados que a capacidade de armazenamento suportada pelo tipo. Normalmente, um tipo de dados com faixa de dados superior, pode receber um valor vindo de uma varivel com capacidade inferior. Por exemplo, uma varivel do tipo int pode receber valores de uma varivel do tipo short, mas o contrrio no pode ser feito sendo gerado um erro de programao, conforme a Listagem 4 demonstra. Ao tentar compilar o programa o erro da Figura 6 exibido.

Tabela 4.

Tipos de dados numricos do C#

Figura 6.

Mensagem de erro ao tentar compilar o programa

O mesmo acontece se quisermos armazenar um valor de uma varivel do tipo inteiro em uma varivel de ponto flutuante como, por exemplo, double ou float. Logo, observe a capacidade de armazenamento de cada tipo ao utilizar tipos numricos em C#. A inicializao de tipos numricos de ponto flutuante deve ser feita adicionando os sufixos M para inicializar tipo decimal e F para float (veja um exemplo na Listagem 5). Caso isto no seja feito o compilador ir apresentar uma mensagem de erro. O cdigo gera os erros de compilador mostrados na Figura 7. Na Tabela 5 podemos ver mais alguns tipos de dados passados por valor.

Figura 7.

Erro ao inicializar incorretamente ponto flutuante

Tabela 5.

Tipos de dado por valor (continuao)

Tipos de dado por referncia


So tipos de dados em que a varivel armazena o endereo da memria em vez do dado propriamente dito. Com isso, ao copiar o contedo de uma varivel para outra, teremos na verdade duas variveis apontando para um mesmo endereo da memria o que far com que, ao se alterar o contedo de uma varivel, o mesmo acontea com suas cpias. Existem milhares de tipos por referncia nativos no framework. A Tabela 6lista algum dos mais comuns. Vejamos na Listagem 6 o que acontece ao criarmos cpias de dados em variveis por referncia.

Tabela 6.

Alguns tipos passados por referncia

Estamos usando StringBuilder para criar um objeto que armazena vrias strings e retorna uma string final com o mtodo .ToString(). Ao criarmos a varivel sb1 e adicionarmos um valor para ela, estamos referenciando um endereo de memria. Quando copiamos seu contedo para a varivel sb2, o contedo de sb1 copiado para ela, o que j era esperado, entretanto, na linha 22 ns adicionamos um novo valor apenas para a varivel sb1. Mas, ao exibirmos o contedo das duas variveis, note que sb2 ficou com o mesmo contedo de sb1. Veja o resultado na Figura 8.

Figura 8.

Executando testes com variveis por referncia

Modificadores de acesso
Em C# a visibilidade de uma varivel pode ser alterada para que seja possvel acess-la dentro e fora da classe, apenas dentro da classe ou apenas para o executvel / assembly atual. Isto feito com os modificadores de acesso private, public e internal (existem outros como protected). Uma varivel definida como private s vai poder ser acessada dentro da classe em que foi criada. J uma varivel com o modificador de acesso public acessada de qualquer ponto do programa, at mesmo fora da classe em que foi criada. J uma varivel com o modificador internal s pode ser acessada dentro do assembly em que foi criada. No exemplo daListagem 7 criamos uma classe com campos pblicos e privados. Essa classe um tipo que representa uma Pessoa, que tem um identificador, um nome e uma data de nascimento (falaremos mais sobre classes adiante).

Em seguida, criamos uma instncia desta classe no programa, o que chamamos de funcionario. Ao pressionarmos o ponto . para visualizarmos quais campos esto visveis (Figura 9), notamos que somente aqueles marcados como public esto disponveis para serem usados.Um ponto importante nos modificadores de acesso que se no declararmos o tipo de acesso, private assumido como o padro. Para maiores detalhes na criao de classes, veja o tpico Classes em C#.

Figura 9.

Visualizando campos "public"

Inicializao de variveis - tipos implcitos


A partir da verso 3.0 do C# no mais obrigatrio que se declare o tipo de uma varivel ao se inicializ-la. Isto pode ser feito com o inicializador dinmico var e o tipo da varivel fica implcito conforme o tipo do valor que foi armazenado pela varivel. Observe que usando var aps a inicializao das variveis, o prprio IntelliSense do Visual Studio j assume o tipo correto apresentando mtodos e propriedades relacionados com o tipo de dado armazenado (Figura 10). Este recurso tambm conhecido como Type Inference. Isto pode ser feito com qualquer tipo de inicializao de dados desde que seja possvel para o C# deduzir qual o tipo do dado que ser armazenado na varivel.

Figura 10.

Usando "var" e inspecionando o tipo - Na figura, o compilador sabe que nome uma string

Tipos de dados definidos pelo usurio - Struct


Em alguns casos necessrio armazenamento de dados complexos como, por exemplo, dados de endereo de uma pessoa. Pode-se fazer isto atravs do uso de um tipo chamado de struct em C#. Deve-se definir quais os campos iro fazer parte da varivel. A Listagem 8 exemplifica o uso de uma struct. Uma struct bem parecida com uma classe, uma vez que temos que criar uma varivel para poder acessar os seus membros, porm, este um tipo por valor enquanto a classe um tipo por referncia. Neste exemplo criamos um struct para armazenar dados de um funcionrio. Estamos definindo todos os campos como pblicos para serem visveis ao criarmos uma instncia. Ao fazermos isso na linha 18, precisamos em seguida atribuir valores para os

campos criados. Para criarmos um valor para o campo de data de nascimento, que do tipo data, usamos um construtor que passa como parmetros o ano, o ms e o dia. Em seguida, fazemos a exibio destes dados. Note que estamos fazendo uma formatao destes dados.

Por exemplo, para formatar a data usamos a expresso dd/MM/yyyy e para formatar o salrio n2, o resultado deste programa pode ser conferido naFigura 11. Nota: Para voc conhecer mais sobre formatao de string, consulte mais sobre o tpico String.Format no framework .NET. Existem inmeros formatos de dados que podem ser teis quando necessitar exibir nmeros, datas ou qualquer outro dado formatado.

Classes em C#
As classes na linguagem C# tm uma grande importncia assim como em qualquer linguagem orientada a objeto. Ser com elas que voc ir desenvolver as solues para os problemas que seus programas iro resolver. Neste artigo, vamos aprender como criar uma classe com seus elementos bsicos. Existem vrias consideraes que sero omitidas neste artigo tais como, por exemplo, o uso de interface e tambm herana. As classes so definidas com a palavra chave class precedida do seu tipo de acesso: public, private ou internal. Os campos (atributos, propriedades etc.) e mtodos devem ser criados sendo precedidos pelo modificador de acesso e tambm o tipo de dado do campo ou de retorno do mtodo. Para mtodos que no retornam nenhum valor usa-se a palavra o tipo void (vazio). Uma classe pode ter construtores parametrizados onde, valores iniciais so passados para a classe, um construtor padro, sem nenhum parmetro, ou ambos. Podemos tambm invocar um construtor padro a partir de um construtor parametrizado, fazendo com que uma inicializao feita pelo construtor sem parmetros possa ser invocada quando utilizarmos os construtores parametrizados. Na Listagem 9 temos um exemplo de uma classe.

Nota: Observe que no C# o nome do construtor leva o mesmo nome da classe.

Neste cdigo criamos os campos com os modificadores de acesso apropriados. Tambm fizemos dois construtores: um deles no recebe nenhum parmetro e inicializa a varivel ID, o outro recebe parmetros para as demais variveis porm, no inicializa o campo ID. Fazemos a inicializao deste campo invocando o construtor padro atravs do uso de this, como est destacado no cdigo na linha 29. Se formos consumir esta classe no nosso cdigo podemos fazer de vrias formas, vejamos a tradicional conforme a Listagem 10.

Note que no h nenhuma diferena entre este cdigo e o que foi usado para a struct. Entretanto considere o cdigo da Listagem 11. A partir deste exemplo, j instanciamos a classe passando os parmetros que sero usados como est representado a partir da linha 41. Com isso, usamos a segunda verso do nosso construtor, parametrizada. Entretanto, com a verso 3.0 do C#, outro tipo de inicializao de classes mais resumido e sofisticado tornou-se possvel. Altere a classe para que fique sem o inicializador parametrizado, conforme a Listagem 12. Em seguida, vamos instanciar a classe, mas nomeando as variveis pblicas e passando os valores para eles. No necessrio obedecer a ordem de criao, embora esteja em ordem no cdigo (Listagem 13). Isto pode ser feito com todas as classes dentro do framework 3.0, certamente uma maneira bem mais clara de se inicializar um objeto. Este recurso tambm conhecido como Object Initializer.

Valores nulos
Um tipo especial de variveis dentro do C# so aquelas que recebem valores nulos, ou seja, aquelas que ainda no foram inicializadas. Algumas variveis como as numricas possuem valores padro como zero no caso destas. Entretanto, existem tipos de dados que no possuem um valor padro ficando seu contedo na memria como nulo at serem inicializados. Considere por exemplo um formulrio de entrada de dados de uma aplicao Windows onde um usurio deve digitar algum valor. Enquanto ele no digitar nada, o valor estar vazio, ou seja, no ter nada. Em alguns casos necessrio considerar valores nulos mesmo para variveis que originalmente no suportam este tipo de dado. Isto feito em C# usando-se a palavra chave nullable<tipo do dado> ou incluindo-se um ? ao lado do tipo do dado. Exemplo: nullable<int> Var; ou int? Var;

Neste caso antes de fazer comparaes com os dados, precisamos certificar que o campo possui algum valor. Somente quando a varivel puder receber valores nulos isto poder ser feito, verificando-se a propriedade HasValue:

// Verifica se a varivel possui valor

if (Var.HasValue) { // algum cdigo aqui ... }

Arrays
Arrays ou vetores so uma coleo de valores do mesmo tipo de dados. Eles so criados no C# declarando-se o tipo da varivel seguido de colchetes []. Da mesma forma, para acessar o atribuir os valores de um elemento do array, colocamos entre os colchetes o nmero do ndice do elemento dentro deste. Declarando um array de strings:

string[] aNomes;
Opcionalmente, podemos declarar a dimenso do array:

string[10] aNomes;
Neste caso precisaremos inicializar manualmente cada ndice, lembrando que em C# sempre iniciamos a contagem com zero no indexador (nmero entre os colchetes) e o ltimo elemento do array ser igual a dimenso do array menos um. O cdigo da Listagem 14 demonstra a criao de um array de nmeros inteiros de cinco posies.

Uma outra forma criar o array e inicializar seus valores diretamente:

int[] nums = { 123, 0, 199, 9, 4};


Os arrays que criamos at aqui so unidimensionais, ou seja, possuem apenas uma coluna e um valor para cada elemento. possvel criar-se arrays

bidimensionais com C# da seguinte forma:

int[,] nums; nums[0,0] = 1; nums[0,1] = 2;


Neste caso, o primeiro indexador refere-se linha e o segundo coluna do vetor.

Controle de repeties de instrues


Faa uma reviso nos vetores (arrays) que criamos at aqui. Se quisermos inspecionar o valor de cada elemento do vetor temos que percorrer todos os valores. Isto pode ser feito de vrias formas no C# usando-se os controles de repetio de instruo do C# que so: - While - Do while - For - Foreach

While
usado sempre que quisermos que uma poro de cdigo seja executada enquanto uma determinada condio for satisfeita. Sua sintaxe bsica a seguinte:

while( <condio>) { <instrues> }


Veja um exemplo na Listagem 15.A partir da linha 12, inicializamos o vetor e em seguida a varivel que ser usada para indexar os elementos. A condio para a execuo que seja executado at a varivel i ser menor < do que o tamanho do vetor. Observe que para sabermos o tamanho do array (nmero de elementos que ele possui) acessamos a propriedade Length.

Do While
Neste tipo de controle de fluxo, a instruo executada pelo menos uma vez e ento a condio para que seja executada verificada.

do { <instrues> } while ( <condio> );


Vemos um exemplo de uso na Listagem 16. Note que basicamente inverteuse o loop que fizemos com o while, jogando esta palavra chave para o final do loop. Por causa disto, deve-se tomar cuidado com o incremento da varivel que controla os elementos para que no ultrapasse o limite mximo do vetor.

For
Com este tipo de loop, estabelece-se um indexador, uma condio para que ele seja executado e seu incremento:

for (<declarao da varivel de ndice>; <condio>; <incremento>) { <instrues> }


Na Listagem 17 temos um exemplo de uso do For.

Foreach
Com este loop a execuo mais simplificada ainda, pois no se usa um indexador. Por esse motivo, as chances da haver um erro so menores, pois no h como o programador por descuido ultrapassar os limites do array. A sintaxe bsica do foreach a seguinte:

foreach(<tipo> <variavel> in <array>) { <instrues> }

Na Listagem 18 temos um exemplo de uso do Foreach.

Controle de fluxo condicional do programa


Os seguintes elementos permitem que o controle do fluxo do programa seja feito conforme condies especficas: - if-else - switch

If-else o controle de fluxo mais comum usado, basicamente deve se colocar a condio a ser avaliada dentro do parnteses seguida do cdigo a ser executado. Em seguida, a palavra chave else seguida do bloco de cdigos a ser executado, caso seja necessrio especificar um comando a ser executado caso a expresso no seja verdadeira. O cdigo daListagem 19 verifica se um nmero par ou mpar atravs do operador mdulo %, que retorna o resto de uma diviso por um determinado nmero.

Existe uma outra maneira de fazer isso usando o if in line, a sintaxe bsica a seguinte:

(<condio> ? Valor se verdadeiro : Valor se falso)


O cdigo da Listagem 19, adaptado para usar este recurso, fica como

naListagem 20.

Operadores relacionais
A Tabela 7 mostra os operadores quepermitem executar comparaes e verificar condies no C#.

Alm destes, existem os operadores lgicos que podem ser usados para acrescentar verificaes nas comparaes ou condies para execuo do programa (Tabela 8).

Operador switch
Em C# existem casos que mltiplas verificaes do valor de uma varivel devem ser feitas. Neste caso, vejamos como faramos isso com if-else (Listagem 21). Porm esta forma de executar testes lgicos se torna extensa. Como alternativa, para quando mltiplos valores podem ser atribudos a uma varivel, podemos usar o bloco switch, onde colocamos no switch o valor que ser inspecionado e para cada case, uma possibilidade de valor, seguido das instrues finalizando o bloco com break (Listagem 22).

Para cada valor encontrado, escrevemos um cdigo aps o case. Se nenhum valor for encontrado, usamos o bloco default para fazer o tratamento. Uma das vantagens deste bloco que podemos fazer um nico cdigo para mltiplas opes. Vamos imaginar que seja informado o pas UK (Reino unido) que tambm fala o idioma ingls, ou ainda os pases ESP (Espanha) ou PY (Paraguai), que tambm falem o idioma espanhol, para isso basta inspecionar os valores e deixar o bloco de cdigo em branco, agrupando todos eles da forma como segue na Listagem 23.

ASP.NET PARA DESENVOLVEDORES DESKTOP


Em que situao o tema til Para que serve Serve para orientar de forma correta e imparcial desenvolvedores Desktop a iniciarem seus trabalhos na Web com ASP.NET reaproveitando os conhecimentos que j possuem. Hoje ter uma soluo baseada na Internet deixou de ser uma opo ou vantagem, uma obrigao. Este artigo ser til para orientar empresas e desenvolvedores nos cuidados necessrios ao iniciar os trabalhos no desenvolvimento Web com ASP.NET. H um bom tempo empresas e desenvolvedores detectaram que possuir uma verso Web de seus produtos Desktop seria uma excelente opo. Estavam completamente certos. A Web se tornou o novo padro para desenvolvimento dos mais variados tipos de aplicaes. Entretanto, muitas empresas preferiram no arriscar na nova onda do mercado, muito tendo em vista preocupaes tecnolgicas. Qual a melhor tecnologia para desenvolvimento Web se eu e minha equipe j possumos um bom know-how no desenvolvimento Desktop? Hoje aquela opo se tornou dor de cabea para muitos, pois no ter um sistema na Web ou pelo menos parte dele um problema, um grande problema. Deixou de ser opo, uma obrigao.

Nesse sentido vemos hoje uma infinidade de profissionais procura de material e aperfeioamento para portar ou migrar completamente sistemas Desktop para ambiente Web, ou mesmo iniciar seus novos projetos na plataforma Web, aproveitando seu vasto conhecimento adquirido durante anos de desenvolvimento para Windows. Muitos pontos devem ser levados em considerao neste caso, sair migrando tudo de uma nica vez certamente um risco. Aplicaes Desktop tero sua serventia por muitos e muitos anos ainda. Principalmente aplicativos comerciais continuaro a rodar na plataforma Windows, esse o melhor caso, por exemplo, para aplicativos de frente de caixa e softwares de automao. H muitos anos a Web realmente tinha suas limitaes, as tecnologias de desenvolvimento eram literalmente arcaicas. Nos primrdios da Internet, basicamente o que tnhamos eram pginas estticas com contedo textual e algumas imagens, normalmente atravs da utilizao de HTML puro.A Internet comeou a se tornar dinmica com a incluso das linguagens servidoras. Por exemplo, a tecnologia CGI permitiu incluir dados dinmicos em pginas, como dados vindos de um banco de dados. Hoje a histria outra. Temos um leque muito grande de opes para o desenvolvimento de aplicativos Web. Tecnologias, linguagens, ambientes de desenvolvimento e frameworks facilitam a criao de softwares baseados na Internet. E quem sempre desenvolveu para Desktop, e nunca ps a mo em uma linha de cdigo em ambiente Web, qual a melhor opo? Aqui entra o ASP.NET.

ASP.NET como opo para desenvolvedores Desktop


O ASP.NET revolucionou o mercado de desenvolvimento para Web quando surgiu, por permitir o desenvolvimento de aplicaes de forma visual, o que comum para desenvolvedores que utilizam o ambiente Desktop. Usando o Visual Studio, desenhamos um formulrio (Web Form) arrastando controles para a tela, o que chamamos de desenvolvimento drag & drop (arrastar e soltar). Os controles servidores do ASP.NET so os principais responsveis pela facilidade do desenvolvimento visual. Os ASP.NET Server Controls encapsulam a gerao de cdigo HTML e permitem um desenvolvimento orientado a objetos, usando boas prticas de programao. O desenvolvedor no precisa se preocupar em conhecer detalhes especficos da plataforma Web, como gerao de cdigo HTML para rodar no browser, tratamento de requisies HTTP, uso de protocolos de baixo nvel etc. Desenvolvemos da mesma forma que estvamos acostumados no Desktop. Controles ASP.NET tm propriedades, mtodos e eventos, assim como componentes utilizados em ambiente Desktop. Se pararmos para pensar como isso era feito antes, lembraremos das Actions no servidor, que eram usadas para recuperar informaes no tipadas diretamente de formulrios Web, manipular HTML, gerar novas tags e devolver um novo contedo. Tudo isso misturado em um nico arquivo. No ASP.NET, configuramos propriedades visualmente, programamos no servidor usando uma linguagem

de alto nvel, podendo desfrutar de todos os recursos da orientao a objetos. O que quero dizer com tudo isso? O ASP.NET sem dvida alguma a melhor opo para o desenvolvimento Web para quem j tem prvios conhecimentos com linguagens de desenvolvimento Desktop. E mesmo para quem nunca desenvolveu qualquer tipo de aplicao, o ASP.NET tambm se mostra uma excelente opo: produtivo, intuitivo, robusto, fcil, com excelente documentao e recursos disponveis para seu aprendizado, est em constante evoluo ( muito importante apostar em uma tecnologia que voc sabe que no vai nascer e morrer da noite par o dia), possui uma grande comunidade ao redor do mundo e muito mais. Este artigo no um tutorial prtico nem tem por objetivo desenvolver um exemplo completo, mas permita-me mostrar um paralelo claro do que estou querendo dizer. Uma das aplicaes mais famosas que sempre vi durante meus estudos em uma das linguagens mais populares para o desenvolvimento Desktop, o Delphi, consistia do formulrio da (Figura 1). Note os controles usados, um Edit, um ListBox e um Button. Este formulrio foi criado visualmente, nada de programao, simplesmente arrastamos os controles para dentro do designer. A funo dele adicionar no ListBox os itens digitados no Edit, quando o boto for clicado. O cdigo do evento OnClick do boto pode ser visto aqui: procedure TForm1.Button1Click(Sender: TObject); begin ListBox1.Items.Add(Edit1.Text); end;

E na Web? Exatamente igual, no existe diferena alguma. Duvida? Arrastamos os mesmos controles para o designer do Visual Studio, digitamos o mesmo cdigo e rodamos (Figura 2). Claro, aqui no temos Edit, temos o TextBox. Talvez seja a maior curva no aprendizado deste exemplo. O cdigo a seguir mostra a implementao do Click do boto, em C#:

protected void Button1_Click(object sender, EventArgs e) { ListBox1.Items.Add(TextBox1.Text); }

Figura 1.

Uma aplicao Desktop tradicional de exemplo

Figura 2.

Uma aplicao Desktop tradicional, agora na Web

A propsito, tambm possvel desenvolver para ASP.NET usando o Delphi Prism com o Visual Studio, exatamente da mesma forma, o cdigo : method Default2.Button1_Click(sender: System.Object; e: System.EventArgs); begin ListBox1.Items.Add(TextBox1.Text); end; claro, o .NET framework tem um conjunto de classes bastante vasto, existem inmeras opes para realizar uma tarefa (um exemplo claro so as diversas formas de acesso a banco de dados). Alm disso, muitos programadores Desktop sentem maiores dificuldades no na utilizao de uma linguagem ou ambiente diferente (pois so muito parecidos), mas na quebra de paradigma Web versus Desktop. Costumo dizer que, muitas vezes, mais difcil migrar uma mente do que um cdigo. Partindo disto, vamos examinar alguns cuidados, dicas e tcnicas para voc no ter problemas ao iniciar seus trabalhos no ASP.NET.

Dicas para um bom desenvolvimento Web


Em primeiro lugar, tenha em mente que uma pgina no um formulrio do Windows. Na Web, muitas coisas que fazemos com tranquilidade no Desktop

exigem um pouco mais de esforo. s vezes, eu realmente sugiro que voc no tente imitar sua aplicao Desktop e faz-la idntica em ASP.NET. Isso um risco! Tentar tornar uma pgina do browser to rica quanto uma interface Windows um sonho, no qual j existem solues que esto em evoluo e aperfeioamento, portanto, no reinvente a roda. Como tecnologias nesse sentido podemos citar o ASP.NET AJAX e o Silverlight. Um outro ponto importante no desenvolvimento Web performance. No Desktop, muitos no se preocupam com a correta alocao e liberao de recursos, total, se voc deixar escapar uns 4 bytes em um clique de um boto Gravar, provavelmente ao final do dia o usurio vai desligar o Windows e o computador e tudo liberado moda antiga. J na Web, 4 bytes perdidos em uma requisio podem se tornar 4 Gigabytes consumindo a memria do servidor ao final de um dia. Aplicaes Web no so desligadas. ASP.NET state-less, e isso ajuda, significa que muita coisa liberada entre uma requisio e outra. Alm disso, o .NET conta com um poderoso mecanismo de coleta de lixo que libera recursos no mais utilizados. Mas tenha em mente, voc vai usar muito mais o try finally (ou using) a partir de agora.

Lembre-se que na Web milhares de usurios podem acessar sua aplicao em um mesmo instante, por esse motivo, ela por padro multithread. Tenha cuidado com cada byte que voc aloca na memria do servidor, saiba gerenciar bem o estado de cada varivel, saiba utilizar corretamente sesses. No desktop, cada usurio roda uma nica instncia da sua aplicao por vez. Na Web sero milhares rodando no mesmo servidor. Quer um exemplo de como isso uma preocupao importante? Sendo curto, objetivo e prtico, abra mil instncias do Delphi ou do Visual Studio na mesma mquina e ver o que quero dizer. Gerenciamento de estado - Este certamente o ponto de maior dificuldade ao iniciar os trabalhos na Web. No Desktop, voc aloca um objeto e deve liber-lo aps seu uso. Na Web, tudo perdido aps cada requisio (em tecnologias state-less como o ASP.NET), como comentei anteriormente. Realmente gerenciar sesso algo que no existe no Desktop, ento procure comear seus estudos por este ponto, pois ele crtico. Os controles servidores ASP.NET j nos ajudam bastante mantendo seu prprio estado entre requisies. No exemplo que apresentei antes, como os dados foram sendo persistidos no ListBox enquanto eu os adicionava? Pode parecer uma questo idiota, mas era para no funcionar, o ListBox deveria exibir somente o ltimo item adicionado. Graas ao recurso de ViewState, o ASP.NET nos poupa de controlar estado para os controles do servidor. Porm o resto com voc, tenha isso em mente. Postbacks - Esteja bem preparado, pois aqui mora uma das principais diferenas na migrao. Quando voc clica em boto no Desktop, uma mensagem da API do Windows trocada internamente, e tratada pelo framework que voc utiliza, normalmente atravs de um evento. No ASP.NET existe o mesmo conceito (de eventos), porm lembre-se que h um Postback,

uma nova requisio criada, vrias informaes so trocadas entre cliente e servidor. Alm disso, procure conhecer profundamente todos os recursos que o ASP.NET e o .NET como um todo oferecem para aumentar a performance de aplicaes Web, em especial: - Conexo a banco - a consulta ao banco de dados o recurso mais precioso e que mais consome tempo em ambiente Web. No desktop abrimos uma conexo e a mantemos aberta durante toda a aplicao, se for uma aplicao clientserver provavelmente o SGBD vai ter no mximo umas 50 conexes simultneas. Na Web isso extremamente diferente. Aqui temos que abrir uma conexo, o mais rpido possvel executar os comandos SQL e fechar a conexo. Deixe que o ADO.NET (tecnologia de acesso a dados) cuide d resto. Ele possui mecanismos, como Connection Pooling, que vo garantir a performance; - Use Stored Procedures, elas aumentam consideravelmente a performance do servidor; - Use e abuse (mas com cuidado) do objeto Cache, principalmente para colocar resultados de consultas do banco de dados em memria e dispensar futuras conexes. Por exemplo, se voc tem uma tabela que constantemente consultada, porm no sofre tantas alteraes, traga os dados para Cache e a partir da no v mais ao banco; - OutputCache - excelente recurso que permite que a sada em HTML gerada pelo ASP.NET possa ser colocada em memria. Futuras requisies ao servidor no realizam nenhuma tarefa adicional, como processar o cdigo C# ou Delphi Prism, ou renderizar a pgina, ou consultar o BD. O ASP.NET simplesmente devolve o HTML pronto e ponto final. Voa. - No tente simular algo como DataModules em ambiente Web. Aqui a regra : execute algo, coloque em tela o resultado e feche tudo; Alm desses cuidados bsicos, procure sempre usar boas prtica de desenvolvimento em suas aplicaes Web, atravs da Programao Orientada a Objetos, Design Patterns, Testes, Refactoring, Desenvolvimento em Camadas etc. Separe bem a responsabilidade de cada classe, use herana, esconda implementaes complexas (use interfaces e classes abstratas). Isso facilitar a manuteno futura da sua aplicao, alm de torn-la mais adaptvel a uma possvel mudana tcnica futura sem causar um impacto gigantesco em toda a soluo (por exemplo, a troca do tipo de servidor de banco de dados ou da tecnologia de acesso a dados). Aproveite os recursos do Visual Studio, como Code Analysis, recursos para arquitetura (novo no VS2010), testes integrados, para sempre deixar sua aplicao com qualidade.

<div>&nbsp;&nbsp; Triplique seus cuidados com segurana. Lembre-se que na

Web seu aplicativo estar acessvel ao mundo inteiro. Conhea os principais tipos de ataque a servidores, defina boas polticas de segurana ainda na fase de anlise do projeto. E lembre-se, o ASP.NET lhe dar um boa mo nesse sentido, pois muitos detalhes de implementao esto prontos.</div>&nbsp;&nbsp; E finalmente, tenha muito cuidado ao optar por tecnologias que so usadas em conjunto com o ASP.NET. Se sua equipe est iniciando o desenvolvimento na Web, tenha em mente que h uma curva de aprendizado que pode ser um risco. Opte por tecnologias mais consolidadas, bem testadas, com maior documentao e garantia comprovada. Por exemplo, desenvolvedores Desktop normalmente no esto acostumados a utilizar frameworks de persistncia e mapeamento objeto relacional. Sair usando logo no primeiro dia de projeto o NHibernate ou o ADO.NET Entity Framework pode ser custoso, principalmente se o prazo for uma preocupao. Ambos so excelentes frameworks, e aqui vai uma dica caso queira considerar o seu uso em projetos futuros: desenvolva em camadas, assim, mais adiante voc pode substituir sua camada de acesso facilmente sem modificar outros mdulos do sistema.

Vantagens do desenvolvimento Web que no existem no Desktop


Agora que j vimos que o ASP.NET a soluo ideal para os desenvolvedores Desktop, vamos s lembrar de alguns aspectos que por tabela voc ganha ao colocar sua soluo na Web: - Deployment - na Web, voc instala seu software em um Data Center, um servidor nas nuvens, seus clientes no precisam nada mais do que um browser. Nada de instalar aplicativos em dezenas de mquinas, configurar arquivos, pastas, bibliotecas etc. Uma atualizao do software pode ser feita no servidor, e todos os clientes passam a enxerg-la; - Se voc ainda uma daquelas pessoas que discute qual o melhor sistema operacional, se Windows, Linux, Mac OS, Google Chorme OS, esquea. Ao desenvolver com ASP.NET, voc hospedar seu sistema em um servidor dedicado e tudo o que seu cliente precisa de um browser, rodando em qualquer sistema operacional. Pode at mesmo usar um iPhone, ou um SmartPhone com Windows Mobile (ou futuramente o Windows Phone 7), e acessar dados da aplicao Web de qualquer parte do planeta, sem instalar nada; - Manuteno - Nada de se preocupar com backups dos clientes, visitas presenciais, envio de mdias com o software, downloads, vrus etc. Isso so caractersticas de sistemas Desktop. Aproveite, as dores de cabea com esses problemas acabam ao ter seus sistema nas nuvens;

O que vem por a?


Hoje estamos diante de um dos maiores lanamentos mundiais na rea de desenvolvimento: o Visual Studio 2010, juntamente com o ASP.NET 4.0 e .NET 4.0, confirmado para 12 de Abril de 2010. Procure se manter informado sobre as novidades, acompanhe as evolues tecnolgicas e o novos recursos que esta verso trar. No ASP.NET, destaco o aprimoramento do suporte ao AJAX, o que vai tornar suas aplicaes Web cada vez mais parecidas com seu software Desktop.

Concluso
Este artigo procurou motivar voc, desenvolvedor Desktop, a optar pela tecnologia ASP.NET para seus novos projetos Web. Comprovamos que o ASP.NET sem dvida alguma a opo mais robusta do mercado para este propsito, e a que exigir uma menor curva de aprendizado. Vimos tambm muitos cuidados que voc deve ter ao comear a escrever software que rodar nas nuvens. Cuidados com performance, segurana, gerenciamento de

estado, que so to importantes quanto os requisitos impostos pelo seu cliente. Abra o Visual Studio, crie uma nova aplicao ASP.NET e sinta-se em casa. Sucesso nos novos projetos, grande abrao e at o prximo artigo.