Lazarus Tutorial

download Lazarus Tutorial

of 50

Transcript of Lazarus Tutorial

Sistemas de InformaoIntroduo ferramenta [email protected] Verso de 2010 / Maio / 12

MIEEC 3 ano

IntroduoA ferramenta Lazarus uma ferramenta de programao potente e complexa, que vai ser utilizada como ambiente de desenvolvimento integrado (IDE) para a linguagem Free Pascal (FPC). A ferramenta em causa totalmente cross platform e est instalada nas mquinas do CICA, na FEUP nos Sistemas Operativos S.O. Windows e em Linux. Este tutorial introdutrio abordar apenas o IDE do Lazarus e a introduo Programao Visual, Programao Orientada a Eventos (POE). Neste tutorial ser apresentado o IDE e as principais ideias chave que permitiro ao aluno posteriormente continuar a aprendizagem com autonomia superior. Na leitura inicial deste tutorial, no salte passos nem se afaste demasiado dos passos mencionados. O aluno pode e deve repetir o guio j depois de ter uma percepo mais completa do funcionamento de conjunto de todos os elementos envolvidos e nessa fase dedicar-se a uma explorao mais abrangente. No se esquea de consultar sempre que necessrio o captulo final "Listagem de Teclas e funcionalidades" , na pg. 50. Bom Trabalho! Armando Sousa

ndiceIntroduo..............................................................................................1 Tutorial .................................................................................................2 Exerccios de Lazarus................................................................................35 Ligao do Lazarus Base de Dados PGSQL .....................................................39 Alguns Comandos SQL (micro resumo)............................................................45 FAQ Lazarus Sistemas de informao.............................................................47 Listagem de Teclas e funcionalidades.............................................................50

Introduo ao Lazarus

FEUP - DEEC

Pg 1

Tutorial1Criao do projecto inicial Form com 1 boto1.1 Arranque o seu PC com o sistema operativo que preferir, windows ou linux e no sistema operativo, arranque o Lazarus

Windows -> Departamentos -> DEEC -> Lazarus Linux -> Desenvolvimento -> Lazarus

1.2 Dentro do Lazarus seleccione, Project -> New Project; aparecer a seguinte caixa de dilogo:

1.3 Seleccione Application e prima Create; acabou de criar um novo projecto vazio para desenvolver uma nova aplicao grfica. 1.4 O ambiente integrado de desenvolvimento (IDE) do lazarus aparecer; este IDE constitudo por diversas partes, cada uma em sua janela:

Por cima, a barra de menus e de componentes Do lado esquerdo, a listagem da rvore de componentes e das respectivas propriedades (object inspector) Ao centro o editor de cdigo Source Editor (onde se escreve o cdigo!) Na figura abaixo representa-se direita a form em design-time Por baixo aparece a caixa de mensagens (onde vo aparecer erros de compilao, etc)

Introduo ao Lazarus

FEUP - DEEC

Pg 2

As janelas no tero o aspecto mostrado; altere as posies e dimenses das janelas para reflectir um aspecto similar ao mostrado acima; pode, no entanto, modificar o aspecto de cada uma das janelas ao seu gosto Insira um boto na form, para isso:

1.5 -

1.5.1 - Clique no componente TButton, dentro do separador Standard:

1.5.2 -

Clique na form:

1.6 O boto que acabou de criar foi automaticamente chamado de Button1; faa duplo clique em cima dele e ser conduzido at ao cdigo a executar quando se carregar no boto (dentro do source editor):

Introduo ao Lazarus

FEUP - DEEC

Pg 3

1.7 Dentro do begin e antes do end, escreva o cdigo Button1.Caption:='Ol Mundo'; este cdigo altera o texto associado ao boto para que este passe a ser Ol Mundo; o boto chama-se Button1 e o texto dentro deste boto pertence-lhe e acessvel atravs de Button1.Caption; para atribuir uma cadeia de caracteres (uma string) ao texto dentro deste boto utiliza-se o cdigo mencionado; a atribuio faz-se com o operador := e a string identificada como estando entre 'plicas' (cuidado, 'plicas' no so "aspas" ); pode-se trocar maisculas e minsculas; o aspecto no IDE ser prximo do mostrado de seguida:

O cdigo que acaba de escrever fica guardado dentro de uma unit do FPC 1.8 Escolha no menu File -> Save All e grave todos os ficheiros numa directoria criada para o efeito numa qualquer localizao no disco local (no utilize drives em rede pois a criao do executvel fica muito lenta). Aceite as os nomes por omisso (default) em minsculas. 1.9 Execute o programa premindo a tecla F9 ou menu Run -> Run e observe o desenrolar das mensagens na janela de mensagens: primeiro vm a mensagem da invocao do compilador do FPC; se no existirem erros, ento vir a mensagem linking assinalando o processo de construo do executvel e depois a mensagem de sucesso:

1.10 O programa que acaba de ser criado ento executado pelo S.O. e aparece a janela do primeiro programa sob Lazarus:

1.11 Prima o boto com o rato e observe que o texto associado ao boto se modificou para:

Introduo ao Lazarus

FEUP - DEEC

Pg 4

1.12 Redimensione e mova a janela do programa para se assegurar que esta janela do programa se comporta como qualquer outra aplicao do S.O. 1.13 Feche a aplicao premindo o do programa que vem sendo executado 1.14 - Ideias a reter:

do canto superior direito da janela

O Lazarus permite fazer aplicaes grficas para S.O. grficos e orientados a eventos Este projecto inclui uma parte grfica (a form) e uma parte de cdigo escrito FPC (a unit) A programao inclui desenhar a form que depois ser executada e o cdigo que ser executado quando se carregar no boto durante a execuo do programa A execuo do programa faz aparecer a janela anteriormente desenhada dentro do IDE do lazarus; quando se carrega no boto, chamado cdigo que escrevemos no programa A janela que desenhada no IDE do lazarus antes da execuo pelo SO denominase de form em tempo de desenho (design-time); esta mesma form aparece em tempo de execuo (em run-time); comparar as figuras 1.5.2 e 1.9 A aplicao criada uma das muitas que est a ser executada pelo S.O. Relativamente ao cdigo FPC, convm reter:

