46
Delphi 2007 Guia de Referência Daniela Caio André Gomes Jorge Kawamura Roberto Scalco 2008

Delphi 2007 Guia de Referência - …oswirad.scienceontheweb.net/.../2008_Delphi_2007.pdf · 3. MANIPULAÇÃO DE PROJETOS ... Ambiente de desenvolvimento do Delphi 2007 Na primeira

Embed Size (px)

Citation preview

Delphi 2007

Guia de Referência

Daniela Caio André Gomes Jorge Kawamura Roberto Scalco

2008

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

33

Sumário

CAPÍTULO 1 – AMBIENTE DELPHI...................................................................................................................... 4

1. EXECUTANDO O DELPHI 2007 ..................................................................................................................... 4 2. AMBIENTE DE DESENVOLVIMENTO DO DELPHI 2007 .................................................................................. 5 3. MANIPULAÇÃO DE PROJETOS ....................................................................................................................... 8 3.1. CRIAR UM NOVO PROJETO ........................................................................................................................ 8 3.2. SALVAR UM PROJETO ................................................................................................................................ 8 3.3. ABRIR UM NOVO PROJETO ........................................................................................................................ 9

CAPÍTULO 2 – BIBLIOTECAS E FUNÇÕES .......................................................................................................... 10

1. CONVERSÕES: TEXTO ↔ NÚMERO ............................................................................................................ 10 2. FUNÇÕES MATEMÁTICAS ............................................................................................................................ 11

CAPÍTULO 3 – COMPONENTES BÁSICOS ......................................................................................................... 12

1. FORM ......................................................................................................................................................... 12 2. BUTTON ..................................................................................................................................................... 13 3. EDIT .......................................................................................................................................................... 13 4. LABEL ........................................................................................................................................................ 14 5. MEMO ........................................................................................................................................................ 14 6. RADIOGROUP ............................................................................................................................................ 15 7. LISTBOX .................................................................................................................................................... 16 8. STRINGGRID .............................................................................................................................................. 17 9. CHECKBOX ................................................................................................................................................ 18

CAPÍTULO 4 – UM EXEMPLO DE RESOLUÇÃO DE PROBLEMA ......................................................................... 20

CAPÍTULO 5 – OUTRAS FUNCIONALIDADES .................................................................................................... 25

1. COMPONENTES VISUAIS ............................................................................................................................. 25 1.1. COMBOBOX ........................................................................................................................................... 25 1.2. IMAGE .................................................................................................................................................... 26 1.3. SPINEDIT ............................................................................................................................................... 27 1.4. PAGECONTROL ...................................................................................................................................... 27 1.5. CHART.................................................................................................................................................... 28 2. MANIPULAÇÃO DE ARQUIVOS .................................................................................................................... 34 2.1. OPENDIALOG ........................................................................................................................................ 34 3. MANIPULAÇÃO DE CORES .......................................................................................................................... 36 3.1. TCOLOR ................................................................................................................................................. 36 3.2. COLORDIALOG ...................................................................................................................................... 36 3.3. SHAPE .................................................................................................................................................... 37 4. MANIPULAÇÃO DE DATAS .......................................................................................................................... 38 4.1. TDATETIME........................................................................................................................................... 38 4.2. NOW ...................................................................................................................................................... 39 4.3. DIFERENÇA ENTRE DOIS INSTANTES ...................................................................................................... 39 4.4. DATETIMEPICKER ................................................................................................................................. 40 5. IMPRESSÃO ................................................................................................................................................. 41 5.1. PRINT ..................................................................................................................................................... 41 5.2. RAVE REPORT ........................................................................................................................................ 42

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

44

Capítulo 1 – Ambiente Delphi Ambiente de programação voltado ao desenvolvimento de aplicações para o sistema operacional Windows. Dentre suas características destacam-se:

a) programação visual; b) RAD – Rapid Application Development; c) Pascal (Object Pascal); d) programação orientada a objetos; e) programação orientada a eventos.

1. Executando o Delphi 2007 No Windows, clique sobre a pasta CodeGear RAD Studio no menu iniciar e em seguida no item “Delphi 2007”.

A figura a seguir mostra o ambiente de desenvolvimento Delphi 2007.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

55

2. Ambiente de desenvolvimento do Delphi 2007 Na primeira parte do curso foi apresentado no ambiente Delphi 2007 um projeto do tipo Console Application, na segunda parte do curso será apresentado um projeto do tipo VCL Forms Application – Delphi for Win32. Para tal clique em File, depois New e em seguida selecione o item VCL Forms Application – Delphi for Win32.

Para confecção de um projeto VCL, o ambiente Delphi disponibiliza os seguintes elementos:

a) Barra Rápida (Speed Bar): permite executar as funções mais comuns do menu por meio do mouse, como por exemplo: abrir projetos, salvar projetos, etc. Ao passar com o mouse sobre seus botões, um texto explicativo é apresentado.

b) Formulário (Form): representa uma janela, que será a janela principal de um aplicativo desenvolvido no Delphi. Contém uma área livre em seu interior, onde serão colocados os componentes que o aplicativo irá necessitar. Note que o formulário pertence à aba Design. Desta maneira, as ferramentas para a confecção da aparência do aplicativo somente são exibidas quando essa aba estiver selecionada.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

66

c) Palheta de ferramentas (Tool Palette): possui um conjunto de componentes organizados segundo a sua função e que podem ser acessados com o mouse.

d) Editor de Código: é uma janela que apresenta um arquivo texto contendo o código fonte em Object Pascal referente ao Form. O nome do arquivo texto contendo código fonte no Delphi é conhecido como Unit (Unidade).

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

77

Para acessar o editor de código selecione a aba Code.

e) Inspetor de Objetos (Object Inspector): Esta janela indica os valores das propriedades

dos objetos (componentes) e os eventos que serão utilizados em um programa. Possui um ComboBox que permite selecionar cada componente utilizado na aplicação e possui, também, uma lista de propriedades pertinentes a esse objeto, bem como uma lista de eventos relacionadas ao objeto que está selecionado.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

88

Observação: Clicar com o botão direito do mouse em Properties no Object Inspector. No item Arrange selecione by name para ordenar por nome as propriedades e eventos do Object Inspector.

3. Manipulação de Projetos Um projeto é um conjunto de Forms e Units que o Delphi usa para gerar o programa final executável. A seguir serão apresentados os processos, de maneira segura, para criar, abrir e salvar projetos.

