Árvore de páginas

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MAXICON BALANÇA

 

 

 

 


Histórico da Revisão

 

Histórico de Alterações

 

Data

Responsável

Solicitação

Alterações

28 /11/2011

Alexandre Tiago Flach

37719

Criação do Manual


ÍNDICE

 

 

Manual Padronização ..........................................................................................................................................................

Maxicon Balança ..................................................................................................................................................................

ÍNDICE ..................................................................................................................................................................................

1 PADRONIZAÇÃO DE TELAS .................................................................................................................................

1.1 Cores ........................................................................................................................................................................

1.2 Programa ..................................................................................................................................................................

1.2.1 Resolução .......................................................................................................................................................

1.2.2 Ícones ..............................................................................................................................................................

1.3 Prompt ......................................................................................................................................................................

1.4 Campos .....................................................................................................................................................................

1.5 Grid ..........................................................................................................................................................................

1.6 Barra de Rolagem .....................................................................................................................................................

1.7 Tela de Consulta .......................................................................................................................................................

1.7.1 Propriedades ..................................................................................................................................................

1.7.2 Consulta de Registros .....................................................................................................................................

1.7.3 Seleção de Registro ........................................................................................................................................

1.7.4 Carregar Controles ........................................................................................................................................

1.7.5 Botões da Barra ..............................................................................................................................................

1.8 Tela Matriz Consulta ................................................................................................................................................

1.8.1 NovoRegistro ..................................................................................................................................................

1.8.2 AlterarRegistro ...............................................................................................................................................

1.8.3 RemoverRegistro ............................................................................................................................................

1.8.4 Novo ................................................................................................................................................................

1.8.5 Alterar .............................................................................................................................................................

1.8.6 Remover ..........................................................................................................................................................

1.9 Tela de Cadastro .......................................................................................................................................................

1.9.1 Carregar Controles ........................................................................................................................................

1.9.2 Carregar Dados ..............................................................................................................................................

1.9.3 Validar ............................................................................................................................................................

1.9.4 Persistir Dados ...............................................................................................................................................

1.9.5 Aplicar ............................................................................................................................................................

1.9.6 Salvar ..............................................................................................................................................................

1.9.7 Habilitar Botões .............................................................................................................................................

1.9.8 Adicionar Botões ............................................................................................................................................

1.10 Campo de Pesquisa ..............................................................................................................................................

1.10.1 Tag de Pesquisa .........................................................................................................................................

1.11 Campo Descrição ................................................................................................................................................

1.12 Campo Data .........................................................................................................................................................

1.13 Campo Hora ........................................................................................................................................................

1.14 Campo Numérico ................................................................................................................................................

1.15 Botões ..................................................................................................................................................................

1.16 Listas ...................................................................................................................................................................

1.17 RadioGroup .........................................................................................................................................................

1.18 Memorando .........................................................................................................................................................

2 PADRONIZAÇÃO DE PROGRAMAÇÃO .............................................................................................................

2.1 Mensagens ................................................................................................................................................................

2.2 Exceções ...................................................................................................................................................................

2.3 Log ...........................................................................................................................................................................

2.4 Comentários .............................................................................................................................................................

2.5 Estrutura Código ......................................................................................................................................................

2.5.1 Endentação do código ....................................................................................................................................

2.6 Declaração e atribuição de variáveis ........................................................................................................................

2.6.1 Variáveis privadas de classe ..........................................................................................................................

2.6.2 Variáveis locais ..............................................................................................................................................

2.6.3 Namespace ......................................................................................................................................................

2.6.4 Interface ..........................................................................................................................................................

2.6.5 Métodos ..........................................................................................................................................................

2.6.6 Enumerações ..................................................................................................................................................

2.6.7 Eventos ...........................................................................................................................................................

2.6.8 Constantes ......................................................................................................................................................

2.6.9 Exceções .........................................................................................................................................................

2.6.10 Propriedades públicas ...............................................................................................................................

2.7 InfoApp ....................................................................................................................................................................

2.7.1 Log ..................................................................................................................................................................

2.7.2 Nome da Aplicação .........................................................................................................................................

2.7.3 Pasta Executável ............................................................................................................................................

2.7.4 Pasta AppData ................................................................................................................................................

2.7.5 Pasta Imagens ................................................................................................................................................

2.7.6 Empresa ..........................................................................................................................................................

2.7.7 Usuário ...........................................................................................................................................................

2.8 Protocolos de Integração ..........................................................................................................................................

2.9 Wizard ......................................................................................................................................................................

2.9.1 Configuração Conexão ...................................................................................................................................

2.9.2 Instalação Nova Base .....................................................................................................................................

2.9.3 Atualização da Base de Dados .......................................................................................................................

2.9.4 Serviço de Integração .....................................................................................................................................

2.10 Setup ....................................................................................................................................................................

2.11 Tradução DevExpress .........................................................................................................................................

2.12 Integrador da Balança ..........................................................................................................................................

3 Referências ..................................................................................................................................................................


 

 

1          PADRONIZAÇÃO DE TELAS

 

1.1       Cores

 

Seguirá o padrão das cores do skin “Office 2010 Silver” do DevExpress, que poderá ser registrado no início da execução do programa:

(Incluir em References do projeto a DLL DevExpress.OfficeSkins.v..)

 

            DevExpress.UserSkins. OfficeSkins .Register();

            DevExpress.LookAndFeel. UserLookAndFeel .Default.SetSkinStyle( "Office 2010 Silver" );

 

 

1.2       Programa

 

Os programas inicialmente serão registrados no MenuPrincipal .cs na função RetornaProgramas, onde conterá os Módulos com o seu tipo de módulo (Maxicon.Balanca.Model.Interface.TModulo) , que será dispostos no menu principal da seguinte forma:

 

