72538859 apostila curso delphi

188
Notas ao Aluno É com muito prazer termos você como nosso aluno virtual em nosso treinamento de Desenvolvimento de Aplicações Delphi. Você adquiriu a versão sem suporte a dúvidas. Mas futuramente poderá adquirir o suporte quando achar necessário pelo e-mail: [email protected] O conteúdo desta apostila é o conteúdo das vídeo aulas. Caso você tenha alguma dúvida recorra às vídeo aulas e caso mesmo assim suas dúvidas não tenham sido sanadas pode enviar para o nosso e-mail. Todos exemplos desta apostila são progressivos, ou seja, dependem das lições anteriores. Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br 1

Upload: roklen

Post on 29-Oct-2015

84 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: 72538859 Apostila Curso Delphi

Notas ao Aluno É com muito prazer termos você como nosso aluno virtual em nosso treinamento de Desenvolvimento de Aplicações Delphi. Você adquiriu a versão sem suporte a dúvidas. Mas futuramente poderá adquirir o suporte quando achar necessário pelo e-mail: [email protected] O conteúdo desta apostila é o conteúdo das vídeo aulas. Caso você tenha alguma dúvida recorra às vídeo aulas e caso mesmo assim suas dúvidas não tenham sido sanadas pode enviar para o nosso e-mail. Todos exemplos desta apostila são progressivos, ou seja, dependem das lições anteriores.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

1

Page 2: 72538859 Apostila Curso Delphi

Fazendo um Tour pelo Delphi Este primeiro capítulo é dedicado a uma visão geral do Delphi e sua configuração. Começamos pelo Main Menu Bar: Main Menu Bar

Aqui temos os menus, os botões de atalho e as palhetas de componentes do Delphi. Cada um destes itens serão apresentados no decorrer de nosso treinamento. Vamos personalizar nossos atalhos para o Delphi. Clique com o botão direito do mouse sobre esta área da figura a cima e escolha a opção Customize, deverá apresentar a tela Customize:

Nesta tela encontramos três pastas: Toolbars, Commands e Options. Em nosso exemplo da apostila temos a opção Custom desmarcada iremos marca-la e observe que o Main Menu Bar sofrerá alterações, o mesmo ocorrerá se você desmarcar outras opções e marcar novamente. Na pasta Commands temos diversos outros atalhos que podem ser adicionados ao Delphi. Para selecionar vamos escolher em Categories a opção Edit e em Commands escolheremos a opção Cut:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

2

Page 3: 72538859 Apostila Curso Delphi

Observe que o mouse depois que selecionamos o componente fica com uma imagem, isto ocorre porque o Delphi fica aguardando o lugar onde você irá colocar o atalho Cut em nosso Main Menu Bar, coloque em qualquer lugar e veja que agora temos um atalho para esta opção. Você também poderá retirar este ou qualquer outro atalho clicando sobre ele e arrastando de volta ao Customize. A opção Options não é aconselhado alterar pois são apresentação de hints e possibilidade de atalhos que são sempre usados por nós.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

3

Page 4: 72538859 Apostila Curso Delphi

A palheta de componentes

Aqui existem as opções de componentes que serão adicionados em nossos projetos de desenvolvimento, cada um destes componentes serão vistos no decorrer do treinamento pois seria inútil aqui fazermos um comentário de cada pasta e seus componentes. Existem componentes visuais e não visuais. Os componente visuais são aqueles que serão vistos pelos usuários quando o programa desenvolvido estiver sendo executado. Os componentes não visuais são aqueles vistos somente pelo desenvolvedor. A partir da versão 6 do Delphi temos duas categorias de componentes as VCL e as CLX onde VCL são para programação Windows e CLX para programação Linux (Kylix). Os componentes CLX funcionam tanto na plataforma Windows como na plataforma Linux., já as VCL funcionam somente na plataforma Windows. Então caso você esteja planejando desenvolver uma aplicação que suporte tanto Windows quanto Linux é aconselhável utilizar somente componentes CLX. Speed Menus

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

4

Page 5: 72538859 Apostila Curso Delphi

Speed Menus existem em todo o Delphi, são menus em forma de pop-up que surgem quando clicamos com o botão direito do mouse e nos dão diversas opções. No caso da figura a cima são as opções de nosso editor de código, onde escrevemos os eventos e códigos de nossas aplicações. Como são diversos Speeds Menus iremos ver mais detalhadamente no decorrer do curso. Object Inspector A janela Object Inspector que se encontra a esquerda do Form, é onde definimos e alteramos as propriedades dos objetos que serão utilizados no desenvolvimento de nossas aplicações. É onde podemos alterar propriedades e eventos de componentes e formulários de nossas aplicações enquanto desenvolvemos.

Propriedades - Properties Ainda no Object Inspector, vou aqui falar um pouco de propriedades, como citado anteriormente, estas propriedades iremos conhecer mais a fundo no decorrer de nosso treinamento, até porque cada componente que iremos trabalhar possuem suas próprias propriedades. É na Propriedade do Objector Inspector que podemos colocar nome em cada objeto (quando eu falar de objetos no decorrer do treinamento gostaria que fosse entendido como componentes e formulários que iremos utilizar no desenvolvimento de nossas aplicações), mudar a fonte, localização, tamanho entre diversas outras propriedades que um objeto pode ter. No caderno de exercícios o primeiro exercício que tem para você fazer é mudar a propriedade Font do Formulário. Gostaria de mostrar aqui somente um

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

5

Page 6: 72538859 Apostila Curso Delphi

caso que sempre gera dúvidas, na propriedade Font existe uma característica “...” estes três pontinhos informam que existem uma janela de formatação de outras propriedades, sempre que encontrar estes pontinhos fique sabendo que existem diversas sub propriedades a esta propriedade. Você perceberá melhor nas vídeo aulas do CD-ROM e no decorrer de nosso treinamento. Eventos - Events Eventos são o que ocorrerá a um objeto se por exemplo: Clicar, O mouse estiver por cima, ou mouse estiver pressionado e diversos outros eventos que cada objeto pode ter – não obrigatoriamente – e que veremos no decorrer do treinamento. Form Designer, Code Editor e Code Explorer O Form Designer é o principal no desenvolvimento de nossas aplicações pois é nele que iremos adicionar todos componentes de nossa aplicação é a janela que iremos utilizar sempre. Faça o seguinte para perceber, vá ao menu do Delphi Run e escolha a opção Run para compilar e ver como fica o formulário.

Code Editor e Code Explorer As janelas Code Editor e Code Explorer é onde é criado a programação de nossas aplicações e onde podemos navegar pelo código desenvolvido.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

6

Page 7: 72538859 Apostila Curso Delphi

Não tenho muito o que dizer aqui na apostila, aconselho assistir a aula pois assim é melhor explicado estas janelas, assim como no decorrer do treinamento você perceberá outras utilidades.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

7

Page 8: 72538859 Apostila Curso Delphi

Nossa Primeira Aplicação Esta lição é a mesma lição das vídeo aulas. A partir daqui que iremos começar a realmente trabalhar com o Delphi e começar a conhecer mais a fundo os componentes, propriedades e escrever os códigos de programação, que na minha opinião é a melhor parte. Este primeiro aplicativo é um aplicativo à-toa, mais para já ir apresentando alguns componentes e regras no desenvolvimento que a partir de adiante iremos utilizar sempre. Então vamos começar:

1.) Vá ao menu File | New | Application:

2.) Nos será apresentado uma nova aplicação.

3.) No Object Inspector vamos alterar as seguintes propriedades:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

8

Page 9: 72538859 Apostila Curso Delphi

Em Name, ao invés de Form1 iremos colocar frmDesigner. O que fizemos aqui foi informar que o nome do Formulário será frmDesigner. Observe que retiramos todas vogais e números do nome Form1 deixando apenas frm e adicionamos a palavra Designer:

Na propriedade Caption, ao invés de frmDesigner iremos colocar Designer, onde o Caption será o nome que será apresentado em nosso formulário, como mostra a figura a seguir:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

9

Page 10: 72538859 Apostila Curso Delphi

4.) Agora iremos adicionar componentes ao nosso formulário. Iremos adicionar os seguintes componentes, veja na tabela com suas propriedades:

Componente Localização Propriedades Edit1 Standard Name = TextForLabel

Text = ProgressBar Win32 Name = prgrsbrAMountDone Button1 Standard Name = btnProgressBarReset

Caption = Reseta Progress Bar Button2 Standard Name = btnUpdate

Caption = Update Label1 Standard Name = lblTextFromEdit Label 2 Standard Name = lblCurrentTime GroupBox Standard Name = grpbxCurrentTime

Caption = Current Time Timer System Name = tmrProgressBar Para melhor compreensão da tabela a cima temos: Componente: Componente que iremos adicionar ao formulário. Localização: Nome da pasta onde se localiza o componente. Propriedades: As propriedades que deverão ser alteradas no Object Inspector para cada componente. O formulário deverá ficar como mostra a figura a baixo:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

10

Page 11: 72538859 Apostila Curso Delphi

Para melhor compreensão é aconselhável assistir a vídeo aula desta lição. Agora que você já montou a tela como apresentado na figura anterior, iremos agora criar os eventos no object inspector de cada componente. Selecionando o componente Reset Progress Bar (btnProgressBarReset) no Object Inspector na pasta Events, dê um duplo clique no evento OnClick:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

11

Page 12: 72538859 Apostila Curso Delphi

E escreva o seguinte código: procedure TfrmDesigner.btnProgressBarResetClick(Sender: TObject); begin prgrsbrAmountDone.Position := prgrsbrAmountDone.Min; end; Este código serve para resetar o componente ProgressBar quando ele estiver sendo executado, quando o usuário clicar sobre o botão. Agora no evento OnClick do componente btnUpdate iremos colocar o seguinte código: procedure TfrmDesigner.btnUpdateClick(Sender: TObject); begin lblTextFromEdit.Caption := edtTextForLabel.Text; end; Este código irá transformar a Caption do componente Label lblTextFromEdit no que estiver escrito no componente Edit edtTextForLabel sempre que o usuário clicar no botão Update. Agora no evento OnTimer do componente Timer (tmrProgressBar) coloque o seguinte código: procedure TfrmDesigner.tmrProgressBarTimer(Sender: TObject); begin //pega a hora atual lblCurrentTime.Caption := TimeToStr(now); //Se a barra de progresso ainda não estiver no máximo acrescenta mais um if prgrsbrAmountDone.Position < prgrsbrAmountDone.Max then begin prgrsbrAmountDone.StepIt; end else prgrsbrAmountDone.Position := prgrsbrAmountDone.Min; end; Este código monta a progressão da barra conforme os segundos do relógio de seu computador e coloca a hora na caption do Label (lblCurrentTime). Para finalizar execute nossa primeira aplicação e veja como ficou. Depois de executado e fechado vamos agora salvar nossa aplicação, vá ao menu do Delphi File | Save Project As, agora clique em janela, vá no ícone Criar nova pasta e coloque o nome da pasta como Designer, salve o projeto como Designer.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

12

Page 13: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

13

Page 14: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

14

Page 15: 72538859 Apostila Curso Delphi

Componentes Sampler A partir de agora iremos explorar um pouco os componentes Sampler e criar nossa segunda aplicação que será como um Windows Explorer. Primeiramente iremos criar uma nova aplicação indo ao menu do Delphi File | New | Application, a partir de agora sempre que eu disser “criar uma nova aplicação” fica entendido que será sempre estes passos. Em seguida já vamos salvar este projeto criando uma nova pasta chamada ComponentSampler e salvar como FromComponentSampler1.pás.

E em seguida como ComponentSampler.dpr:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

15

Page 16: 72538859 Apostila Curso Delphi

Em seguida vamos mudar as propriedades do formulário no Object Inspector com o nome frmComponentSampler e o Caption como Component Sampler.

Os componentes que iremos utilizar: Iremos utilizar os seguintes componentes: Panel, Splitter e StatusBar que são o caminho ideal para criarmos uma boa interface gráfica ao nosso sisteminha e possibilitar ao usuário modificações em tempo real. Panel servirá para distribuirmos melhor a apresentação do nosso projeto e também para possibilitar ao usuário a dimensionar os itens expostos no formulário. Splitter é o objeto que iremos configurar para que possibilite esta movimentação dos objetos pelo usuário do sistema. StatusBar é uma barra que contém informações sobre onde o usuário do nosso exemplo estará. Você compreenderá melhor o que quero dizer até o final desta lição.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

16

Page 17: 72538859 Apostila Curso Delphi

Statusbar Primeiramente vamos adicionar um componente StatusBar ao nosso formulário e setar a propriedade Name para stsbrMain. O componente StatusBar fica localizado na aba de componentes Win32:

Quando você colocou o componente StatusBar em seu formulário ele foi para o final do Form. Agora vamos criar colunas para nosso StatusBar, na propriedade Panels clique nos três pontinhos: Deverá ser mostrado a janela Editing StatusBar1.Panels:

Clique sobre o botão Add New, devemos criar dois TstatusPanel:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

17

Page 18: 72538859 Apostila Curso Delphi

Com o 0 – TstatusPanel selecionado vamos mudar a propriedade Width de 50 para 200, como mostra imagem a seguir:

Vamos mudar a propriedade Bevel de pbLowered para pbNone, perceba que ao alterarmos esta propriedade o nosso componente StatusBar mudou de posição. Vamos deixar assim.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

18

Page 19: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

19

Page 20: 72538859 Apostila Curso Delphi

Panels Vamos agora adicionar um componentes Panel da aba de componentes Standard em nosso formulário e setar sua propriedade Name como pnlLeft e a propriedade Align para alLeft:

Componente Panel da palheta Standard.

Agora vamos colocar um componente Splitter no formulário, o componente Splitter fica na pasta Additional, e nas propriedades deste componente setar Name como splttrMain.

Componente Splitter da palheta Additional.

Vamos também definir a propriedade Align do Splitter como alLeft. Em seguida coloque outro componente Panel no formulário com a propriedade Name como pnlRigth e a propriedade Align como alClient. Seu formulário deverá ficar assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

20

Page 21: 72538859 Apostila Curso Delphi

O componente Splitter é utilizado para que o usuário possa redimensionar a tela no form, para ver na prática execute a aplicação clicando na tecla de atalho Run:

Tecla de atalho Run.

Agora vamos adicionar outro componente Panel em nosso formulário com a propriedade Name pnlLeftTop.e propriedade Align como alTop:

Até o momento estávamos preparando como seria o visual da nossa aplicação. A partir de agora iremos colocar novos componentes que darão a verdadeira função a nossa aplicação que é um Windows Explorer nosso. Vamos agora adicionar um componente DriveCombobox ao formulário sobre o Panel pnlLeftTop, o componente DriveCombobox fica na aba de componentes Win3.1:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

21

O componente DriverCombobox é um componente que lista os drivers que existem em nosso computador.

Page 22: 72538859 Apostila Curso Delphi

Depois de colocado o componente no form como mostra a figura a baixo, vamos configurar suas propriedades como: Name = drvComboBox. Aproveitando vamos retirar nas propriedades dos Panels seus respectivos captions deixando vazios.

Agora localize o componente DirectoryListBox na palheta Win3.1 e coloque sobre o panel pnLeft e configure a propriedade do componente DirectoryListBox como: Name = lstDir e a propriedade Align como alClient devendo ficar assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

