Вы находитесь на странице: 1из 74

Todos os direitos reservados e protegidos pela Lei 5.988 de 14/12/73.

Nenhuma parte deste livro, sem prvia autorizao por escrito de Jos Arnaldo Rodrigues Informtica ME (Celta Informtica), poder ser reproduzida total ou parcialmente, por qualquer processo, eletrnico, fotocpia, mecnico ou sistema de processamento de dados.0

SUMRIO

DELPHI 4.0 - AVANADO...................................................................................................................1 BANCO DE DADOS...............................................................................................................................2


COMPONENTES DE ACESSO A BANCO DE DADOS................................................................................................................. 2 COMPONENTES DE VISUALIZAO DE DADOS..................................................................................................................... 3 EXEMPLO: SISTEMA DE VENDA.......................................................................................................................................... 3 DBEdit - DBText................................................................................................................................................ 8 BDGrid............................................................................................................................................................... 9 DBNavigator....................................................................................................................................................... 9 Edio de Campos........................................................................................................................................... 10

SQL (STRUCTURED QUERY LANGUAGE)..................................................................................15


Exemplo para Pesquisa................................................................................................................................... 15 Sistema de Vendas com Pesquisa.................................................................................................................. 19 RELATRIOS.................................................................................................................................................................... 25 Construo do Relatrio.................................................................................................................................. 27 Valores Calculados.......................................................................................................................................... 31

AMBIENTE CLIENTE / SERVIDOR................................................................................................34


EXEMPLO........................................................................................................................................................................ 38 Construindo o Banco de Dados....................................................................................................................... 40 Construindo o Aplicativo.................................................................................................................................. 45

CRIAO DE COMPONENTES.......................................................................................................54
OBJETO TSOBREBTN....................................................................................................................................................... 54 Construo do boto SobreBtn........................................................................................................................ 54 Teste do Boto SobreBtn................................................................................................................................. 59 OBJETO TCALC............................................................................................................................................................... 60 Construo do TCalc....................................................................................................................................... 60 Teste do TCalc................................................................................................................................................. 62 COMPONENTES ACTIVEX................................................................................................................................................. 63 Componente SobreBtnX.................................................................................................................................. 63 FORMULRIO ACTIVEX.................................................................................................................................................... 66

LISTA DE EXERCCIO......................................................................................................................70

DELPHI 4 - Avanado

DELPHI 4.0 - AVANADO


Neste curso iremos trabalhar com controles de banco de dados, linguagem SQL (Structure Query Language), construo de objetos nativos, objetos ActiveX e construo de pginas WEB. Indo um pouco mais a fundo na linguagem Delphi. Os controles de manipulao de banco de dados incorporados ao Delphi, permitem a construo de aplicativos que utilizam banco de dados, de uma maneira bem rpida - quase sem o uso de linhas de cdigo. Alterando apenas algumas propriedades destes controles, podemos construir aplicativos simples, como veremos mais adiante. A linguagem SQL foi desenvolvida para efetuarmos pesquisas em banco de dados relacionais. uma linguagem de alto nvel onde, o que queremos extrair do BD, informado ao gerenciador de banco de dados como se falssemos com um chefe de arquivos. O Delphi uma linguagem orientada a objetos, onde podemos criar nossos prprios controles e objetos a partir de outros objetos preexistentes na biblioteca do Delphi, ou criados anteriormente por ns mesmos. Criando controles personalizados, o programador otimiza a construo de aplicativos, economizando na construo de rotinas repetitivas. A tecnologia ActiveX foi criada para permitir o uso de um componente criado em uma determinada linguagem em qualquer outro ambiente de processamento compatvel com esta tecnologia. Permitindo o uso destes componentes na criao de pginas da WEB ou em outros ambientes de desenvolvimento.

Pgina: 1

DELPHI 4 - Avanado

BANCO DE DADOS Componentes de Acesso a Banco de Dados


Os componentes mais utilizados so o TDatabase, TTable, TQuery e TDataSource. Todos eles permitem uma conexo do aplicativo com o BD, servindo de interface. O TDatabase utilizado quando se utiliza um banco de dados remoto em um servidor, e se quer ter uma conexo permanente entre o aplicativo e este servidor. Em alguns momentos do aplicativo as tabelas so abertas ou fechadas, caso o TDatabase no seja utilizado para manter constante a conexo com o servidor, a abertura de tabelas pode consumir um certo tempo para realizar-se. O TTable simboliza uma tabela no BD, proporcionando uma conexo entre o formulrio e o BD. Atravs deste componente visualizamos os registros de uma tabela utilizando um ndice, podendo ou no limitar os registros em subconjuntos. O componente TQuery permite a utilizao da linguagem SQL para pesquisarmos registros em uma ou vrias tabelas relacionadas, ele possui vrios mtodos e propriedades semelhantes ao TTable. O TDataSource faz a ligao entre os controles vistos anteriormente e os controles de visualizao de dados do formulrio. A figura abaixo mostra esquematicamente as ligaes entre o BD e os controles no formulrio.

Pgina: 2

DELPHI 4 - Avanado

Componentes de Visualizao de Dados


Estes componentes so semelhantes aos apresentados na paleta standard da barra de ferramentas, e possuem propriedades que os ligam campos, tabelas ou consultas em um banco de dados. Os mais comuns so: DBGrid, DBText, DBEdit, DBMemo, DBLookupList, DBLookupCombo e DBNavigator. Os DBLookupList e DBLookupCombo, so quadros de lista onde os itens apresentados na lista pertencem a um determinado campo de uma tabela, mas o item selecionado neles ser atribudo a um campo de outra tabela. O DBNavigator um conjunto de botes que permitem a navegao entre registros de uma tabela ou pesquisa.

Com o controle DBNavigator podemos trabalhar em uma tabela sem a necessidade de construo de nenhuma linha de cdigo, ou ento podemos oper-lo atravs de botes colocados no formulrio chamando o mtodo BtnClick.

Exemplo: Sistema de Venda


Este exemplo utiliza as tabelas Customer.db, Orders.db, Items.db e Parts.db fornecidas junto com o Delphi, que esto na pasta ...\Arquivos comuns\Borland Shared\Data . Ns desenvolveremos um programa simples para a rotina de vendas, com pesquisas e relatrios. Utilizaremos apenas alguns campos destas tabelas para o desenvolvimento deste aplicativo. A figura a seguir mostra as tabelas e seus relacionamentos.

Pgina: 3

DELPHI 4 - Avanado

Comece a construo do formulrio inserindo um PageControl e defina a propriedade Align:=alClient. Depois clique com o boto direito do mouse e escolha New Page para adicionar uma pgina.

Altere o Caption para Clientes, insira mais uma pgina para Vendas. construo, at o formulrio se parecer com as figuras a seguir.

Continue a

Pgina: 4

DELPHI 4 - Avanado

Os controles de acesso ao BD podem ser colocados diretamente no formulrio que os utiliza, mas quando queremos que outro formulrio acesse os mesmos controles, o programa comea a complicar-se. Esta complicao minimizada com a incluso no projeto de um formulrio do tipo Data Module. No menu File|New, escolha um Data Module, este formulrio ir conter todos os controles de banco de dados que podero se acessados por todas as outras Units do projeto.

Pgina: 5

DELPHI 4 - Avanado

D a este formulrio o nome de FrmControles e coloque os controles para acessar o BD, definindo os Names de acordo com a figura.

Os componentes TTable ligam-se com o BD atravs das propriedades DatabaseName e TableName. A propriedade DatabaseName define o caminho do diretrio que contm os arquivos das tabelas ou um Alias do BD. Ns utilizaremos o Banco de dados DBDEMOS Pgina: 6

DELPHI 4 - Avanado

como valor da propriedade DatabaseName de todos os TTable. Selecione, ao mesmo tempo, todos os componentes TTable para alterar a propriedade DatabasName de uma s vez para todos. Criamos um novo Alias, utilizando a opo Tools | Alias Manager do programa Database Desktop que acompanha o Delphi4. A tabela a seguir mostra os valores da propriedade TableName dos controles TTable.

Name
TblClientes TblVendas TblItens TblProdutos

TableName
Customer.db Orders.db Items.db Parts.db

O controle DataSouce realiza uma ligao entre o TTable e os controles de exibio, portanto, deveremos indicar na propriedade DataSet qual a tabela que estar ligada ao DataSource. A tabela seguinte mostra a definio das propriedades.

Name
SrcClientes SrcVendas SrcItens SrcProdutos

DataSet
TblClientes TblVendas TblItens TblProdutos

Salve o projeto como ProcVendas.dpr e as unidades como Venda.pas e Controle.pas. Volte ao formulrio principal, e no menu escolha File | Use Unit..., selecionando ento a unidade Controle, para que o formulrio principal possa usar os controles de acesso ao BD do Data Module. Este procedimento inclui o Data Module Controles na seo uses da implementao da unidade Venda.

Agora que temos os controles de acesso a banco de dados configurados, poderemos alterar as propriedades dos controles de exibio.

Pgina: 7

DELPHI 4 - Avanado

DBEdit - DBText
O DBEdit um controle que exibe o valor de um campo do registro corrente de uma tabela. As propriedades que realizam esta ligao so: DataSource e DataField. DataSource informa qual TDataSource estar conectado ao DBEdit, e DataField contm o nome do campo que ser exibido. A diferena entre o DBEdit e DBText, que o DBText no permite alterao em seu contedo, ou seja, um controle apenas de exibio. Altere as propriedades destes componentes de acordo com as tabelas Customer.db e Orders.db. Os Names so mostrados nas figuras a seguir.

Pgina: 8

DELPHI 4 - Avanado

BDGrid
Este controle exibe os registros de uma tabela ou consulta, permitindo a visualizao de vrios campos ao mesmo tempo, em uma forma tabular. Ele ligado a uma tabela atravs da propriedade DataSource, que dever conter o nome do componente TDataSource ligado tabela que desejamos visualizar. Defina a propriedade DataSource:=FrmControles.SrcItens, para o DBGrid da pgina Vendas. Este DBGrid ir exibir os itens que compem a venda selecionada.