Atribuio com o operador := Para aceder a propriedades, utilizar ., por exemplo Button1.Caption O FPC insensvel a maisculas e minsculas Cadeias de caracteres (strings) dentro de 'plicas'; no mudar de linha dentro de uma cadeia de caracteres

1.15 Exerccio Livre Crie e teste uma nova aplicao que execute o cdigo ShowMessage('Ol Mundo!!!');

Introduo ao Lazarus

FEUP - DEEC

Pg 5

22.1 2.2 2.3 -

Criao de projecto com dois botesRegresse ao IDE do Lazarus para alterar o projecto anterior Se a Form1 no estiver visvel, escolha View -> Forms -> Form1 -> OK Acrescente um outro boto nossa janela:

2.4 Observe o Object Inspector e confirme que a nossa janela, a form, tem o nome Form1; o primeiro boto chama-se Button1 e o segundo Button2; naturalmente ambos botes esto dentro da Form1.

2.5 Faa duplo clique no boto 2; o cursor aparecer no source editor, dentro do procedimento Button2Click, i.e., o procedimento que ser chamado quando se carregar no boto 2; acrescente o seguinte cdigo: ShowMessage('Ol Mundo'); A janela do editor deve-se parecer com:

2.6 -

Prima File -> Save All

2.7 Prima F9 para executar o projecto e se no houver erros, este ser executado, aparecendo a form em run-time:

2.8 -

Prima o Button1 e confirme a alterao:

Introduo ao Lazarus

FEUP - DEEC

Pg 6

2.9 -

Prima o Button2 e veja o aparecimento da seguinte caixa:

2.10 2.11 -

Feche a aplicao com Regresse ao IDE lazarus e prima F12 at ver a form em design time

2.12 Faa duplo clique no Button1; o cursor aparecer no source editor, dentro do procedimento Button1Click; prima F12 para alternar source e form e depois faa duplo clique no Button2 para o cursor aparecer dentro do procedimento Button2Click; navegue no source editor at achar o procedimento Button1Click:

2.13 Exerccio Livre - Adicione um terceiro boto que quando for carregado mostre uma caixa com a mensagem Bom dia, FEUP! 2.14 - Ideias a reter:

A form do projecto, chamada Form1, passou a ter dois botes, Button1 e Button2 A unit passou a ter, entre outros elementos de cdigo, os procedimentos Button1Click e Button2Click Os dois botes so instncias de objectos do tipo TButton; diz-se que TButton uma classe; geralmente, classes e tipos so identificados comeando pela letra T Cada boto tem o seu respectivo procedimento de resposta ao clique em run-time, Button1Click e Button2Click que so diferentes e no se confundem o S.O. que se encarrega de chamar a rotina certa de cada vez que, em run-time, se carrega em determinado boto, isto , o S.O. que gera os eventos e chama rotinas no programa que se vem criando da este tipo de programao se designar Programao Orientada a Eventos

Introduo ao Lazarus

FEUP - DEEC

Pg 7

3-

Alterando nomes e propriedades de componentes3.1 No Object Inspector seleccione o Button1 e depois o separador Properties; neste separador que se pode ver e alterar todas as propriedades (atributos) do objecto seleccionado actualmente; estas propriedades so listadas por ordem alfabtica; a figura seguinte mostra algumas propriedades do Button1:

3.2 Seleccione agora o separador Events; este separador mostra todos os eventos disponveis para os botes TButton, isto , todos os acontecimentos relacionados com instncias ; o nico campo preenchido Button1Click; Confirme o mesmo para os eventos de Button2 o nico evento listado Button2Click

3.3 Seleccione agora o separador Favorites; este separador tem o resumo das propriedades e dos eventos mais visitados e frequentemente mais utilizados

Introduo ao Lazarus

FEUP - DEEC

Pg 8

3.4 -

O resumo das propriedades dos botes so apresentadas de seguida:

Mude o nome do Button1 para BChangeCaption e do boto 2 para BShowBox; mude apenas a propriedade Name do Button1 e do Button2; depois das mudanas o Object Inspector mostrar:

E o cdigo ser automaticamente alterado para:

Introduo ao Lazarus

FEUP - DEEC

Pg 9

3.5 -

Altere agora as Captions dos botes, tal como nas seguintes figuras:

Observe como as mudanas nas propriedades dos botes ficam efectivas imediatamente e a Form em Design Time imediatamente alterada para reflectir as mudanas 3.6 Seleccione a form no Object Inspector para ver as suas propriedades:

Modifique texto associado Form, isto , a sua propriedade Caption para FEUP; note que a caption da form nada tem que ver com a caption de cada um dos botes. O Object Inspector reflectir as mudanas e a Form passar a ostentar a nova inscrio:

3.7 3.8 -

Escolha File -> Save All Execute a nova verso do projecto com F9 para verificar as diferenas

Introduo ao Lazarus

FEUP - DEEC

Pg 10

3.9 - Ideias a reter:

Os nomes dos componentes tal como botes devem ser descritivos Aps mudana do nome dos componentes, o cdigo vem alterado automaticamente Todos as instncias TButton (isto , todos os botes) devem comear pela letra B - isto permitir mais tarde que todos os botes sejam facilmente localizaveis Mudanas em propriedades de componentes visuais so visveis desde logo em design-time - da esta programao ser Visual Tanto a Form como cada um dos botes tem uma dada Caption - este conceito chama-se polimorfismo; h muitos componentes com propriedades iguais para funcionalidades similares repare que Form.Caption e Button.Caption so conceitos similares para classes diferentes

Introduo ao Lazarus

FEUP - DEEC

Pg 11

4-