22

Page 23: 72538859 Apostila Curso Delphi

Agora coloque o componente FileListBox também da aba de componentes Win3.1 no Panel pnlRight com o nome lstFiles e align como alClient, devendo ficar assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

23

Page 24: 72538859 Apostila Curso Delphi

Pronto, já temos o nosso Windows Explorer. Porém se você mandar executar perceberá que ainda não está funcionando corretamente, isso porque ainda não terminamos, teremos agora que determinar suas propriedades e realizar a programação de eventos dos componentes adicionados. Enfim a parte divertida. Inicialmente selecione o componente DriverComboBox do Formulário e na propriedade dele em DirList vamos setar para lstDir, assim o nosso componente DriverComboBox estará ligado ao nosso componente DirectoryListBox que colocamos o nome de lstDir:

Agora vamos linkar o componente DirectoryListBox com o componente FileListBox. Com o componente DirectoryListBox de nosso formulário selecionado vamos setar a propriedade FileList para lstFiles que foi o nome dado ao nosso componente FileListBox:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

24

Page 25: 72538859 Apostila Curso Delphi

Agora sim, se você mandar executar nossa aplicação todos os controles estarão funcionando perfeitamente. Vamos agora implementar o nosso Windows Explorer, colocando uma informação informando todo o caminho que você está, como se fosse uma Path. Vamos adicionar um componente Label da aba de componentes Standard com o nome de lblDir em sua propriedade. Depois vamos setar nosso label (lblDir) ao componente DirectoryListBox na propriedade DirLabel:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

25

Page 26: 72538859 Apostila Curso Delphi

Em seguida sete a propriedade Visible do Label para True. E está pronto nossa segunda aplicação.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

26

Page 27: 72538859 Apostila Curso Delphi

Menus Características de Menus Vamos iniciar uma nova aplicação para melhor ilustrar este exemplo. Na aba de componentes Standard existe o componente MainMenu é com este componente que criamos nossos menus. Colocamos este componente em nosso formulário e com um duplo clique será aberto uma nova janela que é a janela de edição de menus:

Como todo componente, ele possui sua propriedades no Object Inspector onde temos em Caption a possibilidade de criar as opções de menu. Vamos criar o menu Opções escrevendo no Caption.

Agora vamos criar as sub-opções tais como: Custommer, Parts, Vendors e Sair:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

27

Page 28: 72538859 Apostila Curso Delphi

Para colocar um traço entre Vendors e Sair como mostra a figura a cima, basta colocar um traço “-“ no Caption.

Você já deve ter percebido que programas Windows possuem navegação por teclado, como por exemplo Alt+O e assim por diante, podemos fazer isso colocando o símbolo “&” no Caption de cada opção na letra que acharmos mais conveniente, após fazer isso observe que a letra onde colocamos o símbolo ficará sublinhado:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

28

Page 29: 72538859 Apostila Curso Delphi

Podemos criar sub-menus clicando sobre a opção desejada com o botão direito do mouse e escolhendo a opção Create SubMenu:

Assim podemos fazer quantas sub opções desejarmos:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

29

Page 30: 72538859 Apostila Curso Delphi

Podemos também adicionar imagens, na verdade somente ícones (.ICO), em nossos menus e sub-menus. Para isso precisamos adicionar um nosso formulário um componente ImageList da aba de componentes Win32. Para selecionarmos os ícones de cada opção de menu, basta clicar duas vezes sobre o componente ImageList que deverá aparecer a seguinte tela:

Clique sobre o botão Add... em seguida ir a algum diretório onde haja ícones e selecionar os ícones que irão ser utilizados em seu projeto, como neste exemplo temos 7 opções selecionamos 7 ícones:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

30

Page 31: 72538859 Apostila Curso Delphi

Em seguida clicamos sobre o botão OK. Em nosso componente MainMenu na tela de edição de menus, vamos a propriedade SubMenuImages e linkamos com o componente ImageList:

Agora podemos colocar as imagens em cada opção. Na propriedade ImageList de cada uma das opções existem os Ícones que serão associados a cada opção e sub-opção, enquanto linkamos cada imagem não vemos quando estamos criando (entenda editando) mas se sairmos do editor de menus e irmos ver em nosso formulário poderemos então visualizar:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

31

Page 32: 72538859 Apostila Curso Delphi

Assim encerramos este capítulo por enquanto.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

32

Page 33: 72538859 Apostila Curso Delphi

Borland Database Engine – BDE O Borland Database Engine ou BDE é utilizado para realizar a conexão do Delphi com banco de dados (Paradox, Access, Interbase, Oracle, SQLServer e outros) e permite também distribuir suas aplicações a seus clientes. Neste módulo estaremos dando uma introdução ao BDE. Vamos executar o BDE Administrator que foi instalado em seu computador junto com o Delphi, vá ao menu do Windows Iniciar | Programas | Borland Delphi | BDE Administrator, deverá ser aberto uma janela como esta:

Vamos iniciar nosso aprendizado sobre o BDE com exemplos práticos e que serão utilizados pelo nosso treinamento daqui por diante. Vamos criar aqui um novo Alias1 , para isso vá ao menu Object | New onde deverá ser apresentado a seguinte tela New Database Alias:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

33

1 Alias é um apelido dado a um caminho onde é localizado os bancos de dados que iremos utilizar no desenvolvimento de nossas aplicações para que o Delphi possa localizar quando estivermos desenvolvendo e até mesmo para distribuir nossa aplicação aos nossos clientes.

Page 34: 72538859 Apostila Curso Delphi

Escolheremos sempre STANDARD em seguida clique em OK, deverá ser apresentado a seguinte tela:

Observe que a esquerda há um opção selecionada chamado STANDARD1 é aqui que é criado o nome de nosso Alias, neste exemplo vamos colocar o nome como Delphi_Local_Class_Data2 e em seguida teclar Enter para fixar o nome, como mostra a figura a seguir:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

34

2 Poderíamos criar qualquer nome para o Alias, mas vamos utilizar este nome em todas aplicações que iremos desenvolver daqui por diante. Caso no futuro você desenvolva um controle de estoque poderia colocar o nome deste Alias como Estoque.

Page 35: 72538859 Apostila Curso Delphi

Ao lado direito da imagem temos algumas opções como: Type, Default Driver, Enable BCD e Path. Nestas opções vamos trabalhar com somente a PATH3 clicando sobre esta opção será apresentado os três pontinhos, ou janela de edição, que clicando sobre teremos uma janela chamada Direct Directory que é onde definimos o local onde estão os bancos de dados que iremos trabalhar. Daqui por diante, para não perdermos tempo criando nossos Bancos de Dados (veremos como criar banco de dados Paradox no próximo capítulo) iremos trabalhar com bancos de dados já existentes no próprio Delphi que se localizam em: C:\ Arquivos de programas\Arquivos comuns\Borland Shared\Data4 em seguida clicar em OK.

3 Caminho de diretórios onde se localiza o diretório onde estão os bancos de dados que o sistema a ser desenvolvido estão armazenados.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

35

4 Este caminho pode mudar de computador por computador, é aconselhável realizar um procura antes pelas tabelas: customer.db, Parts.db e colocar o caminho onde se encontram.

Page 36: 72538859 Apostila Curso Delphi

Após clicar em OK deverá nossa PATH listar o caminho selecionado:

Para salvar estes processos realizados, vá ao Menu Object | Apply.em seguida irá perguntar se deseja salvar, confirme clicando em OK:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

36

Page 37: 72538859 Apostila Curso Delphi

Assim estará pronto para começar a desenvolver suas aplicações com banco de dados.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

37

Page 38: 72538859 Apostila Curso Delphi

Conhecendo o Database Desktop Este capítulo é apenas como título de curiosidade, pois nosso objetivo é de apenas ensinar a desenvolver aplicações Delphi. No treinamento oficial da Borland em nenhum momento é ensinado a criar um banco de dados Paradox – apesar de ensinar como desenvolver com – então aqui iremos passar rápido apenas como a título de curiosidade, tanto que este texto já foi utilizado para outros propósitos para o portal Ramos da Informática5. Um banco de dados pode ser definido como um conjunto unificado de informação que vai ser compartilhado pelas pessoas autorizadas de uma organização. A função de um Banco de Dados é permitir o armazenamento e a recuperação da informação necessária para as pessoas da organização tomarem decisões. Um Banco de Dados é formado por um conjunto de arquivos de dados, também chamados de tabelas. Em uma tabela temos, linhas e colunas. Onde uma linha contém informações a respeito de um item em particular, e a coluna possui uma parte das informações de uma linha. A figura a seguir ilustra uma tabela de Clientes.

Código Nome Telefone 001 Aldair 554-8788 002 Marina 879-9687 005 Aline 572-2258 012 José 7070-8580 150 Márcio 446-3987

A tabela mostrada acima possui os campos ou colunas: Código, Nome e Telefone. E em cada linha temos a identificação de um cliente em particular. Cada tabela em um banco de dados possui um campo que identifica unicamente cada registro. O conjunto de atributos ou campos utilizados para gerar este índice é conhecido como chave primária. Nós podemos escolher qualquer campo de uma tabela para ser uma chave primária, sempre levando em consideração que ela deve ser curta. Por exemplo, usar um campo numérico é melhor do que um campo formado por Strings. Como a chave primária determina a singularidade de um registro, quando se usa um string não poderemos ter dois registros com o mesmo nome de cliente. Na tabela do exemplo acima, o mais sensato é determinar o campo Código como nossa chave primária. Além de determinarmos os campos e a chave primária da nossa tabela, também teremos que definir o tipo de dado, comprimento, formato e o domínio para cada campo desta tabela. Tipo de Dado: refere-se ao conteúdo do dado, podendo ser numérico, alfabético, data, hora ou cadeia de caracteres longa ou curta. Comprimento: refere-se ao tamanho ou número máximo de posições que poderá assumir o valor ou conteúdo de cada dado.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

38

5 Portal Ramos da Informática é um portal de comunidade on-line voltado a desenvolvedores Delphi e Kylix e todos bancos de dados do mercado. O endereço de acesso é: www.ramosdainformatica.com.br

Page 39: 72538859 Apostila Curso Delphi

Formato: refere-se à forma com que os dados deverão ser editados ou apresentados, definindo-se as posições de símbolos. Domínio: especifica se os valores dos dados pertencem a uma lista de valores pré definidos, podendo estar em uma lista, ou satisfazer uma regra. Database Desktop No grupo de programas do Delphi, encontramos o utilitário Database Desktop, que permite a criação e manipulação de banco de dados de diversos formatos. O nosso próximo exemplo, gerenciará duas tabelas. Uma com o cadastro dos clientes e outra com as vendas realizadas para estes clientes. Vá ao grupo de programas do Delphi e abra o Database Desktop.

Abra uma nova tabela como mostra a figura a seguir.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

39

Page 40: 72538859 Apostila Curso Delphi

Escolha o tipo Paradox 7. Aparecendo então a janela Create Paradox 7 Table. Digite o nome para o primeiro campo (CODIGO) e mude para tipo de campo (Type) usando a tecla Tab. Com o campo Type selecionado, de um clique com o botão direito do mouse em cima dele, para ser exibido o menu pop-up com todos os valores para o tipo de campo. As letras sublinhadas correspondem à letra de atalho para cada tipo de dado. O nosso campo CODIGO será definido como tipo Alpha. Apesar de ser um campo com números nós não iremos realizar nenhum cálculo matemático com ele, por isso o definimos como Alpha.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

40

Page 41: 72538859 Apostila Curso Delphi

O campo CODIGO será a nossa chave primária para a identificação dos clientes na tabela Clientes. Para definir um campo como chave primária, pressione qualquer tecla quando o campo Key estiver selecionado, marcando este campo com um * - asterisco.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

41

Page 42: 72538859 Apostila Curso Delphi

Dê continuidade entrando com outros campos, seguindo o modelo apresentado abaixo.

Salve-a como Clientes.db.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

42

Page 43: 72538859 Apostila Curso Delphi

Logo após, abra uma nova tabela no mesmo formato, e construa-a como mostrado abaixo.

Para que a tabela Vendas se relacione com a tabela Clientes, deveremos definir o campo CODIGO da tabela Vendas como índice secundário. No ComboBox Table properties, selecione a opção Secundary Indexes e clique no botão Define..., aparecendo o quadro de diálogo Define Secundary Index. Na janela Define Secondary Index, selecione o campo CODIGO e dê um clique na seta para introduzi-lo como campo índice, e finalmente dê um clique no botão OK para aceitar a opção. Será então solicitado um nome para este índice, digite INDCODIGO.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

43

Page 44: 72538859 Apostila Curso Delphi

Salve a tabela como Vendas.dbf. Saia do Database Desktop, através do menu File, opção Exit. O Delphi possui um assistente para a construção de formulários de acesso a Banco de Dados, nós iremos utilizá-lo para construirmos o nosso projeto, que utiliza as tabelas de Clientes e Vendas construídas anteriormente.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

44

Page 45: 72538859 Apostila Curso Delphi

Criando Aplicações com Banco de Dados O Delphi nos oferece algumas soluções para banco de dados como: Session, Database, Dataset, DataSource e Data-aware controls ou controles de bancos de dados. Os componentes Session e Database serão explicados em outro capítulo, neste iremos conhecer apenas outros componentes. Todos os componentes de bancos de dados possuem as seguintes relações:

Vamos inicialmente trabalhar somente com Table e Query, na ilustração a cima pretendo mostrar que estes componentes estão ligados ao componente DataSource que faz a ligação com os demais componentes de controle. Ou seja, sempre que colocarmos um componente Table ou Query em nosso formulário teremos sempre que colocar um componente DataSource para podermos realizar a ligação aos componentes de controle de banco de dados. Teremos um capítulo só de Table e um capítulo só de Query. A diferença entre Table e Query é a seguinte: Table é para banco de dados simples como o Paradox e não possui facilidades para trabalhar com SQL.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

45

Page 46: 72538859 Apostila Curso Delphi

Query podemos trabalhar, além de Paradox, outros bancos de dados e possui maior facilidade para criação de rotinas SQL. Este capítulo iremos trabalhar somente com Table pois é necessário que você tenha conhecimentos deste para podermos prosseguimos com Query e ambos são muito idênticos mudando poucas coisas. O componente Table está localizado na aba de componentes BDE:

Componente Table.

O componente DataSource está localizado na aba de componentes Data Access:

Componente DataSource.

Então sempre que pedir para colocar um desses componentes você já sabe onde localizar. Os componentes de controle, apresentados no diagrama no começo deste capítulo estão localizados na aba de componentes Data Controls. Criando um simples formulário de Banco de Dados Aqui começamos uma nova aplicação. Antes de continuar o assunto sobre criação de aplicações com banco de dados, crie uma nova aplicação com as seguintes propriedades do Form: Name: frmMain Caption: Nossa Aplicação Em seguida salve o projeto como FormMain.pas e Aplicação.dpr. Agora crie um menu com as seguintes opções:Opções, Customers, Parts. Como na figura a baixo:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

46

Page 47: 72538859 Apostila Curso Delphi