3.1. Criar um novo projeto Para criar um novo projeto devemos nos certificar que não existe nenhum projeto aberto, isto pode ser feito clicando no menu File, em seguida no item Close All. Após esta verificação clique novamente em File, depois New e em seguida selecione o item VCL Forms Application – Delphi for Win32 para criar um novo projeto.

3.2. Salvar um projeto Para salvar um projeto no Delphi clique no menu File, em seguida Save All, o Delphi pedirá para salvar primeiro a unidade e depois o projeto. Dê um nome para a unidade, aperte o botão Salvar e a seguir faça o mesmo com o projeto. O nome desses arquivos devem ser seguir as regras para criação de nome de variáveis.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

99

3.3. Abrir um novo projeto Para abrir um novo projeto devemos nos certificar que não existe nenhum projeto aberto, isto pode ser feito clicando no menu File, em seguida no item Close All. Depois disso clique no menu File, em seguida Open.

Dentre os arquivos apresentados escolha o arquivo de projeto (.dpr). Atenção! Não abra o arquivo da unidade (.pas), pois esse possui apenas o código fonte.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1100

Capítulo 2 – Bibliotecas e Funções Esse capítulo apresenta algumas funções e tipos de dados disponibilizados em bibliotecas (units).

1. Conversões: Texto ↔ Número

Quando desejamos ler uma informação digitada pelo usuário em algum componente do formulário, devemos analisar como a informação será armazenada no aplicativo, ou seja, devemos observar qual será o tipo da variável utilizada. Todas as informações do formulário que são representadas por caracteres são valores do tipo texto (string). Desta maneira, quando desejamos ler um valor numérico, devemos converter o valor, escrito na forma de texto, para valores numéricos. Além disso, devemos escolher como será o formato do número, inteiro ou real (chamado número de ponto flutuante, ou float).

a) função que transforma um texto para um número inteiro: StrToInt; b) função que transforma um texto para um número real: StrToFloat.

Quando desejamos exibir um valor numérico em algum componente do formulário, devemos utilizar funções complementares para converter os valores numéricos (inteiros ou reais) para texto.

a) função que transforma um número inteiro para um texto: IntToStr; b) função que transforma um número real para um texto: FloatToStr.

Veja no exemplo como ler e exibir valores em componentes do tipo Edit, considerando que foram declaradas as variáveis A: Integer, B: Real e C: String.

// Lendo valores

A := StrToInt(Edit1.Text);

B := StrToFloat(Edit2.Text);

C := Edit3.Text; // note que não fazemos a conversão

// Exibindo valores

Edit4.Text := IntToStr(A);

Edit5.Text := FloatToStr(B);

Edit6.Text := C; // note que não fazemos a conversão

Também é possível exibir um determinado número de casas decimais quando valores reais forem apresentados nos componentes. Para tal, utilize a função FloatToStrF que formata o valor no momento da conversão para texto. Essa função possui quatro parâmetros:

a) o valor que será exibido; b) o formato do número. Normalmente utilizamos a constante ffFixed; c) a precisão, que representa o número de algarismos significativos; d) a quantidade de casas após o separador decimal.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1111

Considerando que o valor da variável real x seja , veja como o valor pode ser exibido alterando os parâmetros.

Instrução Valor Exibido FloatToStrF(x,ffFixed,6,5) 1,41421 FloatToStrF(x,ffFixed,5,5) 1,41420 FloatToStrF(x,ffFixed,2,5) 1,40000 FloatToStrF(x,ffFixed,6,4) 1,4142 FloatToStrF(x,ffFixed,6,0) 1

Note que o parâmetro da precisão deve ser maior do que o número de casas decimais para que não haja alteração do valor.

2. Funções Matemáticas

Algumas funções matemáticas estão disponíveis na biblioteca Math. Para acessar essas funções, devemos declarar essa biblioteca na cláusula uses.

Uses Math;

Das funções existentes na biblioteca Math, destacam-se três, descritas a seguir:

a) as funções DegToRad e RadToDeg fazem a conversão de valores reais de graus para radianos e de radianos para graus, respectivamente, retornando novos valores reais. Veja os exemplos, considerando que as variáveis reais AnguloGrau e AnguloRadiano foram declaradas:

AnguloRad := DegToRad(AnguloGrau);

AnguloGrau := RadToDeg(AnguloRad);

b) até o momento, o cálculo da potência de dois valores era feita da seguinte maneira:

Potencia := Exp(y*ln(x));

Entretanto, essa expressão possui uma limitação, pois o domínio da função ln somente é

definido para valores positivos de x. Para evitar esse problema, sem ter que criar uma estrutura condicional, podemos utilizar a função Power que possui dois parâmetros reais, a base e o expoente. A função possui o tratamento de eventuais erros, retornando o valor da potência sem restrições de valores da base e do expoente.

Potencia := Power(x,y);

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1122

Capítulo 3 – Componentes Básicos Neste capítulo apresentaremos os componentes básicos para a criação dos aplicativos que serão desenvolvidos no curso.

1. Form O formulário é objeto que serve como “base” para colocar outros objetos (componentes). Possui controles que permitem que o usuário realize ações como minimizar, maximizar e fechar, encerrando a execução do programa. Quando um novo projeto é criado (VCL Forms Application – Delphi for Win 32), esse componente é imediatamente colocado a disposição do programador, permitindo que a confecção do aplicativo se dê por ele.

Propriedades e eventos

a) dentre suas propriedades, destacam-se a Caption que indica qual é o texto que será exibido na barra superior do formulário. No exemplo acima, foi usado:

Form1.Caption := ‘Form1’;

b) a sub-rotina que está associada ao evento OnCreate é ativada logo após a execução do

programa, como se fosse “a primeira coisa que será feita”. Aproveite essa sub-rotina para iniciar suas variáveis globais e fazer algumas configurações iniciais nos objetos que estiverem sobre o formulário.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1133

2. Button Esse componente está na aba Standard da barra de componentes. O botão é o principal objeto que irá sofrer ações (Eventos) oriundas do usuário quando esse desejar executar algumas instruções (Métodos).

Propriedades e eventos

a) a propriedade Caption indica o texto que será exibido no botão; b) a sub-rotina que está associada ao evento OnClick é executada quando o botão for

pressionado. A maioria dos códigos que serão desenvolvidos estará alocada nessa sub-rotina.