DBNavigator
Com o DBNavigator poderemos navegar entre os registros das tabelas de clientes e vendas, alterando ou editando o contedo destas tabelas. Para conectar o DBNavigator a uma tabela, utilize a propriedade DataSource ligando-o a um TDataSource, em nosso projeto defina DataSource:=FrmControles.SrcClientes e DataSource:=FrmControles.SrcVendas para estes controles das pginas Clientes e Vendas respectivamente. A propriedade VisibleButtons do DBNavigator permite a escolha de quais botes sero exibidos ao usurio. Na pgina vendas, ser permitido ao usurio apenas mover-se e adicionar um outro registro de venda, para esconder os outros botes do DBNavigator de vendas, d um duplo clique na propriedade VisibleButtons e faa as alteraes de acordo com a figura a seguir.

Compile e execute o programa, observando que os DBEdit no possuem nenhuma informao e os DBNavigator esto desabilitados. Isto ocorre porque os componentes TTable esto desativados. Para ativ-los, pare a execuo do programa e defina a propriedade Active para True, ao fazer isto, o primeiro registro de cada tabela ser mostrado nos controles de exibio sem no entanto estarem disponveis para manipulao. Execute novamente o programa e teste as possibilidades de edio e criao de registros. Acabamos de construir um simples manipulador de BD sem nenhuma linha de cdigo. Mas no muito operacional pois as tabelas ainda no esto relacionadas, ou seja, quando Pgina: 9

DELPHI 4 - Avanado

selecionamos um cliente, gostaramos que somente as vendas efetuadas para ele fossem exibidas na pgina vendas, e os itens exibidos pertencessem a esta venda em particular. Para criar vnculos um-para-muitos, devemos alterar as propriedades MasterSource e MasterFields da tabela de detalhes, vinculando os ndices de duas tabelas - detalhe e master. Selecione o componente TblVendas e defina MasterSource:=SrcClientes . D um clique na reticncias da propriedade MasterFields exibindo a caixa de dilogo Field Link Designer.

Procure um ndice comum s duas tabelas, selecione os campos correspondentes, adicione e confirme o relacionamento.

Faa o mesmo para a tabela Itens, definindo-a como detalhe de Vendas, escolhendo o campo OrderNo como ligao.

Edio de Campos

Pgina: 10

DELPHI 4 - Avanado

Quando configuramos um objeto TTable , o Delphi incorpora todos os campos da tabela a este objeto, mas nem sempre ns queremos exibir todos os campos. Vemos que no Grid da pgina de Vendas a coluna OrderNo est sendo redundante pois apresenta em todas as linhas o mesmo valor, portanto poderemos otimizar a apresentao, no exibindo esta coluna. O Delphi possui um editor de campos (fields editor) para as tabelas, para acess-lo d um clique com o boto direito na tabela que se deseja editar. No nosso exemplo, vamos editar a tabela Itens.

No Fields Editor, pressione o boto direito do mouse novamente, para adicionar os campos OrderNo, ItemNo, PartNo e Qty, da tabela Items.db.

Note que o campo OrderNo deve ser inserido, pois ele pertence vinculao entre tabelas. Para ele no ser mostrado no Grid, deveremos alterar a propriedade Visible:=False deste Pgina: 11

DELPHI 4 - Avanado

campo, selecione o campo OrderNo no Fields Editor, e na Object Inspector faa a alterao.

Para limitar e/ou auxiliar o que os usurios iro digitar no DBEdit relativo a um campo de tabela, ns configuramos a propriedade EditMask deste campo. Esta propriedade cria uma mscara de entrada de dados formatando os dados que sero inseridos na tabela. Adicione apenas os campos da tabela Vendas usados neste programa, como foi feito anteriormente com a tabela Items, e selecione o campo SaleDate e no Object Inspector, clique na propriedade EditMask abrindo a caixa de dilogo Input Mask Editor.

Quando escolhemos um formato preexistente, o Delphi preenche automaticamente o quadro Input Mask, mas esta configurao pode ser alterada de vrias formas. Consulte no Delphi Help o item TCustomMaskEdit,EditMask onde so descritos os caracteres de controle para a mscara. A tabela Customer.db possui dois ndices - ByCustNo e ByCompany, que servem como ordenadores de exibio dos registros, para alterarmos a ordem de exibio, deveremos mudar a propriedade IndexName desta tabela, e isto pode ser feito durante a execuo do programa. Pgina: 12

DELPHI 4 - Avanado

Adicione dois botes de comando pgina Clientes - Por Nomes e Por Cdigo, e digite as seguintes linhas para o evento OnClick destes botes: procedure TForm1.BtnPorNomeClick(Sender: TObject); begin FrmControles.TblClientes.IndexName:='ByCompany'; end; procedure TForm1.BtnPorCodigoClick(Sender: TObject); begin FrmControles.TblClientes.IndexName:=''; end; Para pesquisar os clientes, iremos construir outro formulrio com um componente DBLookupListbox e um Boto de comando para fech-lo. O DBLookupListbox, funciona semelhante a um quadro de lista com a diferena de poder acessar os dados de uma tabela e incorpor-los em outra para determinado campo. Controlamos este componente atravs das seguintes propriedades: Propriedade DataSource DataField ListSource ListField KeyField Descrio DataSource de destino dos dados Campo de trabalho DataSource da tabela de consulta Campo que ser exibido na lista Campo chave de ligao entre as tabelas

Adicione ao projeto um novo formulrio, colocando um TButton e um DBLookupListbox. Inserindo tambm um boto para abrir este novo formulrio na pgina clientes. Faa que este formulrio tambm tenha acesso aos controles do FrmControles.

Como o DBLookupListbox ir trabalhar somente com a tabela clientes, deveremos alterar apenas as seguintes propriedades: KeyField:= CustNo ListField:= Company ListSource:= ControlesFrm.ClientesSrc

Pgina: 13

DELPHI 4 - Avanado

Aps estas alteraes, o quadro de lista estar exibindo os nomes das companhias (clientes) na ordem do ndice ativo - por nome ou por cdigo. Quando o usurio selecionar um cliente, automaticamente sero exibidos os seus dados na pgina clientes.

Insira mais um formulrio no projeto, semelhante ao Seleo de Clientes, para pesquisar produtos a serem vendidos e incorporados tabela Items.db. E tambm um boto no formulrio Vendas para abrir esta procura. O DBLookupListbox deste formulrio ir trabalhar com duas tabelas, uma para a seleo do campo e outra para receber o campo selecionado. Altere as seguintes propriedades: DataField:= PartNo DataSource:= ControlesFrm.ItensSrc KeyField:= PartNo ListField:= Description ListSource:= ControlesFrm.ProdutosSrc A figura a seguir mostra o formulrio Seleo de Produtos pronto:

Pgina: 14

DELPHI 4 - Avanado

SQL (Structured Query Language)


A SQL ou Linguagem Estruturada de Pesquisa, uma linguagem universal para a manipulao de informaes em banco de dados. Os mtodos de acesso aos registros utilizados pelo componente TTable so bons para pesquisas simples em registros, no sendo to bons para pesquisas complicadas de tomada de decises. Para usarmos informaes em banco de dados de uma forma mais eficiente, deveremos chamar os dados de maneiras diferentes, combinar dados de vrias tabelas, aplicando restries e resumir grandes volumes de dados em poucos nmeros significativos. O modo mais fcil de fazer isto utilizando a SQL. A SQL uma linguagem no procedural, ou seja, no possui procedimentos ou funes para realizar tarefas. Neste tipo de linguagem ns informamos o que queremos, e no como faz-lo. No Delphi utilizamos a SQL atravs do componente TQuery, nele h uma propriedade onde determinada a linha de instruo SQL desejada.

Exemplo para Pesquisa


Para entendermos melhor o funcionamento do TQuery e da SQL, vamos construir um simples programa para teste e pesquisa utilizando instrues SQL. Inicie um novo projeto, colocando no formulrio um DBGrid um TQuery e um TDataSource. Defina as seguintes propriedades do TQuery: DatabaseName := DBDemos SQL := SELECT * FROM Customer.db Active := True

Altere as propriedades dos outros controles determinando as ligaes entre eles, ficando o formulrio conforme a figura a seguir.

Pgina: 15

DELPHI 4 - Avanado

A instruo SQL que iremos utilizar das mais simples, ela solicitar todos os registros e campos da tabela Customer.db. Esta consulta de seleo extrai o contedo da tabela e coloca-o no DBGrid, sempre que queremos realizar uma instruo de seleo, usamos o verbo SELECT seguido de uma lista de campos. A palavra FROM especifica quais ou qual tabela estes campos pertencem. Altere a propriedade SQL do Query1 para: SELECT Company,City FROM 'Customer.db' , observe que apenas os campos Company e City so exibidos do BDGrid.

Uma instruo SQL possui as seguintes palavras chaves: Instrues Funes agregadas Clusulas Operadores Select, UpDate, Insert, Delete SUM, AVG, MIN, MAX, COUNT From, Where, Order By, Group By, Having +, -, *, /, =, <, >, <> Is, Null, And, Or, Not

Pgina: 16

DELPHI 4 - Avanado

Podemos tambm alterar a propriedade SQL de um componente Tquery em tempo de execuo, mudando a pesquisa enquanto o programa executado. Inclua neste formulrio um boto para abrir uma caixa de dilogo, onde o usurio escrever uma instruo SQL. E digite o seguinte cdigo para o evento OnClick deste boto:
implementation {$R *.DFM} var InstrucSQL: String; procedure TForm1.BtnSQLClick(Sender: TObject); var Ok: Boolean; begin InstrucSQL:=''; Ok:=InputQuery('SQL','Entre com uma instruo SQL',InstrucSQL); if Ok then begin With Query do begin Close; SQL.Clear; SQL.Add(InstrucSQL); Open; end; end; end;