Agora vamos continuar entrando na parte de banco de dados. Vá ao menu File | New | Form com o novo form vamos colocar as seguintes propriedades para ele: Name: frmCustomer Caption: Customers Em seguida coloque um componente Table no formulário e vamos colocar as seguintes propriedades: Name: tblCustomer DatabaseName: Delphi_Loca_Class_Data (Observe que é aqui que utilizamos o Alias criado no BDE.) TableName: customer.db (Observe que aqui encontramos todos bancos de dados que indicamos ao criar o Alias no BDE, neste exemplo utilizaremos a tabela customer.db).

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

47

Page 48: 72538859 Apostila Curso Delphi

Agora vamos colocar o componente DataSource que irá auxiliar na conexão com os componentes de controle de bancos de dados, uma vez colocado no formulário vamos realizar as seguintes configurações de propriedade para este componente: Name: dtsrcCustomer DataSet: tblCustomer Pronto! Já fizemos a ligação do Delphi com nosso banco de dados. Vamos agora inserir componentes de controle de banco de dados. Por enquanto vamos adicionar somente o componente DBGrid na palheta de componentes DataControls e setar as seguintes propriedades para este componente: Name: dbgrdCustomer DataSource: dtsrcCustomer E está quase pronto, mas é preciso mostrar os dados do banco de dados Customer.db no DBGrid, para isso selecione o componente table (tblCustomer) e coloque a propriedade Active de False para True e pronto, lá estão os dados do banco de dados Customer.db visível em nosso DBGrid.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

48

Page 49: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

49

Page 50: 72538859 Apostila Curso Delphi

Agora vamos voltar em nosso formulário onde está o menu, se você tiver dificuldades em encontrar vá no menu View | Forms... será apresentado a janela View Form:

Selecione o frmMain e dê um duplo clique para abrir nosso formulário principal. No menu, clique sobre a opção Customers deverá então aparecer a janela de edição de código, coloque o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

50

Page 51: 72538859 Apostila Curso Delphi

Agora mande executar, quando você realizar esta operação o Delphi irá perguntar se deseja declarar o frmCustomer a unir, clique no botão Yes para confirmar:

Em seguida mande executar novamente, para que faça a compilação completa. Os comandos frmCustomer.Show; é usado para chamar o formulário de Customer. Agora vamos melhorar nossa aplicação. Vamos criar aqui uma interface mais agradável ao usuário com várias opções em uma única tela. Para isso vamos selecionar o DBGrid e clicar no botão Delete de seu teclado, vamos deletar o componente DBGrid, mas somente ele. Vamos agora colocar um componente PageControl da aba Win32 em nosso formulário:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

51

Page 52: 72538859 Apostila Curso Delphi

Clique com o botão direito do mouse sobre este componente em nosso formulário e escolha a opção New Page, será criado uma pasta com o nome TabSheet1 vamos agora alterar a propriedade Caption de TabSheet1 para &Listin, vamos repetir esta operação criando uma nova pasta com seu Caption como &Detail em seguida coloque novamente o componente DBGrid e configure ele como fizemos no começo desta lição, uma vez configurado coloque a propriedade Align do DBGrid como AlClient. Seu formulário deverá ficar assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

52

Page 53: 72538859 Apostila Curso Delphi

Observe na imagem a cima que o DBGrid foi colocado na pasta Listn. Agora vamos criar a opção para Detail, onde iremos colocar os detalhes do banco de dados e conhecer outros componentes de controle de banco de dados. Vamos agora colocar 6 componentes DBEdit da palheta de componentes Data Controls e 6 componentes Label da palheta de componentes Standard. Onde os componentes DBEdit terão as seguintes propriedades: Componente Propriedades DBEdit1 Name: dbedtCompany

DataSource: dtsrcCustomer DataFiels: Company

DBEdit2 Name: dbdtAdress DataSource: dtsrcCustomer DataFiels: Addr1

DBEdit3 Name: dbdtCity DataSource: dtsrcCustomer DataFiels: City

DBEdit4 Name: dbdtState DataSource: dtsrcCustomer DataFiels: State

DBEdit5 Name: dbdtZip DataSource: dtsrcCustomer DataFiels: Zip

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

53

Page 54: 72538859 Apostila Curso Delphi

DBEdit6 Name: dbdtContact DataSource: dtsrcCustomer DataFiels: Contact

Label1 Caption: Company Label2 Caption: Adresss Label3 Caption: City Label4 Caption: State Label5 Caption: Zip Label6 Caption: Contact Devendo Ficar assim:

Agora para melhorar a aparência e colocar um novo controle, o controle de navegação, vamos colocar um componente Panel da palheta de componentes Standard e definir em suas propriedades: Caption: Align: alTop Em seguida vamos colocar o componente de controle DBNavigator da palheta de componentes Data Controls com as seguintes propriedades: Name: dbnvgtrCustomer DataSource: dtsrcCustomer

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

54

Page 55: 72538859 Apostila Curso Delphi

Pronto, temos nosso controle de navegação que é melhor explicado na vídeo aula. Vamos selecionar nosso Page Control que já está no formulário e vamos definir sua propriedade Align para alClient, sua tela então deverá ficar como esta:

Fazendo ligação com mais de uma tabela Vamos criar agora mais uma pasta em nosso Page Control que terá seu Caption como &Orders:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

55

Page 56: 72538859 Apostila Curso Delphi

Agora vamos adicionar em nosso formulário um novo componente Table com as seguintes propriedades: DatabaseName: Delphi_Local_Class_Data TableName: orders.db Name: tblOrders Em seguida um componente DataSource com as seguintes propriedades: Name: dtsrcOrders DataSet: tblOrders Em seguida coloque um componente de controle DBGrid e faça sua ligação ao banco de dados, como já apresentado com o DataSource linkado em dtsrcOrders e Align como alClient em seguida no componente tblOrders:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

56

Page 57: 72538859 Apostila Curso Delphi

Agora vamos linkar as duas tabelas uma com a outra, para isso na tabela tblOrders na propriedade MasterSource setar para dtsrcCustomer em seguida na propriedade MasterField vamos clicar nos três pontinhos para abrir a caixa de edição Field Link Designer:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

57

Page 58: 72538859 Apostila Curso Delphi

Em Avaliable Indexes selecione CustNo, em Detail Fields selecione CustNo e também em Máster Fields selecione CustNo em seguida clique sobre o botão Add:

Em seguida clique em Ok e coloque a propriedade do tblOrders de Active False para True e mande executar. O que fizemos faz em Orders mostrar todas as compras realizadas pela empresa selecionada em Customer.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

58

Page 59: 72538859 Apostila Curso Delphi

Usando Database Wizards Ainda em nossa aplicação que iniciamos no capítulo anterior aberta vamos criar o cadastro de Parts. Os Wizards são feitos para facilitar a criação de formulários já com os controles e ligações necessárias aos bancos de dados. Esta é um opção muito fácil pois basta seguir as instruções da tela. Vamos ao menu do Delphi File | New | Other e vamos escolher a pasta Business:

Selecione o ícone Database Form Wizard e clique em OK:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

59

Page 60: 72538859 Apostila Curso Delphi

Form Options temos dois tipos de formulários, por enquanto vamos escolher apenas o Create a simple form e, em DataSet Option por enquanto somente a primeira opção em seguida clique sobre o botão Next:

Em Drive or Alias name vamos selecionar o nosso Alias. Em seguida escolha o banco de dados Parts.db:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

60

Page 61: 72538859 Apostila Curso Delphi

Clique sobre o botão Next, clique sobre o botão ‘>>’ para que passe todos os campos da esquerda para direita:

Clique sobre o botão Next e escolha a opção Horizontally:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

61

Page 62: 72538859 Apostila Curso Delphi

Clique sobre o botão Next e em Form Generation escolha a opção Form Only e deixe desmarcado a opção Generate a main form:

Clique sobre o botão Finish, será criado nosso formulário do Parts, vamos alterar as propriedades deste formulário para: Name: frmParts Caption: Parts Selecione o componente table do formulário e coloque as seguintes propriedades: Name: tblParts

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

62

Page 63: 72538859 Apostila Curso Delphi

Selecione o componente DataSource e coloque a propriedade Name como dtsrcParts e está pronto nosso formulário de Parts. Agora vamos criar um novo formulário Mestre Detalhe6. Mestre Detalhe Wizard Vamos refazer os mesmos passos no anterior:

1. Vá ao menu do Delphi File | New | Other; 2. Selecione a pasta Business; 3. Selecione o ícone Database Form Wizard:

Escolha a opção Create a master/detail form:

Clique em Next e selecione a tabela Parts.db:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

63 6 Mestre Detalhe é quando utilizamos dois ou mais bancos de dados em um formulário.

Page 64: 72538859 Apostila Curso Delphi

Clique em Next e selecione e mova os itens da esquerda para direita:

Clique em Next, escolha a opção Horizontally:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

64

Page 65: 72538859 Apostila Curso Delphi

Clique em Next, escolha a tabela vendors.db:

Clique em Next, mova os itens da esquerda para a direita:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

65

Page 66: 72538859 Apostila Curso Delphi

Clique em Next, escolha a opção In a Grid:

Clique em Next, Selecione as opções VendorNo e clique em Add:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

66

Page 67: 72538859 Apostila Curso Delphi

Clique em Next, escolha a opção Form and DataModule:

Clique em Finish. Será montado nosso formulário que liga a tabela Parts.db com Vendors.db:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

67

Page 68: 72538859 Apostila Curso Delphi

Vamos agora configurar as propriedades do formulário com: Name: frmPartsVendors Caption: Parts and Vendors Temos uma novidade agora, a janela DataModule, onde estão os componentes do formulário:

O DataModule veremos mais detalhadamente no próximo capítulo, por enquanto vamos apenas configurar as propriedades do DataModule dos Tables e DataSources: Componente Propriedades DataModule2 Name: dtmdlPartsAndVendors Table1 Name: tbltblParts Table2 Name: tblVendors DataSource1 Name: dtsrcParts DataSource2 Name: dtsrcVendors

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

68

Page 69: 72538859 Apostila Curso Delphi

Salve este projeto como FormPartsAndVendors.pas.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

69

Page 70: 72538859 Apostila Curso Delphi

Trabalhando com objetos Tfield Os objetos TField são criados já quanto colocamos um componente de banco de dados (Table ou Query) que possibilita a alteração e/ou personalização de cada campo do banco de dados. Tipos de Componentes TField Existem diversas categorias de componentes Tfield são eles: Componentes Field

Correspondência

TAutoIncField Campo de auto-incremento. TStringField Dados em textos de até 255 caracteres. TIntergerField Números entre –2147483648... 2147483648 TSmallIntField Números entre –32768...32168 TLargeIntField Campo Integer longo TWordField Números de zero a 65535 TFloatField Números reais com 15-16 digitos TCurrencyField O mesmo que TFloatField TBCDField Números reais com decimais fixas de até 19 digitos TBooleanField Valores True ou False TDateTimeField Valores Data e Time TTimeField Valor Time TBlobField Campo binário sem limitação de tamanho. TBytesField Igual ao TBlobField TVarBytesField Campo binário com limitação de espaço para 65535 caracteres TArrayField Campo Array TMemoField Somente textos longos TADTField Campo abstrato de dados TGraphicField Campo de imagem (por exemplo, bitmap) sem limitação de tamanho. Estes componentes apresentados na tabela são os que poderão ser alterados em tempo de desenvolvimento ou em tempo de execução. Ou alterando suas propriedades no Object Inspector ou via programação. Conheceremos agora no decorrer do treinamento os principais e mais utilizados componentes TField. Este capítulo, apesar de termos as vídeo aulas, vamos refazer os exemplos das vídeo aulas e vamos explicar itens que não foram explicados nas mesmas. Usando o Field Property Editor Se você quiser criar um objeto TField quando estiver desenvolvendo sua aplicação, clique sobre o componente Table que desejar com o botão direito do mouse e escolha a opção Fields Editor... :

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

70

Page 71: 72538859 Apostila Curso Delphi

Será apresentado o Fields Editor porém vazio. Necessitamos então adicionar os campos da tabela selecionada clicando com o botão direito do mouse e escolhendo a opção Add Fields... será então apresentado a tela Add Fields com os campos da tabela selecionados, neste exemplo deixe todos selecionado:

Em seguida clique sobre o botão OK. Todos campos selecionados foram para o nosso editor de Fields:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

71

Page 72: 72538859 Apostila Curso Delphi

Cada um destes campos possuem suas propriedades e eventos no Object Inspector. Perceba por exemplo o nome do campo Company que está tblCustomerCompany que quer dizer que este componente Field pertence a tabela Customer:

Existem outras propriedades para cada campo TField no Object Inspector. As que iremos conhecer em nosso treinamento são: Propriedade Descrição DisplayLabel É o nome da coluna de um componente DBGrid, é aqui que corrigimos

o nome de uma coluna do DBGrid. DisplayWidth Usado para definirmos o tamanho de uma coluna em um componente

DBGrid.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

72

Page 73: 72538859 Apostila Curso Delphi

EditMask Usado para criarmos mascaras para os campos de cadastro e visualização, como por exemplo CEP, CPF, CNPJ, Data e outros.

Currency Usado para colocar formatação de moeda. Não vamos tratar este na apostila, mas está sendo tratado nas vídeo-aulas.

Formatando Campos com Edit Masks Apesar de apresentarmos nas vídeo aulas, vamos tratar também aqui na apostila de conteúdo o que não foi citado.

Temos algumas mascaras já criadas pelo próprio Delphi que podemos escolher, assim como também podemos criar nossas próprias mascaras. Por exemplo podemos forçar que o sistema aceito somente letras maiúsculas colocando o sinal de maior (“>”)antes da mascara, ou podemos colocar o sinal de menor (“<”) para forçarmos o sistema aceitar somente letras minúsculas. Podemos colocar o caracter “L” para aceitar somente letras e o caracter “A” para aceitar letras e números. O caracter “9” permite somente números. Um exemplo: Se você precisar criar uma mascara que force o usuário a digitar 3 letras maiúsculas e em seguida 4 números você pode criar a seguinte mascara: >LLL-9999

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

73

Page 74: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

74

Page 75: 72538859 Apostila Curso Delphi

Manipulando DataSets Movendo ponteiros Podemos personalizar os botões de nosso DBNAvigator criando assim uma certa personalização de nossas aplicações deixando de depender um pouco dos controles já prontos pelo Delphi – apesar de não achar isso necessário mas acho importante apresentar a você – com muita facilidade. Neste exemplo vamos implementar nosso formulário frmCustomer. Coloque um componente Panel em nosso formulário com a propriedade Align como alRight:

Em seguida coloque dois componentes SpeedButton da palheta de componentes Additional:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

75

Page 76: 72538859 Apostila Curso Delphi

Vá a propriedade Glyph dos SpeedButons para colocarmos imagens nos botões:

Clique sobre o botão Load e escolha as imagens BMP que melhor se encaixar ao exemplo no meu caso estas imagens estavam em \Arquivos de Programas\Borland\Delphi6\Demos\Fotball:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

76

Page 77: 72538859 Apostila Curso Delphi

Após clicar em OK a imagem selecionada foi para o nosso botão SpeedButton, repita os mesmos passos para o segundo botão. Agora vamos escrever os códigos para que nossos botões funcionem, no primeiro SpeedButton coloque o seguinte código no evento OnClik:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