3. Edit Esse componente está na aba Standard da barra de componentes. O Edit permite a entrada de um único valor, digitado via teclado, na forma de texto. Lembre-se das funções de conversão de texto para número caso o valor digitado tenha que ser utilizado em algum cálculo.

Propriedades

a) a propriedade Text contém informações digitadas no componente. É o meio mais comum para a leitura de valores.

O exemplo a seguir mostra como ler alguns valores, considerando que as variáveis A, B e

C são do tipo inteiro, real e texto, respectivamente:

A := StrToInt(Edit1.Text);

B := StrToFloat(Edit2.Text);

C := Edit3.Text; // note que não fazemos a conversão

Embora os exemplos tenham mostrado o uso do Edit para a leitura de informações, também é possível exibir os valores obtidos pelo processamento do aplicativo, escrevendo as variáveis na propriedade Text.

b) para colocar o foco em um componente, ou seja, prepará-lo para receber uma nova

informação, utiliza-se:

Edit1.SetFocus;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1144

c) para limpar o conteúdo do Edit, a propriedade Clear deve ser usada da seguinte maneira:

Edit1.Clear;

4. Label

Esse componente está na aba Standard da barra de componentes. O Label permite exibir um único dado (valor de uma variável) na forma de texto ou apenas melhora a aparência da interface do programa.

Propriedades

a) Para exibir um texto no Label, devemos escrever sobre a propriedade Caption. Veja os exemplos de como exibir uma variável do tipo inteiro, uma do tipo real, uma do tipo string e um texto constante, respectivamente.

Label1.Caption := IntToStr(A);

Label2.Caption := FloatToStr(B);

Label3.Caption := C;

Label4.Caption := ‘Texto’;

Atenção! O Edit possui Text e o Label possui Caption.

5. Memo

Esse componente está na aba Standard da barra de componentes. Exibe um texto que pode ser dividido em linhas, sendo que estas linhas são manipuladas de forma independente.

Propriedades

a) para adicionar um texto na última linha do Memo, usa-se:

Memo1.Lines.Add(‘Texto’);

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1155

b) para conhecer o número de linhas (valor inteiro) existentes no Memo faz-se:

NumeroDeLinhas:= Memo1.Lines.Count;

c) para conhecer o valor do índice da última linha (valor inteiro) existente no Memo, utiliza-

se:

UltimaLinha:= Memo1.Lines.Count - 1;

d) pode-se apagar uma determinada linha (do tipo Integer) com:

Memo1.Lines.Delete(Linha);

e) para apagar todas as linhas de um Memo.

Memo1.Clear;

f) retorna o conteúdo da linha indicada pela variável inteira Linha em uma variável do tipo

String.

Texto:= Memo1.Lines[Linha];

6. RadioGroup

Esse componente está na aba Standard da barra de componentes. O RadioGroup é um componente que permite a escolha de somente uma opção em um grupo contendo várias alternativas. Também é um componente para a entrada de dados, entretanto o usuário deve utilizar o mouse ao invés do teclado.

Propriedades e eventos

a) embora existam elementos dentro do RadioGroup que sejam semelhantes aos RadioButton (não utilizado no curso), eles são, na verdade, textos digitados dentro da propriedade Items no Object Inspector;

b) para descobrir qual dos itens foi selecionado, pode-se usar uma estrutura condicional caso. A expressão que será verificada será a propriedade ItemIndex, que retorna o valor inteiro da posição do RadioGroup selecionado. Importante! O primeiro item sempre é definido com o índice zero;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1166

c) para obter o texto do item selecionado, devemos verificar qual é o valor da lista Itens que está na posição selecionada, como faríamos em uma variável indexada.

TextoSelecionado := RadioGroup1.Items[RadioGroup1.ItemIndex];

d) também é possível executar uma seqüência de instruções quando uma opção do

RadioGroup for selecionada (instruções no Método OnClick).

7. ListBox Esse componente está na aba Standard da barra de componentes. O ListBox é um componente semelhante ao RadioGroup em termos de utilização. Apresenta uma lista de itens, na forma de String, que podem ser selecionados com o auxílio do apontador do mouse.

Propriedades

a) Para preencher a lista de itens do ListBox, devemos digitar os valores dentro da propriedade Items do Object Inspector, exatamente como no RadioGroup. Caso o conteúdo deva ser adicionado em tempo de execução do aplicativo, podemos acrescentar um texto na última linha do ListBox, utilizando:

ListBox1.Items.Add(‘Texto’);

b) para descobrir qual dos itens foi selecionado, pode-se usar uma estrutura condicional

caso. A expressão que será verificada será a propriedade ItemIndex, que retorna o valor inteiro da posição do ListBox selecionado. Importante! O primeiro item sempre é definido com o índice zero;

c) para obter o texto do item selecionado, devemos verificar qual é o valor da lista Itens que está na posição selecionada, como faríamos em uma variável indexada.

TextoSelecionado := ListBox1.Itens[ListBox1.ItemIndex];

d) para apagar uma linha qualquer, utiliza-se:

ListBox1.Items.Delete(NumeroDaLinha);

e) também é possível executar uma seqüência de instruções quando uma opção do ListBox

for selecionada. Para tal, utilize o método OnClick para digitar o código-fonte do que deve ser executado.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1177

8. StringGrid

Esse componente está na aba Additional da barra de componentes. O StringGrid permite a entrada ou exibição de dados na forma de texto. Estes dados podem ser, normalmente, vetores ou matrizes, na forma de uma tabela. Assim como todos os componentes que possuem mais do que um item, o primeiro possui índice 0, no caso, a primeira linha e a primeira coluna possuem o índice 0, não importando a cor. Cada item do StringGrid é denominado de célula. A figura a seguir mostra um objeto com 5 linhas e 5 colunas, com células em três cores diferentes. As células brancas representam as células que podem ser utilizadas pelo usuário para digitar informações. A célula azul representa uma célula branca selecionada. As células da esquerda e as de cima da tabela são denominadas células fixas e não permitem que o usuário escreva nelas.

Propriedades

a) a quantidade de linhas e colunas do StringGrid pode ser definida diretamente no Object Inspector, ou em tempo de execução do aplicativo, manipulando as propriedades inteiras RowCount e ColCount, respectivamente. Veja o exemplo:

StringGrid1.RowCount:= NumeroDeLinhas;

StringGrid1.ColCount:= NumeroDeColunas;

Note que a alteração dessas propriedades modifica apenas a quantidade de linhas e colunas, não modificando o tamanho, em pixels, do StringGrid no formulário. Para acessar as linhas e colunas que não cabem na janela, utilize as barras de rolagem vertical e horizontal.