Nesta listagem, definimos a varivel InstrucSQL para conter o retorno da InputQuery. Se o usurio pressionar o boto Ok, o que ele digitou estar nesta varivel. Para alterar a propriedade SQL de um Query, devemos primeiro fech-lo, limpar a propriedade, e s ento atualizar a Instruo SQL. Os operados SQL listados na tabela de palavras chaves, so usados para restringir as informaes exibidas no BDGrid. Por exemplo, se estivermos interessados apenas nos clientes que residam em determinado estado, utilizamos a seguinte instruo:

Pgina: 17

DELPHI 4 - Avanado

Poderemos pesquisar tambm vendas abaixo de um determinado valor: SQL:= SELECT OrderNo, CustoNo, ItemsTotal FROM Orders WHERE ItemsTotal < 3000 Nesta instruo sero exibidos os campos OrderNo, CustoNo, ItemsTotal apenas dos registros que possurem o valor do campo ItemsTotal menor que 3000.

Funes Agregadas COUNT (nome do campo) MAX ( nome do campo) MIN ( nome do campo) SUM ( nome do campo) AVG ( nome do campo) Retorna o nmero de linhas nas quais o nome de campo no nulo Retorna o valor do maior campo na tabela Retorna o valor do menor campo na tabela Retorna o valor total do campo na tabela Retorna a mdia aritmtica dos valores do campo na tabela

Para retornar o nmero de pedidos por cliente use: SQL:= SELECT CustNo, COUNT(OrderNo) as Vendas FROM Orders GROUP BY CustNo Nesta declarao, estamos incluindo o campo calculado Vendas. A legenda Vendas aparecer no DBGrid indicando o nmero de vendas para cada cliente da tabela Orders.db. A clusula GROUP BY diz ao compilador SQL para agrupar os resultados pelo nmero do cliente - CustNo. Podemos tambm retornar apenas um registro, com os valores mdios das vendas: SQL: SELECT AVG(ItemsTotal) as Mdia FROM Orders Junes entre Tabelas Pgina: 18

DELPHI 4 - Avanado

At agora vimos instrues SQL apenas para uma tabela, para realizar pesquisa em vrias tabelas, utilizamos as junes. Para unirmos duas ou mais tabelas, estas devem possuir dois campos de mesmo nome e que estejam relacionados. Por exemplo, queremos verificar as vendas de cada cliente, exibindo o nome deste cliente e no o seu cdigo. SQL: SELECT C.Company, O.OrderNo FROM Customer C, Orders O WHERE C.CustNo = O.CustNo ORDER BY C.Company Esta instruo utiliza as Letra C e O como abreviao do nome das tabelas Customer e Orders respectivamente. Note que devemos informar qual ser o campo de relacionamento entre as tabelas - WHERE C.CustNo = O.CustNo. Podemos atravs do SQL realizar pesquisas bastante complexas sem a necessidade de linhas de cdigos enormes, usando uma linguagem bem parecida com a nossa linguagem falada.

Sistema de Vendas com Pesquisa


Abra novamente o projeto Processo de Vendas e inclua no formulrio principal mais uma pgina com o ttulo Pesquisa, e trs botes de comando conforme a figura a seguir, e tambm um Query e outro Data Source no formulrio FrmControle que sero os responsveis pela pesquisa dos botes.

Pgina: 19

DELPHI 4 - Avanado

TQuery Active DatabaseName Name TDataSource DataSet Name QryPesquisa SrcPesquisa True DBDemos QryPesquisa

Digite o cdigo a seguir para os trs botes:


procedure TForm1.BtnVendasClick(Sender: TObject); begin with FrmControles.QryPesquisa do begin Close; SQL.Clear; SQL.Add('SELECT C.Company, O.OrderNo, I.PartNo '); SQL.Add('FROM Customer C, Orders O, Items I '); SQL.Add('WHERE O.CustNo=C.CustNo AND O.OrderNo=I.OrderNo '); SQL.Add('ORDER BY C.Company'); Open; end; end; procedure TForm1.BtnVendasMenoresClick(Sender: TObject); var Ok: boolean; Valor: string ; begin Ok:= InputQuery('SQL','Entre com a valor de partida',Valor); if Ok then with FrmControles.QryPesquisa do begin Close; SQL.Clear; SQL.Add('SELECT C.Company, O.OrderNo, I.PartNo '); SQL.Add('FROM Customer C, Orders O, Items I '); SQL.Add('WHERE O.CustNo=C.CustNo AND O.ItemsTotal <'); SQL.Add(Valor + ' ORDER BY C.Company'); Open; end; end; procedure TForm1.BtnVendasPecasClick(Sender: TObject); begin with FrmControles.QryPesquisa do begin Close; SQL.Clear; SQL.Add('SELECT P.PartNo, I.Qty, C.Company, O.OrderNo '); SQL.Add('FROM Customer C,Orders O, Items I, Parts P '); SQL.Add('WHERE O.CustNo=C.CustNo AND O.OrderNo=I.OrderNo '); SQL.Add('AND I.PartNo=P.PartNo ORDER BY P.PartNo'); Open; end; end;

Pgina: 20

DELPHI 4 - Avanado

Todas as instrues SQL do exemplo acima foram vistas nos exemplos anteriores. Merece um destaque a declarao para o boto BtnPecas que associa as quatro tabelas do banco de dados. Para incrementar mais um pouco nosso projeto, vamos fazer com que o Grid da pgina Vendas seja um pouco mais realista exibindo dados das tabelas Items e Parts. Nesse Grid ser mostrado o resultado de uma pesquisa realizada em trs tabelas - Items, Parts e Orders - associadas, apesar de exibir dados de apenas duas - Items e Parts. Inicie inserindo no DataModule um componente Query e outro DataSource, definindo suas propriedades seguindo a tabela: TQuery DatabaseName DataSource Name TdataSource DataSet Name QryFatura SrcFatura DBDemos SrcVendas QryFatura

A propriedade SQL do TQuery far a juno entre as tabelas Items e Parts, selecionando os campos a serem exibidos no Grid, e ser: SELECT I.ItemNo, I.PartNo, P.Description, I.Qty, P.ListPrice FROM Items I, Parts P WHERE I.PartNo=P.PartNo AND OrderNo=:OrderNo A juno com a terceira tabela - Orders - realizada atravs da propriedade DataSource do TQuery. Esta propriedade indica o local de onde a instruo SQL ir retirar o parmetro OrderNo - ... AND OrderNo=:OrderNo. A instruo SQL parametrizada usada para que sejam exibidos somente os itens pertencentes venda corrente, caso no utilize este parmetro, o componente Grid exibir todas as vendas juntamente com seus itens. Agora altere a propriedade DataSource:=SrcFatura do Grid para ele exibir dados do Query Fatura. Mesmo aps esta alterao, o Grid est mostrando os campos anteriores esta mudana. Para alterar os campos mostrados por ele, d um clique-direito em cima do DBGrid para abrir a Columns Editor.

Pgina: 21

DELPHI 4 - Avanado

Para adicionar um campo clique no boto indicado na figura anterior, selecionando a coluna criada (0 - Tcolumn), e na Object Inspector defina o nome do campo associado esta coluna.

Faa o mesmo para as outras colunas, at Columns Editor se parecer com a figura a seguir. Ou e voc preferir poder incluir todos de uma s vez clicando no boto Add All Fields.

Para alterar o ttulo de cada coluno do Grid, altere a propriedade Caption da propriedade Title de cada campo. A figura a seguir mostra a alterao para o campo Description.

Para completar o Grid est faltando um campo com o total da linha. Como este campo no est presente em nenhuma tabela deveremos criar um campo calculado. Um campo calculado criado dinamicamente enquanto o programa executado. Para inserirmos a coluna no Grid relativa a um campo calculado, deveremos primeiro criar este campo no Query QryFatura. Pgina: 22

DELPHI 4 - Avanado

Abra o Fields Editor para o Query QryFatura e inclua todos os campos disponveis para este objeto, e depois, escolha a opo New Field... do menu de atalho. Na caixa de dilogo New Field, copie as definies do novo campo de acordo com figura a seguir. Ele dever ser do tipo Currency e Calculado.

Feche esta janela e inclua a nova coluna no DBGrid e altere as legendas das colunas, para ficar semelhante figura abaixo:

O campo calculado tem seu valor definido a partir de linhas de cdigo associadas ao evento OnCalcFields do objeto que ele pertence. Este evento ocorre toda vez que os campos calculados precisam ser atualizados. Selecione o Query QryFatura e no Oject Inpector, v para a pgina Events dando um duplo clique no evento OnCalcFields. Digite o seguinte cdigo:
procedure TFrmControles.QryFaturaCalcFields(DataSet: TDataSet); begin QryFaturaTotalLinha.Value:=QryFaturaQty.Value * QryFaturaListPrice.Value; end;

Esta linha de cdigo atribui o resultado da multiplicao entre os valores dos campos Qty e ListPrice, ao valor do campo TotalLinha. Quando o programa for executado, o Grid ficar semelhante figura abaixo:

Pgina: 23

DELPHI 4 - Avanado

Parmetros Os parmetros so utilizados para determinar que filtro ser utilizado ou que clculo fazer para a pesquisa. Estes parmetros podem ser configurados atravs da propriedade Params do componente Query. Um parmetro determinado, colocando antes dele o sinal de dois pontos dentro da declarao SQL. O seu funcionamento semelhante ao utilizado na procedure do boto Vendas menores, onde foi utilizada a varivel Vendas incorporando seu valor na prpria declarao SQL. Como exemplo, vamos inserir um boto que nos retornar dados sobre a vendas de uma pea especfica. Inicie adicionando um boto na pgina Pesquisa, com o nome de BtnPeca. Insira no formulrio Controles mais um Query e um DataSource ligado a ele. Ligue o Query ao banco de dados DBDEMOS e com as seguintes propriedades: TQuery DatabaseName Name TdataSource DataSet Name E propriedade SQL:
SELECT I.PartNo, I.OrderNo, C.Company, Qty, O.SaleDate FROM Items I, Orders O, Customer C WHERE I.OrderNo=O.OrderNo AND C.CustNo=O.CustNo AND I.PartNo=:Peca ORDER BY O.SaleDate

