Sistemas de Informação · O Lazarus permite fazer aplicações gráficas para S.O. gráficos e...

50
Sistemas de Informação Introdução à ferramenta Lazarus [email protected] – Versão de 2010 / Maio / 12 MIEEC 3º ano Introdução A ferramenta “Lazarus” é uma ferramenta de programação 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 máquinas do CICA, na FEUP nos Sistemas Operativos S.O. Windows e em Linux. Este tutorial introdutório abordará apenas o IDE do Lazarus e a introdução à “Programação Visual”, Programação Orientada a Eventos (POE). Neste tutorial será apresentado o IDE e as principais ideias chave que permitirão ao aluno posteriormente continuar a aprendizagem com autonomia superior. Na leitura inicial deste tutorial, não salte passos nem se afaste demasiado dos passos mencionados. O aluno pode e deve repetir o guião já depois de ter uma percepção mais completa do funcionamento de conjunto de todos os elementos envolvidos e nessa fase dedicar-se a uma exploração mais abrangente. Não se esqueça de consultar sempre que necessário o capítulo final "Listagem de Teclas e funcionalidades" , na pág. 50. Bom Trabalho! Armando Sousa Índice Introdução .............................................................................................. 1 Tutorial ................................................................................................. 2 Exercícios de Lazarus ................................................................................ 35 Ligação do Lazarus à Base de Dados PGSQL ..................................................... 39 Alguns Comandos SQL (micro resumo) ............................................................ 45 FAQ Lazarus Sistemas de informação ............................................................. 47 Listagem de Teclas e funcionalidades ............................................................. 50 Introdução ao Lazarus FEUP - DEEC Pág 1