Aplicao com Edit e Check Box4.1 Crie um novo projecto de aplicao (Project -> New project -> Application; para mais detalhes veja 1.2) 4.2 1.4) Arranje as janelas a seu gosto (por exemplo, tal como mostrado em

4.3 Escolha no menu File -> Save All e grave todos os ficheiros numa outra directoria diferente da anterior; no utilize drives em rede pois a criao do executvel fica muito lenta; utilize os nomes myunit.pas e project2.lpi (utilize minsculas); deste forma todos os ficheiros deste novo projecto ficam na nova directoria; o Lazarus utiliza e cria diversos ficheiros que so mantidos sem interveno humana 4.4 Acrescente um TEdit Form:

A classe TEdit fornece a funcionalidade de uma caixa de edio de texto standard do S.O. (texto genrico de uma linha apenas). 4.5 Acrescente um TCheckBox Form:

A classe TCheckBox fornece a funcionalidade de uma caixa de escolha Verdadeiro/Falso que uma funcionalidade padro dos S.O.. 4.6 Altere as propriedades da CheckBox tal como se mostra a seguir:Caption: &Alterar - o & define uma tecla de atalho que pode ser utilizada em Run-Time Checked: True - Duplo Clique no False muda para True e vice versa) Name: CBAllowChange

Note que a Check Box um controlo standard do S.O. mas a forma exacta da Check Box e a forma exacta do visto ou da cruz que aparece para indicar que esta opo est validada depende de configuraes do S.O..

Introduo ao Lazarus

FEUP - DEEC

Pg 12

4.7 -

Altere as propriedades da Edit1 tal como se mostra a seguir:Name: EditMyText Text: FEUP

4.8 Verifique na listagem das propriedades que existe uma propriedade chamada ReadOnly, que pode apresentar os valores verdadeiro e falso; esta propriedade permite que em run-time seja possvel alterar o texto deste componente (mantenha ReadOnly igual a False):

4.9 -

Altere a Caption da Form para passar a dizer FEUP

4.10 Faa duplo clique em cima da check box para criar e chamar o procedimento CBAllowChangeChange; este procedimento ser chamado sempre que se clicar sobre a check box; escreva edit e prima CTRL+SPACE para activar a funcionalidade de Completion, isto , completar o cdigo automaticamente; esta opo abre uma caixa de seleco das possibilidades de escrita; prima Enter para seleccionar a opo certa (EditMyText) e ver o texto EditMyText aparecer sem ter de escrever mais do que as primeiras letras!

4.11 -

Utilize esta tcnica para ajudar a escrever o texto:

Introduo ao Lazarus

FEUP - DEEC

Pg 13

4.12 Grave todos os ficheiros premindo e de seguida prima para executar a aplicao; ambos os comandos esto situados na barra de atalhos; estes atalhos equivalem a File->Save All e Run->Run 4.13 4.14 H algum problema com esta aplicao ? Altere o cdigo de CBAllowChangeChange para

Repare que CBAllowChange o nome da CheckBox e CBAllowChangeChange o nome do procedimento que chamado no evento OnChange desta check Box 4.15 Grave e execute para perceber as alteraes e respectivo motivo.

4.16 Qual a aplicao que o utilizador final do nosso programa acharia mais intuitivo de utilizar, a aplicao 4.12 ou a 4.14 ? 4.17 Acrescente um boto com o nome BUpdate e a caption Actuali&zar

4.18 -

Faa duplo clique no boto e escreva tal como mostrado de seguida:

4.19 -

Grave todos os ficheiros premindo

e execute com

4.20 Experimente aceder aos controlos visuais atravs do teclado, utilizando teclas de atalho ALT+A e ALT+Z

Introduo ao Lazarus

FEUP - DEEC

Pg 14

4.21 - Ideias a Reter:

Foi utilizada uma edit box chamada EditMyText; boa prtica todas as edit boxes terem o prefixo Edit Foi utilizado uma CheckBox chamada CBAllowChange; boa prtica todas as CheckBox's terem o prefixo CB Quando o programa arranca, possvel alterar o texto do componente EditMyText pois a sua propriedade ReadOnly foi definida em design time como False e por esse motivo, ao arrancar o programa esta propriedade continua a False O componente CBAllowChange foi definido em design-time como estando seleccionado e por isso no arranque esta caixa apresenta-se seleccionada: Checked a True O texto associado caixa de escolha refere Alterar pelo que ser intuitivo que quando esta caixa estiver seleccionada, ser possvel alterar o contedo da caixa de edio de texto; em termos de programao s temos acesso s propriedades EditMyText.ReadOnly e CBAllowChange.Checked o que obriga utilizao da negao booleana: EditMyText.ReadOnly:=not(CBAllowChange.Checked); Se o texto associado check box dissesse Impedir alterao, ento j faria sentido o cdigo EditMyText.ReadOnly:=CBPreventChanges.Checked;! Lembre-se que o utilizador final no o programador da aplicao e que o utilizador final apenas ler o texto que estiver na form que deve conduzir a uma utilizao fcil, intuitiva e com lgica da aplicao que estamos a criar ! Note ainda que o nome do procedimento a ser chamado no evento o nome do componente concatenado com o nome do evento, por exemplo: o componente CBAllowChange chama para o evento OnChange o procedimento CBAllowChangeChange

Introduo ao Lazarus

FEUP - DEEC

Pg 15

5-

Utilizao do evento OnChange da classe TEdit5.1 Faa duplo clique em cima da caixa de edio de texto (EditMyText) para definir o evento OnChange abrir o procedimento EditMyTextChange e modifique-o tal como indicado:

5.2 -

Escolha File -> Save All e depois Run->Run para executar o projecto

5.3 - Ideias a reter:

O evento TEdit.OnChange chamado sempre que a caixa de texto for modificada, por exemplo, a cada tecla premida; o cdigo deste evento muda a form.caption para o texto da EditMyText e desta forma no necessrio carregar no boto para fazer a actualizao que se tornou Automtica! No executado nenhum cdigo da aplicao fora dos eventos reconhecidos Seria muito errado por um ciclo infinito a verificar se ocorreram mudanas no texto Neste momento h cdigo repetido no nosso programa (Form1.Caption := EditMyText.Text); cdigo repetido sempre mau e deve ser evitado !

Introduo ao Lazarus

FEUP - DEEC

Pg 16

6-

Utilizao de procedimentos e escrita rpida (Code Templates, Completion e Parameter CheckOut)6.1 Procure no cdigo da unidade myunit.pas o procedimento CBAllowChangeChange; logo acima desse cdigo e fora de qualquer procedimento (que comeam por begin e terminam em end), escreva proc

Prima CTRL+J para activar a funcionalidade de Code Templates:

Preencha com o restante texto, tal como indicado de seguida:

Este cdigo define um procedimento (uma funo que no devolve nada) e que recebe como parmetro de entrada uma varivel com o nome StringIn do tipo string 6.2 Faa duplo clique em cima da Edit e ser conduzido ao cdigo relativo ao evento EditMyTextChange; escreva actu e prima CTRL+SPACE:

Prima depois disso CTRL+Shift+Space para ver os argumentos que a funo ou o procedimento esperam (ver texto flutuante directamente por cima do cursor):

Neste caso o procedimento espera um parmetro com o nome StringIn do tipo String (cadeia de caracteres)

Introduo ao Lazarus

FEUP - DEEC

Pg 17

6.3 Complete tal como mostrado (deve ir utilizando a funcionalidade de completao automtica de cdigo CTRL + SPACE):

6.4 Navegue no cdigo at encontrar o procedimento BUpdateClick e altere de acordo com o seguinte:

6.5 Neste momento os procedimento EditMyTextChange e BUpdateClick chamam um outro procedimento chamado Actualiza que centraliza o processo de actualizao 6.6 Grave e execute para verificar que o conjunto funciona.

6.7 Exerccio Livre: Adicione mais outra Check Box com nome e caption adequados; altere a aplicao para implementar a funcionalidade de a actualizao ser automtica apenas quando a caixa de seleco estiver activa; quando inactiva necessrio premir o boto para actualizar a form 6.8 Exerccio Livre: Modifique a aplicao de tal forma que a caption da form seja o texto da edit repetido com um espao de permeio; para ter trabalho mnimo, onde deve inserir as modificaes ??? 6.9 - Ideias a reter:

O evento OnChange do componente TEdit chama o procedimento chamado Actualiza que muda a Form.Caption Foi criado um procedimento para evitar repetio de cdigo e o exerccio 6.8 beneficia desse facto A escrita de cdigo FPC/Lazarus vm facilitada atravs de diversas tcnicas

Code Templates atalho CTRL + J Code Completion atalho CTRL + SPACE Parameter CheckOut atalho CTRL + SHIFT + SPACE

Introduo ao Lazarus

FEUP - DEEC

Pg 18

7-

Navegao no cdigo e form/cdigo7.1 Prima CTRL+Home por exemplo para relembrar que o nome da unidade myunit 7.2 Prima CTRL+H para regressar ao ponto de edio anterior

7.3 Mantenha CTRL premido e clique com o rato em cima do texto TForm1, que aparece sublinhado: 7.4 Com este clique, o cursor ser levado at parte superior da unidade myunit, onde se define o tipo da Form1 chamado TForm1; aqui que se lista os componentes que esto dentro da form:

Este cdigo refere que a Form1 inclui um TButton com nome CBAllowChange 7.5 Depois do end que indica o final da declarao do tipo TForm, aparece a instanciao da form propriamente dita com Var Form1 : TForm1 indicando que Form1 da classe TForm1. 7.6 Navegue com o cursor at linha onde se declara um qualquer dos procedimentos da form e prima CTRL + Shift + seta_para_baixo para ser levado at implementao desse procedimento ou funo; prima CTRL + Shift + seta_para_cima ou CTRL + H para ir de novo para a declarao; exercite para perceber

Introduo ao Lazarus

FEUP - DEEC

Pg 19

7.7 Encontre o Cdigo seguinte, mantenha CTRL premido e clique em StringIn para ser conduzido declarao respectiva;

7.8 -

Experimente o mesmo com EditMyText, que est dentro da Form

7.9 7.10 -

Prima F12 para ser levado at Form Apague o boto

7.11 Prima F12 de novo para ver que na declarao da form deixou de constar o boto

O cdigo do boto BUpdateClick mantm-se mas no ser nunca chamado.

Introduo ao Lazarus

FEUP - DEEC

Pg 20

7.12 - Ideias a reter:

As alteraes feitas na Form mudam o cdigo da respectiva unit Existe a possibilidade de ter cdigo que nunca chamado Quem decide que cdigo executado e por que ordem o S.O. que chama a rotina dentro da aplicao de acordo os eventos gerados, por incluindo as ordens do utilizador A uma Form corresponde um tipo de form (Tform) Uma Form est numa unidade de cdigo (unit); a unidade e a form podem ter nomes quaisquer desde que sejam diferentes !!! Geralmente uma unit s tem uma form Uma unit pode ter uma form ou no (unit pode ser visual ou no) Obs: Nem todas as informaes da Form so mantidas dentro da unidade existem outras informaes, guardadas noutros ficheiros Por segurana e facilidade de utilizao, criar uma directoria nova para cada projecto Lazarus e guardar todos os ficheiros desse projecto nessa mesma directoria Nunca alterar cdigo que no foi feito por ns! Navegao:

F12 troca entre form e cdigo F11 activa o object inspector CTRL + Clique leva declarao de alguma coisa CTRL + SHIFT + cima e CTRL + SHIFT + baixo trocam entre declarao e implementao de procedimentos e funes

Introduo ao Lazarus

FEUP - DEEC

Pg 21

8-

Aplicao com RadioGroup e Memo8.1 Crie um novo projecto de aplicao: Project->New Project>Application ->Create 8.2 Desenhe a seguinte Form que contm um TRadioGroup e um TMemo, ambos situados no separador Standard:

8.3 Encontre a propriedade Lines do Memo, entre dentro desta qudrcula e depois aparecer um boto com ...; prima este boto (mostrado de seguida) no Object Inspector e altere as linhas da Memo para FEUP e na linha seguinte DEEC.

Tal como pode ver, uma memo box uma caixa de texto que permite mltiplas linhas. A propriedade Lines do tipo TStrings que permite conter um texto com diversas linhas.

Introduo ao Lazarus

FEUP - DEEC

Pg 22

8.4 Encontre a propriedade Items do Radio Group, prima ... e insira Primeiro e Segundo; depois disso modifique Item Index para 0 note que o Item Primeiro passou a estar escolhido; deve ter reparado que este mais um componente padro do S.O.

8.5 Faa duplo clique no Radio Group, acrescente tal como mostrado de seguida e depois prima CTRL+Shift+Space para ver as listas parmetros que esta funo aceita:

Para a funo IntToStr, os argumentos podem ser de diversos tipos (mas sempre inteiros) 8.6 Complete como de seguida:

8.7 Grave e execute para testar as funcionalidades: quando se muda a seleco no radio group, acrescentada uma linha de texto que descreve o que est seleccionado.

Introduo ao Lazarus

FEUP - DEEC

Pg 23

8.8 Acrescente ainda um Boto com caption Descreve e com nome BDescribe

8.9 Faa com que o evento OnClick do Radio Group e o OnClick do boto chamem a funo DescribeRadioGroup que se mostra de seguida; note que como a funo externa Form1, necessrio acrescentar a noo de que todos os controlos visuais que temos vindo a manipular esto dentro da Form1 e por isso necessrio indicar Form1.Memo1.Lines.Append:

8.10 -

Grave e execute para testar todas as funcionalidades

Introduo ao Lazarus

FEUP - DEEC

Pg 24

8.11 Exerccio livre: Modifique a form para que passe a ter a configurao indicada de seguida; utilize o novo boto para acrescentar um item em run time ao RadioGroup (utilize a funo RadioGroup.Items.Append para acrescentar items em run-time)

8.12 - Ideias a reter:

O controlo visual RadioGroup escolhe no mximo uma de diversas opes Cada opo do RadioGroup pertence a um TStrings chamado Items O Item escolhido actualmente indicado pela propiedade ItemIndex (-1 significa nada escolhido, 0 o primeiro item, etc) perfeitamente possvel ter items iguais uma vez que os items so numerados Os items podem ser indicados em design time, no object inspector mas tambm podem ser acrescentados em run-time Para acrescentar items ao RG, utilizar RadioGroupName.Items.Append(...) As caixas de texto (TMemo) permitem ter diversas linhas de texto; o texto dentro da caixa de texto ,isto , as suas linhas, so tambm TStrings com o nome Lines Para acrescentar linhas ao Memo, utilizar MemoName.Lines.Append(...) A funo Append chamada em ambos os casos pertence classe TStrings que est tanto no RG.Items como no Tmemo.Lines Quando utiliza uma funo fora da form, para aceder aos controlos visuais da form, necessrio escrever explicitamente Form1.ControloVisual

Introduo ao Lazarus

FEUP - DEEC

Pg 25

99.1 9.2 9.3 -

TemporizadorCrie uma nova aplicao Insira uma caixa de edio de texto TEdit e um boto TButton. Faa com que o texto inicial no arranque da aplicao seja 0 (zero)

9.4 Faa com que a cada presso do boto seja executado o seguinte cdigo: Edit1.Text:= Edit1.Text+'!'; 9.5 Grave o projecto numa directoria adequada e execute

9.6 Confirme que a cada presso do boto um ponto de exclao acrestado 9.7 Modifique agora o evento OnClick do boto para: Edit1.Text:=IntToStr(StrToIntDef(Edit1.Text,0)+1); Este cdigo converte o texto do Edit1 para um nmero inteiro, soma 1 e pe o resultado de volta no mesmo texto, sob a forma de string. 9.8 Grave e execute para confirmar que a cada presso do boto, o nmero na edit box incrementado 9.9 De seguida acrescente um temporizador TTimer (separador System) form:

9.10 Faa duplo clique em cima do timer que acabou de colocar na form para ser levado ao evento 'OnTimer' e preencha dentro do procedimento Timer1Timer o seguinte cdigo com a chamada: Button1Click(Sender); Este cdigo ser chamado peridicamente pelo timer e chama a rotina de presso do boto. 9.11 Grave e execute - note que a numerao incrementada todos os segundos automaticamente e ainda sempre que se premir o boto; note que o timer desaparece em run-time (mas as funcionalidades esto l!) 9.12 9.13 Altere agora a propriedade Timer1.interval para 2000 Execute para ver que o nmero incrementado a cada 2 segundos.

Introduo ao Lazarus

FEUP - DEEC

Pg 26

9.14 Exerccio Livre: Adicione uma check box CBEnable que quando seleccionada permite o funcionamento do incremento automtico; a check box deve aparecer inicialmente seleccionada; Dica: Utilize Timer1.Enabled:=... 9.15 - Ideias a reter:

Quando no h eventos, no h cdigo da aplicao a ser executado Os temporizadores normais do Lazarus / Windows so pouco precisos e aconselhase tempos sempre superiores a 0.1 segundos

10 10.1 10.2 -

Menu da aplicaoAcrescente aplicao anterior um TMainMenu do separador standard Faa duplo clique em cima dele para abrir o editor de menus:

10.3 -

Clique em cima de New Item1 e altere caption para &File

10.4 Em cima de File, clique com rato boto da direita e escolha create sub menu:

10.5 Clique em New Item2 e mude este caption para E&xit! e o nome deste menu para MenuFileExit

Introduo ao Lazarus

FEUP - DEEC

Pg 27

10.6 Clique em File com o rato boto esquerda e escolha Insert New Item (After)

10.7 -

Clique no ltimo item de menu e altere-lhe o caption para Help

10.8 Acrescente um sub menu Help e ao novo item altere o caption para &About e altere-lhe o nome para MenuHelpAbout

10.9 Feche o editor de menus e ainda em tempo de desenho verifique a sua funcionalidade, devemos ter um menu File com a opo Exit! e outro menu Help com a opo About

10.10 -

Seleccione File -> Exit e complete;

10.11 -

Ainda em tempo de desenho, selecione Help About e complete:

10.12 -

Grave e execute para testar as funcionalidades

Introduo ao Lazarus

FEUP - DEEC

Pg 28

10.13 Abra o editor de menus e acrescente um item ao menu File com a caption - e outro com a caption Exi&t... e nome MenuExitQuery.

10.14 Feche o editor e seleccione File->Exit... e complete como se mostra de seguida:

10.15 Nota: boa prtica o menus com aco imediata terem um ! e os que abrem caixas de confirmao ou dilogo terem ... 10.16 Execute e teste as funcionalidades da aplicao

10.17 - Ideias a reter:

Os menus so uma funcionalidade padro do S.O. Os menus devem ter nomes curtos, descritivos e que no dem azo a confuses lembre-se que o utilizador no o programador interessante agrupar as aces a executar por temas e assim ter menus e submenus (e sub-sub-menus...) de acordo com determinada lgica Boas prticas:

Definir teclas de atalho para os menus utilizados mais frequentemente Um Comando! d ideia que o comando ser executado imediatamente sem mais confirmaes Um Comando... d ideia que ser aparecer um dilogo adicional

Introduo ao Lazarus

FEUP - DEEC

Pg 29

11 11.1 -

Eventos com parmetrosCrie uma nova aplicao apenas com uma TLabel

11.2 Na lista de eventos da Form, defina o evento OnKeyPress e complete o respectivo procedimento tal como se mostra de seguida:

Os eventos recebem sempre a identificao do controlo que gerou esse evento atravs do parmetro de entrada Sender no procedimento de atendimento ao referido evento. O procedimento FormKeyPress atende os eventos OnKeyPress da Form1 e recebe no s o sender, como tambm recebe a tecla premida atravs do parmetro de entrada key; a varivel x do tipo inteiro e local a este procedimento (o seu valor no ser mantido entre chamadas ao procedimento) 11.3 Grave e execute premindo as teclas + e - para ver o nmero alterar-se 11.4 - Ideias a reter:

Os procedimentos de atendimento aos eventos recebem parmetros Um parmetro o Sender, isto , qual o objecto que gerou a chamada ao procedimento actual Outros eventos recebem informaes especficas do evento em causa, exemplo: OnKeyPress recebe qual a tecla premida

Introduo ao Lazarus

FEUP - DEEC

Pg 30

12 Confirmar sada da aplicao - Close Query parmetros de sada no evento12.1 12.2 Crie uma nova aplicao Nos eventos da form, defina OnCloseQuery

A funo MessageDlg mostra uma caixa de dilogo standard do sistema operativo e pede confirmao de sada com os botes standar OK e Cancel. No procedimento FormCloseQuery entram os parmetros sender e CanClose que um parmetros do tipo var. O valor desta varivel sada do procedimento ser utilizado pelo sistema operativo para validar realmente o pedido de sada do programa (por defeito, CanClose := True que dir ao S.O. para fechar de facto a aplicao). 12.3 Atravs deste evento, seja qual for a maneira para pedir a finalizao da aplicao, sempre lanada a caixa de dilogo; muitos programas lanam esta caixa de dilogo apenas existirem alteraes por gravar.

Introduo ao Lazarus

FEUP - DEEC

Pg 31

13

DebuggerDe seguida utilizar-se- o debugger do IDE do lazarus; o debugger sob windows pode funcionar mal e pode, por vezes, obrigar a re-arrancar o lazarus (esta situao muito, muito menos frequente em linux) ou pode ser necessrio e Run->Reset Debugger Para terminar a sesso de debugging, utilizar Run->Stop Crie uma nova aplicao com um boto e complete:

13.1 -

13.2 Prima com o rato no stio do point de debugger

vermelho para definir um break

13.3 Grave a aplicao e execute com F9; verifique que o break point aparece confirmado:

Introduo ao Lazarus

FEUP - DEEC

Pg 32

13.4 Prima o boto da aplicao ser atendido o evento, o procedimento de atendimento ao evento ser chamado e o procedimento Button1Click ser executado desde o incio e prosseguir; a execuo ser interrompida no stio do break point:

13.5 Durante este tempo de debugging, possvel ver o valor das variveis passando o cursor do rato por cima dos respectivos nomes das variveis 13.6 Prima F7 repetidamente para ver o programa a ser executado passo a passo e pode inspeccionar as variveis em causa 13.7 Retire o break point e prima F9 para executar o resto to programa normalmente 13.8 Durante o debugging, no possvel ver a form da aplicao

13.9 A tecla F7 faz step into e salta para dentro dos procedimentos que forem sendo chamados 13.10 A tecla F8 faz step over e entra e sai do procedimento passando para a linha seguinte do procedimento actual 13.11 13.12 A tecla F9 executa o resto do programa normalmente Consulte o Menu View->Debug Windows->

Watches permite acompanhar as variveis que se definir Local Variables permite ver o valor de todas as variveis locais desta funo

Introduo ao Lazarus

FEUP - DEEC

Pg 33

14 -

Comentrios FinaisEste conjunto tutorial serve para dar bases para que os alunos possam explorar por si as funcionalidade do lazarus. O lazarus uma ferramenta genrica e imensa de tamanho... Fica o desafio de experimentar esta ferramenta em linux

O lazarus mais rpido a compilar as aplicaes O debugger funciona melhor possvel portar projectos entre windows e linux O sistema operativo Linux livre e todos os drivers so livres O sistema operativo Linux no tem virus!

- fim do tutorial -

Introduo ao Lazarus

FEUP - DEEC

Pg 34

Exerccios de Lazarus1 - Ol Mundo num boto que se move

Crie uma aplicao com um boto numa form Crie um programa que quando premir o boto altere a caption do boto para Ol Mundo!!! Modifique o programa anterior de tal maneira que o boto se mova pela form: de cada vez que se carregue no boto, ele deve mover-se 20 pixeis para a direita e para baixo; antes de qualquer parte do boto sair da form, ele deve ser recolocado obrigatoriamente no centro da form; garanta que o programa funciona quando a form tem qualquer tamanho Dicas: - A generalidade dos controlos tm propriedades top, left, width e height - Utilize o operador div para diviso inteira - As posies e dimenses so sempre em pixeis - Os eixos do Lazarus tm origem no canto superior esquerdo

2 - Edit, Boto e Memo

Crie uma aplicao que de cada vez que carrega num boto, acrescenta numa nova linha da Memo box o texto escrito na Edit box Seleccione a opo relativa ao aparecimento automtico de Scroll Bars na memo Dica: - Utilize Memo.Lines.Append

3 - Clculo da operao escolhida por Radio Group (resultado em Edit Box)

Crie uma aplicao com 3 edit boxes, um radio group e um boto Duas das caixas de texto (Edit Boxes) sero operandos para uma operao a escolher pelo Radio Group a terceira caixa de texto ser para o resultado O Radio Group pode escolher entre as seguintes operaes: soma, subtraco e multiplicao O Clculo ser efectuado quando se premir o boto Dicas: - Utilize StrToInt, e IntToStr - Utilize RadioGroup.ItemIndex

