Pedindo confirmação antes de fechar sua aplicação .NET

14 F Y

Seu usuário pode fechar sem querer sua aplicação. Foi maximizar a janela, errou e clicou no botão de fechar… já era. O mesmo para menus ou outras opções de encerrar o programa. Em alguns casos isso não é tão ruim, basta abrir novamente. Mas em outros, as consequências podem ser bem sérias. Exibir uma confirmação de que o usuário realmente deseja fechar a aplicação é interessante nesses casos.

Confirmação para fechar o programa

Exibir esta dialog para confirmação no .NET Framework é bem simples. O primeiro passo é tratar o evento FormClosing da tela principal de sua aplicação. Ao disparo deste evento, seu método irá receber como parâmetro uma instância da classe FormClosingEventArgs.

Esta classe possui duas propriedades:

  • CloseReason. Esta propriedade informa qual o motivo de sua aplicação estar sendo encerrada. Por exemplo, seu valor pode informar que o programa está sendo fechado pois o sistema operacional está sendo desligado ou pois o usuário pediu, entre várias outras razões. Esta propriedade é read-only.
  • Cancel. Esta propriedade informa se o fechamento da aplicação deve ser cancelado. Se ao final do método o valor desta propriedade for true, seu programa não será encerrado. Seu valor padrão é false.

No método tratando o evento FormClosing, você deve primeiro observar a propriedade CloseReason. Escreva uma verificação para evitar que a confirmação seja mostrada quando o sistema está sendo desligado, por exemplo.

Depois, exiba uma dialog através de MessageBox.Show, informando qual deve ser o texto, o título, o ícone e quais botões devem estar na dialog. O normal é como na imagem acima: Um texto explicando o que pode acontecer caso a aplicação seja fechada, ícone de aviso (Warning) e botões Sim/Não.

Usando o retorno do MessageBox.Show (uma instância de DialogResult, que informa qual botão foi pressionado na tela de confirmação), verifique se o usuário escolheu não fechar a aplicação. Caso isto tenha acontecido, mude o valor da propriedade Cancel de sua instância de FormClosingEventArgs para true.

Para ficar mais claro, segue um exemplo do código deste método, para criar a confirmação da imagem do começo do post:

private void FormClosingEvt(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.WindowsShutDown)
    {
        DialogResult result = MessageBox.Show(
            "Closing the application will stop changing your background image.\n\nAre you sure you want to leave?",
            "Are you sure?", MessageBoxButtons.YesNo,
            MessageBoxIcon.Warning);

        if (result == DialogResult.No)
        {
            e.Cancel = true;
        }
    }
}

Atribuindo este método para o evento de FormClosing do formulário principal de sua aplicação e alterando as mensagens para algo que se encaixe melhor no contexto do seu programa, você terá uma janela de confirmação evitando o fechamento acidental de sua aplicação.

Qualquer dúvida, deixe um comentário e responderei assim que puder.


Adicionando um menu ao ícone na bandeja

12 F Y

Depois de mostrar como colocar um ícone na bandeja para a sua aplicação e a mostrar o balão de notificação a partir deste ícone, irei neste post descrever o passo-a-passo para atribuir um menu para este ícone de sua aplicação .NET. Este menu será acessado através do clique com o botão direito do mouse sobre o ícone.

ContextMenuStrip na toolbar do Visual Studio 2008

O primeiro passo é adicionar um controle ContextMenuStrip ao seu formulário. Como ilustrado na imagem acima, o controle se encontra na aba Menus & Toolbars da Toolbox do VS2008.

Clique e arraste para dentro do seu form, e a representação do seu controle ficará embaixo, fora do form, assim como o NotifyIcon fica quando é arrastado. Quando você clicar no controle, irá aparecer um menu no formulário. Não se preocupe, ele está ali apenas para facilitar seu trabalho durante a edição do menu, e não aparecerá naquele lugar durante a execução da sua aplicação.

Edit Items

Configure o menu de acordo com seu desejo, mudando sua aparência e adicionando itens. Tudo isso pode ser feito através da tela Edit Items, disponível ao clicar na imagem de “play” que surge ao clicar no componente.

Quando acabar, é só adicionar os eventos de clique para cada item do menu. Isto não pode ser feito através da tela Edit Items. Para acessar os eventos, deixe a janela de propriedades do Visual Studio visível e clique no componente. Quando o menu aparecer no form, clique no item desejado. Depois, clique no botão com um “raio” na janela de propriedades para exibir os eventos, e escolha qual evento você deseja adicionar algum comportamento. Provavelmente você irá escrever código para o evento Click.

Depois de atribuir o que deve acontecer quando cada item do menu for clicado, é hora de atribuir este menu ao seu ícone da bandeja. Para isso, clique no componente do ícone, e na janela de propriedades altere o valor da propriedade ContextMenuStrip para o menu que você acabou de criar. Isto irá associar este menu ao seu ícone, e automaticamente quando o ícone for clicado, seu menu irá ser mostrado para o usuário. No meu projeto de exemplo, o resultado é o seguinte:

Ícone na bandeja com menu

Pronto, é só isso! Seu menu está funcionando. Se forem bem escolhidos, os itens deste menu irão refletir as atividades mais comuns e que não exigem que toda a interface seja mostrada. Através deste menu, o usuário poderá então ser mais produtivo ao utilizar a aplicação.

Apesar de meu exemple ter sido feito em C#, o passo-a-passo deste artigo (e dos anteriores também) pode ser utilizado tranquilamente para quem prefere usar VB.NET.

Clique aqui para baixar um projeto com o código final deste exemplo. Este projeto tem o mínimo de código necessário para colocar o ícone na bandeja, exibir balões de notificação e atribuir um menu para o ícone.


Exibindo balões em ícones da bandeja

11 F Y

No post anterior, expliquei como colocar um ícone na bandeja para sua aplicação .NET. Mostrei apenas o básico, mas que já é suficiente para alguns usos. Outras características possíveis de se adicionar nestes botões, como os balões de notificação e os menus, trazem um poder muito grande ao seu pequeno ícone.

Configurando e exibindo balões de notificação para ícones na bandeja

Estes são aqueles balões que gerenciadores de download mostram quando um arquivo acaba de ser baixado, ou que o Windows mostra quando há algum problema de segurança, tipo anti-vírus desatualizado ou firewall desabilitado.

Balão de Notificação

Usá-los é bem simples. Você pode configurar um balão padrão, para mostrar quando o mouse é deixado em cima do ícone por exemplo, ou exibir um balão para avisar de algum evento ocorrido na execução de sua aplicação como o término de um download, no caso dos gerenciadores citado anteriormente.

Propriedades de NotifyIcon para o Balão

Para configurar um balão padrão, basta atribuir valores para as propriedades BalloonTipIcon, BalloonTipText e BaloonTipTitle de NotifyIcon, na janela de propriedades. Para mostrar o balão, chame a seguinte linha de código:

notifyIcon1.ShowBalloonTip(10000);

Onde, 10000 é um timeout, um tempo em milissegundos até o balão desaparecer. De acordo com algumas fontes que li, mesmo que você bote 3000ms por exemplo, o sistema operacional vai deixar por no mínimo entre 10 e 30 segundos. No teste que fiz com o XP, o mínimo foram 10s.

Para fazer o balão aparecer quando o mouse passa por cima do ícone*, basta chamar a linha de código acima no evento de MouseMove do seu NotifyIcon. O resultado desta chamada para as propriedades com os valores da imagem acima é o seguinte:

Balão com dados setados na janela de propriedades

Para mostrar um balão com outro texto, algo que necessite por exemplo de dados de tempo de execução, eu recomendo não alterar aquelas propriedades, mas sim chamar outra assinatura deste método. Esta outra assinatura recebe mais três parâmetros além do timeout:

notifyIcon1.ShowBalloonTip(timeout, tituloDoBalao, textoDoBalao, tipoDoBalao);