b) um caso de interesse é conhecer o valor de índice (representado por um valor inteiro) da última linha ou coluna:

UltimaLinha:= StringGrid1.RowCount - 1;

UltimaColuna:= StringGrid1.ColCount - 1;

c) Para alterar o modo de edição do StringGrid, deve-se clicar na propriedade Options do

Object Inspector. Nesta propriedade existe o campo goEditing, que pode receber valores booleanos (True ou False). No caso do StringGrid ser utilizado apenas para a exibição de dados, ou seja, o usuário não irá digitar nenhum valor nas células do componente, a propriedade goEditing deverá receber False.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1188

Existe outra possibilidade na qual o usuário irá digitar valores nas células do StringGrid. Neste caso, goEditing receberá True.

d) Para escrever ou acessar o conteúdo da célula, na forma de texto, utilizamos a

propriedade Cells como uma variável indexada bidimensional, lembrando que a primeira célula possui os índices [0,0]. Lembre-se de que os índices das células devem ser valores do tipo inteiro. Atenção! Naturalmente utilizamos matrizes considerando o primeiro índice para as linhas e o segundo para as colunas. No StringGrid os índices são coluna e linha, respectivamente. Veja os exemplos que mostram a leitura e exibição de alguns valores. Note que o exemplo mostra que para valores reais e inteiros devemos fazer a conversão dos valores. Considere a seguinte declaração de variáveis:

Var A, linha, coluna: Integer;

B: Real;

C: String;

As variáveis coluna e linha devem estar devidamente preenchidas com os índices desejados.

// leitura de valores

A:= StrToInt(StringGrid1.Cells[coluna,linha]);

B:= StrToFloat(StringGrid1.Cells[coluna,linha]);

C:= StringGrid1.Cells[coluna,linha];

// exibição de valores

StringGrid1.Cells[coluna,linha]:= IntToStr(A);

StringGrid1.Cells[coluna,linha]:= FloatToStr(B);

StringGrid1.Cells[coluna,linha]:= C;

9. CheckBox Esse componente está na aba Standard da barra de componentes. O CheckBox é um componente que permite a entrada de uma informação do tipo Selecionado/Não Selecionado (True / False). A figura a seguir mostra três componentes CheckBox distintos:

Propriedades e eventos

a) para verificar se um CheckBox está ou não selecionado, pode-se verificar o resultado da propriedade Checked. Esta propriedade retorna um valor lógico (True ou False) indicando se o item analisado está ou não selecionado;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

1199

bb)) a verificação deve ser feita para cada um dos componentes CheckBox existentes. No exemplo da figura anterior, devem ser feitas três estruturas condicionais, uma para cada componente;

cc)) também é possível executar uma seqüência de instruções quando o usuário clicar sobre o CheckBox. Para tal, digite as instruções no método OnClick.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2200

Capítulo 4 – Um Exemplo de Resolução de Problema Neste capítulo iremos mostrar o processo de resolução de um exercício desde a leitura e compreensão do enunciado até o desenvolvimento e teste do aplicativo final. Passo 1: Leitura e compreensão do enunciado. “Elaborar um programa que calcule e exiba as raízes de uma equação de segundo grau.” O primeiro passo consiste em analisar a equação necessária para a resolução do problema:

São necessários três valores digitados pelo usuário ( , e ) para calcular as duas raízes ( e ).

Além disso, será criada uma variável auxiliar para calcular o valor de delta ( ). Passo 2: Representação da solução na forma gráfica.

Button1Click

Início

a, b, c

d ← sqr(b)-4*a*c

x1 ← (-b+sqrt(d))/(2*a)

x2 ← (-b-sqrt(d))/(2*a)

x1, x2

Fim

Passo 3: Criando o aplicativo. No Delphi, crie um novo projeto clicando no item New do menu File. Dentre as opções apresentadas escolha VCL Forms Application – Delphi for Win32. Adicione um componente Label ao formulário arrastando-o da palheta de ferramentas para o Form1. Após posicionar o Label verifique se os marcadores de seleção estão visíveis, como mostra a figura a seguir. Caso não estejam dê um clique sobre o objeto Label1. Com o objeto selecionado, altere o texto da propriedade Caption no Object Inspector para ‘a:’.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2211

Depois disso adicione outros quatro Labels, três Edits e um Button. Modifique as propriedades de maneira conveniente para que o seu formulário possua a seguinte aparência:

Para digitar o código-fonte, selecione o Button1 e localize o evento OnClick no Object Inspector. Dê um duplo clique na região branca desse evento, como mostra a figura a seguir:

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2222

O Delphi automaticamente irá criar o cabeçalho do procedimento Button1Click. Nessa região escreveremos o código-fonte de maneira condizente com o fluxograma desenvolvido.

procedure TForm1.Button1Click(Sender: TObject);

var a, b, c, d, x1, x2: real;

begin

a := StrToFloat(Edit1.Text);

b := StrToFloat(Edit2.Text);

c := StrToFloat(Edit3.Text);

d := sqr(b)-4*a*c;

x1 := (-b+sqrt(d))/(2*a);

x2 := (-b-sqrt(d))/(2*a);

Label4.Caption := FloatToStr(‘x1 = ’, x1);

Label5.Caption := FloatToStr(‘x2 = ’, x2);

end;

Clique sobre o botão com a seta verde ou utilize a tecla F9. Isso fará com que seu aplicativo seja compilado e executado. O simples fato do programa ter sido compilado não significa que está correto. Como o Delphi não informou nenhum erro, significa apenas que não existem erros de sintaxe. Para tentar localizar eventuais erros de lógica, devemos testar alguns valores e compará-los aos valores de teste do fluxograma. Nesse exemplo, vamos utilizar os valores 1, 2 e 3 para calcular as

raízes do polinômio . Depois de digitar os valores 1, 2 e 3 nos três Edits e clicar sobre o botão, podemos verificar a seguinte mensagem de erro:

Como podemos observar, a mensagem de erro ‘Invalid floating point operation’ indica que houve um erro em algum cálculo com valores reais. Para descobrir qual é a linha onde o erro foi gerado, clique sobre o botão Break. Note que a linha ‘x1 := (-b+sqrt(d))/(2*a);’ recebe um destaque. Atenção! Não tente modificar o código-fonte nessa situação. É necessário parar a execução do aplicativo clicando na opção Program Reset no menu Run. Vamos lembrar uma técnica para a depuração: dê um clique no ponto ao lado da linha que recebeu destaque do erro. Note que um círculo aparece e a linha novamente recebe destaque. Quando o aplicativo for executado novamente, ele irá parar antes da execução dessa linha. Dessa maneira, poderemos analisar as condições das variáveis que podem gerar o erro.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2233