Introduo ao Lazarus

FEUP - DEEC

Pg 35

4 - Clculo da operao escolhida por Radio Group descritivo em Memo box

Coloque 2 Edits, um Boto, um RadioGroup e um Memo e complete de forma a obter um programa que quando carregar no boto seja calculada a operao seleccionada no RadioGroup e o descritivo (Operando1) (operao) (Operando2) = (resultado) aparea na Memo Dicas: - Utilize StrToInt, StrToIntDef e IntToStr - Utilize RadioGroup.ItemIndex - Utilize MemoResults.add - Utilize soma de strings para concatenao

Altere o programa para que o resultado seja calculado sempre que houver alteraes em qualquer dos edits Dicas: - Utilize o evento Edit.OnChange - Verifique que o programa pode gerar erros e mesmo assim continua a funcionar depois da situao de erro ter sido corrigida

Altere o programa para que a conta seja calculada de 5 em 5 segundos Dica: Utilize um TTimer (separador System)

Introduo ao Lazarus

FEUP - DEEC

Pg 36

5 - Desenho Bsico (canvas)

Coloque um Timer que chama o seguinte cdigo todos os segundoswith Form1 do begin Canvas.Ellipse( -2+Width 2+Width Canvas.Line ( Width 9+Width end; div div div div 2, -2+Height div 2, 2, 2+Height div 2); 2, Height div 2, 2, Height div 2);

Estude este cdigo para o compreender. Execute e redimensione a Form para ver o efeito;

Altere o programa para haver uma varivel global rotacao que define o ngulo de rotao do marcador; acrescente um boto que acrescenta PI/10 radianos Dicas: - As variveis globais so definidas fora de qualquer funo (na zona de interface ou implementao) e so conhecidas da para diante no cdigo - Tenha em ateno o sentido de rotao que se pretende obter e os eixos do lazarus - Utilize as funes sin e cos que recebem argumentos em radianos - O lazarus conhece a constante PI - Ter de utilizar round ou trunc para converter de real para inteiro

Comande a rotao com o teclado: por exemplo '+' e '-' fazem rodar o marcador numa e noutra direco Dicas: - Ponha a verdadeiro a propriedade Form.KeyPreview - Utilize o evento Form.OnKeyPress

Introduo ao Lazarus

FEUP - DEEC

Pg 37

6 - Aplicao multi-janela

Crie uma aplicao com 3 botes numa form; carregando no primeiro abre uma segunda form; carregando no segundo boto fecha a segunda form; carregando no terceiro boto, abre a form no modo modal Dicas: - Utilizar File -> New Form - Ver Project -> Project Options -> forms - Utilizar Form.Show, hide, ShowModal

7 - Clculo de somatriofim

Projecte uma aplicao que calcula

soma1= i i=ini

2

em que ini e fim so

valores inteiros provenientes de caixas de texto

Modifique a aplicao anterior para calcular ou a soma 1 ou a soma 2 (utilize um radio group)

soma2= i3 i=ini

fim

Modifique a aplicao anterior para calcular ou a soma 1 ou a soma 2 ou ambas (ou nenhuma) - utilize um TCheckBoxGroup Impea que todas as check boxes possam ficar no seleccionadas

8 - TXMLPropStorage e session properties

Acrescente aplicao do exerccio anterior um TXMLPropStorage; indique o nome do ficheiro config.xml Aceda ao editor de Form.SessionProperties e seleccione os valores a guardar em disco, sada do programa e que sero repostos entrada do programa Guarde o nmero mnimo de propriedades para que se possa sair da aplicao e voltar a entrar sem perder os valores e as seleces anteriores

- fim exerccios -

Introduo ao Lazarus

FEUP - DEEC

Pg 38

Ligao do Lazarus Base de Dados PGSQL

fcil aceder a Bases de Dados sob Lazarus. Para aceder a BDs criadas com PostGreSQL, utilizar o componente PQConnection que regista todos os dados relativos ao servidor de BD, ao utilizador e respectivas passwords.

Para aceder aos dados da BD necessrio haver uma proteco contra ordens contraditrias simultneas de diferentes utilizadores e para esse efeito utiliza-se um objecto chamado SQLTransaction

Para fazer perguntas (queries) sob a base de dados necessrio o componente SQLQuery

Um componente DBGrid uma grelha automtica com a forma de uma tabela, tabela essa que pode ser uma tabela temporria proveniente de uma pesquisa SQL; para utilizar este componente ainda necessrio uma forma de redireccionar dados, o que conseguido atravs do componente Data Source

Diferentes utilizaes

H 3 formas de aceder a bases de dados sob Lazarus

Utilizando um componente DBGrid visualizaes simples Utilizando PQConnection.ExecuteDirect modificar dados Utilizando SQLQuery.Fields recolha de dados pesquisados (resposta a pergunta SQL)

Preparao

Abra o gnomo/phppgadmin no browser, altere a sua password para uma password pouco importante

Crie uma tabela de teste com dados Experimente uma pergunta (query) de teste na janela de SQL do gnomo (exemplo: select * from anytable)

Introduo ao Lazarus

FEUP - DEEC

Pg 39

Acesso utilizando o componente DBGrid

Este o teste mais visual, que apresenta dados da ligao BD tanto em tempo de desenho como durante a execuo da aplicao; a sua utilizao limita-se a mostrar dados de forma simples e automtica, sem flexibilidade. Ateno: diversas configuraes podem evitar o modo de funcionamento aqui descrito mas o procedimento aqui apresentado foi testado com sucesso nas salas de aula do CICA Construa a aplicao com aspecto similar ao seguinte. A sequncia de operaes indicada logo de seguida:

Componente PQConnection SQLQuery SQLTransaction DataSource DBGrid

Separador SQLdb SQLdb SQLdb DataAccess DataControls

cone

Introduo ao Lazarus

FEUP - DEEC

Pg 40

DatabaseName HostName UserName Password

SQL

Servidor de BD (ex.: Gnomo.fe.up.pt)

No PQConnection

preencher com os respectivos valores :