Módulo:

descricao : descrição do módulo (evitar de criar módulos com nomes iguais para um mesmo tipo de módulo);

tipoModelo : tipo do módulo.

Programa:

nome : nome do programa, geralmente o nome da classe que o implementa;

descrição : descrição do programa, exibido no menu principal;

modulo : módulo no qual o programa pertence;

escopo : escopo onde conterá as janelas, poderá estar em projetos distintos;

protocolo : protocolo no qual o programa implementa;

tipoPrograma : tipo de programa (Consulta, Cadastro), nas chamadas do menu principal será de extrema importância, pois identificará o assembly e o type das janelas.

 

      Atenção: os nomes das telas deverão seguir o padrão do nome do programa e o tipo do programa. Exemplo: CliforConsulta (para janela de consulta) e CliforCadastro (para janela de cadastro), ControlePatioConsulta .

 

 

Tipo de Módulos:

 

Módulos

Programas

Barra com programas em execução

 

1.2.1    Resolução

 

A resolução do sistema deverá se adequar a resolução do computador.

 

 

 

 

1.2.2    Ícones

 

Os ícones deverão estar dentro da pasta /Icones, com o nome “[modulo]_[nome_classe].png”. Exemplo da tela Controle de Pátio: “Pesagens_ControlePatio.png”.

 

Modulo pesagensBalanca = new Modulo () { descricao = "Pesagens" , tipoModelo = TModulo .BALANCA };

Programa controlePatio = new Programa () { nome = "ControlePatio" , descricao = "Controle Pátio" , modulo = pesagensBalanca, escopo = "MaxiconBalanca.Interface.Balanca" };


Observação: os ícones deveram estar no projeto Maxicon.Balanca.View na pasta Icones, com a propriedade Copy to Output Directory com o valor Copy Always. Os novos ícones deverão ser inclusos manualmente no instalador na pasta Icones.

 

 

 

 

1.3       Prompt

 

Fonte: Tahoma

Tamanho: 8

Estilo de Fonte: Regular

 

1.4       Campos

 

Fonte: Tahoma

Tamanho: 8

Estilo de Fonte: Regular

 

1.5       Grid

 

Deverá ser utilizado o componente GridControl utilizando um GridView para listar os dados (Tamanhos e cores são definidos no skin).

 

Para outras definições poderá ser chamado o procedimento ComponenteBehavior .AplicaConfiguracoesGrid no namespace Maxicon.Balanca.View.Pattern.

 

1.6       Barra de Rolagem

 

Automática, controlada pelo componente.

 

1.7       Tela de Consulta

 

Herdar da tela ConsultaPadrao , onde poderão ser preenchidas as seguintes propriedades no construtor.

 

 

Exemplo da tela consulta de municípios:

Construtor:

 

public MunicipioConsulta(): base (Model.Interface. TProtocolo .GET_MUNICIPIOIBGE)

        {

            InitializeComponent();

 

            base . gridConsulta = gridView1;

 

            base . bindingSourceConsulta = municipioIBGEBindingSource;

 

            base . classePesquisa = typeof ( MunicipioIBGE );

 

            base . ordenacao = new Order [] { new Order ( "codigo" , true ) };

        }

 

 

1.7.1    Propriedades

gridConsulta : gridView que será listado a consulta;

bindingSourceConsulta : bindingSource onde conterá o resultado da consulta;

classePesquisa : type da classe que está sendo realizado a consulta (para que funcione corretamente a classe deverá ser herdada pela classe ActiveRecordBase);

ordenacao : ordenação dos registros aplicado sobre a consulta;

protocolo: protocolo específico que a janela de consulta está implementando, com está propriedade informada evitará que o janela seja aberta mais de uma vez no menu principal;

filtroSelecao : onde conterá o filtro vindo de uma outra tela (utilizado no componente PesquisaControle, onde já se tem um critério de pesquisa e janela de consulta abrirá a tela já com os dados que são necessários);

filtroInterno: conterá um filtro interno, por exemplo: registros que não poderão ser mostrados naquela janela ou a utilização de filtros internos como campos para o usuário informar critérios de pesquisa (abaixo onde fala sobre o método ConsultarRegistros há exemplos práticos);

registroInicial: número do registro inicial que será utilizado no pesquisa (utilizado em paginações), seu valor padrão é 0 (zero);

registroFinal: número do registro final que deverá trazer na consulta, utilizado para limitar quantidade de registros pesquisados (poderá ser utilizado em paginações), seu valor padrão é 100, para que retorna todos os registros seu valor deverá ser 0 (zero);

totalRegistros: armazenara o total de registros da consulta, isto é, o total de registros sem aplicação de paginação;

 

 

A tela de consulta padrão possui um construtor que recebe como parâmetro um TProtocolo , se a tela que será herdade possuir um protocolo próprio poderá ser passado no construtor como o exemplo acima. Com está propriedade definida, ao abrir um programa no menu principal será verificado se o programa já se encontra aberto, se encontrar direcionará o foco para o programa que foi solicitado, chamando o procedimento ConsultarRegistros para atualizar a lista de registros. O método poderá ser sobrescrito e adequado caso necessário. Veja exemplo:

 

Janela de consulta de clifor, onde possui campo em tela para filtro com chamada do método base:

 

public override void ConsultarRegistros()

        {

            if (filtroInterno == null )

               filtroInterno = new List < ICriterion >();

            else

                filtroInterno.Clear();

 

            if (! string .IsNullOrEmpty(edNomeClifor.Text))

                filtroInterno.Add( Expression .InsensitiveLike( "nome" , edNomeClifor.Text, MatchMode .Anywhere));

 

            base .ConsultarRegistros();

        }

 

