Alterando a ordem do build manualmente no Visual Studio 2010

5 F Y

O Visual Studio organiza automaticamente, baseando-se nas dependências de cada projeto, a ordem de build dos projetos em uma solução. Desta forma, se o projeto B usa algo do projeto A, o projeto A será “buildado” primeiro, para quando for a vez do projeto B, suas dependências estejam compiladas e este consiga passar com sucesso pelo build.

Em algumas (raras) situações, no entanto, esse ordenamento automático pode não funcionar da maneira esperada. Ele só é configurado com base nas dependências que estão explicitamente definidas no projeto, o que na maioria das vezes será suficiente para inferir a ordem correta. Existem casos, como em alguns projetos de teste ou alguns outros tipos, em que um projeto precisa que outro já esteja buildado, mesmo que não tenha dependência de código diretamente.

Ainda nestas poucas situações, geralmente estes projetos não sofrem alterações constantemente, então, o mais recomendado é desativar o build automático e efetuar o build manualmente apenas quando houver alguma alteração nestes projetos. Desativar o build automático é simples:

Abra o Configuration Manager, e desmarque os projetos que você não deseja que sejam buildados automaticamente. Para efetuar o build manual em cada projeto depois, é só clicar com o botão direito no projeto na Solution Explorer e mandar Buildar.

Se este projeto que está fora de ordem no build tem o código alterado várias vezes, ou se ele depende de algum outro projeto para ser buildado, inviabilizando o build manual, ou se você realmente não quer dar build manual, você pode alterar manualmente a Build Order no Visual Studio.

Para alterar a ordem de build dos projetos, basta clicar com o botão direito na solução no Solution Explorer, e selecionar “Project Build Order” ou em “Project Dependencies”

Na tela que será mostrada, clique na aba “Dependencies” inclua as dependências necessárias entre os projetos, para que a ordem que você verá na aba “Build Order” seja a que você precisa. Confirme as mudanças, e a ordem de build de sua solução estará alterada.


Resolvendo problemas da SiS Mirage 3 com o Visual Studio 2010 (e outras aplicações que usam WPF)

2 F Y

Um dos prêmios que ganhei com a vitória na fase nacional da Imagine Cup deste ano foi um notebook Elcoma Wizz, que apesar de ser uma boa máquina para o dia-a-dia (Core 2 Duo T6400, 320GB de HD e 4GB de RAM, mas Windows 7 de 32bits…), vem com o chipset de vídeo SiS Mirage 3.

Esse chipset é focado para máquinas de baixo custo, e é muito, MUITO fraco. Hoje, primeira vez que fui tentar trabalhar com a máquina nova no Visual Studio 2010, assim que ele abriu, as letras no código todas distorcidas, com quadradinhos coloridos, geralmente amarelos, no meio delas, parenteses que pareciam chaves, chaves que pareciam colchetes, todo tipo de problema de renderização que se possa imaginar. Flávio, que estava junto no momento, disse que a máquina dele, um Positivo que usa a mesma SiS Mirage 3, tem o mesmo problema com o Visual Studio 2010.

Um pouco de pesquisa e descobri que, mesmo com os drivers mais atualizados (o que era meu caso), essa “placa” não trabalha bem com WPF (lembrando que a interface do VS2010 utiliza WPF). A solução é desabilitar a aceleração de hardware… O problema é que, tanto no Windows 7 como no Vista, isso não é trivial.

UPDATE: O novo Windows Live Messenger 2011, popularmente conhecido no Brasil como MSN 11, também tem a interface baseada em WPF. A correção abaixo também irá corrigir os problemas de exibição deste programa.

O caminho é o seguinte:

  • Abra o registro do windows (Iniciar -> Executar -> Regedit)
  • Navegue até a seguinte chave: HKEY_CURRENT_USER\SOFTWARE\Microsoft
  • Verifique se existe a chave Avalon.Graphics
  • Se ela não estiver aparecendo, tente criar uma nova chave com este nome. Ao confirmar, talvez ele reclame que já existe uma chave com este nome. Não ligue pra isso, e procure a chave Avalon.Graphics, que vai estar na lista agora.
  • Adicione um novo valor DWORD, com o nome DisableHWAcceleration, e o valor 1.
  • Reinicie o Windows
Como seu registro deve ficar após as alterações
Como seu registro deve ficar após as alterações

Daí, na próxima vez que você abrir o Visual Studio (ou o MSN / Windows Live Messenger 2011), vai ver que ele está renderizando corretamente o texto e toda a interface. Isso também vai fazer com que qualquer outra aplicação WPF funcione corretamente nesta placa. Nesta minha máquina, isso não causou problemas de performance, mesmo este procedimento desabilitando a aceleração de vídeo por Hardware em aplicações WPF.

UPDATE: Em algumas máquinas com Windows 7, a mudança no registro descrita acima resolve para o Visual Studio, mas para o MSN é necessário atualizar o driver da placa de vídeo para a versão mais nova… O problema é encontrar esse driver, pois o site da SiS vive quebrado ou fora do ar.

UPDATE 2: O link a seguir tem um driver que, segundo relatos, funciona para a solução acima inclusive para monitores externos, sem deixar a imagem piscando ou com flickering: ftp://ftp.clevo.com.tw/M7xxS/VGA/VGA_W7.zip.

PS: Cuidado ao alterar o Registro do Windows. Não me responsabilizo por qualquer dano causado durante a tentativa de realizar esta alteração. Faça por sua conta e risco!

Fonte: http://msdn.microsoft.com/en-us/library/aa970912.aspx


Como usar o Google Webmaster Tools no seu blog WordPress.com

20 F Y

Essa é pra quem hospeda blog aqui no WordPress.com e quer usar ferramentas como o Google Webmaster Tools, o Yahoo! Site Explorer ou o Bing Webmaster Center.

Todos estes serviços necessitam verificar que você realmente tem controle sobre o endereço para o qual você quer ver os dados. Para isso, eles geralmente oferecem várias opções, como colocar uma tag META no cabeçalho das páginas, enviar um arquivo .html específico para o servidor ou mesmo fazer alterações na configuração de DNS do domínio.

Quem tem blog hospedado no WordPress.com, “sabe” que nenhuma destas alternativas é viável. Algum tempo atrás, existia uma “maneira alternativa” (aka gambiarra) de usar o método de enviar o arquivo html. Felizmente, o pessoal da Automattic (os criadores do WordPress e mantenedores do WordPress.com) criou uma solução pronta, sem gambiarras, para permitir o uso das ferramentas para webmasters em blogs do WordPress.com.

Clique para ver o local exato onde você deve clicar para configurar seu blog para usar o Google Webmaster Tools, o Yahoo! Site Explorer ou o Bing Webmaster Center.

É uma questão simples de configuração. Basta, no seu Painel (Dashboard), clicar em Ferramentas. Daí, no fim da página, vão estar os campos para você colocar o conteúdo da tag META fornecida pela ferramenta de sua preferência (no meu caso, o Google Webmaster Tools). Mande “Guardar Alterações”, e já pode mandar verificar seu site na sua ferramenta escolhida.


Resolvendo problema de modem USB travando após conectar

4 F Y

Há algum tempo eu vinha tendo um problema com diversos modems USB no meu netbook, rodando Windows XP (original, SP3 totalmente atualizado). Isso aconteceu com o Nokia 1508i pra conectar no Giro e com dois diferentes modems para conectar ao Claro 3G: Um Huawei E156B e outro mais antigo que quebrou e não lembro mais qual era a marca nem o modelo. Teoricamente, aconteceria com qualquer tentativa de conectar à internet via USB. Conectar com o cabo de rede ou pela rede sem fio não causava o problema.

Logo após conectar, o sistema ficava travando intermitentemente, durante aproximadamente 3 minutos. A barra de tarefas (a barra azul, geralmente na parte de baixo, no Windows XP) ficava completamente travada durante todo este tempo, nenhum novo programa abria e o browser simplesmente não conseguia abrir nenhuma página (tentei o Chrome, Firefox, Internet Explorer e até o Opera…), além de ficar travando, enquanto este problemapersistia. Algum tempo depois, a máquina destravava e voltava a funcionar normalmente.

Há 3 dias, aparentemente, consegui resolver o problema depois de encontrar algumas soluções em um forum. A solução sugerida, que segui e até agora a máquina não voltou a travar depois de conectar com modems USB foi a seguinte:

  • Vá em “Iniciar”, depois “Executar”
  • Digite “services.msc”
  • Pare e desabilite os seguintes serviços:
    • Serviço auxiliar IPv6 (IPv6 Helper Service)
    • Serviço de descoberta SSDP (SSDP Discovery Service)
    • Host de dispositivo Plug and Play Universal (Universal Plug and Play Device Host)

(Para parar e desabilitar um serviço, dê um duplo clique no nome do serviço. Se o serviço não já estiver parado, você deve clicar no botão “Parar”. Depois, selecione “Desabilitado” na lista de “Tipo de Inicialização”, que atualmente deve estar em “Automático” ou “Manual”)

Procurando agora os nomes dos serviços em português para escrever este post (o meu XP está em inglês, assim como o post do forum que eu havia lido), encontrei um post no Guia do Hardware em que apenas desabilitar o Serviço Auxiliar IPv6 resolveu o problema.

Enfim, se alguém mais está/estava tendo este problema, sinta-se a vontade para contribuir nos comentários dizendo se a solução daqui funcionou, se apenas desabilitar o Serviço Auxiliar IPv6 resolveu ou qual foi o outro caminho seguido para resolver este problema que tira a paciência de qualquer um.


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.