Transcript of Sistemas de Informação · O Lazarus permite fazer aplicações gráficas para S.O. gráficos e...

  • Sistemas de InformaçãoIntrodução à ferramenta [email protected] – Versão de 2010 / Maio / 12

    MIEEC

    3º ano

    IntroduçãoA ferramenta “Lazarus” é uma ferramenta de programação 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 máquinas do CICA, na FEUP nos Sistemas Operativos S.O. Windows e em Linux. Este tutorial introdutório abordará apenas o IDE do Lazarus e a introdução à “Programação Visual”, Programação Orientada a Eventos (POE).

    Neste tutorial será apresentado o IDE e as principais ideias chave que permitirão ao aluno posteriormente continuar a aprendizagem com autonomia superior.

    Na leitura inicial deste tutorial, não salte passos nem se afaste demasiado dos passos mencionados. O aluno pode e deve repetir o guião já depois de ter uma percepção mais completa do funcionamento de conjunto de todos os elementos envolvidos e nessa fase dedicar-se a uma exploração mais abrangente.

    Não se esqueça de consultar sempre que necessário o capítulo final "Listagem de Teclase funcionalidades" , na pág. 50.

    Bom Trabalho!

    Armando Sousa

    ÍndiceIntrodução .............................................................................................. 1

    Tutorial ................................................................................................. 2

    Exercícios de Lazarus ................................................................................ 35

    Ligação do Lazarus à Base de Dados PGSQL ..................................................... 39

    Alguns Comandos SQL (micro resumo) ............................................................ 45

    FAQ Lazarus Sistemas de informação ............................................................. 47

    Listagem de Teclas e funcionalidades ............................................................. 50

    Introdução ao Lazarus FEUP - DEEC Pág 1

  • Tutorial

    1 - Criação do projecto inicial – Form com 1 botão

    1.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 diálogo:

    1.3 - Seleccione Application e prima Create; acabou de criar um novo projecto vazio para desenvolver uma nova aplicação gráfica.

    1.4 - O ambiente integrado de desenvolvimento (IDE) do lazarus aparecerá; este IDE é constituído 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 código Source Editor (onde se escreve o código!)

    ○ Na figura abaixo representa-se à direita a “form” em “design-time”

    ○ Por baixo aparece a caixa de mensagens (onde vão aparecer erros de compilação, etc)

    Introdução ao Lazarus FEUP - DEEC Pág 2

  • ○ As janelas não terão o aspecto mostrado; altere as posições e dimensões das janelas para reflectir um aspecto similar ao mostrado acima; pode, no entanto, modificar o aspecto de cada uma das janelas ao seu gosto

    1.5 - Insira um botão na form, para isso:

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

    1.5.2 - Clique na form:

    1.6 - O botão que acabou de criar foi automaticamente chamado de Button1; faça duplo clique em cima dele e será conduzido até ao código a executar quando se carregar no botão (dentro do source editor):

    Introdução ao Lazarus FEUP - DEEC Pág 3

  • 1.7 - Dentro do begin e antes do end, escreva o códigoButton1.Caption:='Olá Mundo';este código altera o texto associado ao botão para que este passe a ser “Olá Mundo”; o botão chama-se Button1 e o texto dentro deste botão pertence-lhe e é acessível através de Button1.Caption; para atribuir uma cadeia de caracteres (uma string) ao texto dentro deste botão utiliza-se o código mencionado; a atribuição faz-se com o operador := e a string é identificada como estando entre 'plicas' (cuidado, 'plicas' não são "aspas" ); pode-se trocar maiúsculas e minúsculas; o aspecto no IDE será próximo do mostrado de seguida:

    O código 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 localização no disco local (não utilize drives em rede pois a criação do executável fica muito lenta). Aceite as os nomes por omissão (default) em minúsculas.

    1.9 - Execute o programa premindo a tecla F9 ou menu Run -> Run e observe o desenrolar das mensagens na janela de mensagens: primeiro vêm a mensagem da invocação do compilador do FPC; se não existirem erros, então virá a mensagem “linking” assinalando o processo de construção do executável e depois a mensagem de sucesso:

    1.10 - O programa que acaba de ser criado é então executado pelo S.O. e aparece a janela do primeiro programa sob Lazarus:

    1.11 - Prima o botão com o rato e observe que o texto associado ao botão se modificou para:

    Introdução ao Lazarus FEUP - DEEC Pág 4

  • 1.12 - Redimensione e mova a janela do programa para se assegurar que esta janela do programa se comporta como qualquer outra aplicação do S.O.

    1.13 - Feche a aplicação premindo o do canto superior direito da janela do programa que vem sendo executado

    1.14 - Ideias a reter:○ O Lazarus permite fazer aplicações gráficas para S.O. gráficos e orientados a

    eventos○ Este projecto inclui uma parte gráfica (a “form”) e uma parte de código escrito

    FPC (a “unit”)○ A programação inclui desenhar a form que depois será executada e o código que

    será executado quando se carregar no botão durante a execução do programa○ A execução do programa faz aparecer a janela anteriormente desenhada dentro do

    IDE do lazarus; quando se carrega no botão, é chamado código que escrevemos no programa

    ○ A janela que é desenhada no IDE do lazarus antes da execução pelo SO denomina-se de form em tempo de desenho (design-time); esta mesma form aparece em tempo de execução (em run-time); comparar as figuras 1.5.2 e 1.9

    ○ A aplicação criada é uma das muitas que está a ser executada pelo S.O.○ Relativamente ao código FPC, convém reter:

    ■ Atribuição com o operador “:=”■ Para aceder a propriedades, utilizar “.”, por exemplo “Button1.Caption”■ O FPC é insensível a maiúsculas e minúsculas■ Cadeias de caracteres (strings) dentro de 'plicas'; não mudar de linha dentro de

    uma cadeia de caracteres

    1.15 - Exercício Livre – Crie e teste uma nova aplicação que execute o código ShowMessage('Olá Mundo!!!');

    Introdução ao Lazarus FEUP - DEEC Pág 5

  • 2 - Criação de projecto com dois botões

    2.1 - Regresse ao IDE do Lazarus para alterar o projecto anterior

    2.2 - Se a Form1 não estiver visível, escolha View -> Forms -> Form1 -> OK

    2.3 - Acrescente um outro botão à nossa janela:

    2.4 - Observe o Object Inspector e confirme que a nossa janela, a “form”, tem o nome Form1; o primeiro botão chama-se Button1 e o segundo Button2; naturalmente ambos botões estão dentro da Form1.

    2.5 - Faça duplo clique no botão 2; o cursor aparecerá no source editor, dentro do procedimento Button2Click, i.e., o procedimento que será chamado quando se carregar no botão 2; acrescente o seguinte código: 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 não houver erros, este será executado, aparecendo a form em run-time:

    2.8 - Prima o Button1 e confirme a alteração:

    Introdução ao Lazarus FEUP - DEEC Pág 6

  • 2.9 - Prima o Button2 e veja o aparecimento da seguinte caixa:

    2.10 - Feche a aplicação com

    2.11 - Regresse ao IDE lazarus e prima F12 até ver a form em design time

    2.12 - Faça duplo clique no Button1; o cursor aparecerá no source editor, dentro do procedimento Button1Click; prima F12 para alternar source e form e depois faça duplo clique no Button2 para o cursor aparecer dentro do procedimento Button2Click; navegue no source editor até achar o procedimento Button1Click:

    2.13 - Exercício Livre - Adicione um terceiro botão 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 botões, Button1 e Button2○ A “unit” passou a ter, entre outros elementos de código, os procedimentos

    Button1Click e Button2Click

    ○ Os dois botões são instâncias de objectos do tipo TButton; diz-se que TButton é uma classe; geralmente, classes e tipos são identificados começando pela letra “T”

    ○ Cada botão tem o seu respectivo procedimento de resposta ao clique em run-time, Button1Click e Button2Click que são diferentes e não se confundem

    ○ É o S.O. que se encarrega de chamar a rotina certa de cada vez que, em run-time, se carrega em determinado botão, isto é, o S.O. é que gera os eventos e chama rotinas no programa que se vem criando – daí este tipo de programação se designar Programação Orientada a Eventos

    Introdução ao Lazarus FEUP - DEEC Pág 7

  • 3 - Alterando nomes e propriedades de componentes

    3.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 são listadas por ordem alfabética; a figura seguinte mostra algumas propriedades do Button1:

    3.2 - Seleccione agora o separador Events; este separador mostra todos os eventos disponíveis para os botões TButton, isto é, todos os acontecimentos relacionados com instâncias ; 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

    Introdução ao Lazarus FEUP - DEEC Pág 8

  • 3.4 - O resumo das propriedades dos botões são apresentadas de seguida:

    Mude o nome do Button1 para BChangeCaption e do botão 2 para BShowBox; mude apenas a propriedade “Name” do Button1 e do Button2; depois das mudanças o Object Inspector mostrará:

    E o código será automaticamente alterado para:

    Introdução ao Lazarus FEUP - DEEC Pág 9

  • 3.5 - Altere agora as Captions dos botões, tal como nas seguintes figuras:

    Observe como as mudanças nas propriedades dos botões ficam efectivas imediatamente e a Form em “Design Time” é imediatamente alterada para reflectir as mudanças

    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 botões. O Object Inspector reflectirá as mudanças e a Form passará a ostentar a nova inscrição:

    3.7 - Escolha File -> Save All

    3.8 - Execute a nova versão do projecto com F9 para verificar as diferenças

    Introdução ao Lazarus FEUP - DEEC Pág 10

  • 3.9 - Ideias a reter:○ Os nomes dos componentes tal como botões devem ser descritivos○ Após mudança do nome dos componentes, o código vem alterado automaticamente○ Todos as instâncias TButton (isto é, todos os botões) devem começar pela letra “B”

    - isto permitirá mais tarde que todos os botões sejam facilmente localizaveis○ Mudanças em propriedades de componentes visuais são visíveis desde logo em

    “design-time” - daí esta programação ser Visual○ Tanto a Form como cada um dos botões 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 são conceitos similares para classes diferentes

    Introdução ao Lazarus FEUP - DEEC Pág 11

  • 4 - Aplicação com Edit e Check Box

    4.1 - Crie um novo projecto de aplicação (Project -> New project -> Application; para mais detalhes veja 1.2)

    4.2 - Arranje as janelas a seu gosto (por exemplo, tal como mostrado em 1.4)

    4.3 - Escolha no menu File -> Save All e grave todos os ficheiros numa outra directoria diferente da anterior; não utilize drives em rede pois a criação do executável fica muito lenta; utilize os nomes “myunit.pas” e “project2.lpi” (utilize minúsculas); deste forma todos os ficheiros deste novo projecto ficam na nova directoria; o Lazarus utiliza e cria diversos ficheiros que são mantidos sem intervenção humana

    4.4 - Acrescente um TEdit à Form:

    A classe TEdit fornece a funcionalidade de uma caixa de edição de texto standard do S.O. (texto genérico 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 padrão 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 opção está validada depende de configurações do S.O..

    Introdução ao Lazarus FEUP - DEEC Pág 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 possível alterar o texto deste componente (mantenha ReadOnly igual a False):

    4.9 - Altere a Caption da Form para passar a dizer “FEUP”

    4.10 - Faça 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 código automaticamente; esta opção abre uma caixa de selecção das possibilidades de escrita; prima Enter para seleccionar a opção certa (EditMyText) e ver o texto EditMyText aparecer sem ter de escrever mais do que as primeiras letras!

    4.11 - Utilize esta técnica para ajudar a escrever o texto:

    Introdução ao Lazarus FEUP - DEEC Pág 13

  • 4.12 - Grave todos os ficheiros premindo e de seguida prima para executar a aplicação; ambos os comandos estão situados na barra de atalhos; estes atalhos equivalem a File->Save All e Run->Run

    4.13 - Há algum problema com esta aplicação ?

    4.14 - Altere o código 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 alterações e respectivo motivo.

    4.16 - Qual a aplicação que o utilizador final do nosso programa acharia mais intuitivo de utilizar, a aplicação 4.12 ou a 4.14 ?

    4.17 - Acrescente um botão com o nome BUpdate e a caption “Actuali&zar”

    4.18 - Faça duplo clique no botão e escreva tal como mostrado de seguida:

    4.19 - Grave todos os ficheiros premindo e execute com

    4.20 - Experimente aceder aos controlos visuais através do teclado, utilizando teclas de atalho ALT+A e ALT+Z

    Introdução ao Lazarus FEUP - DEEC Pág 14

  • 4.21 - Ideias a Reter:○ Foi utilizada uma edit box chamada EditMyText; é boa prática todas as edit boxes

    terem o prefixo “Edit”○ Foi utilizado uma CheckBox chamada CBAllowChange; é boa prática todas as

    CheckBox's terem o prefixo “CB”○ Quando o programa arranca, é possível 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á possível alterar o conteúdo da caixa de edição de texto; em termos de programação só temos acesso às propriedades “EditMyText.ReadOnly” e CBAllowChange.Checked o que obriga à utilização da negação booleana: EditMyText.ReadOnly:=not(CBAllowChange.Checked);

    ○ Se o texto associado à check box dissesse “Impedir alteração”, então já faria sentido o código EditMyText.ReadOnly:=CBPreventChanges.Checked;!

    ○ Lembre-se que o utilizador final não é o programador da aplicação e que o utilizador final apenas lerá o texto que estiver na form que deve conduzir a uma utilização fácil, intuitiva e com lógica da aplicação 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

    Introdução ao Lazarus FEUP - DEEC Pág 15

  • 5 - Utilização do evento OnChange da classe TEdit

    5.1 - Faça duplo clique em cima da caixa de edição 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 código deste evento muda a form.caption para o texto da EditMyText e desta forma não é necessário carregar no botão para fazer a actualização que se tornou “Automática”!

    ○ Não é executado nenhum código da aplicação fora dos eventos reconhecidos○ Seria muito errado por um ciclo infinito a verificar se ocorreram mudanças no texto○ Neste momento há código repetido no nosso programa (Form1.Caption :=

    EditMyText.Text); código repetido é sempre mau e deve ser evitado !

    Introdução ao Lazarus FEUP - DEEC Pág 16

  • 6 - Utilização de procedimentos e escrita rápida (Code Templates, Completion e Parameter CheckOut)

    6.1 - Procure no código da unidade myunit.pas o procedimento CBAllowChangeChange; logo acima desse código e fora de qualquer procedimento (que começam 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 código define um procedimento (uma função que não devolve nada) e que recebe como parâmetro de entrada uma variável com o nome “StringIn” do tipo string

    6.2 - Faça duplo clique em cima da Edit e será conduzido ao código relativo ao evento EditMyTextChange; escreva “actu” e prima CTRL+SPACE:

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

    Neste caso o procedimento espera um parâmetro com o nome “StringIn” do tipo “String” (cadeia de caracteres)

    Introdução ao Lazarus FEUP - DEEC Pág 17

  • 6.3 - Complete tal como mostrado (deve ir utilizando a funcionalidade de completação automática de código – CTRL + SPACE):

    6.4 - Navegue no código 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 actualização

    6.6 - Grave e execute para verificar que o conjunto funciona.

    6.7 - Exercício Livre: Adicione mais outra Check Box com nome e caption adequados; altere a aplicação para implementar a funcionalidade de a actualização ser automática apenas quando a caixa de selecção estiver activa; quando inactiva é necessário premir o botão para actualizar a form

    6.8 - Exercício Livre: Modifique a aplicação de tal forma que a caption da form seja o texto da edit repetido com um espaço de permeio; para ter trabalho mínimo, onde deve inserir as modificações ???

    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 repetição de código e o exercício 6.8 beneficia desse facto

    ○ A escrita de código FPC/Lazarus vêm facilitada através de diversas técnicas● Code Templates – atalho CTRL + J● Code Completion – atalho CTRL + SPACE● Parameter CheckOut – atalho CTRL + SHIFT + SPACE

    Introdução ao Lazarus FEUP - DEEC Pág 18

  • 7 - Navegação no código e form/código

    7.1 - Prima CTRL+Home por exemplo para relembrar que o nome da unidade é myunit

    7.2 - Prima CTRL+H para regressar ao ponto de edição 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 estão dentro da form:

    Este código refere que a Form1 inclui um TButton com nome CBAllowChange

    7.5 - Depois do “end” que indica o final da declaração do tipo TForm, aparece a instanciação 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é à implementação desse procedimento ou função; prima CTRL + Shift + seta_para_cima ou CTRL + H para ir de novo para a declaração; exercite para perceber

    Introdução ao Lazarus FEUP - DEEC Pág 19

  • 7.7 - Encontre o Código seguinte, mantenha CTRL premido e clique em StringIn para ser conduzido à declaração respectiva;

    7.8 - Experimente o mesmo com EditMyText, que está dentro da Form

    7.9 - Prima F12 para ser levado até à Form

    7.10 - Apague o botão

    7.11 - Prima F12 de novo para ver que na declaração da form deixou de constar o botão

    O código do botão BUpdateClick mantém-se mas não será nunca chamado.

    Introdução ao Lazarus FEUP - DEEC Pág 20

  • 7.12 - Ideias a reter:○ As alterações feitas na Form mudam o código da respectiva unit○ Existe a possibilidade de ter código que nunca é chamado○ Quem decide que código é executado e por que ordem é o S.O. que chama a rotina

    dentro da aplicação 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 código (“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 não (unit pode ser visual ou não)○ Obs: Nem todas as informações da Form são mantidas dentro da unidade – existem

    outras informações, guardadas noutros ficheiros○ Por segurança e facilidade de utilização, criar uma directoria nova para cada projecto

    Lazarus e guardar todos os ficheiros desse projecto nessa mesma directoria○ Nunca alterar código que não foi feito por nós! ○ Navegação:

    ● F12 troca entre form e código● F11 activa o object inspector● CTRL + Clique leva à declaração de alguma coisa● CTRL + SHIFT + cima e CTRL + SHIFT + baixo trocam entre declaração e

    implementação de procedimentos e funções

    Introdução ao Lazarus FEUP - DEEC Pág 21

  • 8 - Aplicação com RadioGroup e Memo

    8.1 - Crie um novo projecto de aplicação: Project->New Project->Application ->Create

    8.2 - Desenhe a seguinte Form que contém um TRadioGroup e um TMemo, ambos situados no separador Standard:

    8.3 - Encontre a propriedade Lines do Memo, entre dentro desta qudrícula e depois aparecerá um botão com “...”; prima este botão (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 múltiplas linhas. A propriedade “Lines” é do tipo TStrings que permite conter um texto com diversas linhas.

    Introdução ao Lazarus FEUP - DEEC Pág 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 padrão do S.O.

    8.5 - Faça duplo clique no Radio Group, acrescente tal como mostrado de seguida e depois prima CTRL+Shift+Space para ver as listas parâmetros que esta função aceita:

    Para a função 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 selecção no radio group, é acrescentada uma linha de texto que descreve o que está seleccionado.

    Introdução ao Lazarus FEUP - DEEC Pág 23

  • 8.8 - Acrescente ainda um Botão com caption “Descreve” e com nome “BDescribe”

    8.9 - Faça com que o evento OnClick do Radio Group e o OnClick do botão chamem a função DescribeRadioGroup que se mostra de seguida; note que como a função é externa à Form1, é necessário acrescentar a noção de que todos os controlos visuais que temos vindo a manipular estão dentro da Form1 e por isso é necessário indicar Form1.Memo1.Lines.Append:

    8.10 - Grave e execute para testar todas as funcionalidades

    Introdução ao Lazarus FEUP - DEEC Pág 24

  • 8.11 - Exercício livre: Modifique a form para que passe a ter a configuração indicada de seguida; utilize o novo botão para acrescentar um item em run time ao RadioGroup (utilize a função RadioGroup.Items.Append para acrescentar items em run-time)

    8.12 - Ideias a reter:○ O controlo visual RadioGroup escolhe no máximo uma de diversas opções○ Cada opção 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 possível ter items iguais uma vez que os items são numerados○ Os items podem ser indicados em design time, no object inspector mas também

    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, são também TStrings com o nome “Lines”○ Para acrescentar linhas ao Memo, utilizar MemoName.Lines.Append(...)○ A função Append chamada em ambos os casos pertence à classe TStrings que está

    tanto no RG.Items como no Tmemo.Lines○ Quando utiliza uma função fora da form, para aceder aos controlos visuais da form,

    é necessário escrever explicitamente “Form1.ControloVisual”

    Introdução ao Lazarus FEUP - DEEC Pág 25

  • 9 - Temporizador

    9.1 - Crie uma nova aplicação

    9.2 - Insira uma caixa de edição de texto TEdit e um botão TButton.

    9.3 - Faça com que o texto inicial no arranque da aplicação seja “0” (zero)

    9.4 - Faça com que a cada pressão do botão seja executado o seguinte código:Edit1.Text:= Edit1.Text+'!';

    9.5 - Grave o projecto numa directoria adequada e execute

    9.6 - Confirme que a cada pressão do botão um ponto de exclação é acrestado

    9.7 - Modifique agora o evento OnClick do botão para: Edit1.Text:=IntToStr(StrToIntDef(Edit1.Text,0)+1);Este código converte o texto do Edit1 para um número inteiro, soma 1 e põe o resultado de volta no mesmo texto, sob a forma de string.

    9.8 - Grave e execute para confirmar que a cada pressão do botão, o número na edit box é incrementado

    9.9 - De seguida acrescente um temporizador TTimer (separador System) à form:

    9.10 - Faça 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 código com a chamada: Button1Click(Sender);Este código será chamado periódicamente pelo timer e chama a rotina de pressão do botão.

    9.11 - Grave e execute - note que a numeração é incrementada todos os segundos automaticamente e ainda sempre que se premir o botão; note que o timer desaparece em run-time (mas as funcionalidades estão lá!)

    9.12 - Altere agora a propriedade Timer1.interval para 2000

    9.13 - Execute para ver que o número é incrementado a cada 2 segundos.

    Introdução ao Lazarus FEUP - DEEC Pág 26

  • 9.14 - Exercício Livre: Adicione uma check box “CBEnable” que quando seleccionada permite o funcionamento do incremento automático; a check box deve aparecer inicialmente seleccionada; Dica: Utilize Timer1.Enabled:=...

    9.15 - Ideias a reter:○ Quando não há eventos, não há código da aplicação a ser executado○ Os temporizadores normais do Lazarus / Windows são pouco precisos e aconselha-

    se tempos sempre superiores a 0.1 segundos

    10 - Menu da aplicação

    10.1 - Acrescente à aplicação anterior um TMainMenu do separador standard

    10.2 - Faça 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 botão 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”

    Introdução ao Lazarus FEUP - DEEC Pág 27

  • 10.6 - Clique em File com o rato botão 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 opção Exit! e outro menu Help com a opção 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

    Introdução ao Lazarus FEUP - DEEC Pág 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 prática o menus com acção imediata terem um “!” e os que abrem caixas de confirmação ou diálogo terem “...”

    10.16 - Execute e teste as funcionalidades da aplicação

    10.17 - Ideias a reter:○ Os menus são uma funcionalidade padrão do S.O. ○ Os menus devem ter nomes curtos, descritivos e que não dêem azo a confusões –

    lembre-se que o utilizador não é o programador○ É interessante agrupar as acções a executar por temas e assim ter menus e

    submenus (e sub-sub-menus...) de acordo com determinada lógica○ Boas práticas:

    ■ Definir teclas de atalho para os menus utilizados mais frequentemente■ Um “Comando!” dá ideia que o comando será executado imediatamente sem

    mais confirmações ■ Um “Comando...” dá ideia que será aparecerá um diálogo adicional

    Introdução ao Lazarus FEUP - DEEC Pág 29

  • 11 - Eventos com parâmetros

    11.1 - Crie uma nova aplicação 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 identificação do controlo que gerou esse evento através do parâmetro de entrada “Sender” no procedimento de atendimento ao referido evento. O procedimento FormKeyPress atende os eventos OnKeyPress da Form1 e recebe não só o “sender”, como também recebe a tecla premida através do parâmetro de entrada “key”; a variável x é do tipo inteiro e é local a este procedimento (o seu valor não será mantido entre chamadas ao procedimento)

    11.3 - Grave e execute premindo as teclas “+” e “-” para ver o número alterar-se

    11.4 - Ideias a reter:○ Os procedimentos de atendimento aos eventos recebem parâmetros○ Um parâmetro é o “Sender”, isto é, qual o objecto que gerou a chamada ao

    procedimento actual○ Outros eventos recebem informações específicas do evento em causa, exemplo:

    OnKeyPress recebe qual a tecla premida

    Introdução ao Lazarus FEUP - DEEC Pág 30

  • 12 - Confirmar saída da aplicação - Close Query – parâmetros de saída no evento

    12.1 - Crie uma nova aplicação

    12.2 - Nos eventos da form, defina OnCloseQuery

    A função MessageDlg mostra uma caixa de diálogo standard do sistema operativo e pede confirmação de saída com os botões standar OK e Cancel. No procedimento FormCloseQuery entram os parâmetros sender e “CanClose” que é um parâmetros do tipo “var”. O valor desta variável à saída do procedimento será utilizado pelo sistema operativo para validar realmente o pedido de saída do programa (por defeito, CanClose := True que dirá ao S.O. para fechar de facto a aplicação).

    12.3 - Através deste evento, seja qual for a maneira para pedir a finalização da aplicação, é sempre lançada a caixa de diálogo; muitos programas lançam esta caixa de diálogo apenas existirem alterações por gravar.

    Introdução ao Lazarus FEUP - DEEC Pág 31

  • 13 - Debugger ■ De 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 situação é muito, muito menos frequente em linux) ou pode ser necessário e Run->Reset Debugger

    ■ Para terminar a sessão de debugging, utilizar Run->Stop

    13.1 - Crie uma nova aplicação com um botão e complete:

    13.2 - Prima com o rato no sítio do “ ” vermelho para definir um break point de debugger

    13.3 - Grave a aplicação e execute com F9; verifique que o break point aparece confirmado:

    Introdução ao Lazarus FEUP - DEEC Pág 32

  • 13.4 - Prima o botão da aplicação – será atendido o evento, o procedimento de atendimento ao evento será chamado e o procedimento Button1Click será executado desde o início e prosseguirá; a execução será interrompida no sítio do break point:

    13.5 - Durante este tempo de debugging, é possível ver o valor das variáveis passando o cursor do rato por cima dos respectivos nomes das variáveis

    13.6 - Prima F7 repetidamente para ver o programa a ser executado passo a passo e pode inspeccionar as variáveis em causa

    13.7 - Retire o break point e prima F9 para executar o resto to programa normalmente

    13.8 - Durante o debugging, não é possível ver a form da aplicação

    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 - A tecla F9 executa o resto do programa normalmente

    13.12 - Consulte o Menu View->Debug Windows->

    ○ Watches permite acompanhar as variáveis que se definir

    ○ Local Variables permite ver o valor de todas as variáveis locais desta função

    Introdução ao Lazarus FEUP - DEEC Pág 33

  • 14 - Comentários FinaisEste conjunto tutorial serve para dar bases para que os alunos possam explorar por si as funcionalidade do lazarus.

    O lazarus é uma ferramenta genérica e imensa de tamanho...

    Fica o desafio de experimentar esta ferramenta em linux

    ■ O lazarus é mais rápido a compilar as aplicações

    ■ O debugger funciona melhor

    ■ É possível portar projectos entre windows e linux

    ■ O sistema operativo Linux é livre e todos os drivers são livres

    ■ O sistema operativo Linux não tem virus!

    - fim do tutorial -

    Introdução ao Lazarus FEUP - DEEC Pág 34

  • Exercícios de Lazarus

    1 - “Olá Mundo” num botão que se move○ Crie uma aplicação com um botão numa form

    ○ Crie um programa que quando premir o botão altere a caption do botão para “Olá Mundo!!!”

    ○ Modifique o programa anterior de tal maneira que o botão se mova pela form: de cada vez que se carregue no botão, ele deve mover-se 20 pixeis para a direita e para baixo; antes de qualquer parte do botão 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 têm propriedades top, left, width e height

    - Utilize o operador div para divisão inteira

    - As posições e dimensões são sempre em pixeis

    - Os eixos do Lazarus têm origem no canto superior esquerdo

    2 - Edit, Botão e Memo○ Crie uma aplicação que de cada vez que carrega num botão, acrescenta numa

    nova linha da Memo box o texto escrito na Edit box

    ○ Seleccione a opção relativa ao aparecimento automático de Scroll Bars na memo

    ○ Dica:

    - Utilize Memo.Lines.Append

    3 - Cálculo da operação escolhida por Radio Group (resultado em Edit Box)○ Crie uma aplicação com 3 edit boxes, um radio group e um botão

    ○ Duas das caixas de texto (Edit Boxes) serão operandos para uma operação a escolher pelo Radio Group a terceira caixa de texto será para o resultado

    ○ O Radio Group pode escolher entre as seguintes operações: soma, subtracção e multiplicação

    ○ O Cálculo será efectuado quando se premir o botão

    ○ Dicas:

    - Utilize StrToInt, e IntToStr

    - Utilize RadioGroup.ItemIndex

    Introdução ao Lazarus FEUP - DEEC Pág 35

  • 4 - Cálculo da operação escolhida por Radio Group – descritivo em Memo box○ Coloque 2 Edits, um Botão, um RadioGroup e um Memo e complete de forma a

    obter um programa que quando carregar no botão seja calculada a operação seleccionada no RadioGroup e o descritivo (Operando1) (operação) (Operando2) = (resultado) apareça na Memo

    ○ Dicas:

    - Utilize StrToInt, StrToIntDef e IntToStr

    - Utilize RadioGroup.ItemIndex

    - Utilize MemoResults.add

    - Utilize soma de strings para concatenação

    ○ Altere o programa para que o resultado seja calculado sempre que houver alterações 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 situação 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)

    Introdução ao Lazarus FEUP - DEEC Pág 36

  • 5 - Desenho Básico (canvas)○ Coloque um Timer que chama o seguinte código todos os segundos

    with Form1 do begin Canvas.Ellipse( -2+Width div 2, -2+Height div 2, 2+Width div 2, 2+Height div 2); Canvas.Line ( Width div 2, Height div 2, 9+Width div 2, Height div 2);end;Estude este código para o compreender.

    Execute e redimensione a Form para ver o efeito;

    ○ Altere o programa para haver uma variável global “rotacao” que define o ângulo de rotação do marcador; acrescente um botão que acrescenta PI/10 radianos

    Dicas:

    - As variáveis globais são definidas fora de qualquer função (na zona de interface ou implementação) e são conhecidas daí para diante no código

    - Tenha em atenção o sentido de rotação que se pretende obter e os eixos do lazarus

    - Utilize as funções 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 rotação com o teclado: por exemplo '+' e '-' fazem rodar o marcador numa e noutra direcção

    Dicas:

    - Ponha a verdadeiro a propriedade Form.KeyPreview

    - Utilize o evento Form.OnKeyPress

    Introdução ao Lazarus FEUP - DEEC Pág 37

  • 6 - Aplicação multi-janela○ Crie uma aplicação com 3 botões numa form; carregando no primeiro abre uma

    segunda form; carregando no segundo botão fecha a segunda form; carregando no terceiro botão, abre a form no modo “modal”

    ○ Dicas:

    - Utilizar File -> New Form

    - Ver Project -> Project Options -> forms

    - Utilizar Form.Show, hide, ShowModal

    7 - Cálculo de somatório

    ○ Projecte uma aplicação que calcula soma1=∑i=ini

    fim

    i2 em que ini e fim são

    valores inteiros provenientes de caixas de texto

    ○ Modifique a aplicação anterior para calcular ou a soma 1 ou a soma 2 (utilize um

    radio group) soma2=∑i=ini

    fim

    −i3

    ○ Modifique a aplicação anterior para calcular ou a soma 1 ou a soma 2 ou ambas (ou nenhuma) - utilize um TCheckBoxGroup

    ○ Impeça que todas as check boxes possam ficar não seleccionadas

    8 - TXMLPropStorage e session properties○ Acrescente à aplicação do exercício anterior um TXMLPropStorage; indique o

    nome do ficheiro config.xml

    ○ Aceda ao editor de Form.SessionProperties e seleccione os valores a guardar em disco, à saída do programa e que serão repostos à entrada do programa

    ○ Guarde o número mínimo de propriedades para que se possa sair da aplicação e voltar a entrar sem perder os valores e as selecções anteriores

    - fim exercícios -

    Introdução ao Lazarus FEUP - DEEC Pág 38

  • Ligação do Lazarus à Base de Dados PGSQL ● É fácil 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 é necessário haver uma protecção contra ordens contraditórias simultâneas de diferentes utilizadores e para esse efeito utiliza-se

    um objecto chamado SQLTransaction

    ● Para fazer perguntas (queries) sob a base de dados é necessário o componente

    SQLQuery

    ● Um componente DBGrid é uma grelha automática com a forma de uma tabela, tabela essa que pode ser uma tabela temporária proveniente de uma pesquisa SQL; para utilizar este componente é ainda necessário uma forma de

    redireccionar dados, o que é conseguido através do componente Data Source

    Diferentes utilizações○ Há 3 formas de aceder a bases de dados sob Lazarus

    ■ Utilizando um componente DBGrid – visualizações simples

    ■ Utilizando PQConnection.ExecuteDirect – modificar dados

    ■ Utilizando SQLQuery.Fields – recolha de dados pesquisados (resposta a pergunta SQL)

    Preparação○ 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)

    Introdução ao Lazarus FEUP - DEEC Pág 39

  • Acesso utilizando o componente DBGrid○ Este é o teste mais visual, que apresenta dados da ligação à BD tanto em tempo

    de desenho como durante a execução da aplicação; a sua utilização limita-se a mostrar dados de forma simples e automática, sem flexibilidade.

    ○ Atenção: diversas configurações 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 aplicação com aspecto similar ao seguinte. A sequência de operações é indicada logo de seguida:

    Componente Separador Ícone

    PQConnection SQLdb

    SQLQuery SQLdb

    SQLTransaction SQLdb

    DataSource DataAccess

    DBGrid DataControls

    Introdução ao Lazarus FEUP - DEEC Pág 40

  • ○ 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:

    - Transacção - SQLTransaction

    - Database - PQConnection

    - SQL – preencher com código SQL, exemplo: select * from anytable

    - (não 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á possível ver o resultado da query feita na SQLQuery a aparecer na DBGrid

    Introdução ao Lazarus FEUP - DEEC Pág 41

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

    DatabaseNameHostNameUserNamePassword SQL

  • Execução directa de código SQL (ExecuteDirect)

    ○ Para alterar a BD, utilize código similar ao seguinte:...begin enter:=chr(13)+chr(10); s:='update copias set nalugueres=nalugueres+1 where'+ 'codcopia='+IntToStr(EstaCopia); // string de código 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;

    Introdução ao Lazarus FEUP - DEEC Pág 42

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

    PQConnection.ex.: update tabela set column=1

    ExecuteDirect

    DatabaseNameHostNameUserNamePassword

  • Utilizar Perguntas SQL (Fields)

    ○ Para obter os campos e as linhas de resultado de uma pergunta SQL, utilize código 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 através 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 é necessário indicar o tipo de dados em causa: SQLQuery.Fields[0].AsInteger e SQLQuery.Fields[1].AsString

    Introdução ao Lazarus FEUP - DEEC Pág 43

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

    DatabaseNameHostNameUserNamePassword SQL

  • Dicas● Consulte o ficheiro das perguntas frequentes (nos conteúdos da cadeira)

    ● Por vezes o debugguer pode dar problemas (especialmente sob windows), pelo que pode ser interessante correr o executável via Sistema Operativo

    ● Pode ser necessário dar permissões de acesso à rede na firewall tanto ao lazarus como à aplicação que se cria em tempo de compilação

    Exercício Livre

    ● Este exercício livre compara uma aplicação baseada em Base de Dados com uma outra que utiliza um ficheiro que é lido para memória

    ● Considere a empresa QuerLista, S.A. que deseja ver implementada uma lista telefónica.

    ● Uma empresa chamada SóLazarus vai desenvolver uma aplicação que utiliza de uma list-box de Lazarus para armazenar os dados que serão gravados em disco através 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 número de telefone guardando a informação na mesma linha de uma única ListBox

    ● Uma outra empresa chamada LazGres vai desenvolver uma aplicação rival fazendo uso de PostGreSQL e Lazarus

    ● Ambas as empresas vão utilizar uma listagem com apenas duas colunas: nome e número de telefone: lista_telef(nome, número_telefone)

    ● Para cada uma das aplicações rivais, crie uma aplicação gráfica que permita

    ○ Inserir uma entrada nova

    ○ Apagar uma determinada entrada

    ○ Listar toda a lista telefónica

    ○ Pesquisar através de nome e número_telefone

    ○ Deve ser possível fazer perguntas de fragmentos de dados, exemplo listar todos os nomes “Sousa” registados na base de dados

    ● Comece por projectar a interface gráfica que deve, na medida do possível ser o mais comum possível a ambas as aplicações

    ● Compare ambas as aplicações e caracterize a possibilidade de crescimento de cada uma das bases de dados incluindo para o caso de múltiplos acessos em simultâneo em diversos computadores diferentes

    Introdução ao Lazarus FEUP - DEEC Pág 44

  • Alguns Comandos SQL (micro resumo)

    Manipulação 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 minúsculas

    ● DROP TABLE table_name

    Manipulação 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_nameSET column_name_1 = new_value_1, column_name_2 = new_value_2WHERE column_name = some_value

    ● DELETE FROM table_nameWHERE column_name = some_value

    Introdução ao Lazarus FEUP - DEEC Pág 45

  • Perguntas de dados (Queries)● SELECT column_name(s)

    FROM table_nameWHERE column operator value AND column operator value OR column operator value AND (... OR ...) ...

    ■ Operator =, , >, =,

  • FAQ Lazarus

    1. Porquê Lazarus ?O Lazarus é um programa em rápida evolução, leve e que funciona em diversos sistemas operativos.

    É mais rápido sob linux que sob windows.

    Deriva do Pascal que tem mais verificações em run-time que o C e por isso frequentemente o próprio Pascal assinala erros que doutra forma teriam causado maus funcionamentos difíceis de explicar.

    E é livre, utiliza a licença LGPL, ver http://www.freepascal.org/faq.html

    O Lazarus é uma aplicação normal de FreePascal (FPC) que é uma implementação aberta de uma linguagem próxima do Object Pascal proposto pelo Borland Delphi.

    2. Lazarus & POEO Lazarus é um IDE e um RAD e permite fazer programação de diversos tipos incluindo Programação Orientada a Eventos (POE)

    3. Lazarus, debugger, instabilidades e erros esquisitosO debugger dentro do Lazarus está em fase de desenvolvimento e por vezes surgem problemas de estabilidade, principalmente sobre Windows.

    Para contornar estes problemas:

    • Utilizar sempre a última versão do Lazarus

    • Testar o programa fora do IDE, executando-o através do S.O.

    • Desligar o debugger do Lazarus

    • Sob Linux e pretendendo obter informação adicional relativamente a algum tipo de erros com falta de informação de debug (exemplo: erros do FPC):

    • Executar o Lazarus dentro de uma shell de texto

    • Executar a aplicação criada dentro de uma shell

    Introdução ao Lazarus FEUP - DEEC Pág 47

    http://en.wikipedia.org/wiki/Event-driven_programminghttp://en.wikipedia.org/wiki/Rapid_application_developmenthttp://en.wikipedia.org/wiki/Integrated_development_environmenthttp://en.wikipedia.org/wiki/Lazarus_(software)http://www.freepascal.org/faq.html

  • 4. Lazarus, PostGreSQL e erros relativos a libpq.xxx• Windows:Para o Lazarus se ligar ao servidor de PGSQL é necessário que:

    o Na máquina do lazarus esteja instalado o PGSQL (cliente ou servidor) o As DLLs do PGSQL\bin estejam no path do S.O.

    § Para alterar o path, ir ao control panel, system, advanced, environment variables; seleccionar a variável path (que existe sempre) e acrescentar no final um ponto e vírgula e de seguida o path onde se encontram as DLLs referidas

    • Linux:

    o Criar um soft link do liqpq.so para apontar para o ficheiro liqpq.so.* com a extensão mais avançada

    o Acrescentar o path do liqpq.so.* na secção libraries do ficheiro de configuração do FPC que geralmente é o /etc/fpc.cfg ; por exemplo: -Fl/usr/local/pgsql/lib

    5. Erro “Circular Unit Reference”• Mover as unidades não necessárias na área de interface para a área de implementação, isto é, tirar do “uses” da interface as unidades referentes às forms do utilizador e criar / acrescentar a um “uses” depois da implementação as nossas unidades

    6. Strings Dinâmicas (' plicas dentro de ''plicas'' ')• Em lazarus as cadeias de caracteres são delimitadas por 'plicas'

    • É perfeitamente possível pôr "aspas" dentro de ' “plicas” '

    • Um par de plicas dentro de uma string Lazarus equivale a uma string com uma plica

    • Exemplos:

    o Executando o código: s: = ' 1 2 3 '' 4 5 6 '' 7 8 9 '' '; s ficará com a string: 1 2 3 ' 4 5 6 ' 7 8 9 'o Considere a seguinte query de SQL: SELECT nome FROM paciente LIKE 'T%' O código necessário para produzir esta query é: s := 'SELECT nome FROM paciente LIKE 'T%'''; Para utilizar informação de uma edit box: s := 'SELECT nome FROM paciente LIKE '''+ EditBox.text+''''; a edit box teria por exemplo T% notar ainda que o espaço depois do LIKE é essencial

    Introdução ao Lazarus FEUP - DEEC Pág 48

  • 7. Pesquisas que não funcionam e Esquemas e / ou Relações (Tabelas) que não se consegue aceder• Utilizar tabelas com nomes só em minúsculas

    • Por o nome da tabela entre aspas, exemplo “Tabela”• Utilizar o esquema público ou “Esquema”.”Tabela”

    8. Passwords• Utilizar a propriedade Edit.PasswordChar

    9. Comando Strip• Para reduzir o tamanho de um executável, utilizar o comando “strip”, tipicamente no path do S.O. Linux; em windows, utilizar o executável, tipicamente em (adaptar conforme a directoria de instalação e as versões específicas instaladas): c:\lazarus\fpc\2.2.4\bin\i386-win32\strip.exe nome_do_exe_a_reduzirO comando strip reduz drasticamente o tamanho do executável (qualquer S.O.) que mantém todas as funcionalidades mas perde informação de debugging.

    10. Ficheiros que podem ser apagadosO lazarus utiliza diversos ficheiros temporários, alguns dos quais podem ser apagados. Para tal utilizar Menu File/Clean_Directory. Alguns ficheiros que podem ser apagados: *.compiled, *.o, *.ppu.

    - Fim do FAQ -

    Introdução ao Lazarus FEUP - DEEC Pág 49

  • Listagem de Teclas e funcionalidades● CTRL + Space – completar código

    ● CTRL + SHIFT + Space – Parâmetros da chamada ao procedimento/função

    ● CTRL + J – Code Templates

    ● CTRL + SHIFT + CIMA / CTRL + SHIFT + BAIXO – declaração / implementação

    ● CTRL + Clique - declaração / definição (de qualquer variável, etc)

    ● CTRL + H – Leva ao ponto de edição anterior

    ● CTRL + SHIFT + H – Leva ao ponto de edição seguinte

    ● F12 - troca entre form e código

    ● F11 - activa o object inspector

    ● CTRL + SHIFT + C – completa classe / implementação de classe

    ● CTRL + Y – Apagar uma linha

    ● F7 – Debugger -> Step Into

    ● F8 – Debugger -> Step Over

    ● F9 – Run

    Introdução ao Lazarus FEUP - DEEC Pág 50

    IntroduçãoTutorial 1 - Criação do projecto inicial – Form com 1 botão2 - Criação de projecto com dois botões3 - Alterando nomes e propriedades de componentes4 - Aplicação com Edit e Check Box5 - Utilização do evento OnChange da classe TEdit6 - Utilização de procedimentos e escrita rápida (Code Templates, Completion e Parameter CheckOut)7 - Navegação no código e form/código8 - Aplicação com RadioGroup e Memo9 - Temporizador10 - Menu da aplicação11 - Eventos com parâmetros 12 - Confirmar saída da aplicação - Close Query – parâmetros de saída no evento13 - Debugger 14 - Comentários Finais

    Exercícios de Lazarus 1 - “Olá Mundo” num botão que se move 2 - Edit, Botão e Memo 3 - Cálculo da operação escolhida por Radio Group (resultado em Edit Box) 4 - Cálculo da operação escolhida por Radio Group – descritivo em Memo box 5 - Desenho Básico (canvas) 6 - Aplicação multi-janela 7 - Cálculo de somatório 8 - TXMLPropStorage e session properties

    Ligação do Lazarus à Base de Dados PGSQL Diferentes utilizaçõesPreparaçãoAcesso utilizando o componente DBGridExecução directa de código SQL (ExecuteDirect)Utilizar Perguntas SQL (Fields)DicasExercício Livre

    Alguns Comandos SQL (micro resumo)Manipulação de TabelasManipulação de dadosPerguntas de dados (Queries)

    FAQ Lazarus1. Porquê Lazarus ?2. Lazarus & POE3. Lazarus, debugger, instabilidades e erros esquisitos4. Lazarus, PostGreSQL e erros relativos a libpq.xxx5. Erro “Circular Unit Reference”6. Strings Dinâmicas (' plicas dentro de ''plicas'' ')7. Pesquisas que não funcionam e Esquemas e / ou Relações (Tabelas) que não se consegue aceder8. Passwords9. Comando Strip10. Ficheiros que podem ser apagados

    Listagem de Teclas e funcionalidades

    unnamed0: Offunnamed1: Offunnamed2: Offunnamed3: Offunnamed4: Offunnamed5: Offunnamed6: Offunnamed7: Offunnamed8: Offunnamed9: Offunnamed10: Offunnamed11: Offunnamed12: Offunnamed13: Offunnamed14: Offunnamed28: Offunnamed15: Offunnamed16: Offunnamed17: Offunnamed18: Offunnamed19: Offunnamed20: Offunnamed21: Offunnamed22: Offunnamed23: Offunnamed24: Offunnamed25: Offunnamed26: Offunnamed27: Offunnamed28_2: Offunnamed29: Offunnamed30: Offunnamed31: Offunnamed32: Offunnamed33: Offunnamed34: Offunnamed35: Offunnamed36: Offunnamed37: Offunnamed38: Offunnamed39: Offunnamed40: Offunnamed41: Offunnamed42: Offunnamed43: Offunnamed44: Offunnamed45: Offunnamed46: Offunnamed47: Offunnamed48: Offunnamed49: Offunnamed50: Offunnamed51: Offunnamed52: Offunnamed53: Offunnamed54: Offunnamed55: Offunnamed56: Offunnamed57: Offunnamed58: Offunnamed59: Offunnamed60: Offunnamed61: Offunnamed62: Offunnamed63: Offunnamed64: Offunnamed65: Offunnamed66: Offunnamed67: Offunnamed68: Offunnamed69: Offunnamed70: Offunnamed71: Offunnamed72: Offunnamed73: Offunnamed74: Offunnamed75: Offunnamed76: Offunnamed77: Offunnamed78: Offunnamed79: Offunnamed80: Offunnamed81: Offunnamed82: Offunnamed83: Offunnamed84: Offunnamed85: Offunnamed86: Offunnamed87: Offunnamed88: Offunnamed89: Offunnamed90: Offunnamed91: Offunnamed92: Offunnamed93: Offunnamed94: Offunnamed95: Offunnamed96: Offunnamed97: Offunnamed98: Offunnamed99: Offunnamed100: Offunnamed101: Offunnamed102: Offunnamed103: Offunnamed104: Offunnamed105: Offunnamed106: Offunnamed107: Offunnamed108: Offunnamed109: Offunnamed110: Offunnamed111: Offunnamed112: Offunnamed113: Offunnamed114: Offunnamed115: Offunnamed116: Offunnamed117: Offunnamed118: Offunnamed119: Offunnamed120: Offunnamed121: Offunnamed122: Offunnamed123: Offunnamed124: Offunnamed125: Offunnamed126: Offunnamed127: Offunnamed128: Offunnamed129: Offunnamed130: Offunnamed131: Offunnamed132: Offunnamed133: Offunnamed134: Offunnamed135: Offunnamed136: Offunnamed137: Offunnamed138: Offunnamed139: Offunnamed140: Offunnamed141: Offunnamed142: Offunnamed143: Offunnamed144: Offunnamed145: Offunnamed146: Offunnamed147: Off