DBDemos QryPeca QryPeca SrcPeca

Pgina: 24

DELPHI 4 - Avanado

Observe que o parmetro desta pesquisa ser Peca. D um duplo clique na propriedade Params para abrir o editor de parmetros. Selecione o parmetro 0-Peca e mude sua propriedade DataType:= ftInteger.

No cdigo do procedimento, existem duas opes de se referir ao parmetro, utilizando o seu ndice ou seu nome: QryPeca.Params[ndice] ou QryPeca.ParamsByName (Nome)

Digite o seguinte procedimento para o boto BtnPeca:


procedure TForm1.BtnPecaClick(Sender: TObject); var Peca: String ; begin Peca:= inputbox('Pea','Entre com o nmero da pea:',''); with FrmControles.QryPeca do begin Close; Params[0].value:=StrToFloat(Peca); //ou // ParamByName(Peca).value:=StrToFloat(Peca); Open; end; DbgPesquisa.DataSource:=FrmControles.SrcPeca; //DbgPesquisa o grid da pgina Pesquisa end;

Aps atribuir um novo parmetro, podemos utilizar o mtodo Open ou ExecSQL para executar a consulta. Teste o novo comando usando os seguintes cdigos de peas: 12310, 5313 e 11564. Repare que aps dar um clique no boto BtnPeca, o grid no mostrar mais as pesquisas realizadas plos outros boto. Resolva isto alterando a propriedade DataSource do Grid aps cada pesquisa.

Relatrios
Para a gerao de relatrios no Delphi usamos as ferramentas do QuickReport presentes na paleta QReport da barra de ferramentas. Com estes controles poderemos construir relatrios que sero compilados diretamente em nosso projeto sem a necessidade de Pgina: 25

DELPHI 4 - Avanado

carregar outras ferramentas de relatrio. Poderemos tambm incluir cdigo a vrios eventos de relatrios proporcionando uma grande flexibilidade em nossos projetos. O Delphi nos proporciona alguns modelos de relatrios, e tambm um assistente para a criao destes relatrios. Selecione File >> New >> Form, observando que existem trs modelos de relatrios:

QuickReport Labels - Utilizado na criao de etiquetas. QuickReport List - Permite a criao de relatrios simples, a partir de dados de uma tabela ou query. QuickReport Master/Detail - um modelo de relatrio que obtm dados a partir de duas tabelas. Primeiro vamos criar um relatrio com as informaes sobre os clientes, retiradas da tabela Customer.db.

Pgina: 26

DELPHI 4 - Avanado

Na caixa de dilogo New Items, escolha QuickReport List.

O Delphi nos apresenta um modelo de relatrio com alguns componentes j inseridos. Um destes componentes so as faixas, elas nos do funcionalidade como ttulos, cabealhos, rodaps, detalhes, e sub-detalhes para dados do relatrio - elas representam o componente QRBand. Outros componentes que iremos utilizar so o QRLabel e o QRDBTex. O primeiro exibe informaes estticas no relatrio, enquanto que o segundo exibe informaes dinmicas vindas do banco de dados, pois est ligado a um campo de determinada tabela.

Construo do Relatrio
Repare que o formulrio aberto pelo Delphi do tipo TQRListForm, ou seja, um formulrio especfico para relatrios de lista. Selecione o relatrio (QuickRep1), dando um clique na rea de cliente do formulrio, e mude as seguintes propriedades: Name:= RepClientes ReportTitle:= Informaes de Clientes Mude tambm o nome do formulrio para FrmRelatorioClientes. O componente Table presente no relatrio, recebeu o nome de MasterTable e ele ser nossa fonte de informaes para o relatrio. Altere suas propriedades: DatabaseName:= DBDemos TableName:= Customer.db Na segunda faixa - ColumnHeader - coloque mais dois (j possui um) QRLabel ( ) alterando suas legendas para Nome, Endereo e Telefone, e arrastando-os como qualquer outro objeto, ou definindo suas posies com as propriedade Left e Top. Na terceira faixa - Detail - delete o componente QRLabel existente e adicione trs QRDBText ( ) em baixo das legendas da faixa anterior, definindo a propriedade DataSet como MasterTable para as trs, e as propriedades DataField como Company, Addr1 e Phone. Posicione os controles de forma que seu formulrio de relatrio se parea com a figura a seguir. Pgina: 27

DELPHI 4 - Avanado

Este formulrio possui um menu de atalho que nos d acesso a uma caixa de dilogo onde poderemos alm de outras coisas, configurar a apresentao do relatrio, e possui tambm a opo de visualizao antes dele estar vinculado ao aplicativo. As opes so: Report Settings e Preview. Ative a MasterTable, e faa uma visualizao do relatrio. Altere as fontes das legendas de cada coluna e adicione um componente QRShape com a propriedade Shape:= qrsHorLine. Tome cuidado na hora de inserir o QRShape, pois ele dever pertencer faixa ColumnHeader e no ao formulrio.

Quando as alteraes no relatrio estiverem de acordo com seu gosto, digite o cdigo a seguir para o boto da pgina Clientes que exibir o relatrio. No se esquecendo de incluir o nome da unidade do relatrio na seo uses do formulrio principal.
procedure TForm1.BtnRelatorioClientesClick(Sender: TObject); begin FrmRelatorioClientes.RepClientes.Preview; //ou // FrmRelatorioClientes.RepClientes.Print; //para imprimir end;

Abra um novo relatrio, mas desta vez como Master/Detail.

Pgina: 28

DELPHI 4 - Avanado

Este novo formulrio possui duas tabelas, um DataSource e uma faixa de sub-detalhes a mais, em comparao ao anterior. Ele um outro tipo de componente, o TQRMDForm, sendo um formulrio especfico para a construo de relatrios Master/Detalhe. Altere o nome do formulrio para FrmRelatorioVendas, e as seguintes propriedades do relatrio (QuickRep): Name:= RepVendas ReportTitle:= Vendas Os dois componentes TTable esto nomeadas como MasterTable e DetailTable , e o DataSource como MasterDS. O DataSource est presente apenas para criar uma vinculao entre as tabelas. Altere as propriedades destes componentes associando-os s tabelas Customer.db (master) e Orders.db (detalhe), e tornando-as ativas. V at a DetailTable e selecione a propriedade MasterFields para exibir a caixa de dilogo Field Link Designer, vista anteriormente no curso e utilizada para a vinculao de tabelas. Vincule as duas tabelas pelo ndice CustNo.

Na faixa Column Header, coloque dois componentes QRLabel com as legendas Nome do Cliente e Cdigo. Na faixa Detail, insira dois QRDBText associados aos campos Company e CustNo da MasterTable. Aumente a altura desta faixa, e inclua mais dois QRLabel com as legendas Nmero do Pedido e Valor Pago. Na quarta faixa - SubDetail - coloque dois QRDBText, para os detalhes das compras, associados aos campos OrderNo e AmountPaid da tabela Orders.db da DetailTable. Pgina: 29

DELPHI 4 - Avanado

Verifique se a propriedade DataSet da faixa SubDetail est apontando para a DetailTable , e se a mesma propriedade do relatrio RepVendas igual a MasterTable , e altere a propriedade Text:=Pgina para o QRSysData2. Ao final, o seu formulrio dever se parecer com o da figura a seguir:

Inclua mais um boto no formulrio principal para a exibio deste ltimo relatrio. E teste o seu programa.

Os relatrios construdos anteriormente tambm poderiam ser construdos partindo-se de um formulrio comum, desde que inclussemos o componente QuickRep neste formulrio, dimensionando-o na rea de cliente de acordo com as necessidades. E a partir da colocaramos os demais componentes existentes de modo semelhante aos relatrios construdos como exerccio.

Pgina: 30

DELPHI 4 - Avanado

Valores Calculados
possvel colocarmos campos calculados no relatrio utilizando o componente QRExpr que realiza diversos clculos. Entre eles temos: soma, mdia, mximo, contagem. No relatrio RelVendas, vamos inserir um campo calculado que mostre o total vendido a cada cliente. Como este campo calculado definido para cada cliente, devemos primeiro inserir mais uma banda no relatrio, que estar ligada banda SubDetail. Est nova banda ser do tipo GroupFooter, ou seja, ela ser um rodap de determinado grupo de registros. Clique no componente QRBand da barra de ferramentas QReport, e clique em qualquer regio do relatrio. Com esta nova banda selecionada, altere as seguintes propriedades: BandType:=rbGroupFooter HasChild:=True A banda filha definida na propriedade HasChild, servir para inserir um espao entre a lista de cada cliente. Selecione a banda SubDetail, e altere a propriedade FooterBand:=QRBand1. Insira um QRLabel com a legenda TOTAL e um QRExpr na banda GroupFooter.

Para definir que expresso o QRExpr far, d um duplo clique na propriedade Expression para abrir o assistente de expresso. Este assistente ajuda o programador a definir a frmula da expresso desse componente.

Pgina: 31

DELPHI 4 - Avanado

Digite a seguinte expresso: SUM(AmountPaid), para somar os valores do campo AmountPaid do relatrio e no da tabela. E altere a propriedade Master para QRSubDetail1 ou outro nome que voc tenha dado para a banda SubDetail. Aps um preview, o seu relatrio dever estar da seguinte forma:

Pgina: 32

DELPHI 4 - Avanado

Para finalizar, falta formatar a apresentao do campo Total. Para isso, altere a propriedade Mask do QRExpr para: R$0,0,0.00. Caso queira dar um aspecto diferente para o formulrio possvel envolver as bandas com frames, utilizando a propriedade Frame, deixando a ChildBanda sem nenhum frame.

Pgina: 33

DELPHI 4 - Avanado

AMBIENTE CLIENTE / SERVIDOR