77

Page 78: 72538859 Apostila Curso Delphi

No evento OnClick do segundo SpeedButton coloque o seguinte código:

Agora no componente DataSource de Orders, no evento OnDataChange:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

78

Page 79: 72538859 Apostila Curso Delphi

Escreva o seguinte código:

Agora é só rodar nossa aplicação e ver nossos botões mudando de registro.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

79

Page 80: 72538859 Apostila Curso Delphi

Limitando Record Sets O que iremos criar agora – ainda incrementando o formulário de Customer – é realizar filtros de nomes por pastas no DBGrid. Vamos utilizar um componente TabControl da palheta de componentes Win32 e colocar sobre nosso formulário:

Vamos colocar a propriedade Name deste componente como tbcntrlCustomer e na propriedade Tabs vamos colocar a palavra TODOS e em seguida todo o alfabeto – é o seguinte, se selecionarmos a pasta TODOS será listado todas companhias cadastradas e conforme vamos mudando as pastas serão listados somente as companhias que comecem por aquela letra da pasta.

Logo após clicar em OK seu TabControl ficará assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

80

Page 81: 72538859 Apostila Curso Delphi

Agora para que você deixe sua tela como mostra a figura a cima é necessário você deletar o DBGrid em seguida no componente TabControl colocar sua propriedade Align como alClient e depois colocar o DBGrid novamente de volta e realizar suas ligações ao banco de dados como já foi apresentado anteriormente. Para fazermos um filtro conforma a letra da pasta selecionada devemos colocar o seguinte código no evento OnChange do componente TabControl:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

81

Page 82: 72538859 Apostila Curso Delphi

Não esquecer de colocar a propriedade IndexFieldName do componente tblCustomer em Company. Assim já estará pronto para rodar a aplicação e ver como funciona este filtro. Criando uma pesquisa em registros Vamos criar um simples sistema de busca, para este exemplo vamos trabalhar um pouco na no formulário frmParts, deixando um pouco de lado nosso formulário Customer, mas pode ser feito também em outros formulários futuros. Crie um novo formulário com as seguintes propriedades: Name: frmFindPart Caption: Find Part Em seguida salve este formulário como FormFindPart. Coloque 3 componentes Panel no formulário e coloque as propriedades Align de cada Panel respetivamente como alTop, alBotton e alClient, devendo ficar assim:

No Panel2 colque um componente DBGrid, com sua propriedade Align como alClient:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

82

Page 83: 72538859 Apostila Curso Delphi

No Panel2 coloque 2 componente BitBtn da palheta de componentes Additional e coloque suas propriedades como: Para BitBtn1: Name: btbtnCancel Kind: bkCancel Para BitBtn2: Name: btbtnOk Kind: bkOK No Panel1 vamos colocar um componente label e um componente Edit, com as seguintes propriedades cada um: Para o componente Label: Name: lblFindPartName Caption: Find Part Name: Para o componente Edit: Name:edtFind Devendo seu formulário ficar assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

83

Page 84: 72538859 Apostila Curso Delphi

Na propriedade DataSource do DBGrid coloque dtmdlParts.dtsrcParts para interligar ao DataMolude criado quando desenvolvemos este formulário na lição de Wizard. Neste exemplo é necessário que a propriedade IndexFieldName do componente tblParts esteja como Description que assim será ordenado por ordem de descrição. Agora no evento OnChange de nosso componente Edit vamos escrever o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

84

Page 85: 72538859 Apostila Curso Delphi

ATENÇÃO: O comando FindNearest aplica-se somente com componente Table. Se você for utilizar componente Query ou StoredProc o método Locate é o melhor a ser utilizado. Iremos ver este método quando chegarmos a parte do treinamento que trata de Query. Bookmarking Records Agora precisamos fazer o formulário frmParts chamar o formulário frmFindPart e quando voltarmos de nosso sistema de busca ele volte no registro que realizamos a pesquisa para que o usuário, caso deseje, possa alterar informações. Para isso vamos adicionar um componente SpeedButton no form Parts e no evento OnClick deste componente escrever o seguinte código para que isto seja realizado:

Esta rotina faz a ligação com o DataModule e manda o Delphi construir o formulário de pesquisa.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

85

Page 86: 72538859 Apostila Curso Delphi

Migração para Cliente/Servidor – Client/Server Este capítulo é voltado a migração de aplicações para Cliente Servidor. Você aprenderá a converter seus bancos de dados Paradox para o Interbase e a configurar sua aplicação facilmente para esta plataforma. Escolhemos o banco de dados Interbase não apenas por ser um banco de dados da Borland, mas também por ser um banco de dados muito mais confiável que muitos outros como: MS-Access, MySQL, Paradox e outros. Este capítulo só funciona com o Borland Delphi versão 7, mas pode ser aplicado perfeitamente ao Delphi 6. Particularmente eu prefiro o Delphi 7 por ter mais recursos e alguns passos desta lição podem não dar certo com a versão 6 do Delphi. Num ambiente Cliente/Servidor nós temos um banco de dados central sendo acessado por vários outros usuários - Clientes. Este banco de dados central deve ser gerenciado por um programa específico para isto. O Delphi incorpora o gerenciador de banco de dados InterBase da Borland, nós iremos trabalhar com este gerenciador, o que permite a criação e teste de aplicativos sem estarem instalados no ambiente de produção. Quando o projeto estiver terminado, basta instalá-lo no computador servidor de arquivos para uso imediato. Migrando seus Bancos de Dados com o Data Migration Wizard Para converter os bancos de dados de Paradox para Interbase vamos utilizar uma ferramenta que já vem no próprio Borland Delphi 7. Vamos abrir o DataPump, que irá nos abrir diretamente nesta tela:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

86

Page 87: 72538859 Apostila Curso Delphi

Podemos escolher abrir as tabelas a partir do Alias ou do diretório, vou abrir a partir do Alias. Mas antes por ser um ambiente Cliente Servidor devemos criar um novo Alias, como já foi apresentado não irei demonstrar novamente, chamado Delphi_Server_Class_Data, em seguida escolhido o alias inicial Delphi_Local_Class_Data clique sobre o botão Next e na próxima tela selecione o Alias Delphi_Server_Class_Data:

Em seguida clique sobre o botão Next, vamos selecionar todos os bancos de dados clicando sobre o botão >>:

Em seguida clique sobre o botão Next e será apresentado um relatório sobre cada tabela que irá ser convertida, clique sobre o botão Upsize para iniciarmos a conversão de

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

87

Page 88: 72538859 Apostila Curso Delphi

Paradox para Interbase, será apresentado uma barra de progressão informando a conversão dos bancos em seguida será apresentado um relatório:

Este relatório apresenta que tudo ocorreu bem na conversão, clique em Done e pronto, seus bancos de dados agora são Interbase com todas informações neles contidos mantidos. Agora vamos às modificações que você deve realizar em sua aplicação para que rode perfeitamente, agora com banco de dados Interbase e Cliente Servidor. Modificando Aplicações Aqui neste exemplo vamos realizar a mudança somente no formulário Parts, quando você for desenvolver seus aplicativos e converte-lo deve realizar estes processos em todos formulários. Então com o formulário Parts aberto:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

88

Page 89: 72538859 Apostila Curso Delphi

Devemos realizar diversas modificações de configuração do banco de dados. Vamos começar alterando a propriedade do DatabaseName para o nosso banco de dados servidor que criamos com o DataPump. Em seguida altere a propriedade TableName de parts.db para somente parts e estará pronto sua conversão. Aqui em meu exemplo deu tudo certo, porém podem ocorrer erros quando você for realizar. Entre em contato para que possamos resolver e explicar o que aconteceu.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

89

Page 90: 72538859 Apostila Curso Delphi

UTILIZANDO COMPONENTES TQUERY Introdução e instrução Até este momento vimos a utilização de componente TTable para ligação de tabelas. A partir de agora veremos como utilizar o componente TQuery. O componente TQuery é parecido com o componente TTable. O componente Query é indicado para outros tipos de bancos de dados que não seja o Paradox, apesar de funcionar perfeitamente bem com o Paradox, em especial bancos de dados que trabalhem com instruções SQL como o Interbase. Então a diferença básica entre componente Table e Query é que este último necessita conhecimentos de SQL. Este treinamento não tem como objetivo ensinar SQL, mas vou mostrar aqui algumas funções básicas de SQL. Você poderá conhecer mais sobre SQL no Portal Ramos da Informática ( www.ramosdainformatica.com.br ) na seção de artigos. Não ensinarei o SQL, assim como não ensinei o Paradox, pois sairia do contexto do treinamento que é o Delphi exclusivamente. A utilização de SQL é sem dúvidas mais eficiente e rápido que se fizéssemos com Object Pascal puro e, uma vez que você já tiver conhecimentos de SQL verá como é muito mais fácil desenvolver suas aplicações, sem contar que o SQL é uma linguagem universal para banco de dados, muito utilizada pelos principais bancos de dados do mercado. Com os objetos (componentes) Query você pode desenvolver aplicações muito mais rápidas e seguras, além de ser mais indicado no desenvolvimento de aplicações Client/Server e redes. Um componente Query possui em suas propriedades a possibilidade de criar suas strings SQL e parâmetros. Vamos utilizar o nosso formulário Customer já criado anteriormente para podermos ilustrar melhor a utilização de Querys em nossas aplicações. Neste formulário Customers que criamos utilizamos a tabela Orders. Vamos colocar agora um componente Query, da palheta de componentes BDE, em nosso formulário e setar a propriedade Name para qryOrders e definir a propriedade DatabaseName para o nosso Alias. Em seguida, vamos colocar já um parâmetro em SQL na propriedade SQL deste objeto para fazer a ligação com a tabela orders, este comando deverá ser: Select * From Orders Este comando, como já dito, serve para fazer a ligação da tabela Orders ao componente Query, é sempre este comando mudando apenas o nome do banco de dados sem sua extensão.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

90

Page 91: 72538859 Apostila Curso Delphi

Esta caixa de diálogos a cima é onde se coloca o parâmetro de SQL. Podemos criar aqui diversos outros parâmetros para SQL como UPDATE, DELETE e INSERT. Agora devemos colocar um componente DataSource com o nome de dtsrcOrders para esta nova Query. É aconselhável abrirmos e fecharmos sempre uma Query quando abrimos ou fechamos um formulário, isto para evitar erros e até mesmo para deixar nossas aplicações mais rápidas e seguras. Para isso devemos colocar no evento OnCreate de nossos formulários o seguinte código a baixo para podermos sempre que entrarmos no formulário abrir a Query sem problemas: procedure TfrmCustomer.FormCreate(Sender: TObject); begin

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

91

Page 92: 72538859 Apostila Curso Delphi

pgcntrlCustomer.ActivePage := TabSheet1; // Quando a PageControl de Customer estiver //ativa na Pasta TabSheet1 que é a pasta Listin

// prepara o query para a tabela orders if not qryOrders.Prepared then qryOrders.Prepare; qryOrders.Open; // Abre tabela end; Vou esclarecer os métodos Prepare e Prepared. O método Prepare é importante para otimizar a conexão ao banco de dados, principalmente em um servidor. Assim os comandos SQL já são enviados ao banco de dados deixando a execução e toda operação mais dinâmica. Já o método Prepared checa sempre depois que o usuário executar alguma operação pré-programada por nós deixando assim a aplicação mais lenta. Para finalizarmos esta conexão em nosso banco de dados com Query precisamos agora sempre desativar a propriedade Prepare iniciada quando entramos no formulário e fechar o banco de dados. Isso é preciso, pois sempre que trabalhamos com Query se não fecharmos o banco de dados o computador sempre irá abrir novamente o banco de dados sempre que o usuário entrar no formulário, o que pode ocasionar diversos erros futuros em nossas aplicações e bancos de dados forçando assim uma chamada do cliente ao desenvolvedor da aplicação para corrigir erros o que não é bom. A função que mostro a seguir fecha o banco de dados e desativa a propriedade Prepare com a propriedade UnPrepare, este código é adicionado no evento OnDestroy do formulário: procedure TfrmCustomer.FormDestroy(Sender: TObject); begin qryOrders.Close; qryOrders.UnPrepare; end; Agora precisamos fazer a ligação entre as tabelas tblCustomer e qryOrders para que haja o filtro pelo CustNo, como era antes de realizarmos estas alterações, então de volta ao editor de SQL do Query acrescente:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

92

Page 93: 72538859 Apostila Curso Delphi

Criamos um parâmetro chamado CustNo. Veja na propriedade Params este parâmetro criado:

Observe as propriedades deste parâmetro, o seu exemplo deverá ficar igual. Em seguida no evento OnDataChange de seu componente dtsrcOrders escreva o seguinte código: procedure TfrmCustomer.dtsrcOrdersDataChange(Sender: TObject; Field: TField); begin with qryOrders do // Com a Query Orders begin DisableControls; //Desabilita controle Close; // Fecha ParamByName( 'CustNo' ).Value := tblCustomerCustNo.Value; // Diz que campo CustNo de Orders é igual ao campo CustNo de Customer. Open; // Abre EnableControls; // Ativa controles end; end; Assim está pronto, voltamos a fazer a comunicação entre as tabelas Customer.db e Orders.db utilizando o componente Query.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

93

Page 94: 72538859 Apostila Curso Delphi

Agora vamos criar novo formulário utilizando somente de Querys. Database Form Wizard Anteriormente vimos como trabalhar com o Database Form Wizard com Table agora vemos com Query. Vá ao menu do Delphi File | New | Other e na pasta Business escolha a opção Database Form Wizard:

Em seguida clique em OK. Escolha agora Create Master/Detail Form e Create a Form using TQuery Objects em seguida clique em Next:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

94

Page 95: 72538859 Apostila Curso Delphi

Em Driver or Alias Name coloque o Alias que estamos trabalhando e escolha a tabela Orders.db em seguida clique em Next:

Selecione todos os campos com exceção dos campos que comecem por Ship, em seguida clique sobre o botão Next:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

95

Page 96: 72538859 Apostila Curso Delphi

Defina como Horizontally em seguida clique em Next:

Em seguida escolha a tabela OrderLineItems.db e clique em Next:

Selecione todos campos com exceção de COMMENT em seguida clique em Next:

Escolha a opção In a Grid em seguida clique em Next:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

96

Page 97: 72538859 Apostila Curso Delphi

Selecione ORDER_KEY com OrdNo e clique em Add... em seguida clique em Next:

Escolha a opção Form and DataModule e clique em Finish:

E assim será montado o novo formulário com o DataModule:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

97

Page 98: 72538859 Apostila Curso Delphi

Se você olhar na propriedade SQL dos componentes Querys terá os seguintes códigos a baixo. Neste o Query de Orders: Select orders."OrderNo", orders."CustNo", orders."SaleDate", orders."ShipDate", orders."EmpNo", orders."PO", orders."Terms", orders."PaymentMethod", orders."ItemsTotal", orders."TaxRate", orders."Freight", orders."AmountPaid" From "orders.db" As orders O de OrderLineItems teremos: Select OrderLineitems."LINEITEM_KEY", OrderLineitems."ORDER_KEY", OrderLineitems."PART_KEY", OrderLineitems."SUPPLIER_KEY", OrderLineitems."LINE_NUMBER", OrderLineitems."QUANTITY", OrderLineitems."EXTENDED_PRICE", OrderLineitems."DISCOUNT", OrderLineitems."TAX", OrderLineitems."RETURN_PART", OrderLineitems."LINE_STATUS",

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