Exemplo do filtro no controle de pátio sem a chamada do método base:

 

public override void ConsultarRegistros()

        {

            controlePatioBindingSource.Clear();

 

            var filtrosAnd = Expression .Conjunction();

            filtrosAnd.Add( Expression .Eq( "cancelado" , false ));

            filtrosAnd.Add( Expression .Eq( "status" , TStatusProcessamento .NãoEnviado));

 

            if (! string .IsNullOrEmpty(placaTextEdit.Text))

                filtrosAnd.Add( Expression .Eq( "placaCavalo" , placaTextEdit.Text));

            if (produtoPesquisaControl.Entidade != null )

                filtrosAnd.Add( Expression .Eq( "itemBalanca" , produtoPesquisaControl.Entidade));

            if (fluxoLookUpEdit.EditValue != null )

                filtrosAnd.Add( Expression .Eq( "fluxo" , fluxoLookUpEdit.EditValue));

 

            controlePatioBindingSource.DataSource = ControlePatio .FindAll( new Order ( "placaCavalo" , true ), filtrosAnd);

        }

 

 

Existe um propriedade isLiberaSelecao que se for marcada como true , no momento de exibir a tela ao usuário o botão de seleção será liberado para visualização. Ao clicar no botão ou pressionar F10 para selecionar, a propriedade isSelecionado será marcado como true e a propriedade idSelecionado armazenara o id do registro selecionado. Exemplo de utilização:

 

     DispositivoBalancaConsulta consultaBalanca = new DispositivoBalancaConsulta ();

            consultaBalanca. isLiberaSelecao = true ;

            consultaBalanca.ShowDialog();

            if (consultaBalanca. isSelecionado )

            {

               Dispositivo balanca = DispositivoBalanca .Find(consultaBalanca. idSelecionado );

            }

 

O método SelecionarRegistro chamado na ação da seleção poderá ser sobrescrito, caso não atender a definição padrão.

 

 

 

O procedimento CarregarControles poderá ser sobrescrito, para que possam ser incluídos botões, definir algumas propriedades ao exibir a janela para o usuário, inicializar componentes, carregamento de dados, etc. Função é chamada no evento Load da janela. Abaixo segue exemplo na janela de controle de pátio, onde são incluído botões, aplicado e carregado configurações, além de realizar carregamento de dados para os campos de filtro.

 

 

public override void CarregarControles()

        {

            UtilComponente .AplicaConfiguracoesGrid(controlePatioGridView);

            UtilComponente .AddBotaoLimparLookUpEdit(fluxoLookUpEdit);

            fluxoLookUpEdit.Properties.DataSource = Enum .GetValues( typeof ( TFluxoPesagem ));

 

            PesquisaControl .InserirEventos( this .dxError,

               produtoPesquisaControl,

               codigoProdutoTextEdit,

               typeof ( ItemBalanca ),

               typeof ( ItemBalancaConsulta ),

               null ,

               false ,

               true ,

               null );

 

            var buttonProximaEtapa = new DevExpress.XtraBars. BarButtonItem ();

            buttonProximaEtapa.Caption = "Próxima Etapa (F8)" ;

            buttonProximaEtapa.Hint = "Próxima Etapa" ;

            buttonProximaEtapa.ShortcutKeyDisplayString = " " ;

            buttonProximaEtapa.Name = "buttonProximaEtapa" ;

            buttonProximaEtapa.Visibility = DevExpress.XtraBars. BarItemVisibility .Always;

            buttonProximaEtapa.ItemShortcut = new DevExpress.XtraBars. BarShortcut ( Shortcut .F8);

            buttonProximaEtapa.Glyph = Properties. Resources .proximo_24;

            buttonProximaEtapa.ItemClick += new ItemClickEventHandler (buttonProximaEtapa_ItemClick);

            this .InserirBotaoBarraFerramentas(buttonProximaEtapa, 0, 0, false , true , true );

 

            var buttonProcessamento = new DevExpress.XtraBars. BarButtonItem ();

            buttonProcessamento.Caption = "Processamento (F11)" ;

            buttonProcessamento.Hint = "Procesamento" ;

            buttonProcessamento.ShortcutKeyDisplayString = " " ;

            buttonProcessamento.Name = "buttonProcessamento" ;

            buttonProcessamento.Visibility = DevExpress.XtraBars. BarItemVisibility .Always;

            buttonProcessamento.ItemShortcut = new DevExpress.XtraBars. BarShortcut ( Shortcut .F11);

            buttonProcessamento.Glyph = Properties. Resources .process_24;

            buttonProcessamento.ItemClick += new ItemClickEventHandler (buttonProcessamento_ItemClick);

            this .InserirBotaoBarraFerramentas(buttonProcessamento, 1, 0, false , true , false );

 

            configPesagem = ConfiguracaoPesagem .FindOne( Expression .Eq( "empresa" , InfoApp .empresa));

 

            cancelarButtonItem.Caption = "Fechar (F4)" ;

            cancelarButtonItem.Caption = "Fechar" ;

 

            CarregaOrdemPesagem();

        }

 

 

 

A janela de consulta possui duas barras (toolbar e statubar) onde poderão ser inclusos novos botões.

Por padrão da janela existem os botões:

Selecionar (F10): seleção de registro (ver tópico 1.7.3 );

Atualizar (F5): consulta de registros (ver tópico 1.7.2 );

Cancelar(F4): irá fechar a janela chamando o procedimento Fechar.

Novos botões poderão ser inclusos nas barras através do procedimento:

InserirBotaoBarraFerramentas( BarItem item, int index, int userWidht, bool incluirSeparador, bool incluirMenuBar = true , bool incluirStatusBar = false )

 

