ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profor: 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 First |< Prior < Next > Last >| Insert + Delete Edit ^ Post Cancel x Refresh Método DataModule.tbNomeTabela.First; DataModule.tbNomeTabela.Prior; DataModule.tbNomeTabela.Next; DataModule.tbNomeTabela.Last; Descrição Move para o primeiro registro; Move para o registro anterior; Move para o próximo registro; Move para o último registro; Abre a tabela para inserir um DataModule.tbNomeTabela.Insert; novo registro; DataModule.tbNomeTabela.Delete; Apaga um registro da tabela. Abre a tabela para edição do DataModule.tbNomeTabela.Edit; registro corrente. DataModule.tbNomeTabela.Post; Grava os registros na tabela. Cancela a gravação ou edição de DataModule.tbNomeTabela.Cancel; registros na tabela. Atualiza a tabela limpando os DataModule.tbNomeTabela.Refresh; buffers de memória utilizados. Tabela 1 - Descrição dos métodos e funções dos botões do DBNavegator Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 1 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini 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 Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 2 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini 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: Resolução: 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: Resoluçã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); begin dmClinica.tbPaciente.Open; if (dmClinica.tbPaciente.RecordCount = 0) then begin TabelaVazia; Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 3 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini end else AnteriorPrimeiro; end; 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; begin if (dmClinica.tbPaciente.RecordCount = 0) then begin bbtPrimeiro.Enabled := False; bbtAnterior.Enabled := False; bbtProximo.Enabled := False; bbtUltimo.Enabled := False; bbtExcluir.Enabled := False; bbtEditar.Enabled := False; end; end; 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; begin if (dmClinica.tbPaciente.Bof = True) then begin bbtPrimeiro.Enabled := False; bbtAnterior.Enabled := False; end; bbtProximo.Enabled := True; bbtUltimo.Enabled := True; end; 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). Resolução: Botões Primeiro |< e Anterior < Mover o ponteiro da tabela para o Primeiro registro ou para o registro Anterior; Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 4 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini 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; begin if (dmClinica.tbPaciente.Eof = True) then begin bbtProximo.Enabled := False; bbtUltimo.Enabled := False; end; bbtPrimeiro.Enabled := True; bbtAnterior.Enabled := True; end; 4º Configurar a ação dos botões de edição e inserção de registros. Resolução: 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 dados1 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; begin 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. Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 5 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini 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; end; 5º Configurar a ação dos botões gravar e cancelar operações em registros. Resolução: 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 dados1 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; begin 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; end; Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 6 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini 6º Configurar a ação do botão excluir (delete) Resolução: 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); begin if (dmClinica.tbPaciente.Bof = False) and (dmClinica.tbPaciente.Eof = False) then begin if (MRYes = Application.MessageBox('Certeza?!', 'Remover Registro!', MB_YESNO + MB_ICONQUESTION)) then begin dmClinica.tbPaciente.Delete; TabelaVazia; end; end; end; 7º Fechar a tabela (Close) no procedimento de evento OnClose do formulário. procedure TfrmPaciente.FormClose(Sender: TObject; var Action: TCloseAction); begin dmClinica.tbPaciente.Close; end; 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. Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 7 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini Figura 4 – Formulário paciente totalmente personalizado e funcional. Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 8 ETEC DR. EMÍLIO HERNANDEZ AGUILAR Programação de Computadores II Profores: Gilberto Braga e Renato Candini 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. Rodovia Pref. Luiz Salomão Chamma, S/N Km 41 – Pouso Alegre – CEP 07895-340 Franco da Rocha – SP – Brasil - Telefones (11) 4443-6110/4449-3115 E-mail: [email protected] Site: www.etefran.com.br 9