Execute o aplicativo, apertando a tecla F9 e preencha os Edits com os mesmos valores: 1, 2 e 3. Note que ao clicar sobre o botão, o código-fonte é exibido novamente com uma seta ao lado da linha em destaque. Isso significa que a linha ainda não foi executada. Nesse momento é conveniente utilizarmos um recurso do ambiente Delphi para verificar qual é o valor das variáveis.

Selecione o item Add Watch... do menu Run. Preencha o campo Expression com o nome da variável que deverá ser inspecionada. Repita o processo para todas as variáveis desejadas.

A figura anterior mostra que a variável foi calculada como esperado, ou seja, .

Como os valores e ainda não foram calculados, são exibidos valores remanescentes dos espaços de memória.

Analisando o valor podemos concluir que esse valor irá gerar um erro quando a raiz

quadrada for calculada, uma vez que não possui solução real.

Pressionando a tecla F7, que executa apenas a instrução em destaque, a linha que calcula será executada e, como previsto, será gerado um erro. Para interromper a execução do programa, clique novamente no item Program Reset do menu Run. Para resolver o problema, devemos modificar o algoritmo, como mostra o fluxograma a seguir:

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2244

Button1Click

Início

a, b, c

d ← sqr(b)-4*a*c

x1 ← (-b+sqrt(d))/(2*a)

x2 ← (-b-sqrt(d))/(2*a)

x1, x2

Fim

d >= 0

„Não existem

raízes reais.‟

TrueFalse

Alterando o código-fonte, temos:

procedure TForm1.Button1Click(Sender: TObject);

var a, b, c, d, x1, x2: real;

begin

a := StrToFloat(Edit1.Text);

b := StrToFloat(Edit2.Text);

c := StrToFloat(Edit3.Text);

d := sqr(b)-4*a*c;

if d >= 0 then

begin

x1 := (-b+sqrt(d))/(2*a);

x2 := (-b-sqrt(d))/(2*a);

Label4.Caption := FloatToStr('x1 = ', x1);

Label5.Caption := FloatToStr('x2 = ', x2);

end

else

Showmessage('Não existem raízes Reais.');

end;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2255

Capítulo 5 – Outras Funcionalidades Este capítulo dedica-se aos programadores que desejam tornar seus aplicativos agradáveis ao usuário, tornando o processo de inserção e exibição de dados mais natural. Serão apresentados componentes visuais, componentes que fazem a chamada para algumas funções do Windows, além de estruturas de dados que facilitam o uso e armazenamento de cores e datas, além de permitir a impressão dos valores obtidos pelo aplicativo.

1. Componentes Visuais

1.1. ComboBox

Esse componente está na aba Standard da barra de componentes. O ComboBox é um componente cujas funcionalidades são idênticas ao RadioGroup, entretanto, sua disposição é mais compacta.

Propriedades e eventos

a) os elementos do ComboBox devem ser digitados dentro da propriedade Items no Object Inspector;

b) para descobrir qual dos itens foi selecionado, pode-se usar uma estrutura condicional caso. A expressão que será verificada será a propriedade ItemIndex, que retorna o valor inteiro da posição do ComboBox selecionado. Importante! O primeiro item sempre é definido com o índice zero;

c) para obter o texto do item selecionado, devemos verificar qual é o valor da lista Itens que está na posição selecionada, como faríamos em uma variável indexada.

TextoSelecionado := ComboBox1.Itens[ComboBox1.ItemIndex];

Também é possível conhecer o valor do texto utilizando o ComboBox como se fosse um Edit.

TextoSelecionado := ComboBox1.Text;

d) também é possível executar uma seqüência de instruções quando uma opção do

ComboBox for selecionada (instruções no Método OnClick). Veja a aparência do objeto quando o usuário clica sobre o botão com a seta.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2266

1.2. Image Esse componente está na aba Additional da barra de componentes. Embora o Image possua um conjunto de ferramentas associadas à propriedade Canvas que permite a criação de desenhos em tempo de execução, nos atentaremos a uma característica mais simples, utilizando-o apenas para exibir uma imagem armazenada em arquivo. Em tempo de execução as linhas tracejadas que o contornam não são exibidas.

Propriedades

a) Para carregar uma imagem de um arquivo devemos indicar todo o caminho físico dessa imagem. Isso deve ser feito clicando no botão com três pontos da propriedade Picture do Object Inspector. Depois devemos clicar em Load... e selecionar a figura. Para aceitar clique sobre o botão OK.

b) Caso o resultado não seja esperado, ou seja, a imagem original é maior do que a janela criada pelo Image no formulário, podemos definir o valor True para a propriedade Proportinoal no Object Inspector. Veja a diferença nas imagens quando o valor False (esquerda) e True (direita) estão aplicados na propriedade Proportional.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2277

1.3. SpinEdit Esse componente está na aba Samples da barra de componentes. O SpinEdit é um componente muito útil e prático, entretanto, limitado para entrada de dados de números inteiros.

Propriedades

a) para obter o valor do SpinEdit devemos acessar a propriedade Value, que retorna um valor inteiro e não texto, como todos os outros apresentados. Veja o exemplo, considerando que a variável n foi declarada inteira.

n := SpinEdit1.Value;

b) as propriedades inteiras MinValue e MaxValue definem os limites para o valor do

SpinEdit, seja a entrada realizada via teclado ou mouse, quando o usuário clica sobre os botões com as setas;

c) a propriedade inteira Increment indica qual é o valor do acréscimo ou decréscimo sofrido pelo valor exibido quando o usuário clicar sobre os botões com as setas. Seu valor padrão é um.

1.4. PageControl

Esse componente está na aba Win32 da barra de componentes. O PageControl nada mais é do que um componente para organizar as diferentes funcionalidades do seu aplicativo. Por exemplo, podemos criar várias abas, uma para cadastro de clientes, outra para consulta de preços e outra para efetuar o balanço do dia. Todas estão relacionadas com as informações de um comércio qualquer, mas são utilizadas em momentos diferentes do dia. Isso permite que o formulário possua uma apresentação melhor, sem uma quantidade absurda de objetos que não são utilizados para a maior parte das tarefas. Para criar uma aba, denominada TabSheet, clique sobre o PageControl com o botão direito do mouse e selecione New Page. Repita a operação quantas vezes forem necessárias.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2288