O título e o texto são auto-explicativos. O tipo do balão é um valor do tipo ToolTipIcon que definirá a imagem que aparece dentro do balão. Este parâmetro pode assumir o valor ToolTipIcon.Info, que diz que o balão representa uma informação qualquer, ToolTipIcon.Error, no qual o balão representa um erro e ToolTipIcon.Warning, que irá conter um aviso para o usuário.

De cima para baixo: Info, Error e Warning

Para exibir o balão, basta em qualquer lugar de seu código, chamar a linha de código acima passando os parâmetros desejados. Você pode avisar sobre algum evento que aconteceu durante a execução da sua aplicação, e mesmo que o usuário esteja com a atenção em outra aplicação, poderá ver o aviso através do balão.

Fica para o próximo post o tutorial de como colocar um menu, acessível ao clicar com o botão direito no ícone da bandeja, onde o usuário poderá acessar algumas funcionalidades de sua aplicação.

* Não recomendo mostrar o balão ao passar o mouse por cima do ícone, pois dificulta clicar no ícone e a também complica a exibição do menu.


Colocando um ícone na bandeja do sistema para sua aplicação .NET

10 F Y

Se você está escrevendo um programa que irá rodar a maior parte do tempo em background, com pouca ou mesmo nenhuma intervenção do usuário, utilizar um ícone na bandeja do sistema (system tray, aquele lugar ao lado do relógio… também é conhecido como barra de notificação) pode ser uma mão na roda. Além de economizar o espaço de uma janela na sua barra de tarefas, você pode colocar um menu com algumas atividades mais comuns, fazendo com que o usuário não precise nem restaurar a aplicação para executar algumas tarefas.

Neste post, vou demonstrar como colocar um ícone na barra de notificação. No próximo post, mostrarei como configurar e exibir um balão de dica para o ícone e depois em outro post, como adicionar um menu de acesso rápido para o ícone.

Além disso, irei disponibilizar um projeto de exemplo com código para as funcionalidades que estou falando nestes dois posts.

Colocando um ícone na bandeja para sua aplicação

Controle NotifyIcon no Visual Studio 2008

Em uma aplicação Windows Forms, o .NET Framework nos oferece o controle NotifyIcon, que será o responsável por representar o ícone da aplicação na bandeja do sistema. Para utilizá-lo, basta clicar no controle NotifyIcon na aba Commom Controls da Toolbox (veja figura acima), e arrastá-lo para o form principal de sua aplicação. Pode soltá-lo em qualquer lugar do form, pois o Visual Studio irá colocá-lo fora do form, como ilustrado na figura abaixo:

Controle NotifyIcon inserido no form

Com o controle adicionado, é necessário definir o ícone, através da janela de propriedades do Visual Studio. Observe que mesmo que o form já tenha um ícone configurado, você deve atribuir um ícone para este componente.

Depois de escolher um ícone, se o programa for executado, o ícone será colocado na bandeja, mas ainda sem nenhuma funcionalidade, como ilustrado na figura abaixo. O programa continuará sempre ocupando espaço na barra de tarefas, mesmo que esteja minimizado, e qualquer clique no ícone será inútil, pois ainda não definimos nada para ser realizado ao disparo dos eventos do mouse.

Ícone na bandeja e aplicação rodando

Para a aplicação deixar de aparecer na barra de tarefas quando for minimizada, deve-se adicionar o seguinte código no evento Resize do seu formulário principal (Com o formulário selecionado, na janela de propriedades clique no raio para ver os eventos, e depois dê dois cliques em Resize):

C#:

if (this.WindowState == FormWindowState.Minimized)
{
    this.Hide();
}

VB.NET:

If (Me.WindowState = FormWindowState.Minimized) Then
    Me.Hide()
End If

Desta forma, quando a janela for minimizada, a aplicação deixará de existir na barra de tarefas. O ícone da bandeja terá então a responsabilidade de restaurar a janela do programa. Para inserir este comportamento, o seguinte código deve ser executado quando o evento Click ou DoubleClick (à sua escolha) do seu NotifyIcon for disparado:

C#:

this.Show();
this.WindowState = FormWindowState.Normal;