Num ambiente Cliente/Servidor ns temos um banco de dados central sendo acessado por vrias outros usurios - Clientes. Este banco de dados central deve ser gerenciado por um programa especfico para isto. O Delphi incorpora o gerenciador de banco de dados InterBase da Borland, ns iremos trabalhar com este gerenciador, o que permite a criao e teste de aplicativos sem estarem instalados no ambiente de produo. Quando o projeto estiver terminado, basta instal-lo no computador servidor de arquivos para uso imediato. Iremos utilizar o banco de dados Interbase de amostra, Employee.GDB que est no diretrio ...\Arquivos comuns\Borland Shared\Data do Delphi. Ele possui o alias IBLOCAL. Para observarmos de que elementos o IBLOCAL construdo, utilizamos o programa SQL Explorer presente no grupo do Delphi.

Altere a propriedade SERVER NAME para que este alias aponte para o banco de dados que iremos utilizar - Employee.gdb. Aps a alterao na localizao do banco de dados, necessrio salvar esta alterao para o alias IBLOCAL. D um clique-direito sobre o IBLOCAL e clique na opo Save As do menu atalho, mantendo o mesmo nome do alias.

Pgina: 34

DELPHI 4 - Avanado

Aps salvar, d um clique no sinal + ao lado do IBLOCAL para abri-lo. O Delphi apresentar uma caixa de dilogo para a identificao do usurio, digite a senha masterkey, sem alterar o UserName. Esta senha e usurio foram criados durante a criao do banco de dados.

Estando o banco de dados aberto poderemos visualizar todos os componentes com suas definies de tipos e classes.

Pgina: 35

DELPHI 4 - Avanado

Atravs do SQL Explorer tambm poderemos alterar nosso banco de dados e suas tabelas. Bastando selecionar o item que deseja acrescentar, e no menu Object clicar na opo New, definindo as propriedades que se deseja trabalhar neste novo objeto. Criando as tabelas com suas colunas, definies, e demais itens. Na figura a seguir, foi escolhida uma nova tabela, e uma nova coluna.

Vamos criar um simples programa que acessa os dados da tabela Employee do IBLOCAL. Ns iremos trabalhar com os campos First_Name, Phone_Ext e Salary, mostrados em um DBGrid. Pgina: 36

DELPHI 4 - Avanado

Existem poucas diferenas entre o acesso a um banco de dados simples e outro banco de dados cliente/servidor. Inicie um novo projeto colocando no formulrio os seguintes componentes: DBGrid, DataBase, Table, DataSource e um DBNavigator. Configure os componentes seguindo a tabela mostrada a seguir: DataBase AliasName DatabaseName Table DatabaseName TableName DataSource DataSet Grid Columns 0 - First_Name 1 - Phone_Ext 2 - Salary DataSource1 DataSource1 Table1 IBLOCAL Employee IBLOCAL IBLOCAL

DataSource DBNavigator DataSource

O seu formulrio dever estar semelhante ao mostra na figura a seguir:

Pgina: 37

DELPHI 4 - Avanado

Para finalizar, inclua as linhas de cdigo para o evento OnCreate do formulrio, para abrir e conectar o banco de dados.
procedure TForm1.FormCreate(Sender: TObject); begin DataBase1.Connected:=True {conecta o banco de dados} Table1.Active:=True {abre a table Employee} end;

Aps o incio da execuo, o programa solicitar a senha para a conexo com o banco de dados.

Exemplo
Neste exemplo iremos construir um pequeno aplicativo para controle de livros em uma biblioteca. Este aplicativo trabalhar com o Interbase Server que um servidor de banco de dados nativo do Delphi. Iremos utilizar o Interbase porque ele j vem includo com o Delphi, e aps fazer a instalao do Delphi, podemos tambm instalar o servidor Interbase local com a verso para um nico usurio. Esta verso permite que o programador teste o seu aplicativo fora do ambiente de trabalho, como se estivesse realmente nele. Para criarmos as tabelas no Interbase, utilizamos o InterBase Windows ISQL, que uma ferramenta interativa do Interbase permitindo uma interao com o servidor local ou remoto. Antes de utiliz-lo, o Interbase Server deve estar sendo executado no seu computador.

O aplicativo que iremos construir constitudo por quatro tabelas: Aluno, Livro, Emprestimo e Itens, com os seguintes campos: Aluno Aluno_Id Nome Endereo Telefone Turma Livro Livro_Id Titulo Assunto Emprestimo Emprestimo_Id Aluno_Id Data_Emprestimo Dat_Devolucao Devolvido Itens Itens_Id Livro_Id Emprestimo_Id

Pgina: 38

DELPHI 4 - Avanado

O ISQL composto por duas janelas, onde na primeira digitamos a instruo SQL e na segunda obtemos o resultado desta instruo.

Antes de fazer qualquer coisa com um banco de dados necessrio conectar-se a ele atravs da opo Connect to Database do menu File. Informando se de um servidor local ou remoto, o caminho do banco de dados e os dados para login (user e senha).

Para criar um banco de dados basta escolher a opo Create Database do menu File, introduzindo tambm o caminho completo, o usurio e a senha.

Pgina: 39

DELPHI 4 - Avanado

Construindo o Banco de Dados


Como no exemplo que iremos construir sero muitas instrues SQL para criar o banco de dados e as tabelas, iremos utilizar a opo do ISQL de poder executar um arquivo de Script com todas as linhas de comando j definidas. O Script ISQL um arquivo de texto, com a extenso .sql, que contm as intruo SQL. Digite as seguintes linhas de Script no Bloco de notas:
CREATE DATABASE "c:\meus documentos\biblioteca.gdb" USER "SYSDBA" PASSWORD "masterkey"; CONNECT "c:\meus documentos\biblioteca.gdb" USER "SYSDBA" PASSWORD "masterkey"; CREATE CREATE CREATE CREATE DOMAIN DOMAIN DOMAIN DOMAIN DALUNO_ID INTEGER NOT NULL; DLIVRO_ID INTEGER NOT NULL; DEMPRESTIMO_ID INTEGER NOT NULL; DITENS_ID INTEGER;

CREATE TABLE ALUNO (ALUNO_ID DALUNO_ID, NOME VARCHAR(20) NOT NULL, ENDERECO VARCHAR(30) NOT NULL, TELEFONE VARCHAR(15), TURMA CHAR(3), CONSTRAINT ALUNO_CHAVE_PRIM PRIMARY KEY (ALUNO_ID)); CREATE TABLE LIVRO (LIVRO_ID DLIVRO_ID, TITULO VARCHAR(20) NOT NULL, ASSUNTO VARCHAR(10), CONSTRAINT LIVRO_CHAVE_PRIM PRIMARY KEY (LIVRO_ID)); CREATE TABLE EMPRESTIMO (EMPRESTIMO_ID DEMPRESTIMO_ID, ALUNO_ID DALUNO_ID, DATA_EMPRESTIMO DATE DEFAULT 'NOW' NOT NULL, DATA_DEVOLUCAO DATE, DEVOLVIDO CHAR(3) DEFAULT 'NAO', CONSTRAINT EMPRESTIMO_CHAVE_PRIM PRIMARY KEY (EMPRESTIMO_ID), CONSTRAINT EMPRESTIMO_CHAVE_EST FOREIGN KEY (ALUNO_ID) REFERENCES ALUNO); CREATE TABLE ITENS (LIVRO_ID DLIVRO_ID, EMPRESTIMO_ID DEMPRESTIMO_ID, ITENS_ID DITENS_ID, CONSTRAINT ITENS_CHAVE_PRIM PRIMARY KEY (LIVRO_ID, EMPRESTIMO_ID)); EXIT;

No incio necessrio criar e conectar-se ao banco de dados - Biblioteca.gdb. O login para o Interbase Local SYSDBA para o usurio, e masterkey como senha deste usurio.

Pgina: 40

DELPHI 4 - Avanado

A seguir so criados os domnios, definindo os limites para os campos que sero as chaves das tabelas:
CREATE DOMAIN DALUNO_ID INTEGER NOT NULL;

Na linha acima foi criado o domnio DALUNO_ID do tipo inteiro, e que no pode ser de valor nulo. Depois so criadas as tabelas com a definio de seus campos, junto com os tipos e as definies das chaves primrias e estrangeiras.
ALUNO_ID DALUNO_ID, DATA_EMPRESTIMO DATE DEFAULT 'NOW' NOT NULL,

O campo Aluno_Id, possui os limites definidos pelo domnio DAluno_Id, enquanto que o campo Data_Emprestimo possui as limitaes do tipo Date com o valor padro definido pela funo Now, no podendo ser nulo.
CONSTRAINT EMPRESTIMO_CHAVE_PRIM PRIMARY KEY (EMPRESTIMO_ID), CONSTRAINT EMPRESTIMO_CHAVE_EST FOREIGN KEY (ALUNO_ID) REFERENCES ALUNO);

Criamos chaves primrias e estrangeiras utilizando a clusula Constraint, indicando o nome desta chave e a que campos ela faz referncia. Concluda a digitao, salve o arquivo como Tabela.sql. E no ISQL, escolha a opo Run an ISQL Script do menu File selecionando o arquivo Tabela.sql para ser executado e tambm indicando um arquivo para ser gravado como arquivo de sada.

Este arquivo de sada importante pois os erros na execuo do Script sero gravados nele, onde poderemos ver mais tarde as possveis correes. Aps a execuo do Script, ser apresentada uma mensagem informando se a execuo ocorreu com ou sem problemas.

Agora est faltando apenas alguns detalhes para finalizar o banco de dados. A criao de mais um ndice na tabela Aluno e criar o seu Alias. Pgina: 41

DELPHI 4 - Avanado

A tabela alunos precisa de mais um ndice para organizarmos os registros pelo nome do aluno. Para criarmos o ndice NOMEX e o Alias, vamos utilizar o SQL Explorer que est presente no mesmo grupo de programas do Delphi.

Para criar um novo Alias siga os seguintes passos: 1. Selecione o objeto Database do painel esquerdo. 1. Clique-direito, e no menu de contexto, escolha New. 1. Selecione um tipo de alias (INTRBASE) na caixa de dilogo New Database Alias, e escolha OK. 1. Digite o nome de Biblioteca para o alias. 1.

