Desenvolvimento de Aplicações Desktop Delphi Prof. Melo 1
Apresentação Nome: Hildeberto Melo; Técnico em Desenvolvimento de Software. Ibratec, PE; Bacharel em Sistemas de Informação. FIR, PE; Pós-Graduação em Docência do Ensino Superior. FMN, PE; Mestre em Ciência da Computação. CIN/UFPE. 2
Roteiro Competências Habilidades Resumo do Programa Plano de Aula Critério de Avaliação Regras de Convivência Material do Aluno Avaliações
Delphi
Delphi
Funções Trim(string) – remove os espaços em branco no início e no fim do texto. Ex: x := trim(‘ Hildeberto Melo ‘); X = ‘Hildeberto Melo’; TrimLeft(string) – remove os espaços em branco no início do texto. X = ‘Hildeberto Melo ’; TrimRight(string) – remove os espaços em branco no fim do texto. X = ‘ Hildeberto Melo’;
Funções Inc(integer) – acrescenta uma unidade ao valor; Ex: var x : integer; X := 10; Inc(x); X = 11; Dec(integer) - – decrescenta uma unidade ao valor; Dec(x); X = 9;
Funções Strtoint(string) – converte um valor string em um valor inteiro. Strtofloat(string) – converte um valor string em uma valor float. Strtotime(string) – converte um valor string em uma valor hora. Strtodate(string) – converte um valor string em uma valor data. Strtodatetime(string) - converte um valor string em uma valor data/hora. Strotocurr(string) - converte um valor string em uma valor moeda.
Funções Length(string) – retorno o tamanho de um texto. Ex: var int x; X = length(‘Hildeberto Melo’); X = 15; IntToStr(integer) – Converte um valor inteiro em um valor texto. FloatToStr(float) – Converte um valor float em um valor texto.
Funções IntToStr(integer) – Converte um valor inteiro em um valor texto. FloatToStr(float) – Converte um valor float em um valor texto. FloatToCurr(float) – Converte uma valor float em um valor moeda.
Mensagens ShowMessage(texto) ShowMessage('Hildeberto Melo');
Mensagens Application.MessageBox(texto da mensagem, titulo, ícone); Application.MessageBox('Hildeberto Melo','Hand',MB_ICONHAND); Application.MessageBox('Hildeberto Melo','Quaestion',MB_ICONQUESTION); Application.MessageBox('Hildeberto Melo','Exclamation',MB_ICONEXCLAMATION); Application.MessageBox('Hildeberto Melo','Asterik',MB_ICONASTERISK); Application.MessageBox('Hildeberto Melo','Warning',MB_ICONWARNING);
Mensagens Application.MessageBox(texto da mensagem, titulo, ícone); Application.MessageBox('Hildeberto Melo','Error',MB_ICONERROR); Application.MessageBox('Hildeberto Melo','Information',MB_ICONINFORMATION); Application.MessageBox('Hildeberto Melo','Stop',MB_ICONSTOP); Application.MessageBox('Hildeberto Melo','Mask',MB_ICONMASK);
MessageDlg(texto, tipo, botões): integer; Mensagens MessageDlg(texto, tipo, botões): integer; Botão Retorno 1 OK 2 Cancel 3 Abort 4 Retry 5 Ignore 6 Yes 7 No 9 No to all 10 Yes to all
Mensagens MessageDlg(texto, tipo, botões); MessageDlg('Hildeberto Melo',mtWarning,mbYesNoCancel,0);
Mensagens MessageDlg(texto, tipo, botões); MessageDlg('Hildeberto Melo',mtInformation,mbYesAllNoAllCancel,0);
Mensagens MessageDlg(texto, tipo, botões); MessageDlg('Hildeberto Melo',mtError,mbOKCancel,0);
Mensagens MessageDlg(texto, tipo, botões); MessageDlg('Hildeberto Melo',mtConfirmation,mbAbortRetryIgnore,0);
Mensagens MessageDlg(texto, tipo, botões); MessageDlg('Hildeberto Melo',mtCustom,mbAbortIgnore,0);
Mensagens MessageDlg(texto, tipo, botões); MessageDlg('Hildeberto Melo',mtWarning,mbYesNoCancel,0); MessageDlg('Hildeberto Melo',mtInformation,mbYesAllNoAllCancel,0); MessageDlg('Hildeberto Melo',mtError,mbOKCancel,0); MessageDlg('Hildeberto Melo',mtConfirmation,mbAbortRetryIgnore,0); MessageDlg('Hildeberto Melo',mtCustom,mbAbortIgnore,0);
Conexão Com Banco de Dados 1ª parte da disciplina
Criando Uma Conexão ODBC Vá em: Iniciar do Windows Configurações Painel de Controle Ferramentas Administrativas Fontes de Dados ODBC
Criando Uma Conexão ODBC Para adicionar uma nova fonte clique no botão Adcionar
Access Aparecerá esta tela com os drives disponíveis para conexão Vamos escolher o Driver do Microsoft Access (*.mdb) e clicar em concluir
Access Informar o nome da fonte de dados, ex: CTD2008 Selecionar o Banco de Dados, clicando no botão selecionar
Access Informe onde está o arquivo do banco Depois confirme clicando no ok
SQL Server Aparecerá esta tela com os drives disponíveis para conexão Vamos escolher o Driver do SQL Server e clicar em concluir
SQL Server Informar o nome do alias Escolher o servidor no qual deseja se conectar
SQL Server Após informado os dados clicar em avançar.
SQL Server Caso não haja um usuário definido no banco de dados escolher a opção Com autenticação do windows, caso contrário escolha a opção com autenticação do SQL Serve, nesse caso deverá ser informado o login e senha. Clicar em avançar.
SQL Server Escolher o banco de dados no qual deseja se conectar. Clicar em avançar.
SQL Server Aparecerá esta tela com opções de mudança de idioma e outras informações, não há necessidade de alterar as opções. Clicar em concluir.
SQL Server Aparecerá esta tela com as informações da conexão Clique no botão testar conexão pra verificar se está conectando com sucesso.
SQL Server Aparecerá esta tela com o resultado do teste. Após estas etapas, basta ir clicando nos botões de OK/Confirmar e está concluída a etapa de criação da conexão.
No Delphi Abrir o Delphi e Iniciar um nova aplicação
No Delphi Adcionar um DataModule ao projeto
No Delphi
Paleta BDE Table DataBase
No DataModule Adcionar o componente DataBase Informar o Alias criado anteriormente Informar o nome do componente
Propriedades do DataBase Colocar a opção LoginPropt para True Colocar a opção Connected para True
Table Adcionar um Table No DataModule
Table Informar o DataBaseName Ativar a Table Informar a TableName
Adcionando os Campos a Table Dar um duplo clique no componente Table1 do DataModule Irá aparecer uma caixa, onde clicaremos com botão direito do mouse nesta caixa Escolheremos a opção “Add All Fields” 3 2 1
DataSource
DataSource Colocar um DataSource no DataModule Escolher a tabela a qual irá se vincular 1 2
Paleta DataControls DBGrid DBEdit DBNavigator DBText
Form Principal Colocar os Componentes DBGrid e DBNavigator Fazer com que o Form Principal use o DataModule 1 2
Form Principal Vincular a propriedade DataSource do DBNavigator e DBGrid ao DataSource1
Ir no Object Inspector do Form Principal e escolher a aba de eventos, o evento OnCreate
Form Principal Colocar os seguintes comandos abaixo, no evento OnCreate do Form Principal, para ativar a conexão com o banco de dados e ativar a tabela.
Ir no Object Inspector do Form Principal e escolher a aba de eventos, o OnDestroy
Form Principal Colocar os seguintes comandos abaixo, no evento OnDestroy do Form Principal, para fechar a conexão.
Propriedades do Projeto Ir no Menu Project -> options Colocar a criação do datamodule como o primeiro
Rodar a Aplicação Resultado
Componente TTable Locate Filter
Localizando Registros Para localizar registros você pode usar vários métodos, mas o melhor deles é o Locate, no exemplo abaixo é feita uma pesquisa exata. if not DtmCli.Tbl.Locate('CodCli', Edt.Text, []) then ShowMessage('Cliente não encontrado.'); Você também pode fazer uma pesquisa parcial e/ou sem sensitividade de caso usando o terceiro parâmetro, que é um conjunto de opções. DtmCli.Tbl.Locate('Nome', Edt.Text, [loPartialKey, loCaseInsensitive]); Lopartialkey – pesquisas parciais, só precisa informar parte do nome. LocaseInsensitive – desconsidera maiúsculas e minúsculas Se você precisar fazer uma pesquisa por mais de um campo, separe os nomes dos campos por ponto e vírgula e use a função VarArrayOf para criar um array com os valores que você quer procurar. if not DtmPed.Tbl.Locate('Vendedor;Data', VarArrayOf([EdtVendedor.Text, EdtData.Text]), [loCaseInsensitive]) then ShowMessage('O vendedor não realizou nenhuma venda nessa data'); Caso os campos pesquisados sejam indexados, a pesquisa será muito mais eficiente, senão será criado um filtro temporário da BDE para localizar os registros Para utilizar o Locate em um formulário é necessário colocar na claúsula USES do form, a classe DB.
Utilizando o filter Utilizamos a propriedade Filter e Filtered do componente TTable, para filtrar um determinado número de registros na tabela. A propriedade Filter recebe uma String com o filtro. Ex: nomeDoCampo = ‘conteúdo da pesquisa’ A propriedade Filtered ativa o filtro, tendo como valores: false ou true.
Tela Adicionar na tela Um Edit e um Botão, para ser utilizado na consulta com Locate. Um Edit e dois Botões para ser utilizado com o filter
Locate Clique do botão consultar com locate, colocar este código.
Filter Clique dos botões Filtrando e Limpando filtro.
Tela antes de utilizar os comandos Locate e Filter
Locate Ao informar no Edit a palavra Wra, o locate localizou o primeiro registro da tabela que continha a palavra.
Locate Informando um nome que não existe na tabela
Filter Foi informado a palavra Snapper, ele filtrou e deixou apenas os registro que continham a palavra informada.
Dica CharSet da aspa simples #39 Podemos concatenar strings que precisam de aspas simples assim: Variavel := 'state = '+#39+Texto+#39; Variavel := ‘state = ‘ + ‘’’’ + texto + ‘’’’;
Status do Componente Table Insert Append Edit Post Cancel Delete Refresh
Relatório com Table Passos: Criar um novo projeto Adicionar um DataModule ao projeto Adicionar um DataBase e uma Table ao DataModule Configurar o DataBase e a Table conforme foi visto anteriormente Adicionar mais um formulário ao projeto e renomeá-lo para formImpressao
Relatório com Table Passos (continuação): No formImpressao adicionar um quickRep (aba QReport)
Relatório com Table Ligar o QuickRep a Table do DataModule
Relatório com Table Adicionar duas QRBands ao QuickRep
Relatório com Table Configurar o BandType da segunda QrBand para rbDetail
Relatório com Table Adicionar um QRLabel na banda de Título
Relatório com Table Colocar um QRDBText na banda detalhes Configurar o DataField e DataSet
Relatório com Table No formulário principal colocar um botão, este botão servirá para chamar o formulário de impressão.
Relatório com Table No clique do botão colocar o código abaixo
Executando a Aplicação
Querys Trabalhando com querys – Segunda parte da disciplina
Trabalhando com querys – 2ª parte da disciplina Abra uma nova aplicação no delphi e vamos utilizar querys para manipular informações no banco de dados. Adcione um DataModule Coloque um componente TDataBase Coloque um Componente TQuery
Configuração do TDataBase AliasName = ctds2008 DataBaseName = dbctd Name = dbctd
Configuração da TQuery DataBaseName = dbctd
Criando Uma Aplicação Com Query Visando utilizar Orientação a Objetos em projetos futuros, vamos usar uma metodologia de programação que facilite a migração para Orientação a Objetos.
Unit de Tipos do Sistema Vamos adcionar uma nova unit ao nosso projeto. Ela servirá para definirmos os tipos de dados que utilizaremos em nosso sistema. Os tipo que serão definidos serão semelhantes as tabelas que estão no banco de dados que nosso sistema utilizará.
Unit de Tipos do Sistema Exemplo: Suponhamos que tenhamos uma tabela chamada Cliente, e esta tabela possui os seguintes campos: codigo, nome, residencial e celular. Criaremos um type que representará cada registro desta tabela.
Representação do type
Unit de Tipos do Sistema Para cada tabela no banco de dados existirá um type que corresponda a mesma.
Modularização do Sistema Visando uma melhor organização do código e evitar redundâncias, vamos modularizar o sistema. Todas as operações com relação a banco de dados estarão no DataModule da aplicação. No DataModule estarão os procedimentos de: Select Selecionar um conjunto de registros de uma determinada tabela Update Atualizar um registro ou um conjunto de registros da tabela) Insert Incluir um novo registro na tabela Delete Remover um ou mais registros da tabela
Modularização do Sistema Colocar a assinatura dos procedimentos na sessão public do DataModule. Cada método recebe como parâmetro de entrada um tCliente, servindo como controles internos a cada procedimento específico.
Propriedades da TQuery SQL – Clear() // limpa a instrução sql Add() // adiciona uma instrução na query Open() // abre a query retornando o resultado(select) ExecSql // executa uma query(insert, update, delete) ParamByName // referenciar um determinado parâmetro da query FieldByName // referenciar um determinado campo da query
Método Select
Método Insert
Método Update
Atenção Quando colocamos : (dois pontos) antes de uma palavra na instrução SQL, significa que a palavra será interpretado como um parâmetro.Exemplo: Query1.SQL.Add('update clientes set nome= :nome’); O :nome será um parâmetro e deverá ser referenciado utilizando o ParamByName. Query1.ParamByName('nome').AsString := cliente.nome;
Utilizando os Métodos do DataModule Colocar na tela principal os componentes conforme tela abaixo: DBGrid Edit
Botão Selecionar Todos
Botão Novo
Botão Carregar
Botão Alterar
Orientação a Objetos – 3ª parte da disciplina
Orientação a Objetos Paradigma focado nos dados ao invés de operações Entidades do mundo real são modelados como objetos que encapsulam dados (atributos) e comportamento (métodos) Vantagens Facilidade de manutenção Maior extensibilidade Maior reuso 26/08/08
Orientação a Objetos Classes são “moldes” para criação de objetos Uma classe define a estrutura de um objeto: dados + comportamento Classe é um conceito que define categorias e tipos O conceito de classe agrupa entidades (objetos) com características semelhantes Um objeto é uma instância de uma classe Com orientação a objetos fica muito mais fácil estender sistemas de grande porte 26/08/08
Objetos Características de um objeto Identidade – todo objeto tem um identificador único que é diferente dos identificadores dos demais objetos Estado – o estado de um objeto é definido como o valor de seus atributos num determinado tempo Comportamento – o comportamento de um objeto é definido pelas mensagens que ele aceita. Entenda-se por mensagem qualquer pedido ou solicitação enviada para o objeto (Ex. quando o botão de crédito é pressionado)
Vantagens Modularidade: Coesão Facilidade de manutenção: Reusabilidade Melhor estruturação do sistema Melhor entendimento Coesão Facilidade de manutenção: Custos de manutenção representam em média 70% do custo total do software Reusabilidade
Camadas Características Idéia básica: Dividir o sistema em partes menores (camadas) para resolver problemas em separado (separação de conceitos) Estruturas o sistema é em camadas (uma sobre a outra) Propósito geral de cada camada: Fornecer suporte para a camada superior Abstrair as camadas superiores de detalhes específicos Propósito específico de cada camada: Preocupar-se com os detalhes específicos que serão ‘escondidos’ das camadas superiores
Estrutura básica das camadas GUI, Servlet, Applet, JSP, RMI Front-end Fachada Back-end Coleção de Negócio usar o suporte dar suporte Coleção de Dados Classes Básicas
Classes Básicas Composta pelas classes mais elementares do sistema Apenas os objetos de negócio da aplicação e seus relacionamentos são modelados Cliente Conta 1 N
Coleção de Dados Responsável por manipular diversos objetos das classes básicas Geralmente possui alguma estrutura de armazenamento de objetos: lista, conjunto, array, tabela hash… Preocupa-se com detalhes de armazenamento e recuperação dos objetos: memória, banco de dados, arquivos… Também conhecida como Camada de Persistência
Coleção de Negócio Utiliza uma Coleção de Dados para lhe dar suporte à persistência dos objetos da aplicação Realiza as críticas de Negócio inerentes a uma determinada classe básica aplicação. Ex: ‘não é possível inserir duas contas com o mesmo número’. Disponibiliza serviços específicos do negócio envolvido Geralmente chamada de Cadastro
Implementação das camadas Como implementar a coleção de dados que trata do armazenamento e recuperação de objetos para o sistema? Quais serviços dessa camada estarão disponíveis para a camada superior Como implementar a coleção de negócio e fazê-la usar o suporte da coleção de dados? Como relacionar essas camadas? Quais serviços serão disponibilizados na coleção de negócio? Que métodos serão replicados ou criados na coleção de negócio?
Identificando serviços da Coleção de dados Classe acessoMaterial procedure select(listaMaterial: TListaMaterial); overload; procedure insert(material: TMaterial); procedure update(material: TMaterial); procedure delete(material: TMaterial; usuario: TUsuario); function verificaUso(material: TMaterial): boolean;
Projeto OO Faremos um projeto em Delphi utilizando OO(Orientação a Objetos), para isso seguiremos alguns passos que serão descritos posteriormente. No projeto utilizaremos o Banco de Dados CTDS feito no Access. Utilizaremos classes, objetos, herança, sobrecarga, polimorfismo, etc.
Criação de Classe Criar uma nova unit, indo no menu File -> new -> Unit Salvar a unit com o nome ClasseBasica
Criação de Classe
Criação de Classe O Type define a classe, onde serão Colocados os atributos e métodos da mesma. A palavra class define que o TClasseBasica será uma classe.
Criação de Classe Atributos da classe Property – define que o referido Atributo será uma propriedade da classe
Criação de Classe O encapsulamento dos atributos da classe em delphi é diferente ao encapsulamento feito em java. O Delphi utiliza um padrão diferente do javaBean Para realizar esta tarefa de encapsulamento basta colocar o cursor em cima de um dos atributos da classe e pressionar: Ctrl+shft+C
Criação de Classe
Anteriormente haviamos apenas declarado dois atributos: codigo o descricao. Depois de pressionar Ctrl+Shft+C, foi gerado atributos e métodos na sessão private. Estes métodos e atributos gerados servirão para realizar o encapsulamento dos atributos da classe.
Read – quando atributo codigo for lido, será lido o valor que está em FCodigo. Write – quando se atribuir um valor ao atributo codigo será utilizado o método Setdescricao. Isto garantem o encapsulamento dos atributos, e distingue do encapsulamento feito pelo padrão javaBean.
Instanciando a Classe Criando a classe Atribuindo valores Destruindo a classe
Herança Criar uma nova unit e salvar com o nome de endereço Na definição da classe, depois da palavra reservada class colocar entre parenteses a classe a ser herdada
Classe Aluno Importando as classes utilizadas Herança de Classebasica Atributo do tipo TEndereco Criando contrutores
Classe Aluno Implementação do Construtor
Sobrecarga de Métodos Para sobrecarregar métodos temos que utilizar a palavra reservada overload.
Lista de Objetos A classe Tlist do Delphi possui todos os métodos necessários para manipulação de listas de objetos Ela manipula objetos objetos de uma forma genérica, pois a mesma possui uma lista de ponteiros. Um ponteiro aponta para uma variável criada dinamicamente em tempo de execução. Esta variável pode ser de um tipo Objeto
Cast Para converter um tipo genérico em um tipo específico, teremos que utilizar o Cast para retornar um objeto especifícado. Basta colocar o tipo a ser convertido antes do tipo genérico.
Utilizando Listas Criando a classe Carregando os valores Adicionando na lista Criando a lista de objetos
Percorrendo a Lista
Criando a Classe de Acesso
Método Create
Método Select
Método Insert
Criando o Controlador
Método Insert
Método Select
Fachada
Método Create
Método Destroy
Método Select Turma
Método Insert Turma
Perguntas...
Por onde estudar ?