item : item a ser incluído na barra;

index : índice da posição do item na barra (iniciando em 0 (zero));

userWidht : definir tamanho do item (itens específicos implementam por padrão é zero);

incluirSeparador : caso o botão não possui a mesma característica de funcionalidade que o botão ao lado esquerdo, será possível incluir um separador informando true ;

incluirMenuBar : se true o item será incluso na barra superior;

incluirStatusBar : se true o item será incluso na barra inferior.

 

Exemplo de utilização no tópico 1.7.4 .

 

 

1.8       Tela Matriz Consulta

 

 

A tela matriz de consulta (ConsultaMatrizPadrao) poderá ser herdada por janelas que irão fazer chamadas  de inserção, alteração e remoção de registros. Está janela implementa a janela de consulta padrão (ver tópico 1.7 com as propriedades necessárias para implementação), adicionando os botões:

Adicionar (F6): inclusão de novo registro, realizando chamada no procedimento NovoRegistro();

Alterar (F7): alteração do registro selecionado, realizando chamada no procedimento AlterarRegistro();

Remover (Del): remoção do registro selecionado, realizando chamada no procedimento RemoverRegistro();

 

Atenção: ao herdar de ConsultaMatrizPadrao e sobrescrever o procedimento CarregarControles manter chamada ao método base , pois é ele quem adiciona os botões implementados nesta tela.

 

public override void CarregarControles()

        {

            base .CarregarControles();

 

            UtilComponente .AplicaConfiguracoesGrid(gridView1);

        }

 

 

1.8.1    NovoRegistro

 

Procedimento virtual, que realiza chamada ao procedimento Novo . Possui tratamento de erro e, finalizada com a chamada no procedimento ConsultarRegistros atualizando a lista de registros.

 

 

Procedimento virtual, que verifica se há um registro válido (implementado pela interface IEntidade ) selecionado e realiza a chamada ao procedimento Alterar . Se não encontrar um registro selecionado exibe mensagem ( UtilMensagem .SELECIONE_REGISTRO ). Possui tratamento de erro e, finalizada com a chamada no procedimento ConsultarRegistros atualizando a lista de registros;

 

 

Procedimento virtual, que verifica se há um registro válido (implementada pela interface IEntidade ) selecionado e realiza a chamada ao procedimento Remover . Se não encontrar um registro selecionado exibe mensagem ( UtilMensagem .SELECIONE_REGISTRO ). Possui tratamento de erro e, finalizada com a chamada no procedimento ConsultarRegistros atualizando a lista de registros;

 

 

1.8.4    Novo

 

Procedimento virtual, que deverá ser implementado pela tela que há herda. Método chamado por NovoRegistro .

 

1.8.5    Alterar

 

Procedimento virtual, que recebe como parâmetro de entrada o id do objeto selecionado, que deverá ser implementado pela tela que há herda. Método chamado por AlterarRegistro .

 

 

1.8.6    Remover

 

Procedimento virtual, que recebe como parâmetro de entrada o id do objeto selecionado, poderá ser implementado pela tela que há herda ou como padrão irá fazer a deleção da entidade selecionada caso entidade de pesquisa tiver sido informada na construção da tela ( ActiveRecordMediator .Delete(gridConsulta.GetFocusedRow()) ). Método chamado por RemoverRegistro .

 

 

1.9       Tela de Cadastro

 

As janelas de cadastro poderão ser herdadas de CadastroPadrao na biblioteca Maxicon.Balanca.Lib.

 

 

O procedimento CarregarControles poderá ser sobrescrito, para que possam ser incluídos botões, definir algumas propriedades ao exibir a janela para o usuário, inicializar componentes, carregamento de dados, etc. Função é chamada no evento Load da janela (ver exemplo no tópico 1.7.4 ).

 

1.9.2    Carregar Dados

 

O método CarregarDados é chamado logo após o método CarregarControles no evento Load da janela. Deverá ser sobrescrito se herdado, sua principal função é realizar o carregamento dos dados para edição na janela.

 

protected override void CarregaDados()

        {

            fluxoBalancaLookUpEdit.Properties.DataSource = Enum .GetValues( typeof ( TFluxoBalanca ));

 

            if (configuracao == null )

            {

                configuracao = new DispositivoBalanca ();

                configuracao.descricao = "Balança " + configuracao.fluxoBalanca.ToString();

                configuracao.endereco = "http://localhost:8084/service" ;

                configuracao.delimiter = "13" ;

                configuracao.length = "5" ;

                configuracao.port = "COM1" ;

                configuracao.initialPos = "4" ;

                configuracao.securityReads = "4" ;

                configuracao.baudrate = "9600" ;

                configuracao.databits = "8" ;

                configuracao.stopbits = "1" ;

                configuracao.parit = "0" ;

            }

            else

                descricaoTextEdit.Properties.ReadOnly = true ;

 

            dispositivoBalancaBindingSource.DataSource = configuracao;

            dataLayoutControl1.Refresh();

        }

 

1.9.3    Validar

 

O método Validar é invocado ao tentar persistir as informações da janela. Recebe como parâmetro um booleano que define se o campo com erro deverá receber o foco. Deverá retornar também um booleano se os dados foram validados com sucesso.

O janela possui o componente dxErrorProvider é através deles que os campos são validados, ou seja, toda e qualquer mensagem de validação para um campo deverá passar por este componente. Ele deixará um ícone no campo, isto quer dizer que o campo não está valido, para visualizar o motivo da visualização será necessário ir com o mouse em cima do ícone. Para facilitar a visualização do usuário foi implementado um procedimento para forçar a exibição da mensagem ao receber o foco. Veja exemplo:

 