1. 1. 1. Entre com o caminho completo do alias na caixa de texto Server Name e o nome do usurio na pgina Definition do painel direito. 1. Clique-direito no banco de dados Biblioteca e no menu de contexto, escolha a opo Apply para atualizar o banco de dados. Pgina: 42

DELPHI 4 - Avanado

Para abrir o banco de dados Biblioteca, clique no sinal + ao seu lado, sendo exibida ento a caixa de dilogo para a entrada do login e efetivar a conexo. Digite o nome do usurio e a senha masterkey.

Pgina: 43

DELPHI 4 - Avanado

Aps abrir e conectar-se com o banco e dados, digite a linha de comando SQL na pgina Enter SQL do painel direito, clicando no boto Execute Query, de acordo com a figura a seguir.

Aps a execuo da query, escolha a opo Refresh do menu de contexto do banco da dados para atualiz-lo, adicionando o novo ndice.

Feche o banco de dados Biblioteca a partir do menu Object >> Close. Encerrando sua construo.

Pgina: 44

DELPHI 4 - Avanado

Construindo o Aplicativo
O aplicativo que iremos construir composto por cinco formulrios, com as seguintes funes:

frmCadastroAlunos - responsvel pelo controle dos registros da tabela Aluno. frmCadastroLivros - responsvel pelo controle dos registros da tabela Livro. frmControle - contm todos os controles de acesso a dados. frmEmprestimo - formulrio onde ser realizada a operao de emprstimo de livros. frmPrincipal - o formulrio inicial da aplicao, a partir do qual ser dado acesso aos demais.

frmPrincipal
Comece com a construo do formulrio principal, inserindo nele os seguintes botes e cdigo:

implementation uses UntAluno, UntControle, UntEmprestimo, UntLivro, UnitSplash; {$R *.DFM} procedure TfrmPrincipal.btnSairClick(Sender: TObject); begin Close; end; procedure TfrmPrincipal.btnAlunosClick(Sender: TObject); begin frmControle.tblAluno.Open; frmCadastroAlunos.Show; end;

Pgina: 45

DELPHI 4 - Avanado

procedure TfrmPrincipal.btnLivrosClick(Sender: TObject); begin frmControle.tblLivro.Open; frmCadastroLivros.Show; end; procedure TfrmPrincipal.btnEmprestimosClick(Sender: TObject); begin frmControle.tblEmprestimo.Open; frmControle.tblItens.Open; frmControle.tblAluno.Open; frmEmprestimo.Show; end;

frmControle
A seguir, construa a formulrio dos controles de dados:

Faa as ligaes normais para as tabelas tblAluno, tblLivro e tblEmprestimo e seus respectivos data sources. Para a tabela tblItens, defina-a como detalhe da tabela Emprestimo:

Faa as ligaes do controle Database com o alias Biblioteca criado anteriormente.

Pgina: 46

DELPHI 4 - Avanado

Adicione todos as campos das tabelas no Fields Editor, criando o campo calculado Dias_Atraso para a tabela tblEmprestimo.

O Query qryMaximo fornecer os valores de identificao dos prximos registros para as tabelas Aluno, Livro e Emprestimo. Pois no sero usados campos auto-incremento.
SQL = SELECT Max(Livro_Id) as MaxLivro, Max(Emprestimo_Id) as MaxEmprestimo,Max(ALUNO_ID) as MaxiAluno FROM Livro, Emprestimo, Aluno

Adicione tambm estes campos criados a partir de intruo SQL no Fields Editor do Query. Este formulrio conter somente o cdigo do campo calculado, para o clculo dos dias em atraso utilizando a funo Date:
procedure TfrmControle.TblEmprestimoCalcFields(DataSet: TDataSet); var Atraso:Real; begin Atraso:= (Date) - tblEmprestimoDATA_DEVOLUCAO.AsFloat; if Atraso>0 then tblEmprestimoDIAS_ATRASO.Value:=Trunc(Atraso); end;

Pgina: 47

DELPHI 4 - Avanado

frmCadastroLivros

O que vale ressaltar neste formulrio, a exibio dos Hints do DBNavigator que devero ser passados para o portugus e permitida a sua exibio. Para isso, altere suas propriedades ShowHint:=True e Hints de acordo com a figura:

Altere tambm a propriedade VisibleButtons para exibir somente os botes mostrados na figura do formulrio. Insira tambm os valores para a lista do DBComboBox cbxAssunto, alterando sua propriedade Itens:

Agora digite o seguinte cdigo para o formulrio frmLivro: Pgina: 48

DELPHI 4 - Avanado

implementation uses UntControle; {$R *.DFM} procedure TfrmCadastroLivros.btnSairClick(Sender: TObject); begin frmControle.tblLivro.Close; Close; end; procedure TfrmCadastroLivros.btnProximoClick(Sender: TObject); begin frmControle.TblLivro.Next; //o mtodo Next movimenta o ponteiro da tabela para o prximo //registro end; procedure TfrmCadastroLivros.btnPrimeiroClick(Sender: TObject); begin frmControle.TblLivro.First; //o mtodo First movimenta o ponteiro da tabela para o primeiro //registro end; procedure TfrmCadastroLivros.btnNovoClick(Sender: TObject); begin with frmControle do begin tblLivro.insert; qryMaximo.Close; qryMaximo.Open; tblLivroLivro_Id.Value:= qryMaximoMaxLivro.Value + 1; //a linha de comando acima, pega o maior valor do campo //Livro_Id, soma um e o atribui ao novo registro. end; end;

frmCadastroAlunos

Pgina: 49

DELPHI 4 - Avanado

Os destaques deste formulrio so a caixa de texto edtPesquisa e o RadioGroup rdgOrdem. A primeira ser utilizada para fazer uma pesquisa utilizando o nome do aluno, mostrando os registros de acordo com o que for sendo digitado nela, desde que o ndice ativo seja o Nomex. E o grupo de opo comandar qual ndice ser utilizado para organizar a tabela, se o ndice primrio ou o ndice secundrio Nomex. Entre com o seguinte cdigo para o formulrio frmCadastroAlunos:
procedure TfrmCadastroAlunos.btnSairClick(Sender: TObject); begin frmControle.tblAluno.Close; Close; end; procedure TfrmCadastroAlunos.edtPesquisaChange(Sender: TObject); //Quadro de texto para pesquisa pelo indice begin with frmControle.tblAluno do begin SetKey; {coloca a Table em modo dsSetKey, para poder utilizar os mtodos GoTo... e Find...} frmControle.tblAluno['Nome']:=edtPesquisa.Text; GotoNearest; {Vai para o registro mais prximo ao definido pela chave} end; end; procedure TfrmCadastroAlunos.rdgOrdemClick(Sender: TObject); begin if rdgOrdem.ItemIndex=0 then frmControle.tblAluno.IndexName:='' //muda para o ndice primrio que no precisa ter seu nome //informado else frmControle.tblAluno.IndexName:='NOMEX'; //muda o ndice ativo para o NOMEX end; procedure TfrmCadastroAlunos.btnNovoClick(Sender: TObject); begin with frmControle do begin tblALUNO.Insert; qryMaximo.Close; qryMaximo.Open; tblAlunoALUNO_ID.Value:=qryMaximoMaxiAluno.Value + 1; end; end;

Pgina: 50

DELPHI 4 - Avanado

frmEmprestimo

Neste formulrio, os destaques so para a caixa de verificao (DBCheckBox) Devolvido, para o grid que mostrar os itens (livros) do emprstimo, e o nmero do aluno que ser escolhido atravs de um DBLookupComboBox com as seguintes propriedades de ligao: DataField DataSource KeyField ListField ListSouce Aluno_Id frmControle.srcEmprestimo Aluno_Id Nome frmControle.srcAluno

O DBCheckBox estar ligado ao campo Devolvido da tabela Emprstimo, tendo as propriedades que atribuem o valor para o campo quando a caixa estiver selecionada ou no, definidas em tempo de projeto, so elas: ValueChecked - que contm o valor para quando a caixa de verificao estiver selecionada. ValueUnchecked - caso contrrio.

No DBGrid sero inseridos os dados sobre os livros a serem emprestados, sendo exibido nele as colunas referentes ao nmero do item e ao ttulo do livro. Encontramos aqui um problema, como exibir o ttulo do livro se a tabela Itens no possui este campo. Resolvemos isto criando um Campo de procura para a tabela Itens. Pgina: 51

DELPHI 4 - Avanado

O Campo de procura um campo que exibe dados de uma tabela que no fazem parte dela, ele s existe durante a execuo do programa, semelhente ao campo calculado. No Fields Editor da tabela Itens, adicone um novo campo (New field), seguindo a figura motrada, para suas definies.

Sendo; Key Fields - qual o campo da tabela ser a chave de procura. Dataset - qual ser a tabela relacionada com a procura. Lookup Keys - determina a chave da tabela de procura que ser associada. Result Field - determina qual o campo da tabela de procura ser exibido.

Ao utilizar o grid para inserir um novo livro, basta dar um duplo clique na coluna Titulo do Livro para abrir uma lista com os livros pertencentes tabela, verificando antes se a propriedade ButtonStyle igual a csAuto.

Pgina: 52

DELPHI 4 - Avanado

Digite agora o cdigo para o formulrio frmEmprestimo.


procedure TfrmEmprestimo.btnSairClick(Sender: TObject); begin frmControle.TblItens.Close; frmControle.tblEmprestimo.Close; frmControle.tblAluno.Close; Close; end; procedure TfrmEmprestimo.btnNovoClick(Sender: TObject); begin with frmControle do begin tblEmprestimo.Insert; qryMaximo.Close; qryMaximo.Open; tblEmprestimoEmprestimo_Id.Value:= qryMaximoMaxEmprestimo.Value + 1; tblEmprestimoDATA_EMPRESTIMO.Value:=Date; end; end;

Pgina: 53

DELPHI 4 - Avanado