VB.NET:

Me.Show()
Me.WindowState = FormWindowState.Normal

Desta forma, quando o ícone for clicado, a janela volta a aparecer e é restaurada. Pronto, sua aplicação quando é minimizada fica apenas na bandeja.

Para um resultado um pouco mais “sofisticado”, você pode também alterar a propriedade Visible do NotifyIcon para false quando a janela estiver visível, retornando o valor para true quando o usuário minimizar novamente a aplicação. Desta forma, obtêm-se o efeito de “minimize to tray”, comum em alguns programas como o Winamp, por exemplo.

Clique aqui para ver o próximo post, onde explico como exibir o balão de notificação.

Para um tutorial de como atribuir um menu ao ícone de sua aplicação, siga este link.


Bichano.NET – Desenvolvendo aplicações para o Orkut

11 F Y

Pessoal,

Eu, Lucas Mello, João Paulo Oliveira e Flávio Almeida conseguimos finalmente botar nossa aplicação do Orkut lá dentro. Depois de várias semanas lutando pela aprovação, conseguimos que o pessoal do Orkut aprovasse. Por sinal, todos os agradecimentos possíveis e imagináveis pra esse pessoal que avalia e testa os aplicativos antes de serem aprovados. Eles realmente vão a procura de bugs que nós, desenvolvedores sem uma equipe de testes não conseguiamos imaginar.

Para acessar o Bichano.NET, você pode ir simplesmente em http://www.bichano.net, que você será redirecionado para nossa aplicação lá dentro do Orkut, ou ir direto em http://www.orkut.com.br/Application.aspx?appId=523254528764 e adicionar. Mas enfim…

O QUE É O BICHANO?

O Bichano.NET é um aplicativo para o Orkut que visa unir as pessoas que possuem pets. Com o Bichano, você pode ter um “mini-perfil” de seu pet, com foto e tudo mais, dentro do seu perfil do Orkut. Ao ver o aplicativo inteiro, você pode criar perfis de novos pets, pode procurar e adicionar outros pets como amigos, enviar recados para outros pets, criar a agenda de seus animais e procurar por pets de mesma espécie/raça que morem na mesma cidade que você. Com isso você pode encontrar pessoas para trocar informações, para cruzar seus pets e várias outras atividades.