if (foco)

                ComponenteBehavior .MostrarFocoPrimeiroItemErro(dxErrorProvider, defaultToolTipController.DefaultController);

 

Segue exemplo da utilização do procedimento:

 

protected override bool Validar( bool foco = true )

        {

            bool valido = true ;

            try

            {

                if ( ValidacaoHelper .ControleNulo(dxErrorProvider, depositoPesquisaControl))

                    valido = false ;

                else

                    pesagem.deposito = depositoPesquisaControl.Entidade as Deposito ;

 

                if ( ValidacaoHelper .ControleNulo(dxErrorProvider, tabelaDescontoPesquisaControl))

                    valido = false ;

                else

                    pesagem.tabelaDesconto = tabelaDescontoPesquisaControl.Entidade as TabelaDescontoGrao ;

 

                pesagem.embarque.motorista = motoristaTextEdit.Text;

 

                if (viaTransproteLookUpEdit.EditValue == null )

                {

                    pesagem.embarque.viaTransporte = null ;

                    dxErrorProvider.SetError(viaTransproteLookUpEdit, "Informe um registro" , ErrorType .Information);

                    valido = false ;

                }

                else

                {

                    dxErrorProvider.SetError(viaTransproteLookUpEdit, string .Empty);

                    pesagem.embarque.viaTransporte = viaTransproteLookUpEdit.EditValue as ViaTransporte ;

                }

 

                if (! string .IsNullOrEmpty(transportadorPesquisaControl.Text))

                    pesagem.embarque.transportador = Clifor .FindOne( new ICriterion [] { Expression .Eq( "id" , Int64 .Parse(transportadorPesquisaControl.Text)) });

                else

                    pesagem.embarque.transportador = null ;

            }

            catch ( Exception ex)

            {

                valido = false ;

                InfoApp .Log.Error( "falha validar dados da pesagem." , ex);

                MensagemHelper .Show(ex, MessageBoxIcon .Information, string .Empty, "Falha validar dados da pesagem." );

            }

 

            if (foco)

                ComponenteBehavior .MostrarFocoPrimeiroItemErro(dxErrorProvider, defaultToolTipController.DefaultController);

 

            return valido;

        }

 

A classe ValidacaoHelper poderá ser usada para auxiliar em validações simples, como verificação de campos vazios que são obrigatórios, número máximos e mínimos, conforme necessário validações comuns poderão ser implementadas nesta classe.

 

 

O método PersistirDados irá fazer a persistência e/ou processamento das informações, retornando um booleano com valor true se executar com sucesso.

 

 

  protected override bool PersistirDados()

        {

            configuracao.Save();

 

            return true ;

        }

 

1.9.5    Aplicar

 

O método Aplicar irá validar e persistir os dados e retorna um booleano true se executou com sucesso. Sua chamada é realizada quando pressionado o botão Aplicar (F11) da tela que chama o método Salvar passando o parâmetro como false . Consiste em aplicar as alterações sem fechar a janela.

 

1.9.6    Salvar

 

O método Salvar recebe como parâmetro um booleano que ao retornar true na chamada do método Aplicar e se o parâmetro de entrada for true irá chamar o método Fechar que irá fechar a janela. Para realizar a chamada poderá ser utilizado o botão Salvar (F10) que invoca o método Salvar passando o parâmetro como true .

 

 

O método HabilitarBotões é utilizada para desativar ou ativar os botões Salvar , Aplicar e Cancelar da janela de cadastro.

 

 

 

O método InserirBotaoBarraFerramentas tem a mesma funcionalidade que o método da janela de consulta (tópico 1.7.5 ), mas com a opção de adicionar apenas na barra de status.

 

 

Dentro da biblioteca Maxicon.Balanca.Lib foi desenvolvido um componente chamado PesquisaControl , seu principal objetivo é auxiliar em pesquisas de modelos da biblioteca Maxicon.Balanca.Model.

Para utilizar o componente é possível arrastar a partir do ToolBox do visual studio.

As configurações são carregadas a partir do procedimento estático do componente InserirEventos que irá incluir todos os eventos e configurações necessárias para que o componente realize a pesquisa.

 

Parâmetros de entrada:

dxError : componente dxErroProvider que irá gerenciar os erros ocorridos na validação caso não encontrar um registro;

controle : PesquisaControl que irá ser configurado;

descricaoBaseEdit : componente que irá receber a descrição auxiliar através dos atributos de tag definidos no modelo;

camposPesquisa : quando houver mais de um componente que irá receber descrições/resultados da pesquisa poderá ser passado uma lista com todos estes componentes;

model : Type da classe que irá servir como base das pesquisas;

janelaConsulta : Type da janela de consulta do modelo, que será invocada quando encontrar mais de um registro na pesquisa (deverá ser um Type que possua herança com a ConsultaPadrao );

filtros: lista de filtros que será aplicado juntamente com a consulta, utilizado pra restringir registros que não poderão ser retornados na consulta;

enableDescricaoBaseEdit : irá desabilitar os componentes de descrição se definido o parâmetro como true ;

descricaoEmpty : se este parâmetro estiver definido como true , os componentes de descrição auxiliar não serão limpados quando o controle principal (PesquisaControl) estiver sem informação para pesquisa;

validaControle : delegate auxiliar de validação, que se informado será invocado depois de encontrar o registro.

 

Exemplo de utilização do método com um componente auxiliar e com validação auxiliar:

 

PesquisaControl .InserirEventos( this .dxErrorProvider,

                depositoPesquisaControl,

                numeroDepositoTextEdit,

                typeof ( Deposito ),

                typeof ( DepositoConsulta ),

                null ,

                false ,

                true ,

                new PesquisaControl . ValidaControleEventHandler ( this .ValidaDeposito));

 

