Arquivo

Posts Tagged ‘windows forms’

Windows Forms e configuração local com SharpConfig

Em aplicações, é comum criar configurações locais, que ficarão salvas na própria máquina cliente.

Alternativa:

O .NET conta com o arquivo de configurações nativo. Esse arquivo que pode ser acessado no solution explorer, clicar com o botão direito no projeto, depois properties, e settings.

Na tela de edição de configurações, você pode digitar livremente, e definir um nome para a configuração, um tipo, escopo, e um valor default.

É necessário pré-cadastrar todas as configurações que estarão disponíveis na sua aplicação.

Para acessar e salvar as configurações nativas usamos o seguinte código:

Properties.Settings.Default["NomeImpressora"] = "Salvar para PDF";
Properties.Settings.Default.Save(); // Persiste as configurações

Problema da alternativa:

Essa configuração nativa é interessante até o momento em que você precisa atualizar sua aplicação. Se você ativar um procedimento de atualização automática na sua aplicação, e por engano sobrescrever o aplicativo de config, que é gerado automaticamente pelo build do .net, perderá as configurações salvas. E o pior a meu ver: esse modelo de arquivo de configuração, te exige criar previamente as configurações; não dá pra criar on-the-fly.

Solução:

SharpConfigLogo.png

Encontrei na biblioteca SharpConfig a solução para minhas necessidades. Ele salva suas configurações no formato de arquivo INI do windows.

[General]
# a comment
SomeString = Hello World!
SomeInteger = 10 # an inline comment
SomeFloat = 20.05
SomeBoolean = true
SomeArray = { 1, 2, 3 }
Day = Monday

[Person]
Name = Peter
Age = 50

Aplicação prática:

a) Criei uma classe estática para ser a camada de abstração que permitirá acesso a minhas configurações locais.

public static class LocalConfig
    {
        public static Configuration Configuration;

        public static void Initialize()
        {
            try
            {
                if (!File.Exists("localConfig.ini"))
                {
                    // If file not exists, initialize an empty one.
                    var memoryConfig = new Configuration();
                    memoryConfig.SaveToFile("localConfig.ini");
                }

                LocalConfig.Configuration = Configuration.LoadFromFile("localConfig.ini");
            }
            catch (Exception e)
            {
                MessageBox.Show("Falha ao inicializar configuração. Msg: " + e);
                throw;
            }
        }

        public static string DefaultPrinterName
        {
            get { return Configuration["General"]["DefaultPrinterName"].StringValue; }
            set { Configuration["General"]["DefaultPrinterName"].StringValue = value; }
        }
    }

Perceba que tenho o método Initialize(), esse método é invocado na inicialização da minha aplicação, no Program.cs. Como parte do processo de inicialização, garanto que existe na pasta da aplicação o arquivo “localConfig.ini”, caso não exista eu inicializo uma configuração vazia.

A propriedade estática DefaultPrinterName, é responsável por salvar a configuração na section General, e propriedade DefaultPrinterName. Veja que interceptei o getter e o setter para permitir carregamento e salvamento automático e imediato.

b) Criei uma tela que permite edição das configurações:

Ao clicar em Salvar, é executado o código abaixo:

private void barbtnSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        { 
            // load fields
            LocalConfig.DefaultPrinterName = lkpedtPrinterName.Text;

            this.DialogResult = DialogResult.OK;
            this.Close();
        }

Conclusão:

Há configurações, que devem ser armazenadas no banco de dados. Mas há configurações locais, que devem ser refeitas, quando o sistema é re-instalado. Entendo que a opção da Impressora Padrão é uma dessas configurações, e para esses casos a biblioteca SharpConfig atende as necessidades.

É compatível com as versões mais recentes do .net framework, e atualização relativamente recente.

Evolua o MessageBox com TaskDialog

Olá Pessoal.

Neste post lhes apresento o Task Dialog. Perfeito para o cenário Windows Forms + C#, onde você precisa transmitir uma mensagem em tela para o operador do seu sistema.

Na versão Windows Vista em diante, a microsoft incluiu uma API de mensagens a TaskDialog, que expande muito as possibilidades de apresentação de mensagens em tela.

Você está limitado as possibilidades abaixo?

aparência de um message box

aparência de um message box

Porquê não expandir suas possibilidades de customização para isto?

Demonstrativo com todas as opções de customização da task dialog

Demonstrativo com todas as opções de customização da task dialog

Veja que você pode adicionar Radio Buttons, Botões de Comando, área expansível, para exibir detalhes da mensagem, mensagem de rodapé com ícone, etc.

Vai melhorar a legibilidade das suas mensagens, facilitando o entendimento, e criando a possibilidade do seu operador executar ações diretamente na mensagem.

API com Task Dialog: https://msdn.microsoft.com/en-us/library/windows/desktop/bb787471%28v=vs.85%29.aspx

Para não se preocupar com os detalhes da invocação desta API seguem 2 dicas:

Wrapper para Windows Vista ou superior: http://www.codeproject.com/Articles/17026/TaskDialog-for-WinForms

Wrapper que funciona também em versões anteriores do windows: http://www.codeproject.com/Articles/21276/Vista-TaskDialog-Wrapper-and-Emulator 

Valeu pessoal.

Abraço.

guiaecologico.wordpress.com/

Despertando a consciência que preserva!

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: