Bibliotecas Gráficas

De UniWiki
Revisão de 17h52min de 12 de maio de 2011 por RafaelPires (Discussão | contribs) (TUField)
Ir para: navegação, pesquisa

Desenvolvendo interfaces com a Biblioteca Uniware

Esse guia tem por funcionalidade auxiliar o desenvolvedor na programação de interfaces utilizando a biblioteca da Uniware.

É importante observar que esse artigo não aborda a instalação dos componentes gráficos. Para isso, visite Instalação Delphi



Getting Started

Nesse capítulo podem ser encontrados materiais referentes ao desenvolvimento do unilab para quem está começando.

Banco de dados

Toda alteração no banco de dados é replicada na função TFAtualiza@Ver_Ultimas.

Em casos de views, é necessário escreve-las em:

  • TFAtualiza@CreateViews;
  • TFAtualiza@DropViews.

Criando interfaces

Acessando os templates

Os templates de interface da Uniware encontram-se em Arquivo > Novo... > aba 'UNIWARE_BETA'. utilize os templates:

  • FBaseSelR03;
  • FBaseCadR03;
  • FBaseRelR03.

R03 é a biblioteca de componentes visuais que a Uniware utiliza em seus templates e o tipo varia de acordo com a necessidade, como explicado abaixo:

Ao criar uma unit, adicionar o tipo ao sufixo:

  • Sel, Listagem de registros;
  • Cad, Manipulação de dados;
  • Rel, Referentes aos relatórios.

Será necessário adicionar ao uses a unit UFMain, para integrar-se com o projeto todo.

Já no uses da interface, as principais bibliotecas a serem adicionadas são Ulib e ULibR03

A Unit, ao ser criada, possui uma parte do código assim:

var
  Form1: TForm1;

No projeto essa parte é desnecessária, visto que o FMain realiza a instanciação das interfaces de outra forma.

Componentes disponíveis da lib. R04

Ao apagar o código acima de uma unit, remover do programa UNILAB_BETA a criação automática da interface, como na linha:

  Application.CreateForm(TForm1, Form1);



Propriedades da Interface

O capítulo a seguir identifica possíveis problemas que o programador pode encontrar ao desenvolver suas primeiras interfaces. Relevando as propriedades principais:

TFBase???R03

??? pode-se interpretar como 'Cad' ou 'Sel'.

Dentro da unit UFMain, adicionar o PS (Se necessário, adicionar um CS próprio) para gerenciamento da interface a ser criada.

Desabilite a propriedade BorderIcons.biHelp, pois não disponibilizamos o help por interfaces, ainda.

FormStyle = fsMDIChild, não me lembro bem o objetivo, mas é necessário.

Para ser instanciado, é necessário adicionar aos eventos do TUPS???:

Result := NOME_CLASSE;

No evento do click do Menu, para abrir a interface Sel, sua interface deve ser chamada utilizando UMenuCall('nomeCS','nomePS');

ps. Quando a tela não for da biblioteca, utilizar ChamaForm(TIPO_FORM);

TUQuery

Componente TUQuery
  • Nome Default: Q;
    • Generico: Essa propriedade define a consulta a ser utilizada;
    • SQL, SQLIB, SQLMS, SQLMySQL e SQLORACLE: consulta destinada à um tipo de banco. SQL deve ser configurada caso seja determinado Generico = true;
    • TabelaPrincipal: Deve conter o nome da tabela utilizada no SQL, em interfaces SEL, é comum o uso de Views para essa consulta;
    • TabelaPrincipalAlias: Caso a tabela possua um alias na SQL, ele deve ser informado aqui;
    • UDataBase: referencia FMain.UDB que é a database do sistema.

TDataSource

CompDS.png
  • Nome Default: DS;
    • UQuery: Esse campo deve estar referenciado para o componente anteriormente descrito, Q.

TUDataEntry

Componente TUDataEntry
  • Nome Default: DE;
    • Limite: Determina a quantidade máxima de cadastros de detalhes;
    • LinhasVisiveis: Define quantos campos aparecem abaixo do edit de detalhe (inclusive);
    • UCadastro:Precisa referenciar o TUCadastro associado à grid;
    • UDataSource: Esse campo deve estar referenciado para o componente anteriormente descrito, DS;
    • UDataEntry: Quando for utilizar relações mestre-detalhe na interface, o Data Entry responsável pelo detalhe referencia o Data Entry do mestre.
    • UsaScrollBar: Necessário quando o numero de 'Limite' ultrapassa 'LinhasVisiveis'.