Exemplo de utilização do método passando uma lista de componentes:

 

PesquisaControl .InserirEventos( this .dxErrorProvider,

                fornecedorPesquisaControl,

                new List < AuxiliarPesquisaControl >()

                {

                    new AuxiliarPesquisaControl ()

                    {

                        nivel = 1,

                        tagPesquisa = TTagPesquisa .Tag,

                        principal = true ,

                        pesquisa = true

                    },

                    new AuxiliarPesquisaControl ()

                    {

                        nivel = 1,

                        tagPesquisa = TTagPesquisa .Proxy,

                        descricaoTextEdit = nomeFornecedorTextEdit,

                        pesquisa = true ,

                    },

                    new AuxiliarPesquisaControl ()

                    {

                        nivel = 2,

                        tagPesquisa = TTagPesquisa .Proxy,

                        descricaoTextEdit = cpfCnpjFornecedorTextEdit,

                        pesquisa = true ,

                    }

                },

                typeof ( Clifor ), typeof ( CliforConsulta ), null , false , false );

 

 

1.10.1                        Tag de Pesquisa

 

As tags de pesquisa são definidas nos modelos através do atributo TagPesquisaAttribute da própria biblioteca de modelos Maxicon.Balanca.Model. Este atributo é necessário para que o PesquisaControl consiga mapear as propriedades do modelo e realizar a consulta na base de dados.

O atributo possui as seguintes propriedades:

nível : qual o nível da pesquisa, apenas definir níveis de prioridade das propriedades dos modelos;

tipoTag : tipo da tag se for Tag (espécie de chave do modelo) ou Proxy (descrição);

descrição : descrição da tag de pesquisa.

 

Exemplo de utilização no modelo Deposito:

 

    [ ActiveRecord ( "deposito" )]

    public class Deposito : ActiveRecordBase < Deposito >, IModel

    {

        #region Propriedades

        /// <summary>

        /// Chave Primária (automatico)

        /// </summary>

        [ PrimaryKey ( "id" , Generator = PrimaryKeyType .Sequence)]

        public virtual long id { get ; set ; }

 

        /// <summary>

        /// Número do deposito

        /// </summary>

        [ Property ( "nr_deposito" , NotNull = true , UniqueKey = "unique_deposito_idx" )]

        [ TagPesquisaAttibute ( TTagPesquisa .Tag, 1, "Depósito" )]

        public virtual int numero { get ; set ; }

 

        /// <summary>

        /// Empresa

        /// </summary>

        [ BelongsTo ( "cd_empresa" , NotNull = true , UniqueKey = "unique_deposito_idx" )]

        public virtual Empresa empresa { get ; set ; }

 

        /// <summary>

        /// Descrição do depósito

        /// </summary>

        [ Property ( "ds_deposito" , NotNull = true )]

        [ TagPesquisaAttibute ( TTagPesquisa .Proxy, 1, "Descrição" )]

        public virtual string descricao { get ; set ; }

 

        #endregion

    }

 

Exemplo de utilização no modelo Clifor com vários níveis:

 

     [ ActiveRecord ( "clifor" )]

    public class Clifor : ActiveRecordBase < Clifor >, IModel

    {

        #region Propriedades

        /// <summary>

        /// Chave Primária (automatico)

        /// </summary>

        [ PrimaryKey ( "id" , Generator = PrimaryKeyType .Assigned)]

        [ TagPesquisaAttibute ( TTagPesquisa .Tag, 1)]

        public virtual long id { get ; set ; }

 

        /// <summary>

        /// Número do CPF/CNPJ

        /// </summary>

        [ Property ( "nr_cpfcnpj" , NotNull = true , Length = 14)]

        [ TagPesquisaAttibute ( TTagPesquisa .Proxy, 2)]

        public virtual string cpfcnpj { get ; set ; }

 

        /// <summary>

        /// Nome do Clifor

        /// </summary>

        [ Property ( "nm_clifor" , NotNull = true )]

        [ TagPesquisaAttibute ( TTagPesquisa .Proxy, 1)]

        public virtual string nome { get ; set ; }

 

        /// <summary>

        /// Nome Fantasia

        /// </summary>

        [ Property ( "nm_fantasia" )]

        [ TagPesquisaAttibute ( TTagPesquisa .Proxy, 3)]

        public virtual string nomeFantasia { get ; set ; }

 

        /// <summary>

        /// Data Nascimento

        /// </summary>

        [ Property ( "dt_nascimento" )]

        public virtual DateTime dataNascimento { get ; set ; }

 

        #endregion

    }

 

 

 

Utilizar o componente TextEdit do DevExpress.

 

 

Utilizar o componente DateEdit do DevExpress.

 

 

Utilizar o componente TimeEdit do DevExpress.

 

 

Utilizar o componente SpinEdit do DevExpress, e chamando o procedimento ComponenteBehavior .PadronizaSpindEdit, para padronizar o componente.

 

 

Utilizar os métodos de inserção de botões explicados nos tópicos 1.7.5 e 1.9.8 das janelas padrões.

 

 

Utilizar o componente LookUpEdit do DevExpress.

 

 

Utilizar o componente RadioGroup do DevExpress.

 

 

Utilizar a chamada ao procedimento Memorando .Mostrar da biblioteca Maxicon.Balanca.Lib.

 

 

 

2.1       Mensagens

 

A classe MensagemHelper do namespace Maxicon.Balanca.Lib.Helper, contém dois métodos principais que poderão ser utilizados para exibir as mensagens do sistema, retornando um DialogResult , isto é, o resultado do diálogo, se clicou em algum botão disponível.