CRIAO DE COMPONENTES
A programao orientada a objeto em que o Delphi se baseia, permite a criao de componentes (objetos), podendo ser definidas as propriedades, mtodos e eventos pertencentes a este objeto. As propriedades so o conjunto de atributos deste objeto, elas podem afetar o funcionamento do componente ou disparar uma ao. Os mtodos so funes ou procedures escritas em cdigo e declaradas como pblicas. Os eventos so respostas deste objeto alguma ao do usurio ou de outro objeto, eles so uma propriedade especializada que indica qual procedimento executar para determinada ao - evento.

Objeto TSobreBtn
Este boto apresentar uma janela com as informaes do programador, ele ser baseado em um componente TButton herdando seus mtodos e propriedades.

Construo do boto SobreBtn


Inicie a criao deste boto, selecionando no menu File >> New, e na caixa de dilogo New Item escolha Component.

Na caixa de dilogo New Component, defina a classe ancestral do nosso boto, e mude o seu nome de classe, conforme a figura a seguir:

Pgina: 54

DELPHI 4 - Avanado

Clique no boto OK e o Delphi ir abrir uma unidade de cdigo com o nome SobreBtn.pas. Caso seja necessria a mudana de diretrio de trabalho desta unidade, o quadro Unit file name poder ser alterado. Ou se preferir, a unidade poder ser salva com outro nome utilizando-se a opo Save As... do menu File. A seguir, temos a listagem inicial da Unit SobreBtn gerada pelo Delphi:
unit SobreBtn; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TSobreBtn = class (TButton) private { Private declarations } protected { Protected declarations } public { Public declarations } published { Published declarations } end; procedure Register; implementation procedure Register ; begin RegisterComponents('Samples', [TSobreBtn]); end; end.

O trecho entre a declarao type ... end; corresponde a seo de definio de tipo do objeto. O Delphi cria um novo tipo - TSobreBtn - baseado na classe Tbutton, contendo apenas o procedimento que registra o novo componente na paleta Samples. Pgina: 55

DELPHI 4 - Avanado

Na seo de definio de tipo, ns temos quatro parte que definem qual ser o tipo de acesso para as variveis e procedimentos pertencentes ao objeto, so elas: Private, Protected, Public e Published. Private - Somente as rotinas definidas dentro da prpria unidade podem ter acesso. Fora da unidade, qualquer identificador de componente ser desconhecido e inacessvel. Protected - Acesso permitido apenas aos procedimentos ou funes declaradas na definio de tipo, ou por outros objetos descendentes. Public - Todo a aplicativo tem acesso s variveis ou procedimento. Published - Semelhante ao Public, mas com a exibio das propriedades ou eventos criados, na Object Inspector. Digite o seguinte cdigo: unit SobreBtn; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TSobreBtn = class(TButton) private { Private declarations } protected { Protected declarations } procedure Click; override; public { Public declarations } constructor Create (AOwner: TComponent); override; published { Published declarations } end; procedure Register; implementation constructor TSobreBtn.Create (AOwner: TComponent); begin inherited Create (AOwner); Caption:='&Sobre'; Cursor:=crHelp; end; procedure TSobreBtn.Click; begin inherited Click; MessageDlg ('Programa criado por ...',mtInformation,[mbOk],0); end; procedure Register; Pgina: 56

DELPHI 4 - Avanado

begin RegisterComponents('Samples', [TSobreBtn]); end; end. Na definio de tipo, o evento Click declarado como um procedimento protegido. Os eventos so procedimentos especficos para determinadas aes. Na implementao deste evento, devemos primeiro herdar - inherited - as caractersticas do evento Click do componente ancestral, e depois realizamos as mudanas desejadas. No nosso caso, exibir um quadro de dilogo. O mtodo override, no substitui o evento Click herdado do TButton, ele apenas estende ou refina este evento no novo componente. Usamos override para especificar que haver uma modificao no evento. Na seo public, declaramos o mtodo constructor que controlar a construo do componente. Usamos comumente Create como nome deste mtodo, e Aowner como nome de parmetro, nada impedindo a utilizao de outros nomes. Na implementao do constructor, semelhante ao Click, primeiro herdamos as caractersticas do objeto base e depois alteramos as propriedades Caption e Cursor. A propriedade Cursor, especifica qual ser o desenho que representar o mouse quando este estiver em cima do controle, e pode ser:

Aps a digitao do cdigo, salve o projeto e selecione Component >> Install Component..., na barra de menu para instalar este componente dentro do pacote de componentes do usurio (Delphi Users Components) - dclusr40.dpk. Pgina: 57

DELPHI 4 - Avanado

Um novo controle tambm pode ser instalado em um outro pacote da escolha do programador. Aps a escolha do arquivo de pacote, ser ento pedida uma confirmao para a reconstruo do pacote de componentes.

Caso nenhum erro ocorra durante a compilao da unidade, o Delphi apresentar a seguinte mensagem:

Exibindo em seguida o Gerenciador de Pacotes - que possivelmente estar atrs da janela de cdigo. Caso ocorra algum problema durante a compilao, retorne unidade, corrija o defeito e, no Gerenciador de Pacotes, d um clique nos botes Compile e Install, para uma nova tentativa de instalao do componente.

Pgina: 58

DELPHI 4 - Avanado

O nosso novo boto SobreBtn ser ento instalado na paleta Samples da barra de ferramentas. De onde poderemos incorpor-lo a um formulrio.

Um pacote um tipo de arquivo que contm os controles do Delphi, para vermos quais pacotes esto disponveis no projeto selecione Project >> Options >> Packages .

Teste do Boto SobreBtn


Coloque o TSobreBtn em um formulrio vazio e execute o projeto. Ao se passar o mouse sobre esse boto, o tipo de ponteiro ser mudado, e quando for dado um clique nele, ser apresentada a caixa de mensagem descrita no cdigo.

No componente SobreBtn foram alteradas algumas propriedades herdadas do componente TButton, e alterado o modo como ele trata o evento Click. No nosso prximo componente, iremos criar novas propriedades, mtodos e um evento.

Pgina: 59

DELPHI 4 - Avanado

Objeto TCalc
Este novo controle est baseado no tipo TComponent, ele realizar operaes matemticas e ter um evento para guando o resultado destas operaes for negativo. O TCalc possui trs propriedades : Num1, Num2 e Res, dois mtodos : DoPot e DoMult e o evento OnNegativo.

Construo do TCalc
O incio da construo semelhante ao TBtnSobre. Na janela New Component escolha como tipo ancestral o TComponent, de acordo com a figura a seguir:

Clique no boto OK, e o Delphi criar uma unidade com o nome de Calc.pas. No cdigo mostrado a seguir, os mtodos so declarados como procedure e o evento como property.
unit Calc; interface uses Windows, Dialogs; Messages, SysUtils, Classes, Graphics, Controls, Forms,

type TCalc = class (TComponent) private { Private declarations } FNum1:integer; FNum2:integer; FRes:integer; FNeg:TNotifyEvent; protected { Protected declarations } public { Public declarations } constructor Create (AOwner:TComponent); override ; property Res:integer read FRes; procedure DoPot;

Pgina: 60

DELPHI 4 - Avanado

procedure DoMult; published { Published declarations } property Num1:integer read FNum1 write FNum1; property Num2:integer read FNum2 write FNum2; property OnNegativo:TNotifyEvent read FNeg write FNeg; end; procedure Register; implementation constructor TCal.Create (AOwner:TComponent); begin inherited Create (AOwner); FNum1:=0; FNum2:=0; end; procedure TCalc.DoMult; begin FRes:=FNum1 * FNum2; if FRes < 0 then if assigned (FNeg) then OnNegativo(Self); end; procedure TCalc.DoPot; var Temp:integer; I:integer begin Temp:=FNum1; FRes:=FNum1; if FNum2=0 then FRes:=1 else for I:=1 to FNum2 - 1 do FRes:=FNum1 * Temp; end; procedure Register ; begin RegisterComponents('Samples', [TCalc]); end; end.

Na seo private declaramos as variveis que representam as propriedades dentro do cdigo do objeto, porque elas no so acessadas diretamente pelo usurio do componente e sim atravs de chamadas especiais. Estas variveis possuem a letra F (field) como inicial apenas como padro de programao. Declaramos tambm uma varivel do tipo TNotifyEvent. O tipo TNotifyEvent serve para notificar o componente que existe algum tratamento de evento para este componente. E quando o evento ocorre, o TNotifyEvent envia um parmetro com o remetente do evento. Na seo public declaramos o construtor, a propriedade Res - Resultado - como somente de leitura, e os mtodos DoPot e DoMult. As propriedades Num1 e Num2, e o evento OnNegativo, so declarados como published, para que apaream na Object Inspector. Pgina: 61

DELPHI 4 - Avanado

O mtodo DoMult executa a multiplicao entre FNum1 e FNum2, armazenando o resultado em FRes. Se o valor da operao for negativo, e existir algum cdigo de tratamento de evento (TNotifyEvent diferente de nulo), o evento OnNegativo ocorre recebendo o parmetro Self enviado pelo TNotifyEvent. Calculamos uma potncia entre Num1 e Num2 no mtodo DoPot, armazenando o resultado em FRes. Selecione Component >> Install Component... para compilar e instalar o controle TCalc na barra de ferramentas e no pacote de componentes.

Teste do TCalc
Inicie um novo projeto, colocando no formulrio um TEdit, dois TButton e o TCalc que est na paleta Samples da barra de ferramentas.

Para utilizar este exemplo, o usurio digita um nmero no quadro de texto e d um clique em um dos botes de acordo com a operao que deseja, sendo o resultado exibido no mesmo quadro de texto, caso o resultado para Mult seja negativo, ele ser mostrado na cor vermelha. Entre com o cdigo a seguir:
procedure TForm1.PotBtnClick(Sender: TObject); begin Calc1.Num1 := StrToInt(Edit1.Text); Calc1.Num2 := 2; Calc1.DoPot; Edit1.Text:=IntToStr(Calc1.Res); Edit1.SetFocus end; procedure TForm1.MultBtnClick(Sender: TObject); begin Calc1.Num1 := StrToInt(Edit1.Text);

