Utilizando Delphi Firebird Firedac
Texto
(2) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:2. APLICAÇÃO DELPHI Considerações Iniciais: - Pasta de Trabalho adotada: C:\Sistemas\Trab1_2014\ para os arquivos código do Delphi. - Pasta de trabalho adotada: C:\Sistemas\Trab1_2014\APP\ para o arquivo do Banco de Dados e executável. Iniciando o Desenvolvimento: - Criar uma nova Aplicação: File/New/VCL Forms Application – Delphi - Salvar como: - Unit: UnitPrincipal.pas - Project: ProjetoTrab1_2014.dproj Gerar o Executável dentro da Pasta Pretendida: Como o objetivo é que o arquivo executável seja compilado dentro da pasta C:\Sistemas\Trab1_2014\APP\, devemos proceder da seguinte forma: - Menu Project/Options: será apresentada a tela demonstrada a Figura 2. No lado esquerdo, selecionar a primeira opção (Delphi Compiler). Na parte direita, opção (Output directory), definir o path para geração do executável.. Figura 2 - Definição do caminho para geração do executável.
(3) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. Formulário Principal: Hora de definir as propriedades do Formulário Principal: BorderIcons: biSystemMenu BorderStyle: bsSingle Caption: Trabalho 1 – GTI FAI 2014 FormStyle: fsMDIForm. PG:3. KeyPreview: True Name: frmPrincipal Position: poMainFormCenter WindowState: wsMaximized.. Figura 3 - Formulário Principal. No Formulário Principal Incluir: - Incluir um MainMenu: Cadastro com as opções: Cidades, Marcas, Automóveis. - Incluir um ToolBar com os botões: Cidades, Marcas, Automóveis, Fechar e um Separador . - Incluir um ImageList e vincular tanto ao MainMenu, quanto a ToolBar. (Imagens disponíveis). - Incluir uma StatusBar com três StatusPanels o 1º StatusPanel: Largura 200; Text: Copyright Nome do Aluno (2014) o 2º StatusPanel: Largura 150; Aligment: taCenter; (Text irá receber a data e hora atualizada) o 3º StatusPanel: Aligment: taRightJustify; Receberá no text a versão do Sistema. - Timer: responsável em atualizar a data e horário na StatusBar. o Código: StatusBar1.Panels[1].Text := DateTimeToStr(Now); Para informar a versão do Sistema, inicialmente haverá a necessidade de utilizar uma função específica para tal. Para facilitar as atividades, todas as funções a serem utilizadas nesse Artigo, foram agrupadas numa Unit específica, denominada RotinasGerais.pas..
(4) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:4. Importando uma Unit no Projeto: Inicialmente deve-se copiar a Unit até a pasta na qual constam nossos arquivos fontes: C:\Sistemas\Trab1_2014\. Feito esse procedimento, com nosso Projeto Aberto, basta adicionar a referida Unit (RotinasGerais). - Menu Project/Add to Project Vinculando Units: Com a Unit Rotinas Gerais adicionada ao projeto, basta agora fazer com que a mesma seja visível no formulário principal. - Com o formulário principal selecionado, menu File/Use Unit. - Selecionar na lista a Unit pretendida, depois OK. Basta agora no Evento OnShow do Formulário Principal, invocar a função GetBuildInfo, presente na Unit Rotinas Gerais, e lançar o valor na StatusBar. Código: StatusBar1.Panels[2].Text := GetBuildInfo; Figura 4 - Vincular Units. Utilizando o Data Module (Módulo de Dados): Data Module: trata-se de um container de componentes não visuais que geralmente são utilizados em aplicações de banco de dados e web. Em tempo de projeto (design time), um Data Module é semelhante a um Form, mas em tempo de execução (run time) ele existe somente na memória. Imagine como se fosse um Form invisível no qual se pode incluir componentes invisíveis da VCL do Delphi. Para acrescentar um Data Module ao nosso projeto, cuja função será receber todos os componentes de acesso e manipulação de dados, faça o seguinte: - File/New/Other - Na Janela que abre, no lado esquerdo selecione a opção Delphi Files. - Na parte central, basta clicar no item Data Module. - Com o Data Module inserido, Salve a Unit como UnitDM.pas. - Propriedade Name: DM. Figura 5 - Inserir Data Module.
(5) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:5. Componentes de Conexão ao Banco de Dados: - Da Tool Palette (Paleta de Componentes) FireDAC. Adicione os components: FDConnection e FDTransaction. (No Delphi XE4, os componentes correspondentes são: ADConnection e ADTransaction). - Da Paleta FireDAC UI, adicione o componente FDGUIxWaitCursor. (No Delphi XE4, ADGUIxWaitCursor). - Da Paleta FiredDAC Link, acione o componente FDPhysFBDriverLink. (No Delphi XE4, ADPhysIBDriverLink) Passamos então a configurar a conexão ao banco de dados, dando Clique Duplo sobre o componente FDConnection (ADConnection).. Figura 6 - Configuração do componente FDConnection. - Em Driver ID, seleciona-se o SGBD. No nosso exemplo, adotamos o Firebird. Na Versão XE5 do Delphi, usa-se o driver FB , já na versão XE4, faz-se necessário o uso do driver IB . Ambos funcionarão da mesma forma. - Na opção Database, localiza-se o arquivo do Banco de Dados desejado. No exemplo: C:\Sistemas\Trab1_2014\APP\BDTRAB1_2014.FDB - Em User_Name o usuário padrão do Firebird: SYSDBA (em maiúsculo). - Em Password a senha padrão: masterkey (em minúsculo). - Altere a propriedade LoginPrompt do componente FDConnection (ADConnection) para False; OBS: Os demais componentes inseridos não necessitam de configurações específicas..
(6) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:6. Componente de Acesso às Tabelas do Banco de Dados O componente Table, da mesma forma como o componente Query, podem ser utilizados para acessar os registros das tabelas do Banco de Dados. Para fins de produtividade, o componente Query é o indicado uma vez que não carrega todos os registros na memória. Vale lembrar que uma Query pode fazer a função de um Table, já o Table não pode fazer todas as funções de uma Query. Imagine uma tabela em seu aplicativo com 50 mil registros, e você tendo a necessidade de gravar mais um. Usando um Table o processo vai carregar os 50 mil registros na memória e talvez o seu aplicativo dê uma congelada se estiver rodando numa rede. Se usar uma instrução Sql ("insert into.."), passada para uma Query, o registro será gravado e você nem vai perceber Utilizando o Table para conectar na tabela Marca Da Paleta FireDAC, adicione o componente FDTable (ADTable). Configure as seguintes propriedades: - Name: tblMarca - Connection: FDConnection1 (ADConnection1) - TableName: Marca (Onde são listadas as tabelas contidas no BD) Configuradas as propriedades, dê um duplo clique sobre o componente tblMarca. Na telinha que aparecerá, clique com o botão direito do mouse na parte central e selecione a opção Add all fields (adicionar todos os campos). Para funcionar corretamente a questão do auto incremento, na lista de campos, selecione o campo COD_MARCA, e no Object Inspector altere a propriedade ReadOnly para True. - Active: True. (Caso tenha erro de configuração, ao ativar o mesmo é apresentado). Terminada a configuração do Table, passamos a inserir o componente DataSource, presente na paleta Data Access. Após inserido, altere no Object Inspector a propriedade Name para dsMarca e a propriedade DataSet para tblMarca. Utilizando o Query para conectar na tabela Cidade Da Paleta FireDAC, adicione o componente FDQuery (ADQuery). Configure as seguintes propriedades: - Name: tblCidade - Connection: FDConnection1 (ADConnection1) Configuradas as propriedades, dê um duplo clique sobre o componente tblCidade. No editor que aparecerá, será necessário informar o código SQL select, responsável para trazer os dados da tabela Cidade. Código: Select from Cidade Para testar clique no botão Executar do lado direito, depois OK. Feito esse procedimento, da mesma forma como também foi feito anteriormente para a tabela Marca, usando o Table, vamos adicionar os campos da tabela Cidade ao componente Query..
(7) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:7. Para tal, faz-se necessário clicar com o botão direito do mouse sob o tblCidade, e no submenu selecionar Fields Editor , abrindo a janela para adicionar os campos. - Nessa janela, clique com o botão direito do mouse na área central, opção Add all fields (Adicionar todos os campos). - Para funcionar corretamente a questão do auto incremento, na lista de campos, selecione o campo COD_CIDADE, e no Object Inspector altere a propriedade ReadOnly para True. - Active: True. (Caso tenha erro de configuração, ao ativar o mesmo é apresentado). O passo seguinte será adicionar ao Data Module o componente FDUpdateSQL (ADUpdateSQL) presente na Paleta FireDAC, permitindo que os dados possam ser editados, inseridos e deletados. Esse componente é acoplado a uma Query para desempenhar essas funções. No nosso exemplo, o mesmo será vinculado a Query tblCidade. Altere as propriedades do componente da seguinte forma: - Name: updCidade - Connection: FDConnection1 (ADConnection1) Retorne agora e selecione o componente tblCidade, marcando a propriedade UpdateObject para updCidade. Feito isso, torna-se possível adicionar os códigos SQL responsáveis pela manipulação dos registros. Dê um duplo clique sobre o componente updCidade. Caso seja exibida uma mensagem, apenas confirme clicando em Yes. Abrirá o editor de SQL.. Figura 7 - Editor de SQL – Tabela Cidade.
(8) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:8. Nesse editor, certifique-se que na primeira coluna esteja selecionado o campo chave primária da tabela, na segunda coluna, todos os registros selecionados, o que ocorre por padrão. - Para gerar os códigos SQL automaticamente, basta clicar no botão Generate SQL . Depois só confirmar clicando em OK. Para finalizar, basta inserir o componente DataSource, presente na paleta Data Access. Após inserido, altere no Object Inspector a propriedade Name para dsCidade e a propriedade DataSet para tblCidade. Utilizando o Query para conectar na tabela Automóvel O processo é idêntico ao adotado item anterior, bastando alterar somente algumas propriedades dos componentes para serem associadas dessa vez à tabela Automoveis. Um diferencial a ser adotado nesta tabela, será a configuração de uma máscara de edição, já que encontramos o campo PLACA, que é passível de receber esse parâmetro, por ser sempre composto por 3 letras seguido por 4 números. As máscaras podem ser adotadas a campos, cuja formataçao seja sempre um padrão definido, como telefones, datas, horários, CPFs, CEPs, etc. Vamos aos procedimentos. Da Paleta FireDAC, adicione o componente FDQuery (ADQuery). Configure as seguintes propriedades: - Name: tblAutomovel - Connection: FDConnection1 (ADConnection1) Configuradas as propriedades, dê um duplo clique sobre o componente tblAutomovel. No editor que aparecerá, será necessário informar o código SQL select, responsável para trazer os dados da tabela Automovel. Código: Select from Automovel Para testar clique no botão Executar do lado direito, depois OK. Feito esse procedimento, vamos adicionar os campos da tabela Automovel ao componente Query. Para tal, faz-se necessário clicar com o botão direito do mouse sob o componente tblAutomovel, e no submenu selecionar Fields Editor , abrindo a janela para adicionar os campos. - Nessa janela, clique com o botão direito do mouse na área central, opção Add all fields (Adicionar todos os campos). - Para funcionar corretamente a questão do auto incremento, na lista de campos, selecione o campo COD_AUTOMOVEL, e no Object Inspector altere a propriedade ReadOnly para True. Definindo a Máscara para o campo Placa: selecione o campo Placa, e na propriedade EditMask informe a seguinte máscara de entrada: LLL-9999. Pronto, está configurada a máscara. - Active: True. (Caso tenha erro de configuração, ao ativar o mesmo é apresentado). O passo seguinte será adicionar ao Data Module o componente FDUpdateSQL (ADUpdateSQL) presente na Paleta FireDAC. No nosso exemplo, dessa vez será vinculado a Query tblAutomovel. Altere as propriedades do componente da seguinte forma: - Name: updAutomovel - Connection: FDConnection1 (ADConnection1) Retorne agora e selecione o componente tblAutomovel, marcando a propriedade UpdateObject para updAutomovel..
(9) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:9. Feito isso, torna-se possível adicionar os códigos SQL responsáveis pela manipulação dos registros. Dê um duplo clique sobre o componente updAutomovel. Caso seja exibida uma mensagem, apenas confirme clicando em Yes. Abrirá o editor de SQL.. Figura 8 – Editor de SQL - Tabela Automóvel. Nesse editor, certifique-se que na primeira coluna esteja selecionado o campo chave primária da tabela, na segunda coluna, todos os registros selecionados, o que ocorre por padrão. - Para gerar os códigos SQL automaticamente, basta clicar no botão Generate SQL . Depois só confirmar clicando em OK. Para finalizar, basta inserir o componente DataSource, presente na paleta Data Access. Após inserido, altere no Object Inspector a propriedade Name para dsAutomovel e a propriedade DataSet para tblAutomovel. Figura 9 - Visão Final do Data Module.
(10) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:10. CRIAÇAO DOS FORMULÁRIOS PARA MANIPULAÇÃO DOS DADOS FORMULÁRIO – MARCAS Nesse formulário adotaremos o método rápido para manipulação dos dados, adotando o componente DBNavigator para automatizar grande parte do processo. Vamos criar rapidamente o formulário, através do menu File/New/VCL Form - Delphi. Salve como UnitMarca.pas. Altere as seguintes propriedades: Figura 10 - Formulário de Cadastro de Marcas. BorderIcons: biSystemMenu BorderStyle: bsSingle. Caption: Cadastro de Marcas FormStyle: fsMDIChild KeyPreview: True Name: frmMarca Position: poMainFormCenter Height: 175 Width: 360 Para impedir que o formulário seja criado automaticamente ao executar o aplicativo, por ser do tipo MDI, fazse necessário retirar o mesmo do auto-create. Menu Project/Options. Na primeira coluna opção Forms. Na coluna central, selecione o formulário pretendido, e clique na seta que aponta pra direita. OBS> O frmPrincipal e o DM, devem permanecer sempre na Coluna central, Auto-Create forms.. Figura 11 - Impedir Auto-Create do Formulário.
(11) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:11. Feito o procedimento para impedir o auto-create, vamos garantir que seja possível fechar o formulário quando assim pretendido. Vamos no evento OnClose do frmMarca, incluir os seguintes códigos: Action := Cafree; frmMarca := Nil; Chamando o formulário Marcas a partir do Form Principal: Volte ao formulário principal, abre o MainMenu1, selecione o item Marcas das opções, dando um duplo clique com o mouse. No editor de código, informe o seguinte: if frmMarca = nil then frmMarca := TfrmMarca.Create(Self); frmMarca.Show; Para que também seja possível acessar o formulário Marcas a partir do botão da ToolBar que consta no formulário principal, não será necessário redigitar o código acima. Basta vincular o código existente ao evento OnClick do referido botão. Selecione o Botão Marcas, nos eventos procure o OnClick, e ao invés de dar o duplo clique para abrir o editor de códigos, basta clicar na setinha no canto direito e selecionar o evento já criado anteriormente para o menu, que nesse caso aparecerá como Marcas1Click. Adicionando os componentes ao Formulário Marcas: - Adicione dois labels da paleta Standard. - Da Paleta Additional adicione um BitBtn (name: btnLocMarca) - Da paleta Data Controls, adicione: um DBText, um DBEdit e um DBNavigator. - Organize o layout conforme a Figura 10. Com os componentes devidamente inseridos, faz-se necessário incluir a Unit do Data Module na Unit do Formulário frmMarcas. - Selecione o frmMarcas. - Menu File/Use Unit - Selecione a UnitDM e OK. Agora altere as seguintes propriedades dos componentes: - DBText – DataSource: DM.dsMarca DataField: Cod_Marca - DBEdit - DataSource: DM.dsMarca DataField: Nome_Marca - DBNavigator - DataSource: DM.dsMarca ShowHint: True; Na propriedade Hints do DBNavigator, exclua os textos em inglês, substituindo os mesmos pelas traduções: Primeiro Registro Registro Anterior Próximo Registro Último Registro. Inserir Registro Excluir Registro Editar Registro Salvar Registro. Cancelar Registro Atualizar Dados Aplicar Alterações Cancelar Alterações.
(12) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:12. Fazendo Enter funcionar como Tab: Na propriedade OnKeyPress do formulário frmMarca inclua o código abaixo: if Key = #13 then if not ((ActiveControl is TDBNavigator)) then begin Key := #0; Perform(WM_NEXTDLGCTL, 0, 0); end; Exibir o Código da Marca ao salvar um registro: Para atualizar automaticamente toda vez ao se incluir um registro novo, utilizando-se o componente Table, faz-se necessário retornar ao Data Module e incluir o código abaixo, no evento AfterPost do tblMarca. tblMarca.Refresh; tblMarca.Last; Pronto. Agora é só executar e testar os métodos de inserção, edição e exclusão. Formulário de Pesquisa das Marcas cadastradas - Table Mesmo utilizando-se o componente Table, também torna-se possível realizar buscas nos registros de uma tabela. Embora mais limitado que usando os comandos SQL, podemos utilizar do método Locate do componente Table. Vamos criar um novo Formulário, salvando a Unit como UnitLocMarca.pas. Tire do auto-create conforme visto anteriormente. Altere as propriedades conforme descrito no formulário anterior, substituindo somente as propriedades: - Name: frmLocMarca - Height: 240 - Width: 350 Figura 12 - Formulário Localizar Marca. O form criado deve ser chamado, clicando-se no BitBtn btnLocMarca, inserido no formulário frmMarca. - Inclua nesse formulário localizar: um Label, um MaskEdit, um DBGrid e um BitBtn. - Na parte do código do formulário, bem na parte superior, na cláusula Uses, acrescente no final da lista a classe DB. - No evento OnChange do edtPesquisa, vamos inserir o código responsável pela busca na tabela: DM.tblMarca.Locate('Nome_Marca',edtPesquisa.Text,[loPartialKey]); - No evento OnShow do formulário vamos incluir o código para colocar automaticamente no edtPesquisa: edtPesquisa.setFocus; Temos a necessidade de impedir que o usuário consigo fazer edição ao clicar num campo da tabela. Selecione o DBGrid, e na propriedade Options clique no (+) que aparece à sua frente. Mude para True a propriedade dgRowSelect. Para testar, e garantir melhores resultados, é recomendável ter quantidade maior de registros já inseridos na tabela..
(13) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:13. FORMULÁRIO – CIDADE Para o formulário cidade, adotaremos botões de ações personalizados, manipulando os dados via código. - Crie um novo formulário, salve como UnitCidade.pas, e propriedade Name como frmCidade. Siga os demais procedimentos para deixar o formulário OK para uso.. Figura 13 - Formulário Cidade. Lembre-se de adicionar a unit DM ao formulário de Cadastro de Cidades: - File/Use Unit -> UnitDM.pas Também utilizaremos neste formulário os procedimentos Habilita e Desabilita campos presentes na unit RotinasGerais. Da mesma forma, adicionaremos essa unit ao formulário de Cadastro de Cidades. - File/Use Unit -> RotinasGerais.pas Inserindo os componentes no formulário: Para o campo Cod_Cidade, insira um componente DBText da paleta Data Controls: DataSource: DM.dsCidade DataField: COD_CIDADE Name: lblCodigo Para o campo Nome_Cidade, insira um componente DBEdit da paleta Data Controls: DataSource: DM.dsCidade DataField: NOME_CIDADE Name: edtNomeCidade Para o campo Estado, insira um componente DBComboBox da paleta Data Controls: DataSource: DM.dsCidade DataField: UF Name: cbEstado Na propriedade Items, do DbComboBox, digite as iniciais dos estados Brasileiros para serem exibidos depois: AC, SC, RS, SP, RJ, AM, PR, etc. Para serem ordenados em ordem alfabética, altere a propriedade Sorted para True. Para os botões, insira 11 BitBtns da paleta Additional. Configure as propriedades de tamanho, imagens, hints, conforme cada qual. OBS: Fundamental lembrar que a propriedade Enabled dos botões Salvar e Cancelar deve estar como False, a fim de efetivamente funcionar o tratamento de todos os botões..
(14) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:14. Procedimento de Controle dos Botões – TrataBotoes Para poder gerenciar os botões que devem ficar habilitados e/ou desabilitados durante o processo de inserção ou edição dos dados, faremos uso de um procedimento. Inicialmente será necessário acrescentar o procedimento na cláusula Type do código fonte do formulário, na parte superior do mesmo. Localize onde se iniciam as entradas dos demais procedimentos, e acrescente a seguinte linha: ........ procedure TrataBotoes; ................ Já na parte após a cláusula Uses, acrescente o procedimento de fato: procedure TfrmCidade.TrataBotoes; begin btnNovo.Enabled:=not btnNovo.Enabled; btnEditar.Enabled:=not btnEditar.Enabled; btnExcluir.Enabled:= not btnExcluir.Enabled; btnSalvar.Enabled:=not btnSalvar.Enabled; btnCancelar.Enabled:=not btnCancelar.Enabled; btnFechar.Enabled:=not btnFechar.Enabled; btnLocalizar.Enabled:=not btnLocalizar.Enabled; btnPrimeiro.Enabled := not btnPrimeiro.Enabled; btnAnterior.Enabled := not btnAnterior.Enabled; btnProximo.Enabled := not btnProximo.Enabled; btnUltimo.Enabled := not btnUltimo.Enabled; end;. Figura 14 - Código Fonte. CÓDIGOS DO EVENTO ONCLICK DOS BOTÕES procedure TfrmCidade.btnPrimeiroClick(Sender: TObject); begin DM.tblCidade.First; end; procedure TfrmCidade.btnAnteriorClick(Sender: TObject); begin DM.tblCidade.Prior; end; procedure TfrmCidade.btnProximoClick(Sender: TObject); begin DM.tblCidade.Next; end;.
(15) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. procedure TfrmCidade.btnUltimoClick(Sender: TObject); begin DM.tblCidade.Last; end; procedure TfrmCidade.btnNovoClick(Sender: TObject); begin DM.tblCidade.Append; HabilitaCampos(frmCidade); TrataBotoes; edtNomeCidade.setFocus; end; procedure TfrmCidade.btnSalvarClick(Sender: TObject); begin DM.tblCidade.Post; DesabilitaCampos(frmCidade); TrataBotoes; btnNovo.SetFocus; end; procedure TfrmCidade.btnEditarClick(Sender: TObject); begin DM.tblCidade.Edit; HabilitaCampos(frmCidade); TrataBotoes; end; procedure TfrmCidade.btnCancelarClick(Sender: TObject); begin DM.tblCidade.Cancel; DesabilitaCampos(frmCidade); TrataBotoes; end; procedure TfrmCidade.btnExcluirClick(Sender: TObject); begin If Application.MessageBox('Tem Certeza de que deseja excluir esse registro ?', 'Exclusão',mb_YesNo+mb_DefButton2+mb_IconQuestion) = Id_Yes then Begin DM.tblCidade.Delete; end; end;. PG:15.
(16) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:16. OBS: Como ainda não temos criado o formulário frmLocCidade, vamos apenas inserir o código no botão Localizar, mantendo-o comentado, até que o formulário seja criado mais adiante, bastando daí, somente descometer retirando os ({ }). procedure TfrmCidade.btnLocalizarClick(Sender: TObject); begin { if frmLocCidade = nil then frmLocCidade := TfrmLocCidade.Create(Self); frmLocCidade.Show; } end;. procedure TfrmCidade.btnFecharClick(Sender: TObject); begin Close; end; CÓDIGO EVENTO OnKeyPress DO FORMULÁRIO (Enter Funcionar como Tab). Lembrando de organizar a propriedade TabOrder de todos os componentes presentes do form, iniciando-se no primeiro pelo índice 0 e assim por diante. procedure TfrmCidade.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then if not ((ActiveControl is TBitBtn) or (ActiveControl is TDBMemo)) then begin Key := #0; Perform(WM_NEXTDLGCTL, 0, 0); end; end; No formulário Principal, na opção do Menu para chamar o formulário Cidade, temos que acrescentar a linha que desabilita os botões abrindo-se o mesmo, devendo ficar da seguinte forma: procedure TfrmPrincipal.Cidades1Click(Sender: TObject); begin if frmCidade = nil then frmCidade := TfrmCidade.Create(Self); DesabilitaCampos(frmCidade); frmCidade.Show; end; Para finalizar, falta incluir o código de atualização nos eventos AfterPost e AfterDelete do tblCidade, constante no Data Module: tblCidade.Refresh;.
(17) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:17. FORMULÁRIO LOCALIZAR CIDADE Para facilitar as buscas de cidades cadastradas, vamos incluir um novo formulário ao nosso projeto, salvando a unit com o nome UnitLocCidade.pas, name do form: frmLocCidade. As demais configurações são similares aos anteriormente criados.. Figura 15 - Formulário Localizar Cidade. Vamos incluir a UnitDM ao formulário: - File/Use Unit -> UnitDM.pas Insira os seguintes componentes, no formulário de localização: - Um Label - Um DBGrid - Um MaskEdit - Um BitBtn No DbGrid, na propriedade DataSource, selecione DM.tblCidade. Para personalizar os dados do DBGrid, dê um duplo clique sobre o mesmo. Na janela que aparecer, clique com o Botão Direito do mouse na parte central, depois na opção “Add All Fields”. Agora basta selecionar o/s campos desejados e alterar as propriedades conforme desejado. Lembrando que para ajustar a linha de cabeçalho da tabela, necessita-se clicar no (+) que precede a propriedade Title, sendo possível alterar o Caption, Cor, ajustes de alinhamento, dentre outros.. Figura 16 - Personalizar DbGrid. No Botão OK, basta incluir o comando Close, ao evento OnClick.. Temos a necessidade de impedir que o usuário consigo fazer edição ao clicar num campo da tabela. Selecione o DBGrid, e na propriedade Options clique no (+) que aparece à sua frente. Mude para True a propriedade dgRowSelect..
(18) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:18. Para finalizar o formulário de busca, faremos com que ao ser aberto, o cursor já apareça no campo de pesquisa, através do evento OnShow do formulário. procedure TfrmLocCidade.FormShow(Sender: TObject); begin edtPesquisa.SetFocus; end; Pretende-se que, ao o usuário digitar no campo de pesquisa, sejam simultaneamente filtrados os registros. Para isso, recorremos ao evento OnChange do componente edtPesquisa. E definimos o seguinte código SQL: procedure TfrmLocCidade.edtPesquisaChange(Sender: TObject); begin With DM.tblCidade do Begin Close; Sql.Clear; Sql.Add('Select * from Cidade where nome_cidade containing :Parametro order by nome_cidade'); ParamByName('Parametro').AsString := edtPesquisa.Text; Open; end; end;. Para testar, vamos voltar ao formulário de cadastro de cidades, e descomentar o código do botão Localizar, retirando os ({ })..
(19) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:19. FORMULÁRIO – AUTOMÓVEL - Crie um novo formulário, salve como UnitAutomovel.pas, e propriedade Name como frmAutomovel. Siga os demais procedimentos para deixar o formulário OK para uso.. Figura 17 - Formulário Cadastro de Automóveis. Lembre-se de adicionar a unit DM e RotinasGerais ao formulário de Cadastro de Automóveis: - File/Use Unit -> UnitDM.pas - File/Use Unit -> RotinasGerais.pas Inserindo os componentes no formulário: Podemos agilizar o processo, copiando os botões criados no formulário anterior (frmCidade). Basta selecionar todos eles no formulário Cidade, dar o comando copiar (Ctrl+C) e voltar ao formulário Automóvel e colar (Ctrl+V). Para o campo Cod_Automovel, insira um componente DBText da paleta Data Controls: DataSource: DM.dsAutomovel DataField: COD_AUTOMOVEL Name: lblCodigo Para o campo Marca, insira um componente DBLookupComboBox da paleta Data Controls, que visa buscar os registros cadastrados na tabela Marca. Onde salva: DataSource: DM.dsAutomovel DataField: COD_MARCA Name: cbMarca Da onde Busca: ListSource: DM.dsMarca ListField: Nome_Marca KeyField: Cod_Marca Para o campo Modelo, insira um componente DBEdit da paleta Data Controls: DataSource: DM.dsAutomovel DataField: MODELO Name: edtModelo Para o campo Cidade, insira um componente DBLookupComboBox da paleta Data Controls, que visa buscar os registros cadastrados na tabela Cidade. Onde salva: DataSource: DM.dsAutomovel DataField: COD_CIDADE Name: cbCidade Da onde Busca: ListSource: DM.dsCidade ListField: Nome_Cidade KeyField: Cod_Cidade.
(20) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:20. Para o campo Placa, insira um componente DBEdit da paleta Data Controls: DataSource: DM.dsAutomovel DataField: PLACA Name: edtPlaca CharCase: ecUpperCase Para o campo Ano, insira um componente DBEdit da paleta Data Controls: DataSource: DM.dsAutomovel DataField: ANO_FABRICACAO Name: edtAno Para o campo Conservação, insira um componente DBRadioGroup da paleta Data Controls: DataSource: DM.dsAutomovel DataField: CONSERVACAO Name: cbConservacao Items> (o que é exibido ao usuário) - Informe as quatro opções: Ótimo, Bom, Razoável, Péssimo. Values> (o que se grava efetivamente no banco) – Informe as Iniciais dos Itens: O, B, R e P. Para o campo Obs, insira um componente DBMemo da paleta Data Controls: DataSource: DM.dsAutomovel DataField: OBS Name: mmObs OBS: Fundamental lembrar que a propriedade Enabled dos botões Salvar e Cancelar deve estar como False, a fim de efetivamente funcionar o tratamento de todos os botões. Procedimento de Controle dos Botões – TrataBotoes Inicialmente será necessário acrescentar o procedimento na cláusula Type no código fonte do formulário, na parte superior do mesmo, da mesma forma como foi feito no formulário anterior de cadastro de cidades. Localize onde se iniciam as entradas dos demais procedimentos, e acrescente a seguinte linha: ........ procedure TrataBotoes; ................ Já na parte após a cláusula Uses, acrescente o procedimento de fato: procedure TfrmAutomovel.TrataBotoes; begin btnNovo.Enabled:=not btnNovo.Enabled; btnEditar.Enabled:=not btnEditar.Enabled; btnExcluir.Enabled:= not btnExcluir.Enabled; btnSalvar.Enabled:=not btnSalvar.Enabled; btnCancelar.Enabled:=not btnCancelar.Enabled; btnFechar.Enabled:=not btnFechar.Enabled; btnLocalizar.Enabled:=not btnLocalizar.Enabled; btnPrimeiro.Enabled := not btnPrimeiro.Enabled; btnAnterior.Enabled := not btnAnterior.Enabled; btnProximo.Enabled := not btnProximo.Enabled; btnUltimo.Enabled := not btnUltimo.Enabled; end; OBS: Repare que em relação ao código inserido anteriormente no formulário de cadastro de cidades, apenas foi alterado o nome do form na primeira linha da procedure..
(21) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. CÓDIGOS DO EVENTO OnClick DOS BOTÕES procedure TfrmAutomovel.btnPrimeiroClick(Sender: TObject); begin DM.tblAutomovel.First; end; procedure TfrmAutomovel.btnAnteriorClick(Sender: TObject); begin DM.tblAutomovel.Prior; end; procedure TfrmAutomovel.btnProximoClick(Sender: TObject); begin DM.tblAutomovel.Next; end; procedure TfrmAutomovel.btnUltimoClick(Sender: TObject); begin DM.tblAutomovel.Last; end;. PG:21.
(22) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. procedure TfrmAutomovel.btnNovoClick(Sender: TObject); begin DM.tblAutomovel.Append; HabilitaCampos(frmAutomovel); TrataBotoes; cbMarca.setFocus; end; procedure TfrmAutomovel.btnSalvarClick(Sender: TObject); begin DM.tblAutomovel.Post; DesabilitaCampos(frmAutomovel); TrataBotoes; btnNovo.SetFocus; end; procedure TfrmAutomovel.btnEditarClick(Sender: TObject); begin DM.tblAutomovel.Edit; HabilitaCampos(frmAutomovel); TrataBotoes; end; procedure TfrmAutomovel.btnCancelarClick(Sender: TObject); begin DM.tblAutomovel.Cancel; HabilitaCampos(frmAutomovel); TrataBotoes; end; procedure TfrmAutomovel.btnExcluirClick(Sender: TObject); begin If Application.MessageBox('Tem Certeza de que deseja excluir esse registro ', 'Exclusão',mb_YesNo+mb_DefButton2+mb_IconQuestion) = Id_Yes then Begin DM.tblAutomovel.Delete; end; end;. PG:22.
(23) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:23. procedure TfrmAutomovel.btnLocalizarClick(Sender: TObject); begin { if frmLocAutomovel = nil then frmLocAutomovel := TfrmLocAutomovel.Create(Self); frmLocAutomovel.Show; } end; procedure TfrmAutomovel.btnFecharClick(Sender: TObject); begin Close; end; CÓDIGO EVENTO OnKeyPress DO FORMULÁRIO (Enter Funcionar como Tab). Lembrando de organizar a propriedade TabOrder de todos os componentes presentes do form, iniciando-se no primeiro pelo índice 0 e assim por diante. procedure TfrmAutomovel.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then if not ((ActiveControl is TBitBtn) or (ActiveControl is TDBMemo)) then begin Key := #0; Perform(WM_NEXTDLGCTL, 0, 0); end; end; No formulário Principal, na opção do Menu para chamar o formulário Automóvel, temos que acrescentar a linha que desabilita os botões, devendo ficar da seguinte forma: procedure TfrmPrincipal.Automveis1Click(Sender: TObject); begin if frmAutomovel = nil then frmAutomovel := TfrmAutomovel.Create(Self); DesabilitaCampos(frmAutomovel); frmAutomovel.Show; end; Para finalizar, falta incluir o código de atualização nos eventos AfterPost e AfterDelete do tblAutomovel, constante no Data Module: tblAutomovel.Refresh;.
(24) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:24. FORMULÁRIO LOCALIZAR AUTOMÓVEL Vamos incluir um novo formulário ao nosso projeto, salvando a unit como UnitLocAutomovel.pas, name do form: frmLocAutomovel. As demais configurações são similares aos forms anteriormente criados.. Figura 18 - Formulário Localizar Automóvel. Vamos incluir a UnitDM ao formulário: - File/Use Unit -> UnitDM.pas Insira os seguintes componentes, no formulário de localização: - Um Label - Um DBGrid - Um MaskEdit - Um BitBtn Ajuste o DBGrid, conforme descrito no formulário localizar Cidade, criado em etapas anteriores. Código do Evento OnChange, do edtPesquisa: procedure TfrmLocAutomovel.edtPesquisaChange(Sender: TObject); begin With DM.tblAutomovel do Begin Close; Sql.Clear; Sql.Add('Select * from Automovel where modelo containing :Parametro order by modelo'); ParamByName('Parametro').AsString := edtPesquisa.Text; Open; end; end; Como no DBGrid aparecem os códigos, ao invés da descrição da Cidade e Marca, necessitamos criar campos do tipo Lookup na Query tblAutomovel..
(25) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. PG:25. CRIANDO CAMPOS VIRTUAIS NUM QUERY Abra o Data Module. Clique com o Botão Direito do mouse sobre tblAutomovel e selecione a opção “Fields Editor”. Na Janelinha que é exibida, já estão sendo apresentados os campos físicos e reais da tabela Automóvel. Vamos incluir agora um campo do tipo Lookup. Para tal, clique com o botão direito na parte interna da janelinha e escolha a opção “New Field”. Configure como mostra a Figura 19.. Figura 19 - Campo Virtual - Cidade. Repita o procedimento anterior, adicionando mais um campo para mostrar a Marca.. Figura 20 - Campo Virtual - Marca.
(26) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014. ANEXO unit RotinasGerais; interface uses sysutils, IniFiles,Windows, Forms, Classes, Controls, StdCtrls, Variants,Messages, ExtCtrls, dialogs, DBCtrls, Buttons, StrUtils ; function VerificaCPF(cpf: string): boolean; procedure DesabilitaCampos (Form: TForm); procedure HabilitaCampos (Form: TForm); Function ValidaCNPJ(numCNPJ: string): boolean; function Acentos ( str: String ): String; function GetBuildInfo:string; implementation function GetBuildInfo:string; var VerInfoSize: DWORD; VerInfo: Pointer; VerValueSize: DWORD; VerValue: PVSFixedFileInfo; Dummy: DWORD; V1, V2, V3, V4: Word; Prog : string; begin Prog := Application.Exename; VerInfoSize := GetFileVersionInfoSize(PChar(prog), Dummy); GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(prog), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); with VerValue^ do begin V1 := dwFileVersionMS shr 16; V2 := dwFileVersionMS and $FFFF; V3 := dwFileVersionLS shr 16; V4 := dwFileVersionLS and $FFFF; end; FreeMem(VerInfo, VerInfoSize); result := Copy (IntToStr (100 + v1), 3, 2) + '.' + Copy (IntToStr (100 + v2), 3, 2) + '.' + Copy (IntToStr (100 + v3), 3, 2) + '.' + Copy (IntToStr (1000 + v4), 3, 2); end;. function Acentos ( str: String ): String; var i: Integer; begin for i := 1 to Length ( str ) do case str[i] of 'á': str[i] := 'a'; 'é': str[i] := 'e';. 'í': str[i] := 'i'; 'ó': str[i] := 'o'; 'ú': str[i] := 'u'; 'à': str[i] := 'a'; 'è': str[i] := 'e'; 'ì': str[i] := 'i'; 'ò': str[i] := 'o'; 'ù': str[i] := 'u'; 'â': str[i] := 'a'; 'ê': str[i] := 'e'; 'î': str[i] := 'i'; 'ô': str[i] := 'o'; 'û': str[i] := 'u'; 'ä': str[i] := 'a'; 'ë': str[i] := 'e'; 'ï': str[i] := 'i'; 'ö': str[i] := 'o'; 'ü': str[i] := 'u'; 'ã': str[i] := 'a'; 'õ': str[i] := 'o'; 'ñ': str[i] := 'n'; 'ç': str[i] := 'c'; 'Á': str[i] := 'A'; 'É': str[i] := 'E'; 'Í': str[i] := 'I'; 'Ó': str[i] := 'O'; 'Ú': str[i] := 'U'; 'À': str[i] := 'A'; 'È': str[i] := 'E'; 'Ì': str[i] := 'I'; 'Ò': str[i] := 'O'; 'Ù': str[i] := 'U'; 'Â': str[i] := 'A'; 'Ê': str[i] := 'E'; 'Î': str[i] := 'I'; 'Ô': str[i] := 'O'; 'Û': str[i] := 'U'; 'Ä': str[i] := 'A'; 'Ë': str[i] := 'E'; 'Ï': str[i] := 'I'; 'Ö': str[i] := 'O'; 'Ü': str[i] := 'U'; 'Ã': str[i] := 'A'; 'Õ': str[i] := 'O'; 'Ñ': str[i] := 'N'; 'Ç': str[i] := 'C'; end; Result := str; end; Function VerificaCPF(cpf:string):boolean; var i:integer; Want:char; Wvalid:boolean;. PG:26.
(27) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014 Wdigit1,Wdigit2:integer; begin Wdigit1:=0; Wdigit2:=0; Want:=cpf[1];//variavel para testar se o cpf é repetido como 111.111.111-11 Delete(cpf,ansipos('.',cpf),1); //retira as mascaras se houver Delete(cpf,ansipos('.',cpf),1); Delete(cpf,ansipos('-',cpf),1); //testar se o cpf é repetido como 111.111.111-11 for i:=1 to length(cpf) do begin if cpf[i] <> Want then begin Wvalid:=true; // se o cpf possui um digito diferente ele passou no primeiro teste break end; end; // se o cpf é composto por numeros repetido retorna falso if not Wvalid then begin result:=false; exit; end; //executa o calculo para o primeiro verificador for i:=1 to 9 do begin wdigit1:=Wdigit1+(strtoint(cpf[10-i]) (I+1)); end; Wdigit1:= ((11 - (Wdigit1 mod 11))mod 11) mod 10; {formula do primeiro verificador soma=1° 2+2° 3+3° 4.. até 9° 10 digito1 = 11 - soma mod 11 se digito > 10 digito1 =0 } //verifica se o 1° digito confere if IntToStr(Wdigit1) <> cpf[10] then begin result:=false; exit; end;. for i:=1 to 10 do begin wdigit2:=Wdigit2+(strtoint(cpf[11-i]) (I+1)); end; Wdigit2:= ((11 - (Wdigit2 mod 11))mod 11) mod 10; {formula do segundo verificador soma=1° 2+2° 3+3° 4.. até 10° 11 digito1 = 11 - soma mod 11 se digito > 10 digito1 =0. PG:27. } // confere o 2° digito verificador if IntToStr(Wdigit2) <> cpf[11] then begin result:=false; exit; end; //se chegar até aqui o cpf é valido result:=true; end;. Function ValidaCNPJ(numCNPJ: string): boolean; var cnpj: string; dg1, dg2: integer; x, total: integer; ret: boolean; begin ret:=False; cnpj:=''; //Analisa os formatos if Length(numCNPJ) = 18 then if (Copy(numCNPJ,3,1) + Copy(numCNPJ,7,1) + Copy(numCNPJ,11,1) + Copy(numCNPJ,16,1) = '../-') then begin cnpj:=Copy(numCNPJ,1,2) + Copy(numCNPJ,4,3) + Copy(numCNPJ,8,3) + Copy(numCNPJ,12,4) + Copy(numCNPJ,17,2); ret:=True; end; if Length(numCNPJ) = 14 then begin cnpj:=numCNPJ; ret:=True; end; //Verifica if ret then begin try //1° digito total:=0; for x:=1 to 12 do begin if x < 5 then Inc(total, StrToInt(Copy(cnpj, x, 1)) (6 - x)) else Inc(total, StrToInt(Copy(cnpj, x, 1)) (14 - x)); end; dg1:=11 - (total mod 11); if dg1 > 9 then dg1:=0; //2° digito total:=0; for x:=1 to 13 do.
(28) Sociedade Educacional de Itapiranga - FAI Faculdades Curso: GESTÃO DA TECNOLOGIA DA INFORMAÇÃO Disciplina: PROGRAMAÇÃO II Professor: ANDRÉ KLUNK Período: 3° semestre Ano: 2014 begin if x < 6 then Inc(total, StrToInt(Copy(cnpj, x, 1)) (7 - x)) else Inc(total, StrToInt(Copy(cnpj, x, 1)) (15 - x)); end; dg2:=11 - (total mod 11); if dg2 > 9 then dg2:=0; //Validação final if (dg1 = StrToInt(Copy(cnpj, 13, 1))) and (dg2 = StrToInt(Copy(cnpj, 14, 1))) then ret:=True else ret:=False; except ret:=False; end; //Inválidos case AnsiIndexStr(cnpj,['00000000000000','11111111111111','2222222 2222222','33333333333333','44444444444444', '55555555555555','66666666666666','77777777777777','888888888 88888','99999999999999']) of 0..9: ret:=False; end; end; ValidaCNPJ:=ret; end; procedure HabilitaCampos (Form: TForm); var i : Integer; begin for i := 0 to Form.ComponentCount - 1 do Begin if Form.Components[i] is TCustomEdit then (Form.Components[i] as TCustomEdit).Enabled:=True; if Form.Components[i] is TDBComboBox then (Form.Components[i] as TDBComboBox).Enabled:=True;. PG:28. if Form.Components[i] is TDBLookupComboBox then (Form.Components[i] as TDBLookupComboBox).Enabled:=True; if Form.Components[i] is TComboBox then (Form.Components[i] as TComboBox).Enabled:=True; if Form.Components[i] is TDbCheckBox then (Form.Components[i] as TDbCheckBox).Enabled:=True; if Form.Components[i] is TGroupBox then (Form.Components[i] as TGroupBox).Enabled:=True; if Form.Components[i] is TDBRadioGroup then (Form.Components[i] as TDBRadioGroup).Enabled:=True; End; end; procedure DesabilitaCampos (Form: TForm); var i : Integer; begin for i := 0 to Form.ComponentCount - 1 do Begin if Form.Components[i] is TCustomEdit then (Form.Components[i] as TCustomEdit).Enabled:=False; if Form.Components[i] is TDBComboBox then (Form.Components[i] as TDBComboBox).Enabled:=False; if Form.Components[i] is TDBLookupComboBox then (Form.Components[i] as TDBLookupComboBox).Enabled:=False; if Form.Components[i] is TComboBox then (Form.Components[i] as TComboBox).Enabled:=False; if Form.Components[i] is TDbCheckBox then (Form.Components[i] as TDbCheckBox).Enabled:=False; if Form.Components[i] is TGroupBox then (Form.Components[i] as TGroupBox).Enabled:=False; if Form.Components[i] is TDBRadioGroup then (Form.Components[i] as TDBRadioGroup).Enabled:=False; End; end; end.. -------------------------------------------------------------------------------------------------------.
(29)
Documentos relacionados
Portanto, a análise dos efeitos dos extratos de caferana no sistema nervoso central forneceu poucas evidências de ação farmacológica, contrastando com a
“Gerente de TI”, mesmo entre os mais novos gerentes é necessário que ele tenha um mínimo de vivência na área profissional, sendo assim qualquer graduação na área de TI é
As atividades nessa primeira etapa e apresentadas neste trabalho tinham como objetivo identificar fatores que pudessem dificultar, por parte dos professores, o conhecimento e a
Este trabalho tem como objetivos conhecer quais os critérios utilizados pelos acadêmicos na escolha do seu lanche na cantina da FAI, identificar os alimentos
Disciplina: Algoritmos e Programação Semestre/Ano: 2º semestre de 2009 Professor(a): Cláudio Jorge Cançado Período do curso: 2º.. Carga horária total: 80 h/a Carga horária
Disciplina: Introdução às Construções Semestre/Ano: 2º semestre de 2009 Professor(a): Cláudio Jorge Cançado Período do curso: 1º.. Carga horária total: 40 h/a Carga
Resumo: Partindo do pressuposto de que a Língua Brasileira de Sinais (LIBRAS) é a primeira língua das pessoas surdas no Brasil, e que nem todos os professores que
Desta forma, segundo Portela (2008), “os valores encontrados não devem ser considerados como ótimos para a saúde, havendo a necessidade de serem reduzidos, a