Principais parâmetros primeiro procedimento:

 

owner : formulário que fez a chamada da mensagem;

mensagem : mensagem que irá ser exibida para o usuário;

titulo : título da mensagem (padrão nome do produto);

botão : botões a serem exibidos para o usuário (padrão botão OK);

ícone : ícone da mensagem (padrão nenhum);

botaoPadrao : principal botão que irá receber o foco (padrão primeiro);

 

MensagemHelper .Show( this , "Mensagem de teste!" );

 

 

Principais parâmetros segundo procedimento:

 

owner : formulário que fez a chamada da mensagem;

exception : erro ocorrido durante a execução;

ícone : ícone da mensagem (padrão erro);

titulo : título da mensagem (padrão nome do produto);

mensagem : mensagem que irá ser exibida para o usuário(padrão mensagem da e

Exception );

 

  Exception ex = new Exception ( "Teste de Exception" );

         MensagemHelper .Show( this , ex);

 

 

2.2       Exceções

 

Para tratamento de exceções utilizar try-catch , e se a instrução no qual o código faz uma chamada no método Dispose utilize um using .

Utilizando try-catch:

static string GetValueFromArray( string [] array, int index)

{

    try

    {

        return array[index];

    }

    catch (System.IndexOutOfRangeException ex)

    {

        Console.WriteLine( "Index is out of range: {0}" , index);

        throw ;

    }

}

 

Utilizando using:

 

// You can do the same thing with a using statement.

using (Font font2 = new Font( "Arial" , 10.0f))

{

    byte charset = font2.GdiCharSet;

}

 

 

As exceções que não forem tratadas irão cair no evento ThreadExceptionEventHandler

da aplicação que está tratado para estourar em Mensagem no segundo procedimento com exceção que ocorreu.

 

2.3       Log

 

Os logs serão feitos através da biblioteca log4net, a chamada pra inclusão de log deverá ser realizada pela classe InfoApp na propriedade Log.