E como é que nós fizemos o Bichano? Seguinte… o Bichano está participando de um concurso de aplicações para redes sociais organizado pela Mentez (http://www.mentez.com). Com isso, recebemos dos organizadores um servidor e uma base de dados online para trabalhar… mas com qualquer máquina que fique ligada 24 horas na net, e que você possa acessar externamente através de um endereço fixo (eu ouvi você falar “DynDNS” (http://www.dyndns.com) ou “No-IP” (http://www.no-ip.com) ?), ou até mesmo com os serviços de hospedagem gratuita que existem por aí, dá pra desenvolver.

Primeiros Passos

A primeira coisa que você deve fazer para desenvover uma aplicação pro Orkut é pedir acesso ao sandbox (sandbox.orkut.com). É nele que você vai dar os primeiros passos de sua aplicação, até ela estar madura o suficiente para ser aprovada pelo time do Orkut. Você pode pedir este acesso através deste link: http://code.google.com/support/opensocialsignup/. Infelizmente, eles tem uma pequena falha, e não enviam um email para você avisando que sua conta está pronta para acessar, logo, espere umas 24 horas e tente, provavelmente você já vai ter acesso. Enquanto isso, vá lendo a api de OpenSocial, que é a maneira que você tem de se comunicar com a rede social, podendo pegar alguns (poucos, pouquissimos…) dados do usuário entre outras coisas.

O que vou usar para desenvolver?

Você pode usar qualquer coisa… Nós fizemos nosso aplicativo com .NET, mas existem outros, como o (excelente, por sinal) TypeRacer e aquelas aplicações do globoesporte que são desenvolvidos em várias outras tecnologias. A nossa escolha por .NET (assim como qualquer outra escolha que “exija” que a página vá dentro de um iframe, como PHP ou Java), acarretou em uma série de dificuldades, pois por questões de segurança, os browsers não permitem que a página interna do iframe chame funções de javascript da página externa ao iframe… isso tira 99% das coisas legais que dá pra fazer com OpenSocial… mas o 1% ainda é bem legal.

A alternativa, pra você poder usar OpenSocial de verdade, é usar Google Gadgets. Com isso, você escreve no XML que é enviado ao Orkut e pode chamar tudo que está pronto lá.

Dificuldades

Além do pouco conhecimento na API e em como usá-la com .NET, uma coisa que foi séria no desenvolvimento do Bichano foi a quantidade de informações desencontradas que existem na net… Em um site do google, falando só da API OpenSocial, você se interessa por uma funcionalidade X… daí, quando vai usar na sua aplicação no Orkut, nada… Normal. Cada rede social tem sua implementação de OpenSocial, e ainda falta MUITA coisa… principalmente um esquema que dispensaria o uso de IFRAME e provavelmente serviria para fazer as chamadas de OpenSocial.

Coisas Legais

Putz, dá pra aprender muita coisa, você começa a prestar mais atenção nas requisições que sua página vai fazer, aprende algumas alternativas de como fazer as coisas… enfim, é muito divertido. E quando o pessoal do Orkut aprova, e você vê sua aplicação sendo acessada, a sensação é MUITO boa!

Só pra se ter uma noção, agora, às 3:45 da madrugada, momento em que estou com mais dois amigos da equipe de desenvolvimento do Bichano.NET aqui no Centro de Informática da UFPE, a aplicação conta com 3650 usuários cadastrados e quase 18000 pageviews… em 2 dias e meio no ar!

Enfim, quem quiser qualquer dica, ajuda, apoio ou qualquer outra coisa, entra em contato que eu vejo o que dá pra fazer!

Ai vão algumas coisas legais de ler pra começar a desenvolver pra o Orkut:

http://code.google.com/apis/opensocial/docs/ – API de OpenSocial

http://code.google.com/apis/orkut/docs/orkutdevguidelines.html – Guidelines para aplicações para o Orkut

http://www.google.com/webmasters/gadgets/ – Google Gadgets


Planos de Aprendizado para Certificações Microsoft

17 F Y

Quem deseja obter qualquer certificação, seja ela Microsoft, Sun, Oracle ou de qualquer outra entidade, sabe que a boa preparação com bons materiais é essencial para o sucesso. Alguns podem entrar em cursos preparatórios, que são uma ótima forma para se habilitar para a prova, e nos quais o próprio curso indica aos alunos os materiais que devem ser estudados. Outras pessoas não tem tempo, dinheiro ou simplesmente preferem estudar sozinhas, e caem no dilema de escolhar quais recursos irão usar para a sua preparação. A variedade é imensa, livros, páginas, virtual labs, exemplos que vem com o Visual Studio, e nem sempre a escolha feita é correta.

Para auxiliar nesta escolha, a Microsoft oferece em http://learning.microsoft.com planos de estudo, indicando material e ajudando no seu planejamento e controle pessoal de como está o andamento de seus estudos. Para usar, basta se logar usando seu Passport e procurar qual o seu objetivo de estudo, como uma prova de certificação em específico.

Minha experiência com o site foi muito boa, principalmente psicologicamente 🙂 … Quando participei do S2B – Students 2 Business no fim do ano passado, ganhei acesso durante alguns meses a dois cursos da IT Academy, voltados à certificação 70-536, que é meu atual objetivo. Quando adicionei o plano de estudos da 70-536 ao meu aprendizado no site, vi que o material que eu já havia estudado na IT Academy era um dos materiais recomendados… e também que se eu não tivesse ganho acesso grátis, o custo para adquirir este material seria de quase R$ 800,00.

Apesar do sistema sugerir este tipo de conteúdo, que você precisa comprar direto com a Microsoft e que geralmente é caro e em dólar, ele também sugere alternativas como livros, encontrados na maioria das livrarias por um preço acessível. A maior vantagem está nos links para conteúdos gratuitos que são indicados. São artigos na MSDN, webcasts, páginas com dicas, sugestões de exemplos que vêm com o Visual Studio a serem usados como práticas, enfim, muito material para complementar sua formação.

O objetivo da certificação no meu ponto de vista é mostrar para o mercado que aquele profissional é preparado para lidar com os problemas que envolvem os assuntos da prova que ele fez, e um dos pontos fortes deste plano de aprendizado é que ele não foca exatamente na prova. Ele foca na preparação para a vida prática, com uso dos conteúdos. No caso da 70-536, o material sugerido ajuda a aprender como funciona e como utilizar o poder do .NET Framework da melhor forma possível, não é material “estilo cursinho” que só prepara para fazer uma prova, sem que a pessoa entenda ou fixe de verdade.

Pra facilitar as coisas, aí está o link direto para o Plano de Aprendizado da 70-536:

Learning Plan for Application Development Foundation by Using Microsoft .NET Framework 2.0 (Exam 70-536)

Para todos que desejam fazer alguma prova de certificação MS, bons estudos e boa sorte!


Enum.Parse – Você vai esquecer que usava switch para isso…

10 F Y

Quantas vezes você precisou recuperar os dados de, por exemplo, uma drop-down list contendo o estado em que seu usuário mora, e converter isso para o seu tipo enum Estados? Quantas vezes você já escreveu switches enormes, um case para cada campo de seu enum, só pra poder converter o valor que veio numa string, igual ao nome do campo da enum, para o tipo da enumeração? Seus problemas acabaram…

O método Enum.Parse resolve isto para você em uma (ou algumas poucas mais…) linha. Se você tem uma enum Estado, em que cada campo é a sigla do estado, você pode usar o seguinte:

string estadoUsuarioString = "PE";
Estado estadoUsuarioEnum = (Estado) Enum.Parse(typeof(Estado), estadoUsuarioString);

Só isso… ao fim da execução, estadoUsuarioEnum vai ter como valor Estado.PE, sem precisar de todos aqueles cases que você estava acostumado. Então alguém me diz: “O nome dos campos de minha enum estão todos em maiúsculas, mas o valor que vem do usuário vem em minúsculas (ou misturado, miguxês, qualquer forma que não sejam todas maiúsculas…). Isso é inútil pra mim”. É aí que esta pessoa se engana. Além da assinatura Enum.Parse (Type, String), podemos usar a assinatura Enum.Parse (Type, String, Boolean). O Boolean que você vai passar é indicando se o match será case-sensitive ou não. Usar sem passar o parâmetro é igual a passá-lo como true. Passar false fará os retornos de

(Estado) Enum.Parse(typeof(Estado), "pe", false);
(Estado) Enum.Parse(typeof(Estado), "pE", false);
(Estado) Enum.Parse(typeof(Estado), "Pe", false);
(Estado) Enum.Parse(typeof(Estado), "PE", false);

serem iguais a Estado.PE.

Devemos lembrar que se não existir na sua enumeração um campo com nome igual (ou igual case insensitive, para a assinatura com Boolean), o método retorna uma exceção (System.ArgumentException), então devemos usá-lo com cuidado para não estourarmos um erro na tela do usuário. Por segurança, o método deveria estar dentro de um try-catch (daí o ou algumas poucas linhas a mais), onde o tratamento do catch seria o código que você escrevia no “default:” de seu obsoleto switch.

Confesso que antes de encontrar algo na net sobre isso, usei switch várias vezes, e comecei procurando errado, pensando que não existia nada “pronto” para fazer isso. Procurei por alguma técnica usando Reflection e seus Invokes, e encontrei várias pessoas com a mesma dúvida em fóruns… sempre, depois de vários posts chegava alguém e perguntava: “O que você quer não é usar Enum.Parse?” :)… O que não dá pra fazer (que seja suficientemente “simples”…) em uma linha no .NET Framework?

Para mais informações: http://msdn.microsoft.com/en-us/library/system.enum.parse(VS.80).aspx