TUDataEntry

CompCAD.png
  • Nome Default: CAD;
    • UDataEntry: Esse campo deve estar referenciado para o componente anteriormente descrito, DE.

Para poder trabalhar as configurações visuais da grid, como largura da coluna, propriedades de leitura, etc.

Use o RightClick nesse componente e selecione colunas da grid de procura.

(Você acessa a coluna individualmente buscando a propriedade Columns da DBGridP)

TUField

Para acessar os Campos do dataset, DoubleClick o componente de Query.
Exemplo de uma interface de QFields
  • Nome Default: Q concatenado do mesmo nome da coluna do banco;
    • Campo: Qual campo do banco ele representará;
    • ChavePrimaria: Identificar a PK da tabela;
    • Edicao: Indica o componente visual que edita esse valor;
    • Filtra: Habilita o campo a ser uma chave no botão Filtra;
    • NaNavegacao: Define se a coluna aparecerá na Grid;
    • Ordena: Permite o usuário Ordenar os resultados utilizando a coluna como parâmetro, é obrigatório no mínimo 1 dos campos ser True;
    • PreencheChave: Em uma situação mestre-detalhe, esse parâmetro permite que seja inserido no campo a chave primária do mestre;
    • Procura: Habilita a procura de valores na coluna pelo botão Procura;
    • Sequencial:Quando for um número seqüencial (auto-incremento) informar o nome da tabela a qual o campo pertence;
    • Tabela: Indica a qual tabela o campo pertence;
    • TabelaAlias: Preenchido caso a tabela possua alias;
    • Titulo: valor a ser apresentado no cabeçalho da coluna;

TUFBase???R03Data

CompData.png
??? pode-se interpretar como 'Cad' ou 'Sel'.
  • Nome Default: ???Data;
    • No SelData:
      • CallCadModal: Não permite que seja aberta mais de uma tela de Cad;
      • CallCs: Nome do CS que gerenciará essa interface (UFMain);
      • CallPs: Identificar o processo da interface (UFMain);

TUOrdemCombo

Question.png
(Esse é um componente Invisível)
  • Nome Default: OC;
    • AliasInicial: Coluna definida para que o edit possa fazer uma busca;

TUEdit ou outras formas de input

Caso o componente esteja referenciando um CODI, Alterar:

  • AJCod - Preenche o campo com zeros;
  • MaxLength - Define o tamanho máximo do campo.


Problemas Conhecidos

