Professional Documents
Culture Documents
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
6.2 Eventos mais utilizados no Delphi..........................................................................................23 6.3 Formulrio..............................................................................................................................25 6.4 Palheta Standard....................................................................................................................26
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
A Programao Orientada a Evento muito antiga, se comparada POO, e possvel encontrar muitos exemplos de linguagens de programao orientadas a evento, como a linguagem C e Pascal. A Programao Orientada a Objeto , pelo contrrio, bastante recente. Seu conceito foi desenvolvido para facilitar a criao de programas utilizando interface grfica. As vantagens mais visveis da POO so a facilidade de manipular os programas e o pouco uso de cdigo no projeto, que facilita a manuteno do programa. Na POO, os objetos so utilizados conforme os interesses do programador. O papel do adepto da Programao Orientada a Objeto determinar quais objetos iro interagir entre si, e maneira como ocorrer a interao. Mas o que so esses objetos que a POO pode manipular?
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
Agora o momento de conhecer o Ambiente de Desenvolvimento Integrado (IDE, do ingls Integrated Development Environment) com o qual voc trabalhar. O Delphi possui diversos elementos na sua interface, dos quais parte podem ser vistos ao abrir o IDE, enquanto outros permanecem escondidos at que o usurio os abra.
Para criar um novo formulrio existem duas maneiras: 1. Seguindo a seqencia: File New Form; 2. Atravs do repositrio de objetos, que ser mostrado mais frente. - Editor de Cdigo: O Editor de Cdigo, como o nome indica, permite que o programador faa alteraes no cdigo fonte do projeto. Todas as informaes relevantes ao programador, como objetos (que aparecem descritos de suas propriedades) e seus respectivos eventos, podem ser acessadas no Editor de Cdigo. Quando um novo projeto aberto, gerado, automaticamente, um arquivo de cdigo (.pas). Esse arquivo surge com o nome Unit1, que pode ser visualizado na tabulao do Editor de Cdigo. Voc deve notar que o Form e o Editor de Cdigo ocupam o mesmo espao, alternando em destaque na tela. Uma forma rpida de alternar a visualizao entre um e outro atravs da tecla F12.
Pgina |6
- Object Inspector: composto pela Pgina de Propriedades, Pgina de Eventos e Seletor de Objetos. Seu papel providenciar a conexo entre o cdigo e a interface do programa.
Na pgina de propriedades possvel alterar as caractersticas dos objetos presentes no formulrio, inclusive do prprio formulrio, para melhor se ajustarem s suas necessidades. A pgina de eventos, que fica ao lado, por sua vez, responsvel por manipular os eventos associados aos objetos, permitindo tambm uma rpida navegao pelo cdigo. O Seletor de objetos uma ferramenta que lista todos os objetos existentes no projeto e seus respectivos tipos. Com ele possvel encontrar rapidamente qualquer objeto em um formulrio.
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:
Existem trs formas de selecionar um objeto e transport-lo para o formulrio: 1. Clicando duplamente no cone do objeto (isso o transportar direto para o centro do formulrio); 2. Clicando no cone e clicando dentro do formulrio, no local onde voc quer colocar o objeto; 3. Clicando no cone enquanto a tecla Shift estiver pressionada (dessa forma voc pode clicar vrias vezes no formulrio adicionando o objeto vrias vezes). importante lembrar que existem componentes que no sero visveis durante a execuo do programa (componentes no-visuais). Esses objetos so chamados DDE (Dynamic Data Exchange). - Speed Bar: a barra que contm os botes mais utilizados quando no processo de criao do programa, fornecendo rpido acesso aos mesmos.
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
Como j comentamos anteriormente, inicialmente, observa-se a palavra reservada unit seguida do nome do arquivo em que a unit est armazenada. Na linha seguinte que define o nome da unit, tem-se a palavra-chave interface, onde so declarados os tipos de dados, classes, variveis, funes e procedimentos que podem ser acessados por outras units. Na seo implementation so declarados os tipos de dados, classes, variveis, funes e procedimentos que no podem ser acessados por outras units. Nessa seo tambm so implementados as funes e procedimentos cujo cabealho declarado na seo Interface. A palavra uses outra palavra reservada da Linguagem Object Pascal e define as units que sero utilizadas pela unit corrente.
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
- Comentrios de mltiplas linhas: Para comentrios de mltiplas linhas, colocamos o texto requerido entre chaves. Exemplo:
{ isto um comentrio de mltiplas linhas}
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
Operadores com maior precedncia so executados antes dos de menor precedncia. Operadores com mesma ordem de precedncia em uma expresso so executados da esquerda para a direita. Exemplo:
x:= 8 + 5 * 4;
Atribui o valor 28 para a varivel x. Para que a soma seja executada antes da multiplicao, inclumos os parnteses:
x:= (8 + 5) * 4;
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;
- Funes: Uma funo muito semelhante a um procedimento, com a diferena de que a chamada a uma funo deve retornar um valor como resultado. Alm disso, o resultado de uma chamada a uma funo pode ser diretamente incorporado a uma expresso aritmtica. A definio de uma funo na Linguagem Object Pascal segue a seguinte sintaxe:
function nome_da_funo (par_1: tipo_1, ..., par_n: tipo_n): tipo_de_retorno; var {declarao de variveis locais funo} begin {corpo da funo} result:= valor; end;
P g i n a | 16
O ambiente de desenvolvimento do Delphi 7 capaz de desenvolver aplicaes utilizando o Pascal como linguagem de programao procedural. Esses tipos de aplicaes no tero formulrios (janelas), botes de comando ou qualquer outro tipo de componente da interface padro do ambiente Windows, sendo definidas pelo Delphi 7 como aplicaes do tipo console (sero executadas em uma janela padro do DOS).
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.
Posteriormente criaremos um programa com a mesma finalidade, porm em POO (Programao Orientada a Objetos), ou seja, criando assim formulrios (janelas), botes de comando outros tipos de componentes de interface grfica.
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
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if key in ['a' .. 'z', 'A'..'Z'] then begin // permite apenas as letras de a Z maisculas e minsculas showmessage('Voc pressionou a tecla: [' + key + ']' ); // exibe a tecla pressionada end; end;
- 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); begin showmessage( 'Voc pressionou a tecla n: ' + intToStr(key) ); end; TObject; var Key: Word; Shift:
- OnClick: Este evento disparado sempre que clicamos sobre o objeto. Exemplo:
procedure TForm1.FormClick(Sender: TObject); begin showmessage('Voc clicou no formulario!'); 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
- OnMouseMove: Este um evento pouco utilizado em aplicaes normais (cadastros p.ex.). Ele disparado sempre que o mouse movimentado sobre o objeto. possvel ainda saber o status de teclas como CTRL, ALT, SHIFT e etc. alm das posies X e Y do mouse. Exemplo:
procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin showMessage('Tira esse mouse daqui!'); end;
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
Um bom planejamento indispensvel ao sucesso de um empreendimento. Antes de iniciar a codificao e o desenho da interface da sua aplicao, importante que voc reserve um tempo para o seu planejamento. Graas a facilidade e rapidez com que se pode construir a interface de uma aplicao com o Delphi 7, muitos programadores comeam a desenhar a interface sem se preocupar com um planejamento prvio da sua aplicao e, no meio do processo de desenvolvimento, descobrem que muita coisa poderia ser modificada. A fim de evitar esse tipo de problema, recomendvel que se reserve algum tempo para discutir aspectos importantes da aplicao.
- 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
BorderStyle: bsSingle (esse estilo impede que o formulrio seja redimensionado). BorderIcons: [biSystemMenu, biMinimize]. Caption: Tanque de Mistura. Color: clMenu. Height: 500. Name: FormPrincipal. Position: poScreenCenter. Width: 600.
5. Atribua os seguintes valores para as propriedades do Panel: BevelInner: bvRaised. BevelWidth: 2. BorderWidth: 1. Caption: Deixar em branco. Color: clMenuBar. Height: 300. Width: 280.
P g i n a | 31
6. Selecione o componente Image na paleta Additional e coloque-o no Panel. 7. Para definir a imagem a ser exibida, selecione as reticncias da propriedade Picture. Ser exibida a caixa de dilogo Picture Editor. 8. Selecione o boto Load desta caixa de dilogo e procure pela imagem tanquemistura.jpg, clique em Abrir e, na Picture Editor, em Ok. 9. Atribua os seguintes valores para as propriedades do Image: Autosize: true. Left: 16. Top: 16. 10. Insira seis componentes Label no Panel, altere a propriedade Name e disponha-os conforme a figura abaixo. Seu formulrio deve ficar com o aspecto mostrado na figura a seguir.
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;
Altere as propriedades Name e Caption desse formulrio para FormSobre e Sobre o Sistema, respectivamente. Para personalizar a nossa caixa de dilogo, execute os seguintes procedimentos: 1. Altere o valor da propriedade Caption de ProductName para Problema de Misturas. 2. Altere o valor da propriedade Caption do label Version para Verso 1.0. 3. Altere o valor da propriedade Caption do label Copyright para Direitos Autorais.
P g i n a | 34
4. Altere o valor da propriedade Caption do label Comments para o nome do autor do programa. 5. Altere o valor da propriedade WordWrap do label Comments para False. 6. Se desejar, carregue uma imagem atravs da propriedade Picture do componente ProgramIcon. 7. Salve o arquivo de cdigo associado a este formulrio com o nome UnitSobre.pas, usando o item Save As do menu File.
2. Atribua os seguintes valores para as propriedades do GroupBox: Caption: Equaes. Height: 95. Hint: Equaes do Problema. Name: GroupBoxEquacoes. ShowHint: true. Width: 300. 3. Posicione o GroupBox abaixo do Panel. 4. Insira dois componentes Label no GroupBoxEquacoes. Altere o valor da propriedade Caption e posicione-os de modo a ficaremos como na figura a seguir. 5. Insira dois componentes Image no GroupBoxEquacoes. Conforme descrito anteriormente, atravs da propriedade Picture, defina para o primeiro Image, a figura EqPM1.jpg e para o segundo Image a figura EqPM2.jpg. Para ambas, altere o valor da propriedade Autosize para true, posicione-as conforme a figura abaixo.
P g i n a | 35
P g i n a | 36
P g i n a | 37
Hint: Parmetros do Mtodo ShowHint: True Height: 121 Width: 185 Name: GroupBoxResultados Caption: Resultados Hint: Resultados ShowHint: True Height: 135 Width: 185
Objetos a serem inseridos dentro do GroupBoxPE - Labels Name: LabelQ1 Caption: Q (L/min) = Name: LabelQ2 Caption: Q (L/min) = Name: LabelC1 Caption: C (Kg/L) = Name: LabelV Caption: V (L) = - Caixas de Texto Name: EditQ1 Text: Limpar Texto Width: 75 Name: EditQ2 Text: Limpar Texto Width: 75 Name: EditC1 Text: Limpar Texto Width: 75 Name: EditV Text: Limpar Texto Width: 75
P g i n a | 38
Objetos a serem inseridos dentro do GroupBoxPM - Labels Name: LabelC Caption: C (Kg/L) = Name: Labelh Caption: h (passo) = Name: Labeln Caption: n (n ite) = - Caixas de Texto Name: EditC Text: Limpar Texto Width: 75 Name: Edith Text: Limpar Texto Width: 75 Name: Editn Text: Limpar Texto Width: 75 Objetos a serem inseridos dentro do GroupBoxResultados - Labels Name: LabelResultt Caption: Em t = Name: LabelResultq Caption: q(t) = Name: LabelResultV Caption: V(t) = Name: LabelResultC Caption: C(t) = Reposicione e redimensione estes componentes para que o formulrio fique com o aspecto mostrado na figura a seguir.
P g i n a | 39
P g i n a | 40
dada em um inteiro, usaremos a funo StrtoFloat, existem tambm as funes FloattoStr e InttoStr que desempenham a operao inversa. Um exemplo de como o cdigo pode ser implementado, apresentado abaixo:
function f(t,q,Q1,Q2,C1,V: real): real; begin f:= Q1*C1 - Q2*q/(V + (Q1-Q2)*t); end; procedure TFormPrincipal.BtCalcularClick(Sender: TObject); var q,t,Q1,Q2,C1,C,V,h: real; n,i: integer; begin //Entrada de Dados - Parmetros da Equao Q1:= StrtoFloat(EditQ1.Text); Q2:= StrtoFloat(EditQ2.Text); C1:= StrtoFloat(EditC1.Text); V := StrtoFloat(EditV.Text); //Entrada de Dados - Parmetros do Mtodo C:= StrtoFloat(EditC.Text); h:= StrtoFloat(Edith.Text); n:= StrtoInt(Editn.Text); //Implementao do Mtodo t:= 0; q:= C*V; for i:=1 to n do begin q := q + h*f(t,q,Q1,Q2,C1,V); t := t + h; end; //Resultados Labelt.Caption:= Labelq.Caption:= LabelV.Caption:= LabelC.Caption:= Kg/L'; end; 'Em t 'q(t) 'V(t) 'C(t) = = = = ' ' ' ' + + + + FloattoStr(SimpleRoundTo(t,-2)) + ' min'; FloattoStr(SimpleRoundTo(q,-2)) + ' Kg'; FormatFloat('0.00',V + (Q1-Q2)*t) + ' L'; FormatFloat('0.00',q/(V + (Q1-Q2)*t)) + '
Obs. : As funes FormatFloat e SimpleRoundto foram usadas para mostrar os valores calculados com apenas duas casas decimais.
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, ao executar o programa, o formulrio Ite no exibindo clicando o boto Iteraes. Para que o formulrio seja exibido necessrio associar o mtodo Show ao evento onClick do boto iteraes. Faa isso para que o formulrio seja exibido. Agora, necessrio fazer com que as iteraes sejam adicionadas ao componente Memo. Para isso, devemos fazer uma pequena alterao no cdigo-fonte da aplicao, adicionando estrutura de repetio for e antes dela, os comandos a seguir:
FormIte.MemoIte.Clear; FormIte.MemoIte.Lines.Add('t (min)'+#9+'q (Kg)'+#9+'V (L)'+#9+'C (Kg/L)'); for i:=1 to n do begin q := q + h*f(t,q,Q1,Q2,C1,V); t := t + h; FormIte.MemoIte.Lines.Add(FormatFloat('0.00',t)+#9+FormatFloat('0.00',q)+#9+Fo rmatFloat('0.00',V + (Q1-Q2)*t)+#9+FormatFloat('0.00',q/(V + (Q1-Q2)*t))); end;
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
Caption: Nome do Arquivo: Name: LabelNomeArq Caption: Salvar como Tipo: Name: LabelSalvarcomo - Caixas de Texto Name: EditEndArq Text: C:\Documents and Settings\Elvis Trabalhos\Desktop\PExem\ TabOrder: 4 Width: 290 Name: EditNomeArq Text: Dados_PM TabOrder: 0 Width: 200 - ComboBox ItemIndex: 0 Items: (TStrings)
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.
Para associarmos a apario do FormSalvar ao evento onClick, precisamos definir o seguinte cdigo:
procedure TFormPrincipal.ButtonSalvarClick(Sender: TObject); begin FormSalvar.ShowModal; end;
Para a criao do arquivo utilizaremos um processo um pouco diferente. As iteraes so geradas no evento onClick do boto calcular, por meio da estrutura de repetio for. Ento, para inserir os dados gerados no arquivo, temos duas opes: refazer todos os clculos no evento onClick do boto salvar ou podemos gerar um arquivo temporrio quando o boto calcular pressionado e, caso o usurio queira salvar o arquivo, copiamos o arquivo para um outro diretrio e com um nome definido pelo usurio. Lembrando que o arquivo temporrio deve ser excludo ao fim da aplicao. Para gerarmos o arquivo temporrio devemos utilizar algumas funes e procedimentos para manipulao de arquivos. As principais so apresentadas a seguir. A relao a seguir apresenta as principais funes para a manipulao de arquivos representados por uma varivel: - Append (var F): Abre o arquivo representado pela varivel F, apenas para escrita no final do arquivo. - AssignFile (var F; FileName: string): Associa varivel F o arquivo cujo nome passado como segundo parmetro. - CloseFile (var F): Fecha o arquivo representado pela varivel F. - EOF (var F): Retorna True, se o arquivo representa pela varivel F est posicionado no seu final, e False, em caso contrrio. - Erase (var F): Apaga o arquivo representado pela varivel F.
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
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