O exemplo a seguir podemos ver que foram criados dois ambientes, um em cada aba do PageControl. Note que a numeração dos objetos é contínua em todo o formulário, ou seja, no TabSheet2 foi criado o Edit2, pois existem dois Edits no programa.

1.5. Chart Esse componente está na aba TeeChart Std da barra de componentes. O componente Chart é uma ferramenta para exibição de gráficos de diversos tipos, como linha, pizza, barras e outros. Podemos desenhar várias curvas em um único gráfico.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

2299

Criando uma curva O primeiro passo para criar uma curva é dar um duplo clique sobre o componente Chart, posicionado no formulário. Isso faz com que a janela Editing Chart1 seja exibida, como na figura a seguir.

Ao clicar sobre o botão Add... uma nova série será criada. Neste momento, é necessário decidir qual tipo de gráfico será utilizado. Para o exemplo, escolha Line e remova a seleção da opção 3D. essa opção não cria um gráfico que representa três dimensões, é apenas um efeito visual de profundidade. Depois disso, clique em OK.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3300

Veja que a Series1 foi criada. Quando criarmos o código-fonte que dá forma a série devemos alterar as propriedades desse objeto. Além disso, podemos repetir esse passo e criar várias séries. Isso torna possível criar várias curvas em uma única janela.

A série está pronta para ser utilizada, entretanto podemos configurar alguns itens para que o gráfico traga mais informações.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3311

Selecione a série e clique na aba Axis.

Nessa aba, escolha a aba Title. Selecione Left Axis e dê o nome ao eixo, por exemplo: “Valores de y”. Depois disso, escolha Botton Axis e faça o mesmo, escrevendo “Valores de x”. Agora que os eixos das abscissas e ordenadas possuem uma designação, faremos o mesmo com o ambiente do gráfico, clicando na aba Titles, como mostra a figura a seguir.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3322

Em Text digite o título do gráfico.

Em gráficos com mais de uma série é conveniente manter uma legenda que relaciona as cores das linhas com as séries. No exemplo esse recurso será desabilitado, clicando sobre o item Visible da aba Style da aba Legend. Existem muitas outras configurações que podem ser realizadas no assistente de criação das séries, como, por exemplo, gráficos com eixos invertidos ou em escala logarítmica. Após concluirmos as configurações, devemos clicar em Close. Existem duas propriedades da Series que serão utilizadas:

a) Clear: apaga todos os pontos da série; b) Add: adiciona um ponto à série. Pode ser utilizado com dois parâmetros, sendo o

primeiro o valor da imagem (y) e o segundo o valor do domínio (x) na forma de texto. Isso permite fazer gráficos por categorias, ou por dias da semana, por exemplo.

Finalmente vamos criar o código-fonte, em um botão, por exemplo, que irá traçar uma curva

específica. No caso, vamos desenhar a função para o intervalo da abscissa.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3333

procedure TForm1.Button1Click(Sender: TObject);

var x, xi, xf, dx, y: real;

n: integer;

begin

xi := 0; // limite inferior do domínio

xf := 4; // limite superior do domínio

n := 100; // número de sub-divisões do domínio

dx := (xf-xi)/n; // valor do incremento na direção x

Series1.Clear; // apaga a curva

x := xi; // x recebe o limite inferior

while x < xf+dx do // enquanto x pertencer aos limites do domínio

begin

y := exp(-x)*sin(10*x); // cálculo da imagem

Series1.Add(y,FloatToStr(x)); // adiciona o ponto à Series1

x := x + dx; // próximo x

end;

end;

Após a execução do código-fonte apresentado, podemos observar o seguinte resultado.

Compare o código-fonte com o seu fluxograma. Note que a o uso do componente nada mais é do que a exibição das coordenadas dos pontos, y e x, nesta ordem.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3344

Button1Click

Início

xi ← 0

xf ← 4

n ← 100

dx ← (xf-xi)/n

x ← xi

Enquanto

x < x+dx Faça

Fim Enquanto

y ← exp(-x)*sin(10*x)

y, x

x ← x + dx

Fim

2. Manipulação de Arquivos

2.1. OpenDialog Esse componente está na aba Dialogs da barra de componentes. O OpenDialog é um componente que faz uso da interface do sistema operacional Windows para abrir arquivos. Esse componente não abre o arquivo! Cabe ao programador verificar as informações fornecidas pelo usuário e abrir ou salvar o arquivo. Como faz uso de elementos do sistema operacional, sua aparência pode ser diferente em computadores com versão de Windows diferentes.

Note que o usuário somente perceberá os efeitos quando os componentes forem executados. Caso contrário, não são exibidos.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3355

Propriedades

a) InitialDir: é uma propriedade do tipo texto que recebe um caminho que pode ser do disco rígido ou até mesmos de um pen drive. Quando OpenDialog é executado, a pasta que é exibida inicialmente é o caminho definido nessa propriedade;

b) Execute: é o mecanismo de chamada do OpenDialog. Normalmente utilizado em uma estrutura condicional, pois retorna o valor True quando o usuário clica sobre o botão Abrir e False quando o usuário cancela a operação;

c) FileName: é a propriedade que armazena o caminho total do arquivo informado pelo usuário.

O código-fonte a seguir mostra um exemplo da execução do OpenDialog em um botão. Considere que a variável que representa o arquivo lógico arq foi criada globalmente. procedure TForm1.Button1Click(Sender: TObject);

begin

// faz a chamada da janela do OpenDialog

if OpenDialog1.Execute then

// o usuário clicou no botão Abrir

begin

// associar o arquivo lógico com o arquivo físico escolhido

AssignFile(arq,OpenDialog1.FileName);

// abrir o arquivo

reset(arq);

end;

end;

Quando a instrução OpenDialog1.Execute é executada, a seguinte janela é exibida ao usuário.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3366

3. Manipulação de Cores Em algumas aplicações devemos proporcionar ao usuário escolher uma cor. Entretanto, o computador nos oferece mais de dezesseis milhões de cores. Os elementos que serão apresentados permitirão criar ferramentas para dar ao usuário a opção de escolher uma cor pela sua percepção.