Abaixo estão listadas algumas peculiaridades da biblioteca (problemas ou bug's) que podem impedir o bom funcionamento tanto do software em si quanto o ambiente de programação.

O campo CODI

A biblioteca, hoje, trabalha a chave primária como string, e somente com esse tipo de dados;

Além disso, ela suporta um limite de nove caracteres, e para uma melhor visualização, a Uniware preenche os valores com zeros à esqueda.

Recarregando o DataSource

Quando for alterado alguma estrutura do banco de dados, será necessário recarregar o datasource da interface caso ela esteja aberta.

Para isso, alterar algum campo da interface e fechar/abrir novamente a unit. (Há casos que não é necessário a alteração da propriedade)

Remover um campo calculado

Ao remover um campo calculado da lista de TUFields, nenhum outro registro é selecionado.

Se o programador selecionar alguma interface sem antes selecionar um campo da lista,

o Delphi encerrará acusando um erro.


Outros componentes importantes

Talvez você não os use, mas é importante registrar aqui outros componentes da biblioteca para futuras consultas:


UFBase

Esse formulário é a base dos forms utilizados no sistema unilab. A partir desse modelo são criados os três tipos de interface do sistema: Rel, Sel e Cad, Que por sua vez são herdadas nas interfaces da biblioteca R03.

Nome Funcionalidade
constructor TFBase.Create(AOwner: TComponent); Todo formulário possui um componente com os eventos e dados referentes ao formulário. formulários mais especializados podem ter FormData especializados.

A checagem do FormData é feita na constructor dos Forms. Além disso, este construtor cria o helptimer. O helptimer serve para evitar que o usuário abra várias vezes o help pressionando F1 várias vezes.

procedure FormClose(Sender: TObject; var Action: TCloseAction); Evento para fechar o form e destruí-lo. Não entendi como funcionam as mensagens que ele procura e manda antes de fechar o form.
function FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean; Chama a ajuda relacionada à tela quando usuário pressiona F1. O arquivo de help deve estar no <path do executável>\<LibParam.ProgHelp>\<nome do form>.p. Se o arquivo não existir copia para ele o arquivo “<path onde esta o executável>\manunilab..p”. Por fim, executa o help.
  • Obs: Utiliza o helptimer para evitar que o usuário abra várias vezes o help pressionando F1 várias vezes.
function SearchMsg(s:string): TUMsg; Procura pela mensagem - nil se nao encontrar. Chama o SearchMsg do PS do Form.
function SearchMsgStarting(s:string): TUMsg; Procura pela mensagem começando por s - nil se não encontrar. Chama o SearchMsgStarting do PS do Form.
function CreateMsg(pnome, pcs, pps: string;pforcenew:boolean=True): TUMsg; Criação de mensagem de comunicação com outro processo. Chama o CreateMsg do PS do form.
procedure CreateCall(pname,pcs,pps,pretorno:string;pmodal:boolean=False); overload; Cria uma chamada a uma tela de seleção - CreateCall('nome','cs','ps','ret'). Chama uma tela de seleção. Se a tela já existir, dá foco nela.
procedure CallCad(pmode: TModoCadastro;pname,pcs,pps:string;key:TUPars=nil; pmodal:boolean=False); overload; Cria uma chamada a uma tela de CAD. Idêntico ao CreateCall, mas adicionado à possibilidade de definir o modo (inserção, alteração, exclusão) e os valores da chave.
procedure Answer(pmsg: TUMsg); virtual; tratamento das mensagens
procedure DoAfterCreateForm; apos a criar e mostrar o form
procedure DoAfterLoaded(pcalled:boolean); apos a carregar o form, independente se direto ou por chamada msg (f2...)
procedure DoAfterCreateMsg(pmsg:TUMsg); apos criar uma mensagem de ligacao com outro processo
procedure DoBeforeDestroy; antes de destruir o PS
procedure DoOnDoneUpdated(pdone:Extended); o processo avancou
property PS:TUPS read FPS write FPS default nil; qual instancia de processo e dono do form
procedure Confirm(pclose:boolean=False); Confirma a execucao do processo. Metodo chamado pelo programador para confirmar o form e chamar o processo que o form executa - no evento OnProcess do FormData.
procedure Cancel(pclose:boolean=True); cancela a execucao do processo
property Done:extended read GetDone write SetDone; Informa o quanto o processo esta pronto (%)
procedure PSDestroy(pmsg: TUMsg); virtual; o PS que comunicava pela mensagem enviada foi destruido
property Msg[s:string]: TUMsg read GetMsg;  ?
property Processing  : boolean read FProcessing;  ?


USys

  • Gerente do sistema, centraliza os processamentos do sistema:
    • executa processos (dos CSs);
    • trabalha direitos (verificar, delegar);
    • troca de informacoes entre processos;
    • controle e troca de informacoes com BD (a implementar no futuro 'proximo');
  • Primeiro a ser instanciado, inicializa a aplicacao;
  • As configuracoes gerais do sistema ficam em um .ini junto com o .exe na secao [Geral];
  • As configuracoes por maquina ficam no registro do windows;
  • As configuracoes por usuario ficam no cadastro do usuário.
Classe Nome Funcionalidade
protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; Recebe uma notificação para remover um CS da ListCS onde AComponent é o cs que será destruído e Operation = opRemove.
public function Initialize: boolean; Inicializa o Sys. Verifica a existência dos componentes UError, UCPU e UUser e cria em ListCS uma lista com todos os UCS do form e chama o Initialize de cada cs. Se faltar algum componente ou o initialize de algum cs falhar (retornar false) então interrompe o processo e retorna false.
procedure IniWriteKey(pchave:string;pvalor:string); Escreve no arquivo ini com o mesmo nome do executável e no objeto USys.INI o valor pvalor na chave pchave.
procedure VersionCheck; Compara o número da versão que está gravado no arquivo ini com a versão do executável. Se o executável possui uma versão superior chama o evento BeforeNewVersion, atualiza a versão no Ini e chama o AfterNewVersion.
function CSCount  : integer; Retorna quantidade de CS do form.
function SearchCS(s:string): TUCS; Recebe o nome de um cs e retorna a instância. Se não existe retorna nil.
function SearchPSExe(pcs,pps:string;pincludedependent:boolean=False):TComponent; Recebe o nome de um ps e retorna a instância. Se não existe retorna nil.
function FormClassOf(pcs,pps:string):TFormClass; Retorna o tipo de form do processo informado
function NewPS(pcs,pps:string;pdependent:TComponent=nil):TComponent; Cria e retorna uma nova instância PS do pcs. Onde o seu CS será o pcs e sua propriedade Dependent será o pdependent. É isso mesmo? Quando devo usa esta função?
function AnyPS(pcs,pps:string;pincludedependent:boolean=False):TComponent; Retorna o PS pps. Se a instancia não existe, cria.
procedure BroadCast(o:TObject); Repassa o objeto para o sistema inteiro (para todos os PS do sistema). Para que serve exatamente?
procedure AtualizeBarraTarefas; Atualiza os botões da barra de tarefas, de forma que exista um botão para cada OS instanciado.
property ExePars  : TUPars read FExePars write FExePars; Lista de parâmetros passados na chamada do executável.
property Ini  : TUpars read FIni write FIni; Parâmetros do sistema, lidos do arquivo de inicialização.
property PSs  : TUPars read FPSs write FPSs; Lista dos PS instanciados.
property PSn  : integer read FPSn write FPSn; Número de PSs instanciados.
property PSb  : TList read FPSb write FPSb; Lista com o nome dos botões da barra da tarefas.
published
property Description  : TStringList read GetDescription write SetDescription; Breve descrição do objetivo desta instância.
property Documentation: TStringList read GetDocumentation write SetDocumentation stored false; Documentação para esta instância.
property Development  : TStringList read GetDevelopment write SetDevelopment stored false; Observações sobre o desenvolvimento.
property ID  : string read FID write SetID; para registro do windows.
property Version  : string read FVersion write FVersion; Versão do sistema.
property TaskBar  : TWinControl read FTaskBar write SetTaskBar; Barra de tarefas do form principal.
property BeforeNewVersion : TBeforeNewVersionEvent read FBeforeNewVersion write FBeforeNewVersion; Este evento é disparado pelo VersionCheck quando o executável for uma nova versão.
property AfterNewVersion  : TAfterNewVersionEvent read FAfterNewVersion write FAfterNewVersion; Este evento é disparado pelo VersionCheck depois do BeforeNewVersion e depois de atualizar a versão.


UUser

Detém as informações do usuário que está logado.

  • property UserControl : boolean read FUserControl write FUserControl default True;
    • para que serve?
  • property UserID  : string read FUserID write SetUserID;
    • ID do usuário (Login);
  • property UserName  : string read FUserName write FUserName;
    • Nome do usuário (para exibição)
  • property UserPassword: string read FUserPassword write FUserPassword;
    • Senha do usuário que está logado.


UErros

A idéia deste componente é ele receber e tratar todas as mensagens de erro do sistema. Entretanto, este componente ainda não teve nenhuma funcionalidade implementada (até hoje 11/12/2006).


UCS

Componente de Sistema. Gerencia a troca de mensagens entre um determinado grupo de processos de sistema.


UPS

Processos de Sistema.


UPSCad, UPSSel, UPSRel

São componentes idênticos ao UPS (até hoje 11/12/2006). Para um processo que representa um form de cadastro deve ser utilizado o UPSCad.Para um form de seleção o UPSSel, para um form de relatório um UPSRel e para outros forms ou processos o UPS.


USeg

Controle de segurança do sistema. Determina quando um usuário pode ter acesso a uma determinada função. Grava quando que cada registro foi incluído ou alterado pela última vez. Possui a função de gravar um log dos registros excluídos.


UDatabase

Contém a informação do tipo de banco de dados deve ser utilizado e têm a relação de quais componentes de conexão utilizar para cada banco de dados.