Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Delphi
Apostila Delphi
Centro de Tecnologia
Departamento de Engenharia Qumica
Programa de Educao Tutorial MEC / SESu
PET Engenharia Qumica UFC
Realizao:
Apostila de
Apoio:
V: 1.0
SUMRIO
1. PROGRAMAO ORIENTADA A OBJETOS
1.1 Programao Orientada a Objeto (POO) x Programao Orientada a Evento (POE)...............3
1.2 Liguagem para POO..................................................................................................................4
1.3 Estrutura do cdigo no Code Editor..........................................................................................5
2. ELEMENTOS DO DELPHI
2.1 Elementos Visveis....................................................................................................................6
2.2 Elementos No Visveis.............................................................................................................8
Pgina |1
8. CRIANDO A APLICAO
8.1 Criando o Formulrio da Aplicao.........................................................................................30
8.2 Inserindo um Panel no Formulrio Principal..........................................................................31
8.3 Incluindo um Menu no Formulrio Principal..........................................................................33
8.4 Criando uma Caixa de Dilogo de Direitos Autorais...............................................................34
8.5 Criando um GroupBox para exibir as equaes do problema................................................35
8.6 Criando Botes para a manipulao do Formulrio...............................................................36
8.7 Criando Caixas de Texto para receber os dados do problema...............................................37
8.8 Gerando os Resultados do problema.....................................................................................40
8.9 Compatilhando Eventos..........................................................................................................41
8.10 Exibindo as Iteraes do problema.......................................................................................42
8.11 Criando um Arquivo com os Resultados do problema.........................................................43
Pgina |2
Pgina |3
Basta lembrar que qualquer programa de computador que voc j usou, como a calculadora,
por exemplo:
Na calculadora acima, todos os botes, o menu e o prprio espao onde eles esto so
objetos. Aprendendo a POO, ser possvel utilizar os objetos para criar programas parecidos
com esse.
Pgina |4
seguintes), voc est criando um objeto que pertence ao grupo que armazena todos os botes.
Esse grupo define todos os estados e comportamentos possveis para os objetos que lhe
pertencem. Os grupos de objetos so chamados classes, e os objetos so instancias dessas
classes.
- Herana: Uma considerao importante que quando tratamos de uma classe, esta,
provavelmente, trata-se de uma subclasse de uma classe maior. Sempre que uma classe fizer
parte de uma classe superior, haver a transmisso de mtodos e variveis do grupo maior
para o menor. No entanto, a classe inferior no est limitada as caractersticas da classe
superior, podendo ter seus prprios mtodos e variveis. Chamamos de herana essa relao
entre uma classe e suas subclasses.
Pgina |5
2. ELEMENTOS DO DELPHI
Pgina |6
Pgina |7
- Palhetas: As palhetas so, basicamente, o local onde os objetos ficam listados para que
possam ser selecionados e usados pelo programador. As palhetas foram separadas por grupos
de funcionalidade, como se pode ver abaixo:
Pgina |8
- Repositrio de Objetos: No Repositrio de Objetos constam vrios objetos, alguns dos quais
no aparecem nas palhetas. Para acess-lo basta seguir a seqncia File-New-Other...
- Object TreeView: Logo acima do Object Inspector, aparece o Object TreeView, onde
apresentada uma lista de todos os objetos que esto sendo utilizados no programa. A
princpio, pode parece que no h utilidade alguma para esse componente do Delphi, mas ao
trabalhar com programas complexos que envolvam vrios forms, o Object TreeView facilita
muito o trabalho de ter que encontrar um objeto.
Pgina |9
Comentrios
- Comentrios de uma linha: definido por duas barras inclinadas. A partir destas duas barras,
tudo o que for escrito na mesma linha ser tratado como um comentrio, e durante a
execuo do programa ser desprezado.
Exemplo:
// Mtodo de Runge Kutta
P g i n a | 10
P g i n a | 11
- Variveis Reais:
- Variveis Booleanas:
Para realizarmos uma operao aritmtica entre duas variveis e atribuirmos o resultado a
uma terceira varivel, usamos a seguinte sintaxe:
variavel3:= variavel1 op variavel2; (op um dos operadores aritmticos)
A precedncia dos operadores segue uma ordem, essa ordem pode ser alterada pelo uso de
parnteses.
P g i n a | 12
P g i n a | 13
A palavra reservada end deve sempre ser seguida por um ponto-e-vrgula, exceto quando vier
aps a palavra reservada else, em uma estrutura condicional do tipo If-then-else, ou quando
encerrar uma unit (o end que encerra uma unit seguido por um ponto).
Caso no seja necessria a execuo de qualquer comando se a condio for falsa, basta
suprimir o trecho de cdigo correspondente ao else, como mostrado a seguir.
if (condio)
then
begin
{Bloco de comandos executados se a codio for verdadeira}
end;
P g i n a | 14
Nos casos em que um bloco de comandos formado por uma nica linha de cdigo, podem-se
suprimir as palavras Begin e end, como mostrado a seguir.
if (condio)
then
{Bloco de comandos executados se a codio for verdadeira}
else
{Bloco de comandos executados se a codio for falsa};
Ou
if (condio)
then
{Bloco de comandos executados se a codio for verdadeira};
Nesse caso, se a expresso testada for igual a um dos valores especificados, ser executado o
bloco de comandos a ele correspondente. Caso nenhum desses valores seja igual ao definido
pela expresso testada, o bloco de comandos else ser executado.
Caso se queira que o contador assuma valores decrescentes, deve-se usar a seguinte sintaxe:
for var_contador:= valor_inicial downto valor_final do
<bloco de comandos>
P g i n a | 15
- Laos While:
while <condio> do
bloco de comandos>
- Laos Repeat:
repeat
<bloco de comandos>
until condio;
P g i n a | 16
A aplicao do tipo console ser criada com um nico arquivo (arquivo de projeto, com
extenso dpr), e cujo cdigo gerado reproduzido a seguir.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
{ TODO -oUser -cConsole Main : Insert code here }
end.
P g i n a | 17
4. Salve o seu projeto com o nome MEuler, usando o item Save Project As do menu File.
P g i n a | 18
Readln;
end.
P g i n a | 19
5.1 Eventos
Os programas feitos em Delphi so orientados a eventos. Eventos so as aes normalmente
geradas pelo usurio e que podem ser reconhecidas e tradadas pelo programa. Por exemplo,
Clicar o mouse sobre um componente, focar um componente, mover o mouse sobre um
componente, entre outros.
Os eventos podem ser tambm gerados pelo windows. Existem eventos associados ao
formulrio e cada componente inserido neste. Por exemplos, o OnShow o evento que ocorre
quando mostramos o formulrio na tela, ao componente boto est ligado o evento OnClick,
que ocorre quando damos um click com o mouse sobre o boto.
- Eventos comuns ao formulrio e aos componentes:
OnClick: ocorre quando o usurio clica o objeto.
OndblClick: ocorre quando o usurio da um duplo clique.
OnKeyDown: ocorre quando uma tecla pressionado e o objeto tem o foco.
OnKeyUp: ocorre quando o usurio solta uma tecla enquanto o objeto tem o foco.
OnKeyPress: ocorre quando usurio da um clique numa tecla ANSI.
OnMouseDown: ocorre quando o usurio pressiona o boto do mouse.
OnMouseUp: ocorre quando o usurio solta o boto do mouse.
OnMouseMove: ocorre quando o usurio move o ponteiro do mouse.
- Rotinas que Respondem a Eventos:
Cada evento gera uma procedure, aonde voc deve inserir as linhas de cdigo que envolvem
este evento. Por exemplo, o evento OnClick, que gerado ao clicarmos em um boto chamado
BTNSair, cria a procedure:
Procedure TForm1.BTNSairClick(Sender: Tobject);
onde TForm1 o objeto TForm que contm o boto BTNSair, e Sender um objeto Tobject
que representa o componente que deu origem ao evento. Se voc quiser inserir uma rotina
que trate um determinado evento de um componente, faa o seguinte:
1. Clique sobre o componente;
2. No Object Inspector, seleciona a pgina Events;
3. D um duplo clique sobre o evento para o qual quer inserir o cdigo;
4. Entre no editor de cdigo e escreva as linhas de cdigo.
P g i n a | 20
Exemplo:
Procedure TForm1.BTNSairClick(Sender: Tobject);
begin
Form1.Close;
end;
Obs.: Escreva seu cdigo entre o begin e o end, se por acaso voc quiser retirar o evento e o
componente, retire primeiro os eventos do componente removendo somente o cdigo que
voc colocou e depois o componente; os resto dos procedimentos o DELPHI tira para voc.
5.2 Propriedades
Uma propriedade representa um atributo de um objeto. No Delphi todas as coisas que
aparecem no Object Inspector so propriedades, inclusive os eventos, porm sua referncia
a um mtodo.
Como vimos, eventos podem estar associados a modificaes em propriedade de componente
e formulrio, ou seja, voc pode modificar propriedades de formulrios e componentes
durante a execuo do sistema. Para isso, voc dever usar a sintaxe:
<componente>.<propriedade>;
Por exemplo, para modificar a propriedade text de uma caixa de edio Edit1 para Bom Dia
faa:
Edit1.Text := Bom Dia;
Por exemplo, para modificar a subpropriedade Name, referente propriedade fonte de uma
caixa de edio Edit1, para Script, faa:
Edit1.Font.name := Script;
Obs.: Verifique o tipo da propriedade para antes de mandar o valor, consultando no Objetc
Inspector.
5.3 Mtodos
So procedures ou funes embutidas nos componentes e formulrios, previamente definidas
pelo Delphi.
P g i n a | 21
- Exemplos de mtodos:
Show : Mostra um formulrio;
Hide : Esconde um formulrio mais no o descarrega;
Print : Imprime um formulrio na impressora;
SetFocus : Estabelece o foco para um formulrio ou componente;
- Chamado de mtodos como resposta a eventos:
Um evento pode gerar a chamada para um mtodo, ou seja, uma subrotina previamente
definida para um componente.
No cdigo, para utilizar um mtodo, use a seguinte sintaxe:
<nome do objeto>.<mtodo>
Por exemplo, clicar em um boto pode dar origem ao evento Show de outro formulrio,
mostrando este novo formulrio na tela:
Form2.show;
P g i n a | 22
P g i n a | 23
- OnKeyDown: Este evento faz tudo o que o evento onKeyPress faz porm capaz de processar
sequncias de teclas, como CTRL+Z por exemplo. Tambm capaz de capturar teclas como
TAB, F1, CAPS LOCK, NUM LOCK, INSERT, etc... A varivel KEY do tipo word (um inteiro que
no aceita negativo). Para anularmos a tecla pressionada atribumos 0 ao parmetro KEY.
Exemplo:
// neste exemplo exibimos o n da tecla pressionada. Ideal para se descobrir o
n de uma tecla.
procedure
TForm1.Edit2KeyDown(Sender:
TShiftState);
TObject;
var
Key:
Word;
Shift:
begin
showmessage( 'Voc pressionou a tecla n: ' + intToStr(key) );
end;
- OnDblClick: Este evento disparado sempre que executamos um duplo clique sobre o objeto
em questo. Este evento no ocorrer se o evento OnClick tambm foi programado.
Exemplo:
procedure TForm1.FormDblClick(Sender: TObject);
begin
showwmessage('Voc deu um duplo clique no formulario!');
end;
P g i n a | 24
6.3 Formulrio
- Principais eventos do formulrio:
Os formulrios (objeto Form) so os
pontos
centrais
para
o
desenvolvimento Delphi. Voc se
utilizar deles para desenhar sua
comunicao com o usurio,
colocando e organizando outros
objetos. Ele tem diversos eventos,
porm os principais so:
P g i n a | 25
OnClose: Este evento ocorre sempre ocorre uma tentativa de se fechar o formulrio,
por exemplo, ao executar-se o mtodo close. Podemos neste evento, por exemplo, fechar as
tabelas utilizadas.
OnShow: Este evento ocorre sempre que o formulrio exibido. Por exemplo, ao
executar-se o mtodo show. Podemos neste evento, por exemplo, limpar os componentes da
tela, inicializar variveis, abrir tabelas e etc.
Exemplo:
procedure TForm1.FormShow(Sender: TObject);
begin
showmessage('Exibindo o formulrio.');
end;
P g i n a | 26
- TCombobox: Este objeto utilizado quando possumos vrias opes, porm apenas uma
deve ser selecionada. Utilize a propriedade ItemIndex para saber se alguma opo foi
selecionada. Esta propriedade inicia do 0 e -1 indica que nada foi selecionado.
- TRadioGroup: Este componente similar ao TRadioButton, porm seus itens so criados
atravs da propriedade itens, onde cada linha indica uma nova opo.
- TGroupbox: Utilizado para agrupar componentes.
- TPanel: Utilizado para agrupar componentes.
P g i n a | 27
- Equacionando o problema: Para resolver este problema, iremos supor que a quantidade de
soluto (q) no criada nem destruda dentro do tanque. Portanto, as variaes na
quantidade de soluto devem-se apenas, aos fluxos de entrada e sada no tanque.
Matematicamente, a taxa de variao de q no tanque (dq/dt) igual diferena entre a taxa de
entrada e a taxa de sada, ou seja:
dq/dt = taxa de entrada taxa de sada
Sendo C e C as concentraes das correntes de entrada e sada, respectivamente, e Q e Q as
vazes das corretes de entrada e sada, respectivamente, temos:
dq/dt = taxa de entrada taxa de sada = Q.C - Q.C
Para C, temos que:
Logo:
P g i n a | 28
Ou seja, temos que a equao que rege o problema uma equao diferencial. Para
resolvermos numericamente tal equao diferencial, precisamos escolher um mtodo
matemtico. O Mtodo de Euler ser o mtodo utilizado para a resoluo da equao, para
que possamos aproveitar parte do cdigo j desenvolvido anteriormente.
Resumidamente, podemos listar os parmetros que sero recebidos pelo aplicativo-exemplo e
os parmetros que sero retornados pelo mesmo.
Nossa aplicao dever receber:
1. Os parmetros da equao (Q, C, Q e V)
2. Os parmetros do mtodo (x(0), y(0), h, n)
Nossa aplicao dever fornecer:
A Concentrao (C) e o Volume (V) do tanque no instante t.
Com base nos parmetros que devero ser utilizados e nos resultados que sero gerados,
iremos escolher componentes onde o usurio nos fornecer os dados requeridos, para que
possam ser feitos os clculos necessrios, e componentes que retornem, para o usurio, os
dados gerados.
P g i n a | 29
8. CRIANDO A APLICAO
P g i n a | 30
P g i n a | 31
11. Com a tecla shift pressionada, selecione os seis componentes Label e, na propriedade
Font, clique nas reticncias. Na caixa de dilogo Fonte, escolha a fonte arial, estilo
negrito e clique em Ok.
P g i n a | 32
P g i n a | 33
11. Podemos, tambm, criar uma rotina para confirmar o encerramento da aplicao. Para
isso, podemos usar o comando MessageDlg. Temos o seguinte cdigo:
procedure TFormPrincipal.Finalizar1Click(Sender: TObject);
begin
if MessageDlg('Deseja encerrar a
aplicao?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
FormPrincipal.Close;
end;
P g i n a | 34
P g i n a | 35
P g i n a | 36
P g i n a | 37
P g i n a | 38
P g i n a | 39
P g i n a | 40
'Em t
'q(t)
'V(t)
'C(t)
=
=
=
=
'
'
'
'
+
+
+
+
P g i n a | 41
EditQ2.Clear;
EditV.Clear;
EditC1.Clear;
EditC.Clear;
Edith.Clear;
Editn.Clear;
//Retornando os componentes ao estado inicial
Labelt.Caption:= 'Em t = ';
Labelq.Caption:= 'q(t) = ';
LabelV.Caption:= 'V(t) = ';
LabelC.Caption:= 'C(t) = ';
end;
Repare que o procedimento foi associado ao evento onclick do boto limpar. Agora, para
compartilharmos o evento, necessrio selecionarmos, atravs do componente Menu, a
opo limpar tudo e, na palheta de eventos, atravs da combo do evento onclick
selecionarmos a opo BtLimparClick.
P g i n a | 42
Repare que dessa forma no sero exibidas as solues do problema para o instante t=0. Para
que a soluo em t=0 seja exibida, podemos repetir o mesmo comando que foi acrescentado
ao for, adicionando-o antes da execuo do for.
P g i n a | 43
Name: ComboBoxTipoArq
Style: csDropDownList
TabOrder: 1
Width: 200
- Botes
Caption: &Salvar
Name: BotoSalvar
TabOrder: 2
Caption: &Cancelar
P g i n a | 44
Name: BotoCancelar
TabOrder: 3
Reposicione e redimensione estes componentes para que o formulrio fique com o aspecto
mostrado na figura a seguir.
P g i n a | 45
- FileSize (var F): Retorna o tamanho, em bytes, do arquivos representado pela varivel F.
- Read (F, V1 [, V2, ..., Vn]): L elementos de dados em um arquivo representado pela varivel
F e os armazena nas variveis v1, v2, ..., vn.
- Readln ([var F: Text;] V1 [,V2, ..., Vn]): L elementos de dados em uma linha de um arquivo
de texto representado pela varivel F e os armazena nas variveis v1, v2, ..., vn. Caso no
sejam fornecidos parmetros, o arquivo passa para a linha seguinte.
- Rename (var F; NewName): Renomeia como NewName o arquivo representado por F.
- Reset (var F [:File; RecSize: Word]): Esse procedimento abre o arquivo representado pela
varivel F. o parmetro RecSize opcional e especifica o tamanho do registro usado na
transferncia de dados. Se for omitido, o valor default 128 usado. Se o arquivo no existir,
ocorrer um erro no processamento. Se o arquivo j estiver aberto, ele fechado e reaberto,
sendo posicionado no seu inicio. Se F representar um arquivo de texto, ele aberto apenas
para leitura.
- Rewrite (var F [:File; RecSize: Word]): Esse procedimento cria o arquivo representado pela
varivel. Se o arquivo j existir, seu contedo ser apagado, mesmo que j esteja aberto.
- Write (F, V1 [, V2, ..., Vn]): Escreve, em um arquivo representado pela varivel F, elementos
de dados armazenados nas variveis v1, v2, ..., vn.
- Writeln (F, V1 [, V2, ..., Vn]): Escreve, em uma linha de um arquivo de texto representado
pela varivel F, elementos de dados armazenados nas variveis v1, v2, ..., vn.
A relao a seguir apresenta as principais funes para manipulao direta de arquivos (no
associados a uma varivel):
- ChangeFileExt (const FileName, Extension: string): Muda para Extension a extenso do
arquivo cujo nome e/ou path complete so definidos pela string FileName.
- DeleteFile (const FileName: string): Apaga o arquivo cujo nome e/ou path completo so
definidos pela string FileName. Retorna False, se o arquivo no existe, e True, em caso
contrrio.
- ExpandFileName (const FileName: string): Retorna em uma string o path completo e o nome
do arquivo definido pela string FileName.
- ExtractFileDir (const FileName: string): Retorna em uma string o diretrio do arquivo cujo
nome e/ou path completo so definidos pela string FileName.
- ExtractFileDrive (const FileName: string): Retorna em uma string o drive do arquivo cujo
nome e/ou path completo so definidos pela string FileName.
- ExtractFileExt (const FileName: string): Retorna em uma string a extenso do arquivo cujo
nome e/ou path completo so definidos pela string FileName.
P g i n a | 46
- ExtractFileName (const FileName: string): Retorna em uma string apenas o nome do arquivo
cujo nome e/ou path completo so definidos pela string FileName.
- ExtractFilePath (const FileName: string): Retorna em uma string apenas o path completo do
arquivo cujo nome e/ou path completo so definidos pela string FileName.
- FileExists (const FileName: string): Retorna True, se o arquivo cujo nome e/ou path completo
so definidos pela string FileName existe, e False, em caso contrrio.
- FileSearch (const Name, DirList: string): Pesquisa, pelos diretrios definidos no parmetro
DirList, um arquivo cujo nome definido pela string Name. O parmetro DirList uma string
em que os diretrios de pesquisa devem ser separados por vrgulas. Se o arquivo for
encontrado, a funo retorna o path completo do arquivo.
- RenameFile (const OldName, NewName: string): Renomeia para NewName o arquivo cujo
nome definido pela string OldName, retornando True, se a operao realizada com
sucesso, e False, em caso contrrio.
Para criao do arquivo temporrio, devemos declarar uma varivel do tipo TextFile, junto as
variveis j declaradas no procedimento.
Antes de entrarmos na estrutura de repetio for, demos associar o arquivo a varivel
criada, por meio do procedimento AssignFile, e criar o arquivo, por meio do mtodo Rewrite.
De forma semelhante ao Memo, os resultados para t = 0 no so exibidos, logo adicionaremos,
antes do for, o procedimento write para que, no arquivo, sejam exibidos os valores iniciais do
problema e, por ltimo, devemos inserir um procedimento write dentro da estrutura for.
Lembrando que, ao encerrar o programa, o arquivo temporrio deve ser excludo, utilizando,
assim, o evento onClose do formulrio.
As mudanas feitas no cdigo esto mostradas abaixo.
procedure TFormPrincipal.BtCalcularClick(Sender: TObject);
var q,t,Q1,Q2,C1,C,V,h: real;
n,i: integer;
Arq: TextFile;
begin
AssignFile(Arq,'C:\Arq_temp');
Rewrite(Arq);
Write(Arq,'t =',t:5:3,'s
','q =',q:5:3,'Kg
',(V + (Q1-Q2)*t):5:3,'L
',(q/(V + (Q1-Q2)*t)):5:3,'Kg/L');
MemoIteracoes.Lines.Add(FloattoStr(SimpleRoundTo(t,-2))+'
'+FloattoStr(SimpleRoundTo(q,-2))
+'
'+FloattoStr(SimpleRoundTo(V + (Q1-Q2)*t,-2))+'
'+FloattoStr(SimpleRoundTo(q/(V + (Q1-Q2)*t),-2)));
for i:=1 to n do
begin
q := q + h*f(t,q,Q1,Q2,C1,V);;
t := t + h;
Writeln(Arq);
Write(Arq,'t =',t:5:3,'s
','q =',q:5:3,'Kg
',(V + (Q1-Q2)*t):5:3,'L
',(q/(V + (Q1-Q2)*t)):5:3,'Kg/L');
MemoIteracoes.Lines.Add(FloattoStr(SimpleRoundTo(t,-3))+'
P g i n a | 47
'+FloattoStr(SimpleRoundTo(q,-3))
+'
'+FloattoStr(SimpleRoundTo(V + (Q1-Q2)*t,-3))+'
'+FloattoStr(SimpleRoundTo(q/(V + (Q1-Q2)*t),-3)));
end;
CloseFile(Arq);
end;
procedure TFormPrincipal.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
DeleteFile('C:\Arq_temp');
end;
Agora, para que o formulrio salvar possa gerar o arquivo requerido, devemos fazer com que
ele copie o arquivo temporrio (que ainda no foi excludo) para um diretrio especificado
na caixa de texto EditEndArq.
Utilizaremos o evento OnClick do boto salvar para fazer a copia do arquivo temporrio e
salva-lo no diretrio desejado. Um exemplo de cdigo que faa a cpia do arquivo para o local
descrito no EditEndArq e com a extenso escolhida no ComboBoxTipoArq, mostrado abaixo:
procedure TFormSalvar.ButtonSalvarClick(Sender: TObject);
var F_Name: string;
F: TextFile;
begin
if EditNomeArq.Text <> '' then
begin
case ComboBoxTipoArq.ItemIndex of
0: F_Name:= EditEndArq.Text + EditNomeArq.Text + '.txt';
1: F_Name:= EditEndArq.Text + EditNomeArq.Text + '.doc';
2: F_Name:= EditEndArq.Text + EditNomeArq.Text + '.xls';
end;
AssignFile(F,F_Name);
if CopyFileTo('C:\Arq_temp',F_Name) then;
FormSalvar.Close;
end
else Application.MessageBox('Digite o nome do Arquivo','Erro',16);
end;
Agora, mostraremos de uma forma bem mais simplificada como gerar o arquivo com as
iteraes.
Ao boto salvar do FormIte, podemos definir o seguinte procedimento:
procedure TFormIte.BtSalvarClick(Sender: TObject);
const
SELDIRHELP = 1000;
var
dir: string;
begin
dir := 'C:';
if
SelectDirectory(dir,
[sdAllowCreate,
sdPerformCreate,sdPrompt],
P g i n a | 48
SELDIRHELP) then
MemoIte.Lines.SaveToFile(dir+'\ite.txt');
end;
Utilizando poucas linhas, conseguimos produzir o mesmo resultado. No Delphi temos, quase
sempre, vrias maneiras de chegar no mesmo propsito e muitas vezes o tempo que ns
passamos planejando e pensando na nossa aplicao pode se multiplicar e transforma-se em
economia de tempo. Pensem nisso!
Com isso conclumos nossa breve introduo sobre o Ambiente de Desenvolvimento do Delphi.
P g i n a | 49