98

Page 99: 72538859 Apostila Curso Delphi

OrderLineitems."SHIP_DATE", OrderLineitems."COMMISSION_DATE", OrderLineitems."RECEIPT_DATE", OrderLineitems."SHIP_INSTRUCTIONS", OrderLineitems."SHIP_MODE" From "OrderLineitems.DB" As OrderLineitems Where "OrderLineitems"."ORDER_KEY" =:"OrderNo" Veja que assim o Wizard já montou os parâmetros SQL de chamada para seus bancos de dados. Vamos agora alterar algumas propriedades do Formulário: Caption = Orders Name: frmOrders Agora basta você chamar este formulário no menu do Formulário principal da aplicação com o comando: FrmOrders.Show; Editando Registros Este formulário ainda não está aceitando edição porque o Wizard deixa a propriedade RequestLive dos Querys como False, coloque esta propriedade como True para que possibilite a edição de registros. Porém utilizar-se somente deste artifício para edição de registro não é aconselhável por não ser uma operação segura principalmente se você for trabalhar com aplicações em rede. Por enquanto isto basta, mas veremos mais adiante como fazer corretamente em “TDatasets Avançado”. Localizando Registros em Queries Com o componente Table podemos utilizar os métodos FindKey ou FindNearest para realizarmos pesquisas, isso porque com os Tables podemos aproveitar dos indeces das tabelas. Já com o componente Query não podemos utilizar dos índices de tabelas portanto não podemos utilizar os métodos FindKey ou FindNearest, então neste exemplo não vamos utilizar estes métodos pois estamos trabalhando com Query. Neste nosso exemplo vamos colocar um componente Label, Edit e Button devendo ficar desta forma:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

99

Page 100: 72538859 Apostila Curso Delphi

E iremos utilizar o método Locate, então no evento OnClick de nosso botão escreva o código a seguir: procedure TfrmOrders.btnFindOrdersClick(Sender: TObject); var OrderToFind : Variant; // Declara variável begin OrderToFind := edtFind.Text; // Define esta variável como o Texto a ser digitado no edit. with dtmdlOrders.qryOrder do // Define tabela que iremos trabalhar if not Locate('Order_Key', OrderToFind, [loCaseInsensitive]) then // se não localizar então… MessageDlg('Order not Found', mtError, [mbOK], 0); // mostra esta mensagem de erro com o botão OK. end; O SQL Builder Eu disse que neste treinamento não irei entrar em detalhes sobre programação em SQL, porém o Delphi possui um gerador de rotinas em SQL, o SQL Builder que pode ser acessado diretamente nos componentes Query, clicando sobre o botão direito deles:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

100

Page 101: 72538859 Apostila Curso Delphi

Devendo aparecer a seguinte tela:

Vou demonstrar como gerar seus SQLs com este gerador do Delphi. Primeiro vamos definir nosso Alias em Database:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

101

Page 102: 72538859 Apostila Curso Delphi

Neste exemplo vamos abrir os bancos de dados Customer e Order em Table, devendo ficar assim:

Agora vamos selecionar os campos que iremos utilizar em nossas tabelas, tanto em Customer quanto em Orders, como mostra a ilustração a baixo:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

102

Page 103: 72538859 Apostila Curso Delphi

Para realizar uma interligação de nossas tabelas, na pasta Joins iremos definir que o campo Customer_Key da tabela de Customer é igual ao campo Customer_Key da tabela Orders, como mostra a ilustração a seguir:

O SQL Builder permite fazer outros tipos de controles além de setar compartilhar tabelas dos Querys. Podemos fazer outras condições ao código SQL que será gerado. Por exemplo a próxima figura mostra que posso definir critérios:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

103

Page 104: 72538859 Apostila Curso Delphi

Além de diversas outras opções como na pasta Group Criteria que podemos realizar operações matemáticas entre os campos, onde SUM seria a somatória de valores de um campo a ser definido.:

Na barra de atalhos do SQL Builder possui o Execute Query onde você poderá visualizar os em um DBGrid o que está sendo montado para que você aprove ou não:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

104

Page 105: 72538859 Apostila Curso Delphi

Quando você já souber trabalhar com SQL poderá ver e editar o código gerado pelo SQL Builder, ainda na barra de atalhos, através do Show and Edit SQL :

Você deverá copiar este código pois o SQL Builder não coloca automaticamente nas propriedades SQL de seu Query.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

105

Page 106: 72538859 Apostila Curso Delphi

DbExpress O dbExpress surgiu a partir da versão 6 do Delphi. Apesar disto é muito importante que você, mesmo começando a programar a partir da versão 6 do Delphi, conheça e aprenda o BDE pois a maioria, eu diria uns 95%, da aplicações já desenvolvidas e ainda por desenvolver trabalha com o BDE e creio que ainda vá demorar bastante para que sejam convertidos para o dbExpress. Esta nova camada foi reconstruída a partir do zero, não aproveitando a estrutura da BDE . Veja agora as principais diferenças entre a BDE e a DbExpress:

• A camada DbExpress é muito mais simples e leve, deixando muitos recursos a serem controlados pela própria aplicação. Por exemplo, o caching de dados. A dbExpress retornará os dados somente de forma unidirecional, ou seja, não criará um handle de edição (live result set). A camada Midas, encapsulada nos objetos DataCLX, será a responsável pelo cache dos dados retornados.

• A API desta camada é mais simples, baseada em apenas quatro objetos- SQLDriver, SQLConnection, SQLCommand e SQLCursor - comumente chamados de SQLObjects.

• A movimentação de registros, a indexação, ou qualquer outro tipo de manipulação dos dados retornados serão controlados pelo MIDAS ClientDataSet, livrando a DbExpress deste trabalho.

• A dbExpress também não implementará o Cached Updates, RequestLives ou reprocessamento de querys dinamicamente, o que irá incrementar a performance de acesso.

Em suma, a nova camada promete um considerável aumento de performance para aplicações que manipulem massas de dados. Vejamos os principais pontos oferecidos pela DbExpress:

• Incremento considerável de velocidade, visto que a DbExpress é muito simples, eliminando toda a carga de processamento realizada pelo BDE;

• Maior praticidade para distribuição do aplicativo, pois a complexidade de configuração e instalação da BDE não estará mais presente;

• Alocação de recursos dinâmicos no cliente será muito menor. • O dbExpress permite criar tanto para Delphi quanto para Kylix.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

106

Page 107: 72538859 Apostila Curso Delphi

Conhecendo os componentes do dbExpress

Esta é a palheta de componentes do dbExpress:

Nesta palheta temos os componentes SQLConnection, SQLDataSet, SQLQuery, SQLStoredProc, SQLTable, SQLMonitor e SQLDataSet respectivamente. É mais utilizado em banco de dados que se utilizam de SQL, como: Oracle, Interbase, SQL Server, MySQL e outros. Para se trabalhar com o dbExpress é necessário o conhecimento de SQL e outros bancos de dados.

Vamos conhecer aqui uma breve descrição sobre cada um destes componentes. Para que você conheça melhor suas propriedades veja no Help do Delphi.

SQLConnection – Este componente realiza a conexão com banco de dados. O componente SQLConnection suporta elementos requeridos para o login, transação e interação com o servidor.

SQLDataSet – Este componente é um componente especializado ClientDataSet para se utilizar os componentes internos SQLDataSet e DataSetProvider, que realiza a ligação com os campos do banco de dados.

SQLQuery – Este é um componente DataSet para enviar códigos SQL para o servidor de banco de dados. Este componente suporta dados enviados pelo comando SELECT. Modificações de dados com INSERT, UPDATE e DELETE são suportados. Comandos para criar definições como CREATE TABLE (etc.) enquanto é executado.

SQLStoredProc – Este componente é utilizado para acessar stored procedures de bancos de dados em servidores, via SQLConnection. TSQLStoredProc retorna o resultado de uma stored procedure ao cursor. Você adiciona um componente TSQLStoredProc em um formulário ou DataModule em tempo de design ou cria em tempo de execução.

SQLTable – Este componente é utilizado para se conectar a simples bancos de dados – como o paradox.

SQLMonitor – Este componente é como se fosse uma ferramenta para se verificar as stored procedures dos bancos de dados. Ele faz uma verificação encontrando possíveis erros dentro das procedures dos bancos de dados.

Para entendermos melhor os conceitos e utilização do dbExpress vamos a partir de agora criar um exemplo.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

107

Page 108: 72538859 Apostila Curso Delphi

Um exemplo de mundo real

Para que você compreenda melhor o funcionamento do dbExpress, que necessita do componente ClientDataSet, vamos mostrar na prática com o desenvolvimento de um exemplo de mundo real.

Vamos imaginar que você precise criar uma aplicação flexível. Mais ainda, suponha que sua aplicação tenha que trabalhar com diversos tipos de bancos de dados e sistemas operacionais, e que necessita de ser utilizado em um laptop para em seguida se conectar a um servidor para transferência de dados para este servidor, quando o usuário chegar ao escritório. Melhor explicando: Você foi contratado para desenvolver uma aplicação onde os vendedores de um grande distribuidor atacadista necessitam recolher informações de seus clientes em seguida enviar estas informações em seus laptops a central de atacado para poderem processar os pedidos e sua aplicação necessita ser flexível pois a empresa está com planos futuros de mudar toda sua base de dados e necessite de algo que não dependa de plataforma ou tipo de banco de dados. Então como fazer? Quais componentes utilizar?

No Delphi você utilizará o componente ClientDataSet. Este componente permite que você crie arquivos fixos em seu computador para Interbase, Oracle, XML ou arquivo binário, sem necessitar conhecer estes bancos de dados. E para realizarmos a conexão e transferência para o servidor de banco de dados iremos então utilizar o dbExpress.

Crie agora um novo projeto case1.dpr com FormCDS.pas como formulário principal. Coloque os seguintes componentes com seus respectivos nomes no formulário:

Componente Name Palheta de componentes ClientDataSet clntdtstSales Data Access DataSource dtsrcSales Data Access BDNavigator dbnvgtrSales Data Controls DBGrid dbgrdSales Data Controls

Precisamos agora fazer ligações entre nossos componentes. Observe que ainda não utilizamos nenhum componente do dbExpress, principalmente o componente SQLConnection que será envolvido neste exemplo. Coloque a propriedade DataSet do DataSource para o componente específico ClientDataSet, o DBGrid e o DBNavigator a propriedade Datasource para dtsrcSales.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

108

Page 109: 72538859 Apostila Curso Delphi

Agora clique com o botão direito do mouse sobre o componente ClientDataSet deverá ser apresentado um pop-menu, como mostra figura a baixo. Este menu você pode ler uma tabela de seu disco ou associar a um banco de dados na propriedade DataSet. Para este exemplo vamos utilizar do Field Editor para definirmos uma nova tabela, e criarmos em tempo de design um banco de dados a ser criado em tempo de execução.

Selecione a opção Fields Editor. Na janela de Fields Editor não há entradas. Clique com o botão direito do mouse sobre o Fields Editor e selecione New Field, veja na figura a seguir. Coloque as informações como mostra a figura:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

109

Page 110: 72538859 Apostila Curso Delphi

Clique em OK e crie um novo campo com as propriedades Name como “Description”, Type como String, Size como 50 e FieldType como Data. O seu Field Editor deverá ficar assim:

Feche a janela Fields Editor. Agora clique com o botão direito do mouse sobre o componente ClientDataSet onde você deverá ver as seguintes opções:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

110

Page 111: 72538859 Apostila Curso Delphi

Agora você tem a opção de criar seu DataSet. Clique na opção Create DataSet e observe o DBGrid. O grid agora tem duas colunas com os campos criados. Coloque a propriedade Active do ClientDataSet para True.

Se clicarmos com o botão direito do mouse novamente sobre o componente ClientDataSet, veremos que o pop-menu sofreu algumas alterações. O pop-menu nos dá a opção de salvar os dados do DataSet em vários formatos no disco, ou podemos limpar as informações de dados.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

111

Page 112: 72538859 Apostila Curso Delphi

Mas qual opção vamos salvar as informações? Iremos escolher a opção Save to MyBase Xml table, para convertermos e criarmos informações em XML (Extensible Markup Language). É linguagem de marcação de dados (meta-markup language) que provê um formato para descrever dados estruturados. Isso facilita declarações mais precisas do conteúdo e resultados mais significativos de busca através de múltiplas plataformas. O XML também vai permitir o surgimento de uma nova geração de aplicações de manipulação e visualização de dados via internet.

Um elemento XML pode ter dados declarados como sendo preços de venda, taxas de preço, um título de livro, a quantidade de chuva, ou qualquer outro tipo de elemento de dado. Como as tags XML são adotadas por intranets de organizações, e também via Internet, haverá uma correspondente habilidade em manipular e procurar por dados independentemente das aplicações onde os quais são encontrados. Uma vez que o dado foi encontrado, ele pode ser distribuído pela rede e apresentado em um browser como o Internet Explorer 5 de várias formas possíveis, ou então esse dado pode ser transferido para outras aplicações para processamento futuro e visualização.

Em nosso exemplo salvado em XML temos seu conteúdo assim:

<?xml version="1.0" standalone="yes" ?> - <DATAPACKET Version="2.0"> - <METADATA> - <FIELDS> <FIELD attrname="ID" fieldtype="i4" /> <FIELD attrname="Description" fieldtype="string"

WIDTH="50" /> </FIELDS> <PARAMS />

</METADATA> <ROWDATA />

</DATAPACKET>

Neste exemplo do conteúdo do XML apresentado mostra somente os campos porque não digitamos nada.

Neste treinamento, assim como o SQL, não vamos entrar muito em detalhes sobre XML porque é voltado exclusivamente ao Delphi.

Execute esta aplicação e insira alguns dados.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

112

Page 113: 72538859 Apostila Curso Delphi

Assim está pronta nossa aplicação inicial. Poderem se você encerrar a aplicação e mandar executar novamente perceberá que a tabela foi esvaziada. Para podermos registrar e sempre ler o que foi registrado em nossa grid precisamos definir a propriedade FileName do componente ClientDataSet como Sales.xml. Assim estaremos com este problema resolvido.

Se você quiser fazer isso em tempo de execução utilize os métodos LoadFromFile e SaveToFile do ClientDataSet.

Agora que nossa aplicação já está criando e salvando as informações precisamos agora fazer com que se conecte ao servidor de banco de dados e mande as informações para lá.

ClientDataSet com dbExpress

Vamos agora adicionar os seguintes componentes a nossa aplicação:

Componente Name Palheta de componentes SQLConnection cnncthMain dbExpress SQLTable tblSales DbExpress DataSetProvider dtstprvdrSales Data Access

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

113

Page 114: 72538859 Apostila Curso Delphi

Defina as propriedades do ClientDataSet: Filename como em branco por agora e Active de True para False. Agora clique com o botão direito do mouse sobre o ClientDataSet e selecione Clear Data.