3.1. TColor O TColor é um tipo, assim como o String ou o Integer. Sua modelagem interna permite armazenar um número inteiro suficientemente grande para manipular as mais de dezesseis milhões de cores. Uma vez criada uma variável do tipo TColor, ela pode ser preenchida de duas maneiras distintas:

a) valores constantes. As constantes de cores começam por cl, como os exemplos clRed, clBlue, clGreen, clBlack, entre outras;

b) composição de três canais de cores: vermelho, verde e azul. Esses canais são valores inteiros entre 0 e 255 e devem ser passados via parâmetro à função RGB, que retorna um valor do tipo TColor.

Var Cor1, Cor2, Cor3: TColor;

...

Cor1 := clRed;

Cor2 := clBtnFace;

Cor3 := RGB(255,0,0); // no exemplo, vermelho

...

Assim como outros tipos de variável, o TColor pode compor campos de registros (record) criados para a manipulação de arquivos.

3.2. ColorDialog Esse componente está na aba Dialog da barra de componentes. Assim como o componente OpenDialog, o ColorDialog somente está visível ao usuário quando executado. Possui uma região de cores predefinidas e outra para que o usuário possa escolher a cor visualmente, seja pela percepção, por valores de Matiz, Saturação e Brilho ou as componentes dos canais Vermelho, Verde e Azul.

Propriedades

a) Execute: é o mecanismo de chamada do ColorDialog. Normalmente utilizado em uma

estrutura condicional, pois retorna o valor True quando o usuário clica sobre o botão Abrir e False quando o usuário cancela a operação;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3377

b) Color: retorna a cor, do tipo TColor, selecionada pelo usuário.

Quando a instrução ColorDialog1.Execute é executada, a seguinte janela é exibida.

3.3. Shape Esse componente está na aba Additional da barra de componentes. O Shape é um objeto que exibe uma figura geométrica como retângulos, elipse e retângulos com cantos arredondados.

Propriedades e eventos

a) para escolher a forma do objeto, escolha uma das opções da propriedade Shape no Object Inspector;

b) a cor do preenchimento é definida quando um valor do tipo TColor é atribuído à propriedade Color da propriedade Brush, como mostra o exemplo a seguir.

Shape1.Brush.Color := clBlue;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3388

c) também é possível executar uma seqüência de instruções quando o usuário apertar um botão do mouse sobre o Shape. Para tal, utilize o método OnMouseDown para digitar o código-fonte do que deve ser executado. O evento OnClick não está presente no Shape.

Exemplo de manipulação de cores O exemplo a seguir mostra como criar uma interface para a entrada de dados em forma de cor. Em seu formulário, acrescente um componente ColorDialog e um Shape. Com o objeto Shape selecionado, dê um duplo clique para abrir o evento OnMouseDown no Object Inspector. Nessa região será digitado o código-fonte que fará a leitura e exibição da cor escolhida pelo usuário. procedure TForm1.Shape1MouseDown(Sender: TObject; Button:

TMouseButton; Shift: TShiftState; X, Y: Integer);

var cor: TColor;

begin

if ColorDialog1.Execute then

begin

cor := ColorDialog1.Color;

Shape1.Brush.Color := cor;

end;

end;

Quando o usuário pressionar um botão do mouse sobre o Shape a janela do ColorDialog será exibida. Após a escolha da cor, quando a janela estiver oculta, poderemos ver o Shape todo preenchido com a cor escolhida. Sob o ponto de vista de fluxograma, essa sub-rotina faz apenas a entrada de dados da variável cor.

4. Manipulação de Datas Essa seção destina-se a apresentação de elementos para o armazenamento e manipulação de datas e horas, além da interface com o usuário.

4.1. TDateTime O tipo TDateTime é uma estrutura de dados que permite armazenar um valor numérico sob a forma de data, contendo dia, número da semana, mês, ano, hora, minuto, segundo e milésimo de segundo. Veja o exemplo da declaração de uma variável.

Var Data: TDateTime;

Assim como outros tipos de variável, o TDateTime pode compor campos de registros (record) criados para a manipulação de arquivos.

É possível exibir os dados de uma variável do tipo TDateTime de três maneiras distintas nos objetos apresentados até o momento, bastando fazer a conversão para texto. Veja o exemplo, considerando que a variável data indica o dia 12.11.1955 e a hora 22:04:00.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

3399

Label1.Caption := DateTimeToStr(Data); // exibe 12.11.1955 22:04:00

Label2.Caption := DateToStr(Data); // exibe 12.11.1995

Label3.Caption := TimeToStr(Data); // exibe 22:04:00

4.2. Now A função Now retorna a data e hora do instante em que foi executada, no formato tipo TDateTime, com precisão da ordem de milésimo de segundo. Essa função é muito utilizada em aplicativos que medem o tempo de execução de algoritmos ou aplicativos que fazem cálculos com datas e horas, como por exemplo, aplicativos para hotéis, estacionamentos e outros. Veja o exemplo de como obter o valor da data e hora atual do computador. Considere que a variável Data, do tipo TDateTime foi declarada como no exemplo anterior.

Data := Now;

4.3. Diferença entre dois instantes Existem algumas funções que retornam valores inteiros da diferença entre dois instantes de tempo distintos. Para utilizar essas funções é necessário declarar a biblioteca DateUtilis.

Uses DateUtils;

A tabela a seguir relaciona as funções com a unidade de tempo calculada. Todas as funções recebem como parâmetro o instante final e o instante inicial, nessa ordem, sob a forma de um valor do tipo TDateTime.

Função Unidade de tempo

MilliSecondsBetween Milissegundos

SecondsBetween Segundos

MinutesBetween Minutos

HoursBetween Horas

DaysBetwwen Dias

WeeksBetween Número de Semanas

MonthsBetween Meses

YearBetween Anos

O exemplo a seguir mostra como calcular quanto milissegundos se passaram durante a execução

de um algoritmo que calcula o comprimento da curva no intervalo .

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

4400

procedure TForm1.Button1Click(Sender: TObject);

var x, y, xa, ya, dx, c: real;

DataInicio: TDateTime;

tempo: integer;

begin

DataInicio := Now; // hora de início

c := 0; // comprimento inicial

xa := 0; // início do domínio

dx := 1/10000000; // incremento de x

while xa+dx <= 1 do // até valor final

begin

x := xa + dx; // posição futura

y := sqr(x);

c := c + sqrt(sqr(x-xa)+sqr(y-ya)); // calcula comprimento

xa := xa + dx; // incrementa posição atual

ya := sqr(xa);

end;

