Prof or : Gilberto Braga e Renato Candini Nome Número: Série DELPHI PARA PROGRAMAÇÃO DE COMPUTADORES II AULA 2 Competências: Integrar sistemas; Habilidades: Utilizar modelos, pseudocódigos e ferramentas na representação da solução de problemas; Bases Tecnológicas: Programação de computadores linguagem de apoio: Delphi. Analisando e comparando as funções do DBNavegator Perceba que o DBNavegator tem dez botões e que cada botão tem uma função específica na manipulação dos registros da tabela vinculada a ele. Figura 1 Formulário com o DBNavegator implementado. O que acontece é que o DBNavegator usa métodos internos que agem com o objeto table do Data Module. Observe a tabela a seguir e veja qual método está atrelado a qual botão. Botão Método Descrição First < DataModule.tbNomeTabela.First; Move para o primeiro registro; Prior < DataModule.tbNomeTabela.Prior; Move para o registro anterior; Next > DataModule.tbNomeTabela.Next; Move para o próximo registro; Last > DataModule.tbNomeTabela.Last; Move para o último registro; Insert + DataModule.tbNomeTabela.Insert; Abre a tabela para inserir um novo registro; Delete - DataModule.tbNomeTabela.Delete; Apaga um registro da tabela. Edit ^ DataModule.tbNomeTabela.Edit; Abre a tabela para edição do registro corrente. Post DataModule.tbNomeTabela.Post; Grava os registros na tabela. Cancel x DataModule.tbNomeTabela.Cancel; Cancela a gravação ou edição de registros na tabela. Refresh DataModule.tbNomeTabela.Refresh; Atualiza a tabela limpando os buffers de memória utilizados. Tabela 1 - Descrição dos métodos e funções dos botões do DBNavegator 1
Neste caso, para substituir o DBNavegator por botões personalizados capazes de interagir com as tabelas do banco de dados seria necessário apenas seguir os passos listados: Figura 2 - BitBtn na paleta de componente Additional 1º - Inserir um botão do tipo BitBtn (Bit Button) para cada botão do DBNavegator, para que o usuário possa interagir com um botão mais sugestivo que um button comum. 2º - Configurar a propriedade glyph com uma imagem contida em "C:\Arquivos de programas\arquivos comuns\borland Shared\Images\Buttons\... " para cada um dos botões e limpar o texto contido na propriedade caption, pois não é necessário que os botões tenham qualquer informação contida na propriedade caption. 3º - Configurar a propriedade ShowHint como True e Hint com uma dica sobre o que cada botão faz (ir para o primeiro, ir para o próximo, etc), isso ajuda o usuário a ter total entendimento da ferramenta, tornando-a intuitiva. Figura 3 BitBtn configurado e pronto para ser usado pelo usuário 2
4º - Finalmente, codifique os botões com os métodos propostos na Tabela 1 acima e observe que os botões funcionam quase de maneira idêntica ao DBNavegator, porém, com a vantagem de serem botões personalizados. Melhorando os métodos dos botões Existem uma série de tratamentos que podem ser aplicados aos botões para que eles passem a funcionar com precisão. Podemos fazer certas operações em um determinado botão e influenciar em outro, ou viceversa, portanto, é importante que se tenha alguns botões habilitados durante uma operação e outros desabilitados e assim por diante. Para que essa mecânica de funcionamento seja implementada usaremos, em alguns casos, o comportamento dos botões através dos eventos (exemplo: Se eu clicar em um botão eu desativo/ativo outro, etc), e, em outros, o comportamento da tabela (exemplo: se eu estiver no início da tabela eu desativo alguns botões e ativo outros, etc.) interagindo com os métodos internos implementados para o funcionamento de cada botão. 1º Controle dos botões Gravar (Post) e Cancelar e dos objetos contidos no formulário (DBEdits, etc) antes de mostrar o formulário: O formulário precisa, ao ser carregado, desativar os botões Gravar (post) e Cancelar, assim a propriedade Enabled desses dois botões será False. Os objetos DBEdit e todos os demais objetos vinculados a campos da tabela a ser carregada deve ativar a propriedade ReadyOnly, atribuindo a ela o valor True, para que o campo não permita edições até que o usuário deixe claro que tem a intenção de editar os campos, isso garante a integridade dos campos fazendo com que eles não sejam editados por engano. 2º Controle da tabela e dos botões de rolagem (Primeiro e Anterior) ao carregar o formulário e durante a navegação: Ao mostrar o formulário, abrir a tabela contida no Data Module; Verificar, ao mostrar o formulário, se a tabela está vazia. Se sim chamar o procedimento TabelaVazia, se não, chamar o procedimento AnteriorPrimeiro. procedure TfrmPaciente.FormShow(Sender: TObject); dmclinica.tbpaciente.open; if (dmclinica.tbpaciente.recordcount = 0) then TabelaVazia; 3
end else AnteriorPrimeiro; O procedimento TabelaVazia: Será usado ao iniciar o formulário atrelado a tabela e ao deletar registros, pois, nos dois casos a tabela pode estar ou tornar-se vazia, assim, com a tabela vazia, seria necessário desabilitar os botões Primeiro, Anterior, Próximo, Último, Editar e Deletar, pois todos esses botões são inúteis com a tabela vazia. procedure TfrmPaciente.TabelaVazia; if (dmclinica.tbpaciente.recordcount = 0) then bbtprimeiro.enabled := False; bbtanterior.enabled := False; bbtproximo.enabled := False; bbtultimo.enabled := False; bbtexcluir.enabled := False; bbteditar.enabled := False; O procedimento AnteriorPrimeiro: Será usado ao iniciar o formulário atrelado a tabela e ao clicar nos botões Primeiro e Anterior, pois, caso a tabela tenha algum registro quando for aberta ela automaticamente deverá mover o ponteiro para o início da tabela (BOF), assim se o ponteiro estiver no início da tabela os botões Anterior e Primeiro deverão ser desabilitados (Enabled = False), enquanto os botões Próximo e Último devem ser incondicionalmente habilitados para garantir que o usuário possa se mover para os demais registros. procedure TfrmPaciente.AnteriorPrimeiro; if (dmclinica.tbpaciente.bof = True) then bbtprimeiro.enabled := False; bbtanterior.enabled := False; bbtproximo.enabled := True; bbtultimo.enabled := True; 3º Controle dos botões de rolagem (Próximo e Último) durante a navegação: Desabilitar os botões de navegação Primeiro e Anterior se a tabela estiver no início (BOF = True) e Habilitar os botões Próximo e Último, incondicionalmente, sempre que o usuário clicar em qualquer um dos botões (Primeiro ou Anterior). Botões Primeiro < e Anterior < Mover o ponteiro da tabela para o Primeiro registro ou para o registro Anterior; 4
Chamar o procedimento PrimeiroAnterior (Descrito acima). Botões Próximo > e Último > Mover a tabela para o Próximo ou Último registro; Chamar o procedimento ProximoUltimo; O procedimento ProximoUltimo: Será usado ao clicar nos botões Próximo e Último, pois, assim se o ponteiro estiver no final da tabela (EOF = True) os botões Próximo e Último deverão ser desabilitados (Enabled = False), enquanto os botões Anterior e Primeiro devem ser habilitados (Enabled = True), incondicionalmente para garantir que o usuário possa se mover para os demais registros. procedure TfrmPaciente.ProximoUltimo; if (dmclinica.tbpaciente.eof = True) then bbtproximo.enabled := False; bbtultimo.enabled := False; bbtprimeiro.enabled := True; bbtanterior.enabled := True; 4º Configurar a ação dos botões de edição e inserção de registros. Botões Insert + e Edit ^ Chamar os métodos Insert ou Edit; Chamar o procedimento Edição. Procedimento Edição: Desativa os botões de rolagem (Primeiro, Anterior, Próximo e Último), os próprios botões de Inserção, Edição, Exclusão e Atualização dos registros da tabela, habilita os botões para Gravar e Cancelar, desabilitam a propriedade ReadyOnly de todos os objetos vinculados aos campos do banco de dados 1 e verifica se a tabela está vazia através do procedimento TabelaVazia, descrito acima, atualizando a regularização dos botões caso uma tabela vazia tenha sido aberta para inserção e não tenha sido inserido nenhum registro; procedure TfrmPaciente.Edicao; bbtprimeiro.enabled := False; bbtanterior.enabled := False; 1 Exceção para os que não deverão ser editados pelo usuário, isto é, serão editados automaticamente pelo banco de dados, exemplo: Campo Código do Cliente = Auto numeração, pois estes campos nunca será habilitado. 5
bbtproximo.enabled := False; bbtultimo.enabled := False; bbtatualizar.enabled := False; bbteditar.enabled := False; bbtinserir.enabled := False; bbtexcluir.enabled := False; bbtgravar.enabled := True; bbtcancelar.enabled := True; DBEdit2.ReadOnly := False; DBEdit3.ReadOnly := False; DBEdit4.ReadOnly := False; DBEdit5.ReadOnly := False; DBCheckBox1.ReadOnly := False; DBEdit2.SetFocus; TabelaVazia; 5º Configurar a ação dos botões gravar e cancelar operações em registros. Botões Gravar V e Cancelar X Chamar os métodos Post ou Cancel; Chamar o procedimento Rolagem. Procedimento Rolagem: Habilita os botões de rolagem (Primeiro, Anterior, Próximo, Último), os botões de Inserção, Edição, Exclusão e Atualização dos registros da tabela, desabilita os botões para a Gravação e para Cancelar a operação, habilita a propriedade ReadyOnly de todos os objetos vinculados aos campos do banco de dados 1 e verifica se a tabela está vazia através do procedimento TabelaVazia descrita a cima, atualizando a regularização dos botões caso a tabela tenha sido aberta para inserção e não tenha sido inserido nenhum registro; procedure TfrmPaciente.Rolagem; bbtprimeiro.enabled := True; bbtanterior.enabled := True; bbtproximo.enabled := True; bbtultimo.enabled := True; bbtinserir.enabled := True; bbteditar.enabled := True; bbtexcluir.enabled := True; bbtatualizar.enabled := True; bbtgravar.enabled := False; bbtcancelar.enabled := False; DBEdit2.ReadOnly := True; DBEdit3.ReadOnly := True; DBEdit4.ReadOnly := True; DBEdit5.ReadOnly := True; DBCheckBox1.ReadOnly := True; TabelaVazia; 6
6º Configurar a ação do botão excluir (delete) Botão Excluir - Verificar: Se a tabela não está no inicio e no final ao mesmo tempo (BOF = True) e (EOF = True); Se não, perguntar ao usuário se ele tem certeza que quer excluir o registro corrente; Se sim, excluir e Verificar se a tabela está vazia através do procedimento TabelaVazia. Se não, não faça nada. procedure TfrmPaciente.bbtExcluirClick(Sender: TObject); if (dmclinica.tbpaciente.bof = False) and (dmclinica.tbpaciente.eof = False) then if (MRYes = Application.MessageBox('Certeza?!', 'Remover Registro!', MB_YESNO + MB_ICONQUESTION)) then dmclinica.tbpaciente.delete; TabelaVazia; 7º Fechar a tabela (Close) no procedimento de evento OnClose do formulário. procedure TfrmPaciente.FormClose(Sender: TObject; var Action: TCloseAction); dmclinica.tbpaciente.close; Obs: O botão atualizar (Refresh) é o único que não precisa de tratamento personalizado para ser implementado. No final a tabela terá uma aparência similar a apresentada na Figura 4 abaixo, porém, sua funcionalidade é o verdadeiro diferencial entre usar uma ferramenta pronta e programar funcionalidades personalizadas na aplicação. 7
Figura 4 Formulário paciente totalmente personalizado e funcional. 8
Exercícios O projeto anterior propunha um formulário Principal que trazia, através de menu, três outros formulários (Paciente, Médico e Consulta). A proposta é, com base na personalização realizada no formulário paciente com o objetivo de substituir DBNavegator por botões personalizados SUBSTITUA OS DOIS DBNAVEGATORS DOS FORMULÁRIOS CONSULTA E MÉDICO POR BOTÕES e experimente-os para saber se você obteve botões funcionais para trabalhar com os registros da tabela. Obs: Use o Database Desktop para, eventualmente, abrir e fechar a tabela com o propósito de ver se as alterações foram realmente efetivadas na tabela. 9