O componente SQLConnection provê a conexão direta com um banco de dados. Editando suas propriedades vamos interliga-lo colocando um banco de dados Interbase chamado Employee.gdb e definirmos as propriedades Name como “sysdba”, Password como “masterkey”. E a propriedade LoginPrompt como False.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

114

Page 115: 72538859 Apostila Curso Delphi

Coloque as propriedades do componente SQLTable para acessar o SQLConnection e a propriedade TableName como “SALES” e a propriedade Active para True.

Coloque agora a propriedade DataSet do componente DataSource para tblSales e a propriedade ProviderName do componente ClientDataSet para dtstprvdrSales.

Você precisa agora definir a propriedade do componente DataSetProvider para o componente SQLTable. E a propriedade ProviderName do componente ClientDataSet para o componente DataSetProvider. A propriedade DataSe do DataSource deve estar ligado ao ClientDataSet e a propriedade Active do ClientDataSet como True. Então o seu DBGRid deverá ficar assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

115

Page 116: 72538859 Apostila Curso Delphi

Neste ponto em que estamos podemos mudar os registros e adicionar em nosso ClientDataSet, mas nós ainda não estamos mandando ao servidor. Nós precisamos adicionar alguns códigos para atualizar o ClientDataSet e adicionar os dados do banco de dados. Agora vamos mandar as informações ao servidor de banco de dados, para isso nós devemos checar a propriedade ChangeCount do ClientDataSet.

Vamos adicionar um componente Button em nosso formulário:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

116

Page 117: 72538859 Apostila Curso Delphi

No evento OnDataChange do componente Datasource vamos escrever o código a baixo para desativarmos o botão enquanto não houver modificações no ClientDataSet:

btnApplyUpdates.Enabled := clntdtstSales.ChangeCount > 0;

No evento OnClick do botão coloque o código a seguir para realizarmos a atualização ao servidor de banco de dados:

clntdtstSales.ApplyUpdates(-1);

Agora na propriedade FileName do componente ClientDataSet coloque “Sales.cds” e execute sua aplicação e edita o DBGrid.

SQLDataSet

Salve este projeto em um novo diretório com o nome de Case3.dpr. Remova o componente SQLTable. Coloque um componente SQLDataSet com o nome de sqldtstSales.

Nas propriedades do SQLDataSet configure seus DataSource e SQLConnection e edita CommmandText como:

Select * from SALES

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

117

Page 118: 72538859 Apostila Curso Delphi

E na propriedade do DataSetProvider coloque o Dataset com o SQLDataSet. Em seguida execute a aplicação e edite os dados do grid.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

118

Page 119: 72538859 Apostila Curso Delphi

Conferindo erros do servidor

Quando você estiver editando e realizando update no banco de dados poderão surgir erros que o servidor não permite. Vamos agora criar um formulário que reporte o erro e possibilite a correção em tempo de execução evitando assim erro ao mudar ou adicionar os dados na tabela.

Salve seu projeto em um novo diretório com o nome de Case4.dpr. Vá ao menu do Delphi File | New | Other e escolha a pasta Dialogs a opção “Reconcile Error Dialog” e salve como FormReconcile.pas.

No evento OnReconcilleError do componente ClientDataSet coloque o seguinte código:

Action := HandleReconcileError(DataSet, UpdateKind, E);

Você precisa adicionar o FormReconcile a clausula uses de FromCDS:

implementation

{$R *.dfm}

uses

FormReconcile;

Assim você terá sempre os avisos de erro do servidor e poderá corrigir alterando os valores, evitando assim erros do sistema.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

119

Page 120: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

120

Page 121: 72538859 Apostila Curso Delphi

Técnicas de Interface de usuários 1

Aqui vamos ver:

Como criar um Splash Screen Como criar aplicações SDI Melhor forma de destruir formulários Controlar os cursores de mouse Hints

O Delphi é bastante rico para desenvolvermos nossas interfaces, neste capítulo e no próximo irei apresentar algumas das mais importantes técnicas de interface que você poderá adicionar em suas aplicações.

Splash Screen

A primeira técnica de interface que vou demonstrar é a apresentação de um Splash Screen. O Splash Screen é um formulário que é aberto antes de carregar nossas aplicações que possuem informações tanto do sistema quanto da empresa ou profissional que desenvolvel a aplicação, como se fosse uma abertura. Esta abertura tem dois propósitos. O primeiro, é um aviso ao usuário que sua aplicação está sendo iniciada. Segundo para que o usuário aguarde enquanto sua aplicação está sendo carregada.

Para criar um Splash Screen no Delphi, primeiro criamos um formulário com informações (imagens, textos e copyright). Depois definimos a propriedade BorderIcons do Form como vazio e a propriedade BorderStyle como bsNone. No formulário você pode colocar o que quiser, neste eu coloquei desta forma:

O Splash Screen deve ser colocado no projeto DPR do formulário principal da aplicação. Você deverá escrever o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

121

Page 122: 72538859 Apostila Curso Delphi

begin

Application.Initialize;

frmSplash := TfrmSplash.Create(Application);

frmSplash.Show;

frmSplash.Refresh;

Application.CreateForm(TfrmMain, frmMain);

Application.CreateForm(TfrmSplash, frmSplash);

frmSplash.Free;

Application.Run;

end.

Assim teremos o Splash Screen sendo apresentado enquanto são carregados os Form e bancos de dados de nossas aplicações.

Criando e liberando Formulários

A técnica apresentada agora é um meio de deixar nossas aplicações mais rápidas. Imagine o usuário ter que carregar todos os formulários e bancos de dados de uma aplicação sempre que ela for iniciada. Isto sem contar que com o tempo os bancos de dados ficariam muito carregados com a quantidade de informações que estaria carregado. Imagine seu cliente abrir o sistema, ter que carregar tudo para acessar somente a base de dados de cliente. Quanto tempo ele irá perder abrindo a aplicação.

O método que vou apresentar, servirá para que o sistema carregue mais rápido e que o sistema carregue somente o que o usuário irá utilizar gastando assim menos memória e tempo na máquina do cliente deixando nossas aplicações mais rápidas.

Na lista do DPR inicial, isto em nossa aplicação, vamos deixar somente desta forma:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

122

Page 123: 72538859 Apostila Curso Delphi

Observe que eliminei todas chamadas de criação dos outros formulários e bancos de dados, deixando somente a abertura de nosso Splash Screen e a criação do formulário principal de nossa aplicação.

O que vamos fazer agora é, em cada opção do menu para chamada de um novo Form, realizar a criação dos formulários e dos bancos de dados de cada formulário na hora em que o usuário abrir. Você poderá estar se perguntando: Mas aí irá demorar sempre para abrir este formulário. Correto. Mas pense, é melhor o cliente esperar para abrir só o que ele vai usar do que abrir tudo quando for iniciar o sistema que pode levar muito mais tempo com o decorrer do uso do sistema.

Lembra que para chamarmos um formulário no menu colocávamos apenas o comando com o nome do formulário a ser aberto seguido de .Show? Tipo:

FrmCustomer.show;

Como eliminamos a criação de cada um dos formulários no arquivo DPR de inicialização do sistema, vamos ter que coloca-lo novamente, desta vez no mesmo lugar onde colocamos o comando citado a cima, devendo ficar assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

123

Page 124: 72538859 Apostila Curso Delphi

Isso somente no caso do Formulário de Customer. Deve você fazer o mesmo com os demais formulários, como mostra a ilustração a cima.

Por termos feito isso, e para continuarmos melhorando a velocidade de nosso sistema em todos os formulários de nossa aplicação devemos destruir a criação do Formulário e dos bancos de dados para estarmos sempre liberando memória na máquina de nossos clientes. Até mesmo porque, se não fizermos isto, pode ocorrer o seguinte: sempre que o usuário fechar o formulário que chamou com nossa aplicação aberta e depois fechar este formulário ele será fechado na vista de nossos clientes mas não liberará da memória e quando o usuário for abrir novamente o mesmo formulário estará criando novamente sempre que for realizando esta operação sendo assim, consumindo sempre mais memória. Então devemos destruir o formulário com o método caFree para liberar a memória sempre que os formulários forem sendo fechados.

Por isto em todos formulários de nossa aplicação, no evento OnClose devemos utilizar do comando: Action := caFree;

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

124

Page 125: 72538859 Apostila Curso Delphi

Controlando os cursores

Quando mandamos criar nossos formulários e bancos de dados em tempo de execução pode haver uma demora na abertura do formulário e precisamos informar ao usuário que é para ele esperar que está sendo executado. Uma forma de comunicar ao usuário que o formulário está sendo carregado e que é para ele esperar é mudando o cursor do mouse.

Existem diversos tipos de cursores do próprio Windows e do próprio Delphi que podemos utilizar, a baixo há uma tabela com seus valores e imagens dos cursores que podemos utilizar em nossas aplicações:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

125

Para mudarmos o cursor precisamos saber seus nomes. O que a aplicação usa sempre é o crDefaut. Vamos mudar o cursor de crDefaut para crHourglass sempre que o usuário

Page 126: 72538859 Apostila Curso Delphi

for entrar em um novo formulário em nossa aplicação e assim que o formulário e os bancos de dados forem recarregados retornar ao crDefaut.

Este procedimento vamos realizar em todas chamadas de formulário assim como fizemos para criar cada um dos formulários. O código será o seguinte:

E assim estará pronto. Talvez você não vá perceber que está funcionando porque talvez sua aplicação esteja com poucos dados o que torna esta operação muito rápida. Mas conforme seu banco de dados vá crescendo com certeza isto será muito útil.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

126

Page 127: 72538859 Apostila Curso Delphi

Toolbars

Dando continuidade às técnicas de interface, vamos agora colocar atalhos em nossa aplicação, devendo nossa aplicação ficar assim no final:

Vamos adicionar um componente TooBar da palheta de componentes Win32 em nosso formulário. Em seguida com o botão direito do mouse vamos criar 5 novos botões sendo que o ultimo será separado por um separador:

Vamos precisar colocar imagens nestes botões. Para isto coloque um componente ImageList, também da palheta de componentes Win32, em nosso formulário e vamos

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

127

Page 128: 72538859 Apostila Curso Delphi

colocar o nome deste componente como imglstMainMenu. Agora com um duplo clique sobre este botão vamos definir as imagens de cada um destes – como já apresentei este componente anteriormente vamos prosseguir. O meu eu coloquei as imagens que tenho aqui onde meu aplicativo ficou desta forma:

Agora no evento OnClick de cada um destes botões coloque as ligações que deseja para cada um deles. Aqui eu coloquei as ligações como: Botão 1 para Customers, Botão 2 para Orders, Botão 3 para Parts, Botão 4 para Suppliers e botão 5 ainda não coloquei nada.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

128

Page 129: 72538859 Apostila Curso Delphi

Hints

Podemos agora colocar Hints em cada um destes botões. Hints são pequenas ajudas que auxiliam o usuário na navegação de uma aplicação, são mensagens que informam a utilidade de um botão.

Nas propriedades de todos tipos de botões existem os Hints, basta escrever em cada um o que quer que seja mostrado ao usuário para o guiar. E definir a propriedade ShowHint para True.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

129

Page 130: 72538859 Apostila Curso Delphi

Técnicas de Interface II

Neste capítulo veremos:

Como criar aplicações MDI A distinção entre fsMDIForm e fsMDIChild Como controlar as instancias Como implementar o Windows Window Menu

Aplicações MDI

Até o momento aprendemos desenvolver aplicações SDI e MDI. Agora vou ensinar a deixar sua aplicação somente como MDI. O MDI é legal que dá uma aparência mais confortável aos usuário que podem abrir várias telas e visualizar todas sem nenhuma ou pouca dificuldade.

A propriedade FormStyle

Para definirmos nossas aplicações como MDI devemos utilizar a propriedade FormStyle. O normal é a propriedade fsNormal que cria aplicações SDI – o que fizemos o tempo todo. Para mudarmos nossas aplicações para MDI devemos mudar para fsMDIForm ou fsMDIChild em todos os formulários no método Show.

fsMDIForm

O estilo fsMDIForm cria janelas MDI pais. É muito importante saber sobre isso. Primeiro que não são todos formulários que são definidos como fsMDIForm. Devemos sempre definir o formulário principal como fsMDIForm porque assim as janelas filhas não irão sobrepor o menu nem os botões da ToolBar criados quand as janelas filhas forem maximizadas.

fsMDIChild

O fsMDIChild é a janela filha de fsMDIForm, ou seja, fsMDIChild é dependente de fsMDIForm. Devemos respeitar sempre esta regra. Em nossa aplicação devemos então agora definir a propriedade FormStyle de nosso formulário principal como fsMDIForm e os formulários restantes como fsMDIChild.

Fazendo isto podemos até eliminar o método Show para chamarmos nossos formulários. Veja o exemplo a baixo que eliminamos o método Show e deixamos somente frmSuppliers := TfrmSuppliers.Create( Application );

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

130

Page 131: 72538859 Apostila Curso Delphi

Window Menu

Agora vamos colocar controles para nossa aplicação MDI que facilitem ao usuário sua organização automática. O Windows menu possui opções típicas como title, cascate, minimize all e arrange icons para os formulários filhos. Agora nós vamos utilizar o componente TactionList.

Action Lists

Action List faz a localização para responder aos comandos do usuário, acionados pelo clique do mouse, para os objetos do menu. O componente ActionList é usado para definirmos uma lista de ações (TAction). Então coloque o componente ActionList em nosso formulário principal e vamos dar um duplo clique sobre ele:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

131

Page 132: 72538859 Apostila Curso Delphi

Nós agora temos que adicionar ações para o ActionList selecionando New Standard Action na botão toolbar, como mostra a figura:

Esta é uma caixa de dialog com uma lista de ações para escolhermos ao formulário:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

132

Page 133: 72538859 Apostila Curso Delphi

Vamos selecionar as ações de Window. Agora acabamos de criar as ações para as escolhas do menu Window.

Podemos agora selecionar cada um destas opções de ações e definir diversas propriedades em nosso Object Inspector para cada uma destas opções, deixarei livre para que você explore estas propriedades uma vez que você já possui conhecimentos para isto:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

133

Page 134: 72538859 Apostila Curso Delphi

Agora você deve editar novamente o menu e colocar as ações correspondentes para cada uma das opções, na propriedade Action do Object Inspector para cada opção de menu:

Depois que você fizer estas ligações todas modificações realizadas serão atualizadas no formulário:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

134

Page 135: 72538859 Apostila Curso Delphi

Assim, quando você for executar a sua aplicação abra diversos formulários e explore as opções do menu Window.

Agora vamos criar uma opção para fechar todos os formulários de uma vez quando o usuário assim o desejar, crie a opção Close All no menu:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

135

Page 136: 72538859 Apostila Curso Delphi

Agora precisamos criar uma ação no ActionList para fecharmos todas janelas filhas que poderão ser abertas pelo usuário. Vamos precisar criar uma nova ação no editor de ação do componente ActionList:

Com o nome de actnCloseAll:

Agora vamos colocar no evento OnExecute desta ação o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

136

Page 137: 72538859 Apostila Curso Delphi

Em seguida faça a ligação desta ação nas propriedades do Menu da opção Close All Criada, com isto o usuário poderá fechar todas janelas abertas por ele automaticamente e tudo de uma única vez. Mas para concretizarmos tudo isto sem erros devemos ainda colocar o seguinte código no evento OnUpdate da ação criada:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