As configurações de onde serão gravados os logs ficaram no arquivo app.config que deverá estar com o executável (para mais detalhes de configuração e utilização verificar documentação do projeto http://logging.apache.org/log4net/ ).

 

           try

            {

                InicioSistema();

            }

            catch ( Exception ex)

            {

                InfoApp .Log.Error(ex.Message, ex);

                MensagemHelper .Show( null , ex, MessageBoxIcon .Exclamation);

            }

 

2.4       Comentários

 

Os comentários são realizados no subversion a cada commit realizado, onde deverão ser comentadas todas as alterações realizadas. Como o subversion possui controle de acesso, e data/hora de revisão, nos commits do subversion apenas serão importantes os comentários que ilustram o motivo da alteração e sua fonte de origem (solicitação).

 

 

 

2.5       Estrutura Código

 

 

Um bom layout usa formatação para enfatizar a estrutura do seu código e facilitar a leitura do código.   Utilizando as seguintes convenções:

  • Use as configurações padrão do Editor de código (recuo inteligente, recuos de quatro caracteres, tabulações, salvas como espaços).   Para obter mais informações, consulte   A formatação, C#, editor de texto, caixa de diálogo Opções .
  • Grave apenas uma instrução por linha.
  • Grave somente uma declaração por linha.
  • Se as linhas de continuação não são recuadas automaticamente, recue a eles uma parada de tabulação (quatro espaços).
  • Adicione pelo menos uma linha em branco entre as definições de método e propriedade.
  • Use parênteses para tornar as cláusulas em uma expressão aparente, conforme mostrado no código a seguir.

 

if ((val1 > val2) && (val1 > val3))

{

    // ação.

}

 

 

Use   digitação implícita   por variáveis locais quando o tipo da variável é óbvio do lado direito da atribuição ou o tipo exato não é importante.

 

var var1 = "This is clearly a string." ;

var var2 = 27;

var var3 = Convert.ToInt32(Console.ReadLine());

 

Não use   var   quando o tipo não está aparente no lado direito da atribuição.

 

int var4 = ExampleClass.ResultSoFar()

 

Use a digitação implícita para determinar o tipo da variável de loop em para e foreach loops.

O exemplo a seguir usa a digitação implícita em uma for instrução.

 

 

var syllable = "ha" ;

var laugh = "" ;

for ( var i = 0; i < 10; i++)

{

    laugh += syllable;

    Console.WriteLine(laugh);

}

 

O exemplo a seguir usa a digitação implícita em uma   foreach   instrução.

 

foreach ( var ch in laugh)

{

    if (ch == 'h' )

        Console.Write( "H" );

    else

        Console.Write(ch);

}

Console.WriteLine();

 

 

 

Utilizar a definição CamelCase (a primeira letra do identificador é minúscula e a primeira letra de cada identificador subseqüente concatenado é maiúscula).

 

Exemplo:

  http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001_clip_image009.gif

 

 

Utilizar a definição CamelCase.

 

2.6.3    Namespace

 

Utiliza-se o nome da empresa seguido pelo nome do projeto, camada de negocio e o modulo que está sendo desenvolvido.

 

Exemplo:

 

http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001_clip_image010.gif

 

2.6.4    Interface

 

O nome de interface deve ser PascalCase (a primeira letra do identificador é maiúscula e a primeira letra de cada identificador subseqüente concatenado é maiúscula), e começar com o prefixo “I”, para indicar que o tipo é uma interface.

 

Exemplo:

 

http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001_clip_image011.gif

 

2.6.5    Métodos

 

Utilizar a definição PascalCase.

 

2.6.6    Enumerações

 

Utilizar a definição PascalCase.

 

2.6.7    Eventos

 

Utilizar a definição PascalCase para o nome do evento.

Utilizar o sufixo EventHandler para o nome do delegate associado ao evento. Especificar dois parâmetros “sender” e “e”. O parâmetro “sender” representa o objeto que disparou o evento e deve ser sempre do tipo Object, mesmo sendo possível utilizar um tipo especifico. O estado associado com o evento é encapsulado em uma instancia de um evento de classe chamado “e”.

 

Exemplos:

 

http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001_clip_image012.gif

 

2.6.8    Constantes

 

Nomes de constantes deverão ser todos maiúsculos com as palavras separadas por um underscore.

 

Exemplo:

 

http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001_clip_image013.gif

 

2.6.9    Exceções

 

O nome de uma classe de exceção deve utilizar a definição PascalCase,  e finalizar com a expressão Exception , para indicar que o tipo é uma exceção.

 

Exemplo:

 

  http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001_clip_image014.gif

 

2.6.10                        Propriedades públicas

 

Utilizar a definição PascalCase para o nome de propriedades.

 

Exemplo:

http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001_clip_image015.gif

 

 

2.7       InfoApp

 

A classe InfoApp no namespace Maxicon.Balanca.Controle, conterá informações pertinentes a aplicação.

 

2.7.1    Log

 

Conterá a propriedade Log de log do log4net instanciada (ver tópico 2.3 ).

 

 

O procedimento NomeAplicacao retornará o nome do aplicativo (definido no assembly em execução).

 

 

Procedimento PastaExecutavel irá retornar a pasta de onde a aplicação está sendo executada, ou seja, local do arquivos da aplicação.

 

2.7.4    Pasta AppData

 

O procedimento PastaAppData irá retornar o diretório para gravação de dados locais (informações específicas, arquivos que ficaram gravados para o usuário do Windows).

 

2.7.5    Pasta Imagens

O procedimento PastaImagens irá retornar o diretório de onde ficaram armazenados as imagens da aplicação.

 

2.7.6    Empresa

 

A propriedade Empresa armazenara o modelo Empresa , no qual o usuário efetuou login. Servirá de apoio para gravação de dados e busca de configurações específicas da empresa.

 

2.7.7    Usuário

 

A propriedade Usuario armazenara o modelo Usuario , usuário que efetuou login. Servirá de apoio para gravação de dados e controle dentro da aplicação.

 

 

 

Os principais métodos estão nos namespaces:

 

Maxicon.Balanca.Controller.Recursos: conterá todos os recursos (protocolos) de integração, que deverão ser implementadas pela interface IRecurso , deverá possuir o sufixo ‘Recurso’. Nestes recursos que serão processados as requisições e respostas da integração.

Maxicon.Balanca.Controller.Schema: terá as classes auxiliares para os recursos que são implementadas pelo IRequest (classes com o sufixo ‘Request’), e IResponse (sufixo ‘Response’). As requisições terão as informações necessárias para realizar as requisições através dos recursos e as respostas (utilizado para serializar o xml da resposta em um IResponse , para que seja processado no recurso).

Maxicon.Balanca.Controller.Util: contém classes de apoio para o processamento dos recursos, dentre eles o processamento das mensagens, a interpretação dos protocolos, monitoramento de fila de integração, controle de versão.

 

2.9       Wizard

O projeto Maxicon.Balanca.Wizard contém os assistentes necessários para configuração de conexão, criação da base de dados, atualização e instalação do serviço de integração.

 

 

 

O assistente de configuração de conexão irá auxiliar na parametrização da conexão com a base de dados e a fila de integração (janela TelaConexao ). Estes dados serão gravados no arquivo app.config que ficará na mesma pasta do executável. O arquivo será acessado tanto pela balança como o integrador através da classe ConexaoHelper do namespace Maxicon.Balanca.Controller.

 

 

Para que o sistema seja instalado, será necessário configurar a base de dados, é onde serão criadas todas as tabelas, sequências e inserção dos protocolos necessários para integração, além das configurações iniciais (janela TelaNovaBase ).

 

 

[em implementação]

 

 

Este assistente será utilizado para auxiliar ao realizar a instalação do serviço de integração da balança, além de realizar sua remoção (janela TelaServicoIntegracao ).

 

 

O instalador está no projeto Maxicon.Balanca.Setup, é a partir deste projeto que será gerado o instalador da balança. O instalador foi configurado para que crie três ícones no menu de programas do usuário (assistente de configuração, aplicação e desinstalador da balança) e o ícone da aplicação na área de trabalho do usuário. Contém duas pastas com as traduções do DevExpress (pastas pt e pt-BR, ver tópico 2.11 ) e com os ícones (ver tópico 1.2.2 ) que estão no projeto Maxicon.Balanca.View mas que precisam ser atualizados manualmente a cada inserção ou remoção de arquivos.

 

 

Para que os componentes do DevExpress estejam devidamente traduzidos é necessário alguns arquivos e parametrizações:

- Inclusão do trecho de código na inicialização da aplicação ( Program );

       System.Threading. Thread .CurrentThread.CurrentCulture = new System.Globalization. CultureInfo ( "pt-BR" );

       System.Threading. Thread .CurrentThread.CurrentUICulture = new System.Globalization. CultureInfo ( "pt" );

- E as pastas pt e pt-BR do projeto Maxicon.Balanca.View ( ver tópico 2.10 ).

 

O integrador está em um projeto à parte chamado Maxicon.Balanca.Integrador.Client .

(verificar necessidade de documentação a parte também)

 

 

3          Referências

 

http://www.juliobattisti.com.br/tutoriais/mauricioborges/padraocodificacao001.asp

 

http://msdn.microsoft.com/pt-br/library/ff926074.aspx

 

http://msdn.microsoft.com/pt-br/library/03864tbz.aspx