- Transaction - SQLTransaction - Database nome da BD a utilizar, exemplo sinf0812 - HostName nome do servidor de BD a utilizar, ex: gnomo.fe.up.pt - UserName nome do utilizador na BD, exemplo sinf0812 - Password password no servidor de BD

(Confirmar que SQLTransaction aponta para PQConnection) No SQLQuery preencher:

- Transaco - SQLTransaction - Database - PQConnection - SQL preencher com cdigo SQL, exemplo: select * from anytable - (no preencher o campo DataSource)

No DataSource

preencher DataSet como SQLQuery

No DBGrid preencher DataSource Activar todos os elementos e mesmo em tempo de desenho ser possvel ver o resultado da query feita na SQLQuery a aparecer na DBGrid

Introduo ao Lazarus

FEUP - DEEC

Pg 41

Execuo directa de cdigo SQL (ExecuteDirect)DatabaseName HostName UserName Password

Servidor de BD (ex.: Gnomo.fe.up.pt)

PQConnection. ExecuteDirect ex.: update tabela set column=1

Para alterar a BD, utilize cdigo similar ao seguinte: ... begin enter:=chr(13)+chr(10); s:='update copias set nalugueres=nalugueres+1 where'+ 'codcopia='+IntToStr(EstaCopia); // string de cdigo SQL try PQConnection.Connected:=True; PQConnection.ExecuteDirect('Begin Work;'); PQConnection.ExecuteDirect(s); PQConnection.ExecuteDirect('Commit Work;'); PQConnection.Connected:=False; except on E : EDatabaseError do MemoLog.Append('ERROBD:'+enter+ E.ClassName+enter+E.Message); on E : Exception do MemoLog.Append('ERRO:'+enter+ E.ClassName+enter+E.Message); end; end;

Introduo ao Lazarus

FEUP - DEEC

Pg 42

Utilizar Perguntas SQL (Fields)DatabaseName HostName UserName Password

SQL

Servidor de BD (ex.: Gnomo.fe.up.pt)

SQLQuery Fields .

Para obter os campos e as linhas de resultado de uma pergunta SQL, utilize cdigo similar ao que se segue: procedure TForm1.OpenQueryPrintAllFieldsClose; var ln, col : integer; s : string; begin SQLQuery.SQL.Text := 'select * from anytable'; PQConnection.Open; SQLQuery.Open; for ln := 1 to SQLQuery.RecordCount do begin SQLQuery.RecNo := ln; s:=''; for col:=0 to SQLQuery.FieldCount-1 do begin s:=s+SQLQuery.Fields[col].AsString+'; '; end; MemoLog.Append(s); end; SQLQuery.Close; PQConnection.Close; end;

A resposta pergunta SQL tem as linhas desde 1 at SQLQuery.RecordCount e as colunas desde 0 at SQLQuery.FieldCount-1 A Linha actual pode ser obtida e imposta atravs de SQLQuery.RecNo Cada coluna pode ser de um tipo diferente de dados, por exemplo a primeira coluna pode ser um inteiro e a segunda uma string pelo que necessrio indicar o tipo de dados em causa: SQLQuery.Fields[0].AsInteger e SQLQuery.Fields[1].AsString

Introduo ao Lazarus

FEUP - DEEC

Pg 43

Dicas

Consulte o ficheiro das perguntas frequentes (nos contedos da cadeira) Por vezes o debugguer pode dar problemas (especialmente sob windows), pelo que pode ser interessante correr o executvel via Sistema Operativo Pode ser necessrio dar permisses de acesso rede na firewall tanto ao lazarus como aplicao que se cria em tempo de compilao

Exerccio Livre

Este exerccio livre compara uma aplicao baseada em Base de Dados com uma outra que utiliza um ficheiro que lido para memria Considere a empresa QuerLista, S.A. que deseja ver implementada uma lista telefnica. Uma empresa chamada SLazarus vai desenvolver uma aplicao que utiliza de uma list-box de Lazarus para armazenar os dados que sero gravados em disco atravs do componente TXMLPropStorage; adicionar ListBox.Items nas Session Properties da Form; se o entender como til, utilize o caracter especial # para separar o nome do nmero de telefone guardando a informao na mesma linha de uma nica ListBox Uma outra empresa chamada LazGres vai desenvolver uma aplicao rival fazendo uso de PostGreSQL e Lazarus Ambas as empresas vo utilizar uma listagem com apenas duas colunas: nome e nmero de telefone: lista_telef(nome, nmero_telefone) Para cada uma das aplicaes rivais, crie uma aplicao grfica que permita

Inserir uma entrada nova Apagar uma determinada entrada Listar toda a lista telefnica Pesquisar atravs de nome e nmero_telefone Deve ser possvel fazer perguntas de fragmentos de dados, exemplo listar todos os nomes Sousa registados na base de dados

Comece por projectar a interface grfica que deve, na medida do possvel ser o mais comum possvel a ambas as aplicaes Compare ambas as aplicaes e caracterize a possibilidade de crescimento de cada uma das bases de dados incluindo para o caso de mltiplos acessos em simultneo em diversos computadores diferentes

Introduo ao Lazarus

FEUP - DEEC

Pg 44

Alguns Comandos SQL (micro resumo)Manipulao de Tabelas

CREATE TABLE "table_name" ("column_1" "data_type_for_column_1", "column_2" "data_type_for_column_2", ... )

tipos varchar e int obs: utilizar nomes de colunas em minsculas

DROP TABLE table_name

Manipulao de dados

INSERT INTO Persons VALUES('Hussein', 'Saddam', 'White House') INSERT INTO table_name VALUES (value_1, value_2,....) INSERT INTO table_name (column1, column2,...) VALUES (value_1, value_2,....) UPDATE table_name SET column_name_1 = new_value_1, column_name_2 = new_value_2 WHERE column_name = some_value DELETE FROM table_name WHERE column_name = some_value

Introduo ao Lazarus

FEUP - DEEC

Pg 45

Perguntas de dados (Queries)

SELECT column_name(s) FROM table_name WHERE column operator value AND column operator value OR column operator value AND (... OR ...) ...

Operator =, , >, =, Step Into F8 Debugger -> Step Over F9 Run

Introduo ao Lazarus

FEUP - DEEC

Pg 50