Pgina: 62

DELPHI 4 - Avanado

Calc1.Num2 := 2; Calc1.DoMult; Edit1.Text:=IntToStr(Calc1.Res); end; procedure TForm1.Calc1Negativo(Sender: TObject); {D um clique duplo no TCalc para editar este procedimento} begin Edit1.Font.Color:=clRed ; end; end.

Componentes ActiveX
O padro ActiveX desenvolvido pela Microsoft, permite a criao de componentes que podem ser acessados e utilizados por qualquer ambiente que suporte esta tecnologia. Interligando diversos ambientes de desenvolvimento, por exemplo: um componente desenvolvido em Delphi pode ser utilizado pelo Visual Basic, e vice-versa. Com o ActiveX podemos construir pginas ativas na Web, fazendo com que o usurio execute em micros remotos, programas residentes nos servidores da Web.

Componente SobreBtnX
Podemos criar um componente ActiveX a partir de um outro componente j existente ou criado um componente por ns de acordo com as necessidades. Como exemplo, vamos transformar o nosso boto TSobreBtn em um controle ActiveX. Mas poderamos criar outro boto derivado do TButton com as mesmas caractersticas do TSobreBtn diretamente em ActiveX. Inicie a construo deste novo controle abrindo uma biblioteca ActiveX como base do nosso projeto. Selecione File >> New >> ActiveX >> ActiveXLibrary:

E novamente File >> New >> ActiveX >> ActiveXControl , para criar a unidade do nosso controle: Pgina: 63

DELPHI 4 - Avanado

Ser ento exibida a janela ActiveX Control Wizard, para serem definidas as bases do novo controle: o nome deste controle e o nome do arquivo .pas que conter a unidade. Siga a figura abaixo para as definies do SobreBtnX:

Feito isto, o Delphi j criou automaticamente todo o cdigo para a transformao do TSobreBtn em um controle ActiveX. E criou tambm uma biblioteca de tipos que define as interfaces e as propriedades do componente ActiveX. Para abrir a biblioteca de tipos, selecione View >> Type Library, nela podemos observar todos os componentes que integram o controle SobreBtnX.

Pgina: 64

DELPHI 4 - Avanado

Na biblioteca de tipos podemos observar o cdigo GUID, que identificar o componente no Windows. Este identificador um valor binrio de 16 bits que identifica unicamente uma interface entre todas as outras. Para a construo de pginas HTML com Script, devemos usar o Tag OBJECT com o cdigo GUID para a incorporao deste objeto na pgina. Para podermos utilizar este controle, devemos antes registr-lo no Windows, clique na opo Register ActiveX Server no menu Run. Quando o Delphi finalizar a tarefa, ser mostrada a seguinte mensagem:

Para testar este controle, vamos construir uma pgina simples em HTML que contenha o boto SobreBtnX. Abra o Bloco de Notas do Windows e edite o texto mostrado a seguir, observando que a linha classid=clsid: , dever conter o mesmo cdigo GUID exibido, quando o controle SobreBtnX estiver selecionado.

Pgina: 65

DELPHI 4 - Avanado

<HTML> <H1> Teste de componente ActiveX</H1><p> <HR><center><Table Border = 1> <TR>D um clique no boto abaixo para saber mais </TR> <TR><TD ALIGN=CENTER> <OBJECT classid="clsid:D2044505-75B2-11D3-AB37-0000214D4F96" width=280 height=50 align=center hspace=5 vspace=5 > </OBJECT> </TD></TR> </HTML>

Salve este arquivo com a extenso .htm . E abra-o no seu Browser que suporte ActiveX.

Quando o usurio posicionar o mouse em cima do boto Sobre, o tipo de cursor ser mudado e, ao se dar um clique, ser mostrada a janela Sobre.

Formulrio ActiveX
No formulrio ActiveX que agora vamos construir, iremos exibir um arquivo .avi em um controle TPanel e teremos tambm o boto SobreBtn para informar a identificao do programador. Este formulrio tambm pode ser includo em uma pgina HTML, mas desta vez iremos utilizar um construtor de pgina de teste do Delphi.

Pgina: 66

DELPHI 4 - Avanado

Inicie um novo projeto selecionando File >> New >> ActiveX >> ActiveXLibrary, para iniciar um projeto ActiveX, e depois inicie um novo formulrio selecionando File >> New >> ActiveX >> ActiveForm. No ActiveForm Wizard, defina os nomes do formulrio e do arquivo da unidade deste formulrio.

Crie o formulrio mostrado na figura a seguir:

Digite o cdigo mostrado a seguir, para o boto Iniciar :


procedure TActiveFormX.IniciarBtnClick(Sender: TObject); begin Screen.Cursor:= crHourglass; MediaPlayer.FileName:= 'C:\...\Demos\coolstuf\cool.avi'; MediaPlayer.Display:= Panel; MediaPlayer.Open; Screen.Cursor:= crDefault; end;

Pgina: 67

DELPHI 4 - Avanado

No cdigo acima, o cursor do mouse ser mudado para a ampulheta enquanto o arquivo .avi est sendo carregado no MediaPlayer. Definimos tambm que este arquivo dever ser exibido no controle Panel - MediaPlayer.Display:= Panel - e s ento o mouse voltar forma Default, liberando o uso do programa. Aps isto, o formulrio j poder ser registrado no Windows, selecione Run >> Register ActiveXServer. Se todo o cdigo estiver correto, ser exibido o quadro mostrado a seguir.

E ento, poderemos abrir a Type Library e verificar o cdigo GUID do ActiveFormX criado. Para que o Delphi faa uma pgina de teste escolha Project >> Web Deployment Options..., definindo as pastas de trabalho e tambm o endereo URL do nosso formulrio.

Agora selecione Project >> Web Deploy para que o Delphi gere o arquivo .htm de teste.

Pgina: 68

DELPHI 4 - Avanado

A listagem mostrada a seguir, mostra o arquivo .htm gerado pelo Delphi na pasta que foi definida na caixa de dilogo Web Deployment Options.
<HTML> <H1> Delphi 4 ActiveX Test Page </H1><p> You should see your Delphi 4 forms or controls embedded in the form below. <HR><center><P> <OBJECT classid="clsid:D2044511-75B2-11D3-AB37-0000214D4F96" codebase="C:/Meus Documentos/Web/Project2.ocx" #version=1,0,0,0 width=284 height=180 align=center hspace=0 vspace=0 > </OBJECT> </HTML>

Abra o seu Browser chamando o arquivo .htm gerado. E para testar o formulrio, d um clique no boto Iniciar, e aps a carga do arquivo .avi, clique no boto play ( ) do controle MediaPlayer, exibindo a animao. O boto SobreBtn funcionar do mesmo modo que no formulrio comum, um formulrio ActiveX, ou sozinho como componente de uma pgina HTML.

Pgina: 69

DELPHI 4 - Avanado

LISTA DE EXERCCIO
1. Quais as diferenas entre os componentes de acesso a banco de dados e os de Visualizao de dados ? 1. Em que condies utilizamos o componente PageControl ? 1. O que SQL, e para que serve ? 1. Quais as diferenas entre um ambiente cliente/servidor e um banco de dados local ? 1. Em uma linguagem orientada a objetos, o que so componentes ? 1. Quando criamos um novo objeto, ele deve ser descendente de outro? Porqu ? 1. Qual a utilidade dos componentes ActiveX ? 1. O banco de dados DBDEMOS possui uma tabela de nome Vendors, atravs do programa Database Explorer, verifique os seus ndices e campos. Com estes dados mo, construa mais uma pgina para exibir os dados de vendedores no sistema de vendas. 1. Inclua na pgina de Vendedores um boto de comando que chame um formulrio de pesquisa exibindo os nomes por ordem alfabtica. 1. No programa para SQL, escreva uma instruo que informe a quantidade de peas que cada vendedor vende. 1. Crie uma instruo SQL que informe as mdias de preos das peas - utilize os campos Cost e ListPrice. 1. Escreva uma outra instruo SQL que exiba a quantidade total vendida de cada pea com sua descrio e preo de venda - ListPrice. 1. Na pgina de Pesquisa do nosso programa Sistema de Vendas, inclua um boto de pesquisa que informe as peas com a quantidade em estoque - OnHand - abaixo de 25 unidades. Indicando o cdigo da pea, sua descrio, o nome do vendedor(es) e seu telefone. 1. Inclua no formulrio do Sistema de Vendas mais uma pgina para informar dados sobre as peas, com um componente Grid exibindo o cdigo da pea, sua descrio, preo de venda e de compra e a margem de lucro. Observe que o campo margem de lucro dever ser um campo calculado. 1. Quando trabalhamos com o controle TQuery, notamos que existem poucas diferenas entre ele e o controle TTable. Monte um relatrio baseado numa instruo SQL que liste as peas com estoque baixo <25, utilizando um componente TQuery como ligao entre o banco de dados e este relatrio. 1. Monte um outro relatrio que emita um formulrio semelhante um pedido, com as informaes do Cliente, nmero do pedido, descrio das peas e quantidades. 1. O que so pacotes de componentes ?

Pgina: 70

DELPHI 4 - Avanado

1. Crie um novo componente baseado no controle Image, que possua uma figura e, ao passar o mouse sobre esta figura, aparecer o seu nome. 1. Monte um projeto que utilize o controle construdo anteriormente. 1. Projete um componente baseado no TComponent que possa realizar um teste no dgito de verificao em um cdigo de identificao, semelhante ao CPF. Quando a digitao for incorreta, o usurio ser informado e o contedo do quadro de texto apagado. 1. Transforme o controle criado anteriormente, em um componente ActiveX e inclua-o em uma pgina HTML. 1. Coloque este mesmo componente em um formulrio ActiveX, que contenha um quadro de edio e outro para exibir o cdigo, se este for digitado corretamente. E que apresente um arquivo AVI na sua abertura, sem a visualizao do componente MediaPlayer.

Pgina: 71

Вам также может понравиться