tempo := MilliSecondsBetween(now,DataInicio); // calcula duração

Label2.Caption := IntToStr(tempo); // exibe duração

Label1.Caption := FloatToStr(c); // exibe comprimento

end;

4.4. DateTimePicker Esse componente está na aba Win32 da barra de componentes. O componente DateTimePicker torna a entrada e a exibição de datas de maneira simples e clara ao usuário. Note que o componente, na sua forma compacta exibe uma data, entretanto, quando o usuário clica sobre o botão com a seta, o componente se abre e permite a escolha de uma nova data. Note que existe uma indicação da data atual na forma expandida.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

4411

Propriedades

a) A propriedade DateTime pode ser lida ou receber uma informação. Essa informação é

um valor do tipo TDateTime. O exemplo a seguir considera que uma loja aceita que a primeira parcela de um produto vendido seja pago quinze dias após a data da compra. Foram utilizados dois componentes DateTimePicker, um para a entrada de dados (dia da compra) e outro para exibir a data do pagamento da primeira parcela. procedure TForm1.Button1Click(Sender: TObject);

var DataCompra, PrimeiraParcela: TDateTime;

begin

DataCompra := DateTimePicker1.DateTime; // entrada de dados

PrimeiraParcela := DataCompra + 15; // calcula nova data

DateTimePicker2.DateTime := PrimeiraParcela; // exibe resposta

end;

5. Impressão Em alguns aplicativos é necessário gerar relatórios com o conteúdo armazenado ou calculado durante a execução. Serão apresentadas duas soluções, com características totalmente diferentes, mas que permitem imprimir as informações desejadas. Cabe lembrar que a impressão também deve ser expressa na forma de fluxograma. Desta maneira, quando desejamos imprimir o nome, o endereço e a idade de uma pessoa, utilizamos a seguinte representação.

Nome, Endereco, Idade

5.1. Print Uma solução simples, entretanto não usual em virtude da sua apresentação visual, consiste em utilizar a propriedade Print do próprio formulário. Isso faz com que todo o formulário, desde os botões até a barra com os botões maximizar e minimizar sejam impressas na impressora padrão do usuário.

Form1.Print;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

4422

5.2. Rave Report O Rave Reports é um programa que permite ao usuário criar relatórios de impressão, da mesma maneira que o usuário adiciona objetos em um formulário, com parâmetros que podem ser preenchido por um aplicativo criado no Delphi. Uma vez instalado, devemos ter o cuidado de somente executar o Rave Reports com o Delphi aberto.

O ambiente de confecção do Rave Reports é semelhante à filosofia de confecção da aparência de um formulário. Podemos notar as abas com os componentes sobre a folha de trabalho. Serão utilizadas duas abas para gerar o exemplo de um relatório: Standard e Report.

A principal diferença entre as duas abas consiste na característica dos componentes da aba Standard serem imutáveis durante a execução do aplicativo em Delphi, enquanto que na aba Report, o conteúdo dos componentes podem ser alterados, permitindo exibir, por exemplo, os valores calculados pelo aplicativo. O exemplo a seguir mostra a criação de um relatório contendo uma imagem e três textos, sendo um fixo e os outros dois preenchidos por um aplicativo.

a) O primeiro passo consiste em analisar o que deverá ser exibido em função da resposta do aplicativo que estamos desenvolvendo. No caso, de um Pet Shop, será cadastrado o nome e a data de nascimento dos cães dos clientes. Isso significa que o nome e a data são os parâmetros do relatório;

b) para definir esses parâmetros, clique sobre o item Report1 da árvore do projeto e depois clique sobre o botão com três pontos do item Parameters do Object Inspector.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

4433

c) a janela Strings Editor será exibida. Digite o nome dos dois parâmetros desejados. Vale ressaltar que os parâmetros no Rave Reports são textos e não precisam seguir as regras para criação de variáveis, ou seja, podem possuir caracteres especiais e espaços. Depois disso clique em OK;

d) vamos adicionar um componente Text da aba Standard e criar o título do relatório, alterando as características da fonte e a propriedade Text;

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

4444

e) depois adicione um componente Bitmap, também da aba Standard. Assim como no

componente Image do Delphi defina a imagem alterando a propriedade Image do Bitmap;

f) Para exibir o nome e a data de nascimento, adicione dois componentes DataText da aba Report. Selecione o DataText1 e clique no botão com três pontos da propriedade DataField no Object Inspector.

Escolha o nome do parâmetro em Project Parameters e clique sobre o botão Insert Parameter. Isso faz que o Data Text seja preenchido com Param.Nome, nesse exemplo. É possível concatenar um texto fixo com parâmetros, somando strings. Para tal, vamos escrever um texto antes do parâmetro no Data Text. Não se esqueça de utilizar apóstrofos para delimitar o texto.

‘Nome do Animal: ’ + Param.Nome

Depois disso clique sobre o botão OK;

g) repita os passos do item f) para definir o parâmetro Data para o DataText2. Veja o resultado na figura a seguir.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

4455

Salve o arquivo, de preferência na mesma pasta do projeto do Delphi e feche o Rave Reports. De volta ao Delphi, vamos criar um botão que irá fazer o chamado ao relatório de impressão criado no Rave Reports. Para tal, acrescente ao formulário um componente RvProject, da aba Rave.

Com o objeto RvProject1 selecionado, clique sobre o botão com os três pontos da propriedade ProjectFile no Object Inspector e escolha o arquivo criado no Rave Reports. Lembre-se que a extensão desse arquivo é rav. Depois disso, devemos criar o código-fonte do botão que preencherá os campos do relatório e o exibirá. A mecânica de funcionamento do objeto RvProject é a seguinte:

a) abrir o projeto com a propriedade Open; b) preencher os parâmetros com a propriedade SetParameters; c) fazer a chamada do relatório com a propriedade Execute; d) fechar o projeto com a propriedade Close.

DDeellpphhii 22000077 –– GGuuiiaa ddee RReeffeerrêênncciiaa

4466

Note que o código-fonte apresentado a seguir preenche as propriedades „Nome‟ e „Data‟ com valores digitados pelo usuário em componentes do tipo Edit. procedure TForm1.Button1Click(Sender: TObject);

begin

RvProject1.Open;

RvProject1.SetParam('Nome', Edit1.Text);

RvProject1.SetParam('Data', Edit2.Text);

RvProject1.Execute;

RvProject1.Close;

end;

Veja o resultado quando o botão for pressionado.