137

Page 138: 72538859 Apostila Curso Delphi

Para finalizar este capítulo temos que tomar cuidados com o seguinte. O usuário não pode fechar a aplicação toda se tiver com algum formulário aberto dentro da aplicação, porque os formulários não foram destruídos, portanto precisam ser destruídos para que libere memória ao computador do usuário. Então precisamos criar uma mensagem para que o usuário feche primeiro os formulários abertos para poder sair da aplicação.

Para isso no evento OnCloseQuery do formulário principal escreva o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

138

Page 139: 72538859 Apostila Curso Delphi

Em seguida rode sua aplicação abrindo diversos formulários e tente fechar sua aplicação com os formulários abertos que deverá aparecer a mensagem: 'Cannot close application while child windows are open'. E assim encerramos este capítulo.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

139

Page 140: 72538859 Apostila Curso Delphi

Introdução ao Rave Report

A partir da versão 7 do Delphi o QuickReport deixa de existir para dar lugar ao Rave Report.

Com o Rave Report o desenvolvedor pode criar e visualizar relatórios, como era no QuickReport, mas o rave permite tanto CLX quanto VCL (plataformas Linux e Windows).

O primeiro componente da palheta Rave é o TRvProject. Este controla a impressão e visualização dos relatórios.

É com este componente que você irá trabalhar para criar o visual do seu relatório.

O Componente TRvSystem é um componente fundamental para integração e funcionalidade de um pré-visualizacão antes da impressão. É este componente que manda o relatório para impressão ou visualização. É com este componente que se faz a ligação entre os componentes TRvNDRPreview, TRvNDRPrinter e TRvNDRWriter todos fáceis de se usar.

O Componente TRvNDRWriter é usado em conjunto com os componentes TRvNDRPreview e TRvNDRPrinter.

Os próximos 4 componentes da lista são: TrvCustomConnection, TRvDataSetConnection, TRVTableConection e TRvQueryConection que são utilizados para realizar conexão a banco de dados para geração dos relatórios. Onde temos:

- TrvCustomConnection - Este componente realiza a conexão tradicional em seu danco de dados.

- TrvDataSetConnection - Seta o acesso ao banco de dados.

- TRVTableConection - Implementa a conexão ao banco de dados.

- TrvQueryConection - Faz conexão como se fosse um Querie.

Os próximos 2 componentes são:

- TrvRenderPreview - Componente que realiza os controles do preview.

- TrvRenderPreview - Componente que realiza a administração (funcionamento) do preview.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

140

Page 141: 72538859 Apostila Curso Delphi

Os quatro últimos componentes são:

- TRvRenderPDF - cria seus relatórios em formato de PDF.

- TRvRenderHTML - gera seus relatórios em HTML.

- TRvRenderRTF - Geral seus relatórios no formato Rich-Text.

- TRvRenderTEXT - Gera seus relatórios em formato de texto (ASCII).

Criando Relatórios visuais com o Rave

Podemos criar relatórios de forma visual com sua ferramenta. Assim criamos relatórios dinâmicos sem utilizar comandos.

Neste exemplo vamos iniciar uma nova aplicação. Em seguida vamos adicionar um componente ClientDataSet da palheta de componentes Data Access ao formulário, com a propriedade Name como clntDataLocal e a propriedade FileName como customer.xml e colocar a propriedade Active para True.

Localize o componente RvDataSetConnection na palheta de componentes Rave e coloque em seu formulário com as seguintes propriedades:

Name = rvDataSetLocal

DataSet = clntDataLocal

Agora para finalizar a conexão de componentes adicione o componente RvProject no formulário para iniciarmos o desenvolvimento de nosso relatório exemplo.

Clique com o botão direito sobre este componente e escolha a opção Rave Visual Designer:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

141

Page 142: 72538859 Apostila Curso Delphi

Este é o editor visual de relatórios do Rave:

Criar relatórios com o Rave é muito fácil. Uma vez dentro do editor do Rave vá ao menu do Rave em File | New Data Object.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

142

Page 143: 72538859 Apostila Curso Delphi

Com o Rave suporta diversos tipos de relacionamentos com dados, vamos especificar um tipo de dados que queremos criar.

Selecione Direct Data View e prossione o botão de Next. Em seguida você deverá especificar que tipo de conexão deseja realizar, é neste que definimos nosso componente do tipo rvDataSetLocal.

Nos é apresentado no canto direito da tela os campos desta conexão:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

143

Page 144: 72538859 Apostila Curso Delphi

Esta lista de campos está localizado em uma Tree View, na opção Data View Dictionary.

Assim podemos começar a desenvolver nossos relatórios. Vamos utilizar neste exemplo Wizard para a construção de nosso relatório exemplo. Para isso vá ao menu do Rave Tools | Report Wizards | Simple Table:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

144

Page 145: 72538859 Apostila Curso Delphi

Será apresentado a caixa de diálogo como mostra a figura a cima, com nosso DataView1 definido então clique em Next. Nesta próxima caixa de diálogos escolhemos quais campos deverão ser apresentado ao nosso relatório, que você poderá marcar ou desmarcar:

Ao clicarmos em Next será apresentado os campos selecionados com a possibilidade de alterar suas ordens para apresentação do relatório.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

145

Page 146: 72538859 Apostila Curso Delphi

Clicando no botão Next é apresentado uma caixa de diálogo que mostra e permite a criação do Título, ou não, do relatório:

Clicando em Next você pode alterar os tipos de fontes do relatório:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

146

Page 147: 72538859 Apostila Curso Delphi

Depois de alterado os tipos de fonte do relatório clicando no botão Generate você terá seu relatório pronto e poderá até fazer modificações utilizando as ferramentas de edição do Rave.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

147

Page 148: 72538859 Apostila Curso Delphi

Para vermos se nosso relatório está realmente correto podemos executar pelo próprio Rave, para isto vá ao menu File | Execute Report, deverá ser apresentado esta tela:

Nesta opção você pode imprimir, gerar uma pré-visualização ou gerar um arquivo. Selecione o Preview pois iremos apenas visualizar nosso relatório, deverá ser apresentado um preview que você poderá ver como ficou seu relatório.

Quando você gera seu relatório em Rave, são criadas propriedades exclusivas do mesmo e você precisa salvar todas estas características. Todos relatórios Rave possuem a extensão .rav. Tanto para alterar futuramente seus projetos de relatórios quanto para enviar aos clientes você precisa enviar estes arquivos .rav quando for distriubuir suas aplicações.

Gerando o Relatório no Delphi

Depois que você criou o design de seu relatório e o salvou, a forma de chamar no Delphi é muito fácil.

Vamos adicionar com componente Button ao formulário e no evento OnClick do botão escrever o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

148

Page 149: 72538859 Apostila Curso Delphi

TDataSets Avançado

Processando Transações

Temos agora a seguinte situação. Atualmente quando o usuário faz alguma modificação ao em algum registro do banco de dados este registro é alterado na hora ou quando se começa a fazer alguma alteração não tem como voltar atrás. Precisamos permitir ao usuário poder definir se aquela mudança que ele fez no registro é o que realmente quer e dar a possibilidade de voltar atrás. Neste tipo de operação é necessário utilizar controles de transação aos métodos dos objetos de banco de dados. As transações são obrigadas a iniciar no evento BeforeEdit com o método StartTransaction. É preferível segurar todas modificações para o banco de dados até que o método Commit seja usado, escrevendo todas mudanças no banco de dados ou o método Rollback para modificações pendentes.

Multi-Dataset Updates com Transações

Vamos abrir o formulário de Supplier – que já foi criado anteriormente neste treinamento – para podermos incorporar as mudanças para a realização das transações. O formulário Supplier tem uma relação entre a tabela Supplier e a tabela Inventory.

Vamos colocar no evento BeforeEdit do componente tblSupplier o código a seguir, que possibilita iniciar a transação:

Devemos agora criar um evento para aceitar a transação quando o usuário quiser salvar o que foi realizado, utilizando o método Commit. Para isso no evento AfterPost do mesmo componente iremos colocar o seguinte código:

Caso o usuário deseja cancelar as mudanças precisamos cancelar a transação com o método rollback que não salva as informações na tabela e em seguida devemos utilizar o

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

149

Page 150: 72538859 Apostila Curso Delphi

método refresh para voltar as informações anteriores ao usuário apagando as alterações por ele canceladas. Então devemos colocar no evento AfterCancel do componente o seguinte código:

Cached Updates

O Cached Updates é utilizado para que possamos habilitar ao usuário diversas possibilidades para edição de registros ou tabelas, realizando assim transações explicitas. Com isto o Delphi checa se o registro – ou registros – foram feitos e se não os atualizam.

O Dataset possui três métodos e uma propriedade para implementar o Cached Updates. A propriedade CachedUpdate é preciso estar como True para que todos os métodos tenham efeitos. Então, se o usuário desejar sempre salvar, todas mudanças precisam do método ApplyUpdate. Se o usuário desejar não salvar todas mudanças, o método CancelUpdates deve ser executado para voltar ao que era anteriormente. Se o usuário, no meio de sua edição quiser voltar ao que era anteriormente aquele campo em que ele estava editando, temos que utilizar o método RevertRecord. Neste caso, todos edits que o usuário estiver alterando voltara ao que era.

Multi-Dataset Updates com Cached Updates

Componentes TDatabase também possuem o método ApplyUpdates.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

150

Page 151: 72538859 Apostila Curso Delphi

Em nosso exemplo vamos usar na tabela pai o evento AfterPost para criar uma transação e escrever todas pendências de atualização em ambas tabelas pais e filhas. Porém, neste exemplo o método AfterPost não será usado. A razão para isto é que com o método Post é chamado para os Dataset (qryOrders) pai, e automaticamente atualiza as tabelas filhas (qryLineItems). Para isto vamos criar um novo SpeedButton em nosso formulário para postar as mudanças.

No Datamodule, vamos mudar ambos objetos query para usar o cached updates. No formulário adicione um componente SpeedButton com a propriedade name como spdbtnAppluUpdates e mude a propriedade VisibleButtons do DBNavigator para que o botão Post não seja apresentado. No evento OnClick do SpeedButton escreva o seguinte código:

Neste exemplo, o evento AfterCancel é usado para jogar fora todas mudanças de um Query. Para cancelarmos mudanças devemos, no evento AfterCancel do componente, escrever o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

151

Page 152: 72538859 Apostila Curso Delphi

Usando Componentes TUpdateSQL

Podemos fazer atualizações também com comandos SQL utilizando o componente TUpdateSQL.

Você terá com este componente três possibilidades: InsertSQL, DeleteSQL e ModifySQL. Onde você pode respectivamente: Inserir, deletar e modificar dados de TQuerys que serão voltados para o servidor. Para utilizar estas opções do componente TUpdateSQL, para a propriedade das Querys, CachedUpdates como True e RequestLive para false.

Vamos ver mais na prática. Usando o formulário Orders, vamos mudar a propriedade ResquestLive para False dos componentes qryOrders e qryLineItems.

Vamos agora adicionar dois componentes UpdateSQL com nosso DataModule com as propriedades Name como updtsqlOrders e updtsqlLineItems:

Veja que nas propriedades do componente UpdateSQL podemos escrever os códigos de SQL para cada item: DeleteSQL, InsertSQL e ModifySQL:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

152

Page 153: 72538859 Apostila Curso Delphi

Na janela a baixo é mostrado o editor onde podemos escrever as instruções em SQL para estas três propriedades:

Dando um duplo clique sobre o componente UpdateSQL teremos a seguinte caixa de diálogos, que gera os códigos em SQL, como não é nosso objetivo ensinar SQL neste treinamento, vamos aprender como utilizar esta caixa:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

153

Page 154: 72538859 Apostila Curso Delphi

Por enquanto não temos nada nesta caixa de diálogos pois precisamos fazer a ligação dos componentes UpdateSQL com os componentes Query, para isso basta setar, na propriedade UpdateObject dos Querys seus respectivos componentes UpdateSQL:

Assim, se você novamente realizar um duplo clique sobre o componente UpdateSQL encontrará a caixa de diálogos assim:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

154

Page 155: 72538859 Apostila Curso Delphi

Temos quatro botões:

Get Table Fields – Pega todos campos da tabela

Dataset Defalts – pega os campos que estão dispostos no formulário.

Select Primary Keys – Seleciona chave primária

Generate SQL – Gera rotina SQL automática para você.

Como este curso não ensina SQL você deverá sempre utilizar o botão Generate SQL para criar seus ModifySQL, InsertSQL e DeleteSQL.

Observe que clicando sobre o botão Generate SQL você gera seus códigos automaticamente já para os três items.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

155

Page 156: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

156

Page 157: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

157

Page 158: 72538859 Apostila Curso Delphi

Packages

Package é uma DLL (dynamic-link library) que inclui os códigos de um sistema. Os packages podem ser usados tanto em tempo de execução, quanto em tempo de design de nossos sistemas. Neste capítulo irei demonstrar como criar, distribuir e instalar packages no Delphi.

Podemos entender como packages, também, como se fosse um componente. Vamos entender as diferenças entre Packages em tempo de execução e em tempo de design.

Packages em tempo de execução

Temos algumas vantagens em trabalhar com packages em tempo de execução:

O compilador constrói sua aplicação mais rápido. Sua aplicação é carregada mais rápida. Reduz o espaço em disco rígido requerido. Você pode utilizar em diversos sistemas desenvolvidos por você, e sempre que

você alterar alguma coisa no sistema é alterados em todos seus sistemas e você precisa enviar ao cliente somente a package alterada. Deixa seu executável menor.

Mas sempre que você criar packages em tempo de execução é necessário levar estas aos seus clientes. Um package não acompanha os fontes.

Packages em tempo de Design

Packages em tempo de design é utilizado somente quando você está desenvolvendo suas aplicações. Não vou detalhar muito ainda pois veremos com maior clareza com a criação de exemplos.

Criação de Package

Para criar uma package, vá ao Menu File | New. Em seguida escolha “Package” da pasta “New Items”, deverá aparecer uma caixa de diálogos como esta:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

158

Page 159: 72538859 Apostila Curso Delphi

A janela de edição de Package é usado para administrar packages. Esta interface nos permite adicionar ou remover units de um package, construir a package, configurar as opções do package, administrar dependências e instalar um package.

Para salvar um package clique na opção Save.

O Delphi pedirá um nome para o arquivo de projeto (.DPK). Este deverá ser o nome do package que será criado.

Adicionando componentes

Nós vamos ver primeiro como adicionar componentes que já existem no package. Para adicionar um componente para um package, precisamos então adicionar. Clique no botão Add no editor de Package.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

159

Page 160: 72538859 Apostila Curso Delphi

Temos as seguintes páginas nesta tela:

Add Unit – Onde podemos adicionar a unit que será nosso Package.

New Component – Onde podemos criar novo componente Package.

Import ActiveX – Que podemos importar controles ActiveX para nossas aplicações.

Utilizando componentes ActiveX

Diversas aplicações que temos em nossos computadores possuem controles ActiveX. E podemos “pegar emprestado” estes controles para implementar nossas aplicações. No Delphi 7 por exemplo já existe um componente para rodar arquivos do Flash (.SWF) porém no Delphi 6 não existe componente, mas podemos utilizar componentes ActiveX do Flash para termos este componente no Delphi 6.

Geralmente existe uma lista de todos componentes ActiveX instalados em nosso computador na pasta Import ActiveX, bastando escolher o que deseja instalar e clicando em seguida sobre o botão Add.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

160

Page 161: 72538859 Apostila Curso Delphi

Adicionando Dependências (Requires)

Como já dito, um package pode depender de outros packages para que seja executado, são os Requires. Selecione a pasta requires do nosso editor de Package:

Em seguida clique sobre o botão Add:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

161

Page 162: 72538859 Apostila Curso Delphi

É nesta opção que adicionamos os Packages que poderão ser exigidos pelo packages que você possa vir instalar.

Instalando Packages

Podemos instalar packages no menu Component | Install Package que abrirá a janela Project Option from Package:

Que podemos adicionar, remover e editar packages.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

162

Page 163: 72538859 Apostila Curso Delphi

Instalando componentes

Podemos também instalar novos componentes ao Delphi, no menu Component | Install Component, que abrirá a caixa de diálogos “Install Component”:

Na aba “Into existing package” você pode instalar a unit e/ou package do componente que deseja instalar.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

163

Page 164: 72538859 Apostila Curso Delphi

Um exemplo prático

Como discutido anteriormente, packages em tempo de execução são pequenas partes de código que uma aplicação pode executar. Com isto podemos desenvolver múltiplas aplicações com um mesmo pacote deixando nossos executáveis menores.

Para entender melhor esta questão imagine o seguinte: Você tem um sistema que é dividido por módulos, estoque, clientes, caixa, bancário e outros. Você pode criar um package para cada um destes módulos.

Vamos ver por outro aspecto também, suponha-se que você trabalha com uma equipe de desenvolvedores e cada um é responsável por cada um destes módulos e para distribuir para que outros desenvolvedores aproveitem estes módulos em suas aplicações você precisa só criar um package para isto.

Para criar um novo package baseado em nosso exemplo principal, nós vamos precisar criar uma nova package. Vamos chamar esta package de “pkgDataOrderEntry.dpk”. Uma vez criado, vamos adicionar a unit DataMain.pas em nosso editor de Package:

Uma vez adicionado, vamos compilar a package. Por padrão, o arquivo DCP é gerado em um diretório padrão. Este diretório mode ser mudado nas opções do Package na pasta Directories/Conditionals. Os outros arquivos gerados deverão ficar no diretório corrente.

Nós vamos agora remover a unit DataMain de nosso projeto. Para isto abra o project manager e com o botão direito do mouse sobre a unit DataMain escolha a opção Remove From Project.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

164

Page 165: 72538859 Apostila Curso Delphi

Nós removemos o datamodule de nosso projeto, nós então removemos o datamodule. Então, nós precisamos criar a conexão de volta a este datamodule para que nosso sistema funcione novamente realizando a conexão com os bancos de dados deste datamodule. Precisamos fazer a chamada deste para podermos utilizar em nossa aplicação. Portanto no evento OnCreate do formulário principal de nossa aplicação precisamos colocar o seguinte código:

dtmdlMain := TdtmdlMain.Create(Application);

Devemos também fazer uma referencia a unit DataMain a cláusula Uses do formulário.

E assim nosso sistema volta a funcionar com seu executável menor e com a package em tempo de execução.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

165

Page 166: 72538859 Apostila Curso Delphi

Opções de distribuição usando Packages

Quando você for distribuir sua aplicação é necessário que o Package criado vá junto a sua aplicação, para isto você deve definir no Delphi a sua package libary (.BLP). Em “Project Option” (vá ao menu do Delphi Project | Option...) na pasta Packages.

Habilite a opção “Build with runtime packages” para habilitar o botão Add:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

166

Page 167: 72538859 Apostila Curso Delphi

Você também poderá mexer nos arquivos DCU que sua aplicação exige, não aconselho mexer nestes arquivos. Clique direto no botão Add:

Clique então no botão Browse para indicar o arquivo .BPL que criamos:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

167

Page 168: 72538859 Apostila Curso Delphi

E assim está pronto. Você pode compilar sua aplicação e verificar o tamanho do seu executável antes e depois de realizarmos todos estes processos e você verá que seu executável ficou menor. O que possibilita uma maior rapidez as suas aplicações.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

168

Page 169: 72538859 Apostila Curso Delphi

Threading

Introdução

Neste módulo nós vamos discutir como criar e manipular objetos thread em Object Pascal.

Para entender o que um thread é, nós precisamos primeiro entender como é seu processo.

Quando executamos uma aplicação no Windows é chamado um processo. Quando o Windows carrega um programa, um processo é criado. O processo consiste de um endereço de espaço virtual, código, dados e outras operações de recursos de sistema. Ou seja, todas aplicações executadas no Windows possui ao menos um thread.

Um processo pode conter mais de um Thread. A partir do Windows 95 foi possível a utilização de diversos Threads.

O Thread permite que o sistema realize várias tarefas ao mesmo tempo. Por isso podemos hoje abrir diversos programas no Windows que não há problemas, isso porque os Threads permitem que a cada milésimo de segundos seja realizado uma operação de cada vez sem que o usuário perceba e quando mais rápido o computador menos será visível ao usuário.

Utilidade para aplicações Muilti-Thread

Pelo motivo de VCL e outras restições, você é obrigado a ter cuidado ao decidir quais objetos você precisa criar Thread. Em nossa aplicação nós vamos agora criar um thread para executar query para atualizar dados em um database. Isso porque dependendo da quantidade de informações e processos que esta atualização pode realizar pode, com certeza demorar e precisamos permitir que o usuário realize outras operações enquanto é realizado estes processos, criando Thread.

VCL e Segurança ao usar Thread

Em uma aplicação Delphi, você não deve usar operações thread todo tempo. É preciso tomar algumas precauções em certas situações. Por exemplo, os VCL não são seguros para se utilizar thread. O uso de thread em aplicações VCL podem causar diversos erros de corrupção porque não é seguro sua utilização e pode deixar suas aplicações muito lentas. A razão para esta lentidão é que VCL não foi desenvolvido pensado-se somente no Windows mas também no Linux, que não possui as mesmas características do Windows.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

169

Page 170: 72538859 Apostila Curso Delphi

Criando Objetos Thread

Vamos criar um novo objeto thread pelo menu do Delphi File | New... | Threads Objects. E vamos chamar a “Class Name” de TmonthEndProcThread.

A Classe TThread

Em seguida será criado automaticamente o código fonte necessário para o nosso exemplo. Observe em especial o método Execute:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

170

Page 171: 72538859 Apostila Curso Delphi

O método Execute contém o código que você precisa para executar enquanto o thread começa.

Em nosso exemplo, nós vamos usar Thread para atualizar a tabela Customer. Para isso, vamos precisar que no fim do mês nós ajustamos o campo Account_Balance de Customer uma ajustação mensal na porcentagem para uma especifica nação (país). Neste exemplo então vamos adicionar um componente SpeedButton ao formulário de Customer, com a propriedade Name como spdbtnMonth e no evento OnClick do botão escreva o código a seguir:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

171

Page 172: 72538859 Apostila Curso Delphi

Neste código a cima, se o usuário responder que sim, “yes”, aparece a mensagem e a thread é criada e o parâmetro CreateSuspender é setada para True. Lembre-se, se o parâmetro CreateSuspend é True (Verdadeiro), o método Execute da Thread criada é chamada.

Bem, devemos agora antes de testar colocar um novo componente querie com o nome de qryMonthEnd em sua propriedade.

Agora mude o código de sua Thread como mostra o código a seguir:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

172

Page 173: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

173

Page 174: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

174

Page 175: 72538859 Apostila Curso Delphi

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

175

Page 176: 72538859 Apostila Curso Delphi

Aqui no método Execute nós checamos a propriedade de qryMontEnd está configurada corretamente. Se estas propriedades não estão configuradas mostra a mensagem. Se as propriedades estão todas configuradas continua a operação. Neste caso, é continuado utilizando três procedures: GetNations, GenerateUpdateQuery e ApplyMonthEnd.

A procedure GetNations é usado para pegar uma lista de todas nações em uso para nossa tabela Customer..

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

176

Page 177: 72538859 Apostila Curso Delphi

Então ele seta na propriedade SQL de qryMonthEnd o código SQL:

select distinct Nation from Customer

O resultado deste código é usado no TstringList, com o nome de strnglstNations, e então o qryMonthEnd é fechado.

Com isto temos a lista de nações, nós vamos atualizar o campo account balance da tabela Customer. Para isso, nós primeiro temos que criar os códigos para realizar este update. A procedure GenerateUpdateQuery tem este propósito:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

177

Page 178: 72538859 Apostila Curso Delphi

A Query a cima tem dois parâmetros: Fee e Nation. A procedure UpdateNation verifica estes parâmetros depois que a query é executada. A procedures ApplyMonthEnd chama a procedure UpdateNation em um loop. Basicamente, para todas nações na strnglstNation, Isto para executarmos o código SQL para os corretas Nation e Fee.

A função MonthEndFee é usado na procedure UpdateNation para determinar o parâmetro Fee usado em cada nação:

Assim quando você executar a aplicação e mandar realizar esta atualização você poderá facilmente mover ou fazer qualquer outra coisa enquanto é executado esta atualização.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

178

Page 179: 72538859 Apostila Curso Delphi

Criando componentes em tempo de execução

O Delphi permite que você crie componentes em tempo de execução, assim como em tempo de design. Todo componente que você coloca no formulário é criado em tempo de design, todo o componente que você coloca no formulário que você não tenha colocado no formulário quando desenvolveu em tempo de design é em run-time (tempo real). O Delphi permite que você crie componentes dinamicamente se desejar. Neste capítulo vamos ilustrar com alguns exemplos pequenos sobre como fazer isto e um exemplo que cria componentes em tempo de execução conforme for a condição.

Testando componentes depois de instalados

Componentes tem essencialmente duas interfaces: Interface de desenvolvimento (ou design) e interface de aplicações em tempo real (enquanto a aplicação é rodada). No decorrer deste capítulo você aprenderá a criar componentes em run-time (Tempo de execução).

Criando componentes em Tempo de Execução

Para que você entenda melhor este assunto vamos explicar na prática as teorias. Observe a sintaxe que precisaríamos para criar um componente Timer em tempo de execução:

TmrClock := TTimer.Create( self );

Onde temos:

TmrClock seria a propriedade Name do componente Timer.

:= TTimer.Create( self ); que informa que o TmrClock é o componente Ttimer e manda criar este componente e self é o parâmetro usado para definir que este é um objeto a ser criado.

Sempre vamos utilizar self quando quisermos criar nossos componentes em tempo de execução.

Vamos nos aprofundar ainda mais.

Para componentes não visuais (como o componente Timer) você precisa somente chamar o construtor. Porém para componentes visuais (como um componente de botão) você precisa definir a propriedade pai7 (Parent).

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

179

7 Propriedade pai – Por exemplo, se você colocar um componente Panel em seu formulário ele será o pai de todos outros componentes que forem anexados a ele, que serão os filhos do Panel. Assim como o pai do Panel é o formulário.

Page 180: 72538859 Apostila Curso Delphi

Para criar um componente é preciso que você defina suas propriedades (é opcional definir a propriedade pai) no código. Em um novo formulário coloque um componente Panel com as propriedades:

Name = pnlContainer e Align = alClient.

No evento OnCreate do formulário escreva o seguinte código:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

180

Page 181: 72538859 Apostila Curso Delphi

Esta figura mostra nossa aplicação sendo rodada:

Muito bem, criamos o botão, agora precisamos determinar alguma função para ele pois por enquanto só está sendo apresentado em nosso formulário. Como é um botão que é

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

181

Page 182: 72538859 Apostila Curso Delphi

criado em tempo de execução, não o Object Inspector para mudarmos suas propriedade e eventos, então devemos continuar escrevendo código para ele.

Primeiro criamos o evento OnClick para o botão, declarando como público:

Em seguida adicionamos o comando a baixo para definirmos que o evento OnClick do botão será esta variável publica que foi criada:

OnClick := ButtonClick

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

182

Page 183: 72538859 Apostila Curso Delphi

Em seguida criamos a rotina para o evento OnClick do botão criado até agora:

Se rodarmos nossa aplicação, além de ser mostrado o componente se você clicar sobre o botão será apresentado a mensagem:

Assim você criou sua primeira aplicação com componentes em run-time. Vamos agora evoluir um pouco mais em nossos estudos e vamos aplicar isto a banco de dados.

Imagine a seguinte situação: Você precisa criar um formulário que mostre somente os países cadastrados em um banco de dados, sendo estes países botões e você não sabe

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

183

Page 184: 72538859 Apostila Curso Delphi

quais paises existem nos bancos de dados, e listar uma somatória referente a cada um dos países que será selecionado pelo usuário em tempo de execução. Como você não sabe quais países existem cadastrados – e nem te interessa saber – você tem que criar em tempo de execução botões que representem estes países e a cada clique em um destes botões deverá ser apresentado um relatório das somatórias de cada pais.

Para exemplificar, vamos agora criar este exemplo em um novo formulário, com botões que representem os países cadastrados na tabela de customer. O grid a esquerda lista as nações achadas na tabela de customer com um total, assim:

Para montar este exemplo você irá adicionar um componente ScrollBox com as propriedades: Name = scrlbxButtons e Align = alLeft.

Colocar um componente Panel, com a propriedade Align = alClient.

Um componente DBNavigator com a propriedade Align = alTop.

Um componente DBGrid com a propriedade Align = alClient.

Em seguida você deve adicionar dois componentes Query, sendo o primeiro com o nome de qryNations, a propriedade DatabaseName definir o nosso Alias padrão e na caixa de edição da propriedade SQL deste componente escrever a seguinte sintaxe:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

184

Page 185: 72538859 Apostila Curso Delphi

Nesta sintaxe em SQL estou pedindo que selecione as nações sem repetição de nome da tabela customer em ordem alfabética.

O segundo componente Query com o nome de qryTotals, a propriedade DatabaseName definir o nosso Alias padrão e na caixa de edição da propriedade SQL deste componente escrever a seguinte sintaxe:

Nesta sintaxe em SQL estou pedindo que faça uma somatória geral do campo Total_Price de cada nação.

Em seguida adicione um componente DataSource e defina a propriedade DataSet deste componente para qryTotals.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

185

Page 186: 72538859 Apostila Curso Delphi

Na propriedade DataSource dos componentes DBGrid e DBNavigator defina o nosso DataSource.

No evento OnCreate do formulário coloque a seguinte sintaxe:

Lembro que você deve definir a cláusula uses e a variável publica para habilitar o evento OnClick de cada componente de botão que será criado:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

186

Page 187: 72538859 Apostila Curso Delphi

E antes da procedure que cria os botões é necessário também definir as variáveis de localização dos botões para que a rotina funcione perfeitamente.

Agora precisamos criar os eventos OnClick de cada um dos botões, escrevendo em seguida:

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

187

Page 188: 72538859 Apostila Curso Delphi

E assim temos nossa aplicação pronta.

Ramos da Informática – Todos direitos reservados. www.ramosdainformatica.com.br

188