Gestão de forms em aplicações .NET CF (3.5)

Foi atribuída à moving2u a tarefa de ‘simples’ conversão de uma solução em .NET CF 1.0 para .NET CF 3.5, entre outras alterações, como suporte a diferentes resoluções e orientações de ecrã, passar a utilizar bases de daods SQL Compact localmente no PDA e suporte a impressão em impressoras portáteis A4 da HP.

Ao correr a nova aplicação nos novos equipamentos da HTC os utilizadores com frequência ‘perdiam-se’, pois ao invocar o ‘task manager’ da HTC, surgiam várias ‘instâncias’ activas da aplicação. Tal comportamento, completamente oposto ao que deve ser uma aplicação .NET CF bem comportada, derivava da forma como os forms eram geridos por quem desenvolveu a versão inicial.

Numa aplicação em que a navegação entre forms fosse ‘explícita’, ou seja, em que cada form antes de fechar-se abre sempre explicitamente outro form, assegurando-se que a cada momento há apenas um form activo, este problema não se colocaria, mas neste caso a ‘retro-navegação’ era implícita dado que os forms eram sempre exibidos com o método .ShowDialog() e fechado com o .Close(), a ‘pilha’ de forms activos era exibida no task manager.

Para contrariar esse comportamento, impõem-se algumas regras, a mais simples das quais indica que para uma instância de um form activo não constar na lista de programas em execução, deve colocar-se o respectivo título (propriedade .Text do form) a vazio. Para não ter de a cada chamada guardar o texto do título do form chamador, limpá-lo, exibir o novo form e ao fechá-lo repor o título no form chamador, criei o seguinte extenseion method:

 

    public static class FormExtensionMethods
    {
        public static System.Windows.Forms.DialogResult ExibeDialogo(this System.Windows.Forms.Form newForm, System.Windows.Forms.Form currentForm)
        {
            string s = currentForm.Text;
            currentForm.Text = "";
            System.Windows.Forms.DialogResult r = newForm.ShowDialog();
            currentForm.Text = s;
            currentForm.Show();
            currentForm.BringToFront();
            return r;
        }
    }

Deste modo, bastou-me mudar as chamadas do tipo myForm.ShowDialog() por myForm.ExibeDialogo(this) para atingir o fim desejado :)

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>