Carlos's profileCarlos Mattos - Sorocaba...PhotosBlog Tools Help

Blog


    April 25

    Parque "Quinzinho de Barros" ganha portal inédito na internet

    Segundo Carlos Mattos, diretor de tecnologia da WD5, empresa sorocabana parceira da multinacional na construção do portal, outros animais do zôo terão sua vez como apresentador das atividades e conteúdos na web. O projeto também prevê a instalação de câmaras no local para registrar as imagens dos animais e disponibilizá-las on-line. No parque existirá, ainda, um ponto de acesso livre à internet com conexão sem fio.

    Veja a matéria completa publicada no Jornal Cruzeiro do Sul (http://www.cruzeironet.com.br/materia.phl?editoria=39&id=70333).

    Site do zoológico inaugura nova tecnologia criada pela Microsoft

    O novo site do Parque Zoológico Municipal Quinzinho de Barros é vitrine para a nova tecnologia Silverligth desenvolvida pela Microsoft. É o que revelou o diretor da multinacional, Carlos Ferreira, ontem à tarde, durante cerimônia de lançamento do portal. A ferramenta eletrônica permite uma maior manipulação de fotos e imagens no campo virtual. Para Ferreira, implementar a tecnologia em um Zoológico cujo trabalho é reconhecido quase que mundialmente, expõe de maneira positiva a qualidade do produto.

    Veja a matéria completa publicada no Jornal Cruzeiro do Sul (http://www.cruzeironet.com.br/materia.phl?editoria=39&id=76076). 

    April 23

    (Jornal Bom Dia) Site do zológico de Sorocaba disponibiliza informações e imagens

    Está disponível na internet desde esta quinta-feira, 3, o projeto do zôo virtual do Parque e Zoológico Municipal Quinzinho de Barros, de Sorocaba. O site é resultado de uma parceria com a empresa Microsoft.

    Nesta primeira fase do projeto, o site oferece informações institucionais, imagens e dados dos bichos do "Quinzinho", detalhes de lendas envolvendo a fauna do local, calendário de eventos e uma área sobre como entrar em contato com os funcionários do zôo.

    Haverá ainda uma área restrita, que será acessada a partir de um cadastramento, destinada a professores, pesquisadores e estudantes de qualquer parte do país ou do mundo. A página dará acesso a arquivos técnicos especialmente desenvolvidos para a pesquisa, com o objetivo de servir para utilização na área de educação.

    Outra área de acesso restrito é voltada para os funcionários do zôo, para que eles possam atualizar as informações. A empresa que desenvolveu o portal para a Microsoft, a WD5, acompanhará os trabalhos de realimentação das informações do site.

    Durante o lançamento do site, o representante da Microsoft, Carlos Mattos, explicou que numa segunda fase haverá uma interação com os internautas, com a disponibilização de imagens em tempo real. Segundo ele, isso se dará por intermédio de câmeras de vídeo instaladas em pontos estratégicos de todo o zôo. "Elas vão registrar os animais e as ações dos funcionários, como o tratamento dentário, o cuidado com ninhos e o trabalho de apoio na procriação de espécies, além das reações dos bichos", explicou ele.
     
    March 19

    Heroes Happen Here - Sorocaba/SP - 15/03/2008

    O evento realizado no último sábado, dia 15/03/2008 no auditório da Academia de Ensino Superior de Sorocaba foi um sucesso! Tivemos mais de 180 pessoas presentes. Estiveram presentes no evento o profissional Paulo Dutra (MCSE) palestrando sobre o Windows Server 2008, o MVP Pedro Galvão falando sobre o SQL Server 2008, o Ricardo Slavov, líder do Grupo de Usuários SorBr.NET. Minha participação foi registrada com a apresentação das novidades do Visual Studio 2008. Para quem perdeu esta oportunidade, estou disponibilizando o PPT da minha palestra no meu SkyDrive\Public\Palestras (http://cid-834535b664f10b2d.skydrive.live.com/browse.aspx/Palestras.
     
    Gostaria de agradecer o Ricado Slavov por mais esta oportunidade de contribuir com o grupo de usuários SorBr.NET e também à Academia de Ensino Superior de Sorocaba que disponibilizou uma excelente estrutura e ofereceu todo apoio necesário para realizarmos esse evento.
     
    O público presente estava de parabéns, para um evento realizado no interior, tivemos um excelente número de participantes.
     
    Até a próxima oportunidade.
    March 05

    Retornando o índice de uma linha no SQL Server

    Em alguma situações, é possível que você precise obter o índice (posição ordinal) de uma linha retornada por um SELECT no SQL Server. As funções ROW_NUMBER e OVER do T-SQL permitem essa construção. Veja o exemplo abaixo:
     

    select tipoeis.*, ROW_NUMBER() OVER (order by idtipoeis) - 1 as Posicao from tipoeis

    ROW_NUMBER_SQL

     

     

    January 24

    Listando Tabelas e Colunas utilizando LINQ-to-SQL

    Recuperar nomes de tabelas e colunas a partir da estrutura do banco de dados é sempre útil no processo de desenvolvimento. Existem diversas técnicas utilizando diferentes tecnologias para isto. Este post mostra como obter uma lista com os nomes das tabelas e seus respectivos campos utilizando o LINQ-to-SQL. O exemplo foi implementado com 1 formulário contendo 1 botão e 1 controle ListBox. Essa construção é possível porque o LINQ-to-SQL mantém o mapeamento da estrutura do banco de dados armazenado no objeto DataContext. Veja abaixo a interface em tempo de execução mostrando a lista das tabelas e colunas:
     

    ListandoTabelasColunasLINQ

    Agora veja o código necessário para construir esta lista (é bem simples):

     

    using
    System.Data;
    using
    System.Drawing;
    using
    System.Linq;
    using
    System.Text;
    using
    System.Windows.Forms;
    using
    System.Data.Linq;
     
    namespace
    Testes
    {
       public partial class Form1 : Form
       {
      
          DBTeste db = new DBTeste();
     
          public Form1()
          {
             InitializeComponent();
          }
     
          private void Button1_Click(object sender, EventArgs e)
          {
             var DBEstrutura = db.Mapping;
     
             foreach (var Tabela in DBEstrutura.GetTables())
             {
                listBox1.Items.Add(Tabela.TableName);
     
                foreach (var Coluna in Tabela.RowType.DataMembers)
                   listBox1.Items.Add(" -" + Coluna.MappedName);
             }
          }
       }
    }
     
     
    January 20

    Criptografando dados com C# e MD5

    O exemplo abaixo demonstra como criptografar dados utilizando C# e o algorítmo MD5. O Namespace System.Security.Cryptography oferece os recursos necessários para esta implementação.
     
    using
    System.Security.Cryptography;
     
    ...
     
    public static string GetMD5Hash(string input)
    {
       MD5 md5Hasher = MD5.Create();
     
       byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
      
       StringBuilder sBuilder = new StringBuilder();
      
       for (int i = 0; i < data.Length; i++)
       {
          sBuilder.Append(data[i].ToString("x2"));
       }
       return sBuilder.ToString();
    }

    Abrindo Formulários Dinamicamente C# (Windows Forms)

    Introdução
    Uma tarefa comum no desenvolvimento de soluções Windows Forms é a necessidade de instanciar formulários com base no nome da classe, ou seja, como o desenvolvedor pode abrir um formulário dinamicamente (programaticamente) passando o nome deste formulário (classe) como string. Isto é muito comum quando há necessidade de criarmos menus populados dinamicamente a partir de uma base de dados.
     
    Problema
    Apesar de representar uma necessidade comum em aplicações Windows Forms, ainda há muitas dúvidas entre os desenvolvedores de como implementar corretamente um procedimento para instanciar um formulário dinamicamente. Faltam exemplos sobre esse tipo prática e os que estão disponíveis na Web não são facilmente encontrados e na maioria das vezes são apresentados em outro idioma.
     
    Solução
    Uma construção simples com o método CreateInstance do objeto Activator permite implementar esta funcionalidade. Veja o código abaixo:
     
    public static void OpenForm(string Namespace_FormName, bool System_Modal)
    {
       Type t = Type.GetType(Namespace_FormName);
      
       if (t != null)
       {
          System.Windows.Forms.Form f = (System.Windows.Forms.Form)Activator.CreateInstance(t);
     
          if (System_Modal)
             f.ShowDialog();
          else
             f.Show();
       }
    }
     
    Instanciando um formulário implementado em outro assembly
    Com uma construção semelhante, é possível iniciar um formulário implementado eu outro assembly. Basta modificar o código acima para incluir informações sobre o assembly externo. O exemplo abaixo mostra como iniciar um formulário (MDIChild) contido em outro assembly e centralizá-lo no MDI:
     
    private
    void OpenChildFormFromExternalAssembly(
       string Full_Namespace_Class,
       string Root_Namespace,
       string Assembly_Version,
       string Assembly_Culture,
       string Assembly_PublicKeyToken,
       bool System_Modal)
    {
       Type t = Type.GetType(Full_Namespace_Class + "," + Root_Namespace
          + ", Version=" + Assembly_Version
          + ", Culture=" + Assembly_Culture
          + ", PublicKeyToken=" + Assembly_PublicKeyToken);
     
       if (t != null)
       {
          System.Windows.Forms.Form f = (System.Windows.Forms.Form)Activator.CreateInstance(t);
     
          f.MdiParent = this;
     
          int TopMargin = 0;
          int LeftMargin = 0;
     
          LeftMargin = ((this.Width - f.Width) / 2) + this.Left;
          TopMargin = ((this.Height - f.Height) / 2) + this.Top - 50;
     
          f.StartPosition = FormStartPosition.Manual;
          f.Top = TopMargin;
          f.Left = LeftMargin;
     
          if (System_Modal)
             f.ShowDialog();
          else
             f.Show();
       }
    }
     
     
    As linhas abaixo demonstram como invocar o procedimento acima passando os parâmetros necessários:
     
    OpenChildFormFromExternalAssembly(
       "EIS.Presentation.frmTipoEis", // Namespace completo
       "EIS", // Root Namespace
       "1.0.0.0", // Assembly Version (AssemblyInfo.cs)
       "neutral", // Cultura (Default=neutral)
       "null", // PublicKeyToken (Default=null)
       false
    );

    Gerenciando Conflitos de Concorrência no LINQ-to-SQL

    Introdução

    O LINQ-to-SQL oferece uma coleção de APIs (Application Program Interface) para auxiliar o desenvolvedor a identificar, avaliar e solucionar conflitos de concorrência nas suas aplicações.

     

    Concorrência Otimista

    O modelo otimista para gerenciamento de conflitos de concorrência utiliza o método Resolve(RefreshMode) apresentado pelo Namespace System.Data.Linq. Este método avalia o conflito e atualiza os dados de acordo com o que foi definido pelo desenvolvedor através da Enumeração RefreshMode.

     

    Enumeração RefreshMode

    Esta enumeração determina como o método Resolve() irá tratar os conflitos de concorrência expostos pela Exception ChangeConflictException. Abaixo estão os membros desta enumeração com uma breve descrição:

     

    Membro

    Descrição

    KeepCurrentValues

    Força o método Resolve a substituir os valores originais com os valores contidos no banco de dados. Nenhum valor atual é modificado.

    KeepChanges

    Força o método Resolve a manter os valores atuais que foram modificados, mas atualiza outros valores com os valores contidos no banco de dados.

    OverwriteCurrentValues

    Força o método Resolve a sobrescrever os valores atuais com os valores contidos no banco de dados.

     

    Entendendo o RefreshMode

    Analisando a Enumeração acima, o desenvolvedor pode ter uma interpretação equivocada sobre o comportamento do método Resolve(). Para esclarecer isso abaixo estão três cenários diferentes que ilustram o comportamento do método Resolve para cada Membro da Enumeração RefreshMode.

     

    Cenário de Exemplo

    Considere o cenário abaixo. Uma Exception do tipo ChangeConflictException é gerada quando o Usuário1 tenta submeter suas alterações ao banco de dados, porque o Usuário2 efetivou modificações nos dados enquanto o Usuário1 estava manipulando o mesmo registro.

     

    Ação/Situação

    Colunas da Tabela Funcionario

    Manager

    Assistant

    Department

    Valores originais quando os usuários 1 e 2 obtiveram os dados

     

    Alfreds

     

    Maria

     

    Sales

    O Usuário1 tenta submeter as seguintes alterações

     

    Alfred

     

    (não modificado)

     

    Marketing

    O Usuário2 já tinha efetivado as seguintes alterações

     

    (não modificado)

     

    Mary

     

    Service

     

     

    Resolvendo conflitos mesclando dados (KeepChanges)

    O membro KeepChanges pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro mescla dados do cliente com dados contidos na base.

     

    Ação/Situação

    Colunas da Tabela Funcionario

    Manager

    Assistant

    Department

     

    Estado dos dados após a solução do conflito

     

     

    Alfred

    (Usuário 1)

     

    Mary

    (Usuário 2)

     

    Marketing

    (Usuário 1)

     

     

    Resolvendo conflitos mantendo os dados do banco (OverwriteCurrentValues)

    O membro OverwriteCurrentValues pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro sobrescreve os valores atuais (no cliente) com os valores encontrados no banco de dados.

     

    Ação/Situação

    Colunas da Tabela Funcionario

    Manager

    Assistant

    Department

     

    Estado dos dados após a solução do conflito

     

     

    Alfreds

    (Original)

     

    Mary

    (Usuário 2)

     

    Service

    (Usuário 2)

     

     

    Resolvendo conflitos sobrescrevendo os valores do banco de dados (KeepCurrentValues)

    O membro KeepCurrentValues pode ser utilizado para reconciliar diferenças entre os valores esperados e os valores reais contidos no banco de dados antes de você tentar submeter a atualização novamente. Este membro sobrescreve os valores do banco de dados com os valores atuais no cliente.

     

    Ação/Situação

    Colunas da Tabela Funcionario

    Manager

    Assistant

    Department

     

    Estado dos dados após a solução do conflito

     

     

    Alfred

    (Usuário 1)

     

    Maria

    (Original)

     

    Marketing

    (Usuário 1)

     

     

    Exemplo de implementação do modelo de concorrência otimista

    O procedimento abaixo apresenta o código necessário para implementação do modelo otimista. A linha em destaque mostra a chamada do método Resolve() onde o desenvolvedor pode escolher a ação desejada de acordo com a enumeração RefreshMode.

     

    try

    {

        db.SubmitChanges(ConflictMode.ContinueOnConflict);

    }

     

    catch (ChangeConflictException e)

    {

        Console.WriteLine(e.Message);

     

        foreach (ObjectChangeConflict occ in db.ChangeConflicts)

        {

            occ.Resolve(RefreshMode.KeepCurrentValues);

        }

    }

     

     

     

    January 02

    MVP 2008 Reloaded!

    Mais um ano no programa MVP! Não há maneira melhor para iniciar um novo ano! Recebí hoje pela manhã o e-mail informando a minha renovação para o programa MVP. Este é o quarto ano que participo do programa. Sinto-me honrado por fazer parte de uma comunidade tão ativa ao lado de grandes profissionais. Desde 2003 (meu primeiro ano no programa) conheci grandes profissionais e fiz grandes amigos!
     
    Abraços para todos!
     
    Carlos Mattos
    MVP 2008 (C#)
    December 13

    Palestra Resumo do TechEd 2007

    No próximo sábado, dia 15/12/2007, estarei na UNIP Sorocaba, para palestrar sobre as novidades apresentadas no TechEd Brasil 2007 e em seguida abriremos uma discussão sobre o mercado de trabalho para desenvolvedores de software. O evento é organizado pela Célula Acadêmica CARS.NET liderada pelo estudante Fernando Maldonado (fernandomal@hotmail.com). As atividades da célula iniciarão às 10h00min no Auditório Nobre da UNIP Sorocaba. O evento é gratuito e aberto para toda comunidade acadêmica.
    November 22

    Problema com ASP.NET AJAX 1.0 no Visual Studio 2008

    Cenário:
    Alguns desenvolvedores tem encontrado dificuldades para rodar projetos ASP.NET 2.0 que utilizam o AJAX Extensions versão 1.0.61025.0 no Visual Studio 2008. Muitos destes desenvolvedores, tentam apenas fazer a referência para a biblioteca  AjaxControlToolKit.dll diretamente a partir da janela Choose ToolBox Items. Contudo, o Ajax Control Toolkit utiliza o assembly System.Web.Extensions que é registrado no GAC (Global Assembly Cache). O que ocorre é que quando você instala o Visual Studio 2008, o assembly System.Web.Extensions registrado no GAC é da versão 3.5.0.0. Assim, quando você tenta abrir um projeto que utiliza o AJAX 1.0 a IDE do Visual Studio exibe uma mensagem de erro informando que o assembly System.Web.Extensions não pode ser carregado por que ele ou uma das suas dependências não foi encontrado.
     
    Solução:
    Instale o ASP.NET AJAX Extensions 1.0 a partir do arquivo ASPAJAXExtSetup.msi (disponível para download no site www.asp.net). Esta instalção adiciona e registra no GAC a versão 1.0.61025 necessária para seus projetos. As duas versões vão continuar funcionando normalmente pois o Global Assembly Cache gerencia de forma eficiente os assemblies de mesmo nome e com vesões diferentes.
     
    Alternativa:
    Se você não quiser instalar o ASP.NET AJAX Extensions 1.0 completo, basta copiar o assembly System.Web.Extensions de outro computador que tenha a versão 1.0.61025 e registrá-lo no GAC manualmente utilizando a ferramenta GACUtil.exe. O comando deve ser invocado a partir do prompt de comando do Visual Studio 2008 com a seguinte sintaxe GACUtil.exe -i <path>\System.Web.Extensions.dll. Esta prática é recomendada apenas para ambientes de desenvolvimento para ambientes de produção, o desenvolvedor deve instalar os componentes através do MSCORCFG.msc ou preferencialmente por um pacote do Windows Installer (.msi).
     
    Abaixo está o screenshot da pasta C:\WINDOWS\ASSEMBLY mostrando as duas versões do assembly System.Web.Extensions devidamente configuradas: GAC_SystemWebExt  

    Busca Incremental no Visual Studio

    Que a IDE do Visual Studio oferece um recurso de busca incremental? Este recurso permite que o desenvolvedor localize uma variável, objeto, função ou qualquer palavra dentro do seu código. A pesquisa incremental é executada de acordo com os caracteres digitados pelo desenvolvedor. Por exemplo, se você está buscando uma variável chamada intCodigoProduto e ativa a busca incremental, ao digitar "intCod" esse recurso selecionaria a próxima palavra que iniciasse com esses caracteres. Para ativar a Busca Incremental basta utilizar o atalho de teclado CTRL+I na janela de código.
    November 20

    Aprenda a jogar com seu tempo! (VOCE S/A)

    Para quem é leitor assíduo da revista Você S/A, publicada pela Editora Abril, com certeza já leu a matéria de capa da edição 112 (Outubro/2007). A matéria com o título "Use melhor o seu tempo" contém 32 idéias e vários depoimentos de executivos e especialistas em gestão do tempo. Tema de grande importância para todos que tem que dificuldades para organizar sua agenda.

    Logo na introdução, a matéria apresenta um dado estatístico impressionante: "... nós, brasileiros, jogamos fora dois terços do dia com atividades inúteis e urgentes. A Triade do Tempo, de São Paulo, especializada no assunto, fez a descoberta após ouvir 15.324 pessoas nos últimos dois anos. Por isso, sobra tão pouco espaço na agenda para o que é ralmente importante. ..."

    O fragmento do texto acima é apenas um aperitivo sobre o conteúdo desta matéria. Se você ainda não leu a edição de Você S/A deste mês, vá para a banca mais próxima e garanta o seu exemplar.

    Ainda sobre a gestão do tempo, outra referência muito boa é o livro "It's called work for a reason" de Larry Winget (http://www.larrywinget.com/). Nesta publicação o autor, utilizando uma linguagem direta, também destaca o tempo que perdemos com o que é urgente e não importante. O título do livro sugere exatamente o conteúdo apresentado de forma contundente pelo autor que tem um estilo único. Outra publicação do mesmo autor, que permaneceu no topo da lista dos livros mais vendidos do Wall Street Journal, leva o título "Shut up, stop whining & get a life".

    Estas publicações deixam de lado muitas filosofias de auto-ajuda e mergulham de forma prática e direta no que realmente importa - o resultado - o valor agregado para sua equipe, sua empresa, e claro, para sua carreira diretamente.

    Se tiver oportunidade de ler esses livros, tenha certeza que seu tempo será bem utilizado.

    Nova linguagem Microsoft F#

    Colegas, gostaria de compartilhar com vocês o texto divulgado pelo colega Fábio Galuppo (MVP C++) sobre a nova linguagem F# anunciada pela Microsoft. Confiram o texto abaixo:

    ...

    Acho que temos uma ótima notícia a ser divulgada aos MVPs e programadores .NET em geral.

    Ontem fiquei muito contente em saber desta notícia: http://blogs.msdn.com/somasegar/archive/2007/10/17/f-a-functional-programming-language.aspx

    Blog do Don Syme (criador do F#): http://blogs.msdn.com/dsyme/archive/2007/10/17/s-somasegar-on-taking-f-forward.aspx#comments

    Já venho pesquisando e criando ferramentas de apoio com F# a uns 2 ou 3 anos. Sendo que a partir dela surgiu meu interesse em functional programming (OCaml, Haskell, ...).

    Interessante saber que desde a incepção de anonymous methods no C# 2.0 e agora com o LINQ e lambda, o .NET Framework traz um novo estilo de programação, totalmente influenciado pelo paradgima funcional. A teoria matemática do Lambda Calculus de Alonzo Church foi a percursora deste paradigma de programação.

    A saber, no ano passado, no evento sobre Linguagens de Programação realizado pela Tempo Real, eu falei sobre C++/CLI e C#. Porém introduzi a evolução do C# (3.0, lambdas e LINQ) e reforçei o poder dos anonymous methods - obviamente que introduzi superficialmente o F# e suas construções para contextualizar sobre a influência da programação funcional ao .NET em geral.

    Não aconselho ao programador mediano ou grandes projetos comerciais migrarem para F#. Mas conhecer o paradigma funcional possibilita que um programador com fundamentos em linguagens tradicional (JAVA, C#, VB, Delphi,...) venha a resolver problemas que seriam complexos no paradigma imperativo de forma diferenciada e eficaz.

    Vejo o emprego do F# nos segmentos de pesquisas em geral, aplicações visualização (2D ou 3D) e matemática aplicada, bem como na construção de ferramentas e bibliotecas da apoio e até mesmo como scripts para construção de jogos.

    Grande abraço,

    Fabio Galuppo
    MVP Visual C++

    Arquivos MDW no Access 2007

    Alguns colegas têm me perguntado o que aconteceu com a ferramenta Workgroup Administrator no Access 2007, principalmente como associar um arquivo MDW (Arquivo de Informações do Grupo de Trabalho) à um projeto do Access 2007.

    O Access 2007 realmente está mudado, assim como as outras ferramentas do Office 2007, o Access passou por uma transformação desde sua interface até sua estrutura e formatos de arquivos.

    Porém, a estrutura e o conceito dos arquivos de informações dos grupos de trabalho (SYSTEM.MDW) não foram alterados e sua utilização continua a mesma. O problema é que ninguém encontra o utilitário Workgroup Administrator no menu do Access 2007 para associar arquivos MDW aos projetos já existentes.

    Para arquivos novos, criados no Access 2007 ou arquivos do Access 2003 que você deseja implementar a segurança em nível de usuário, basta utilizar o menu Database Tools para acessar a opção Users and Permissions, e acionar o assistente User-Level Security Wizard este assistente o conduzirá passo-a-passo para criar seu arquivo de grupo de trabalho e associá-lo ao Access.

    Para aqueles que desejam associar-se à um arquivo MDW já existente (aplicado para projetos criados no Access 2003 e versões anteriores também), basta criar um atalho para iniciar o Access acrescentando um parâmetro (switch) de inicialização, neste caso o parâmetro necessário é o /wrkgrp. Com este parâmetro é possível fazer a associação com o arquivo MDW. A sintaxe está apresentada abaixo:

    Path_Instalacao_Office12\MSACCESS.EXE /wrkgrp Path_Arquivo.MDW

    Por exemplo, o atalho abaixo associa o Access ao arquivo de grupo de trabalho chamado WD5Access.mdw:

    "C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE" /wrkgrp C:\Users\CarlosM.WD5\Documents\Sources\Access\WD5Access.mdw

    Ocultando o diálogo "Generating Previews" do Método System.Drawing.Printing.Print()

    Muitas aplicações .NET utilizam o Namespace System.Drawing.Printing para criar documentos de impressão (PrintDocument) e enviá-los para impressora ou para janela de PrintPreview.

    Um cenário comum é encontrado em aplicações WindowsForms. Imagine um ponto de venda que utiliza uma aplicação WindowsForms para impressão de cupons, comandas entre outros jobs. Considere que o operador desta aplicação utiliza o teclado para executar todos os comandos e entradas de dados (o uso do mouse é minimizado). Em cenários como este, é comum que a tecla [ENTER] seja pressionada repetidas vezes para completar um processo de entrada de um novo pedido por exemplo.

    Tive um cenário semelhante implementado no módulo de caixa de um restaurante, o volume de comandas entregues pelos garçons ao caixa é grande e o procedimento do caixa para inserir os pedidos no sistema é rápido e agilizado pelo uso do teclado. Ao final do processe de inserir uma nova comanda, o sistema verifica os itens inseridos e envia um job para diferentes impressoras dependendo dos itens, por exemplo, os itens "pratos quentes" são impressos na cozinha, enquanto as bebidas são enviadas para a impressora do bar para que o pedido seja atendido.

    O problema é que com o tempo, o usuário do caixa, tende a digitar as entradas cada vez mais rápido. Isso faz com que a tecla [ENTER] seja pressionada repetidas vezes, algumas para avançar para o próximo campo e outras para acionar os botões de comando. Contudo, é comum que o usuário pressione esta tecla pelo menos 1 vez mais além do necessário. Se isso ocorre quando a janela de diálogo "Generating Previews" está sendo exibida, o job de impressão é cancelado.

    Imagine a situação, você está na mesa, solicitou um prato, o garçon emitiu a comanda, entregou ao caixa, o caixa registrou o pedido, mas, sem perceber, pressionou a tecla [ENTER] mais uma vez cancelando o envio da impressão para a cozinha. Seu prato demora, você reclama para o garçon, ele reclama para o caixa, o caixa culpa a cozinha e no final de tudo a cupla recai sobre o sistema que devia ter previsto este cenário e utilizado uma implementação diferente.

    A solução: A solução é simples, porém os exemplos de impressão na documentação do MSDN não aborda nenhum cenário semelhante. Basicamente o que você precisa é mudar o PrintController do seu objeto PrintDocument. Por padrão, o PrintController é um objeto do tipo PrintControllerWithStatusDialog, assim toda vez que o método Print() é invocado, o PrintControllerWithStatusDialog exibe a janela Generating Previews. Basta substituí-lo pelo objeto StandardPrintController que a janela não será mais exibida. A sintaxe correta para esta construção é:

    pd.PrintController = new StandardPrintController();
    pd.Print();

    Simples assim!

    Podcast com a entrevista sobre a liberação do código-fonte do .NET Framework

    O website Hansel Minutes (http://www.hanselminutes.com/default.aspx?showID=101) publicou o áudio da entrevista com Shawn Burke da Microsoft. Nesta entrevista, Scott Hanselman e Carl Franklin conversam com Shawn Burke sobre a nova versão do Visual Studio que possibilita que o desenvolvedor estenda a depuração de suas aplicações até as classes do .NET Framework. A entrevista está no idioma original (Inglês), mas vale a pena conferir.

    Liberado acesso ao código-fonte do .NET Framework 3.5

    A Microsoft hoje fez um importante anúncio sobre a próxima versão do Visual Studio 2008, que permitirá acessar o código fonte das bibliotecas do .NET Framework 3.5 para ajudar no processo de depuração de sua aplicação. Os arquivos disponibilizados incluem os comentários da equipe de desenvolvimento da Microsoft.


    Além de permitir o download dos arquivos-fonte separadamente (onde o desenvolvedor pode utilizar qualquer editor de texto para analisar o conteúdo), a Microsoft já anunciou que o Visual Studio 2008 oferecerá suporte completo para depuração do código-fonte do .NET Framework.

    A liberação do código-fonte inclui o BaseClassLibrary (System, System.IO, System.Collections, System.Configuration, System.Threading, System.Net, System.Security, System.Runtime, System.Text, etc), ASP.NET (System.Web), Windows Forms (System.Windows.Forms), ADO.NET (System.Data), XML (System.Xml), and WPF (System.Windows).

    O código-fonte estará disponível sob o Microsoft Reference License (MS-RL).

    Além do impacto altamente positivo que esta abertura representa para todos os profissionais de desenvolvimento, penso que um impacto ainda maior será percebido junto à Comunidade Acadêmica, que receberá esta notícia com grande vibração!