Вы находитесь на странице: 1из 121

Programao Orientada a Eventos

FreePascal + Lazarus

Armando Jorge Sousa (asousa@fe.up.pt)


Professor Auxiliar
Depart. de Engenharia Electrotcnica e de Computadores
FEUP
Verso 9, 30 Maro 2008

asousa@fe.up.pt

--- 1 ---

ndice

Introduo POE

Soluo FPC/Lazarus

Resenha Histrica

Bsicos de FreePascal (Object Pascal)

Lazarus IDE (e primeiro programa)

Lazarus IDE avanado


(incluindo debugger e navegao em programas longos)

FPC avanado (e algumas configuraes do IDE)

Controlos visuais (padro) mais frequentes

Componentes adicionais

asousa@fe.up.pt

--- 2 ---

Introduo

asousa@fe.up.pt

--- 3 ---

Paradigma Programao Orientada a Eventos (POE)

O SO fornece um sistema de processamento de eventos em ciclo


Eventos podem ser clicks do rato, mensagens de rede, etc.
A linguagem colabora mapeando callbacks
Adicionando eventos fila

Os programas do utilizador so chamados pelo SO


Processam o evento comunicado pelo SO e retornam
O sistema operativo com interface grfica distribui eventos
(pelos diversos programas) - Multi Janela !
As forms janelas pertencem a diferentes programas !

Estes conceitos integram bem com Multi-Processo / Multi-User

asousa@fe.up.pt

--- 4 ---

Benefcios da Programao Orientada a Eventos (POE)

SO e linguagem colaboram no sentido de:


Optimizar o desempenho / eliminar polling
Identificar Idle Time
Atender eventos na lista de forma adequada
Diminuir mudanas de contexto (foradas)
Tornar transparentes os acessos remotos ou ao hardware
Facilitar a programao grfica / interactiva

asousa@fe.up.pt

--- 5 ---

Conceitos a abandonar quando se faz POE

Abordagem procedimental pura

A noo dos microcontroladores de tempo para queimar

Loops de espera

Operaes de polling

Abandonar em definitivo a noo de que o


programa tem um ciclo principal,
comea a e a acaba

asousa@fe.up.pt

--- 6 ---

Linguagens de programao modernas

Funcionalidades acrescidas
Independncia de SO e ao hardware

Abordagem JAVA: Mquina Virtual


Byte Code a interpretar(/JIT Compile) portvel
Lento (...)

Outra abordagem (FPC/Lazarus):


O ambiente de desenvolvimento e a linguagem asseguram a
correcta implementao das mesmas funcionalidades em
ambientes diferentes
Portar para outro ambiente SO/HW implica recompilar
Cdigo executvel convencional (rpido)
asousa@fe.up.pt

--- 7 ---

Estrutura de camadas

Lazarus / Delphi / Kylix


FCL + LCL / VCL / CLX
S.O. Windows / S.O. Linux

Maiores
Funcionalidades

Hardware

VCL Delphi

CLX Delphi>=6 e Kylix

Funcionalidades
Cross-Platform custa de
diversas camadas de software

Footprint grande

No mais lentos por causa


disso...

FCL e LCL - Lazarus

asousa@fe.up.pt

--- 8 ---

FPC/Lazarus

asousa@fe.up.pt

--- 9 ---

Uma Soluo Possvel: Lazarus + FreePascal

Freeware with source

Sem royalties / GPL

Bibliotecas LGPL* (pode linkar estaticamente)

RAD (Rapid Application Development)

GUI altera cdigo fonte aps edio (2 way tool)

Cross Platform

Fcil ligao a diversos SGBD

Facilmente Extensvel: pacotes e componentes

Permite POE ou no + facilidade de instalar servidores

Linguagem OO, moderna, simples mas poderosa


Inclui excepes, variantes e operator overloading

asousa@fe.up.pt

--- 10 ---

Lazarus cross-platform

FPC+Lazarus portado para:

Processadores:

Intel x86, Amd64/x86 64, PowerPC, Sparc, ...


Sistemas Operativos:
Windows 32, Linux, FreeBSD, Mac OS X/Darwin,
Mac OS classic, DOS, OS/2, Netware (libc and
classic), MorphOS, ...

asousa@fe.up.pt

--- 11 ---

Histrico

asousa@fe.up.pt

--- 12 ---

Histria do Lzarus

Borland:
Turbo Pascal / B. Pascal + Delphi + Kylix

Internet:
Free Pascal + Lazarus

Lazarus feito em Lazarus + FPC,


autocompilvel !

asousa@fe.up.pt

--- 13 ---

Histria do Lzarus

Pascal (1971):
Simplificao do Algol (1960)
Genrica
Educativa (ponteiros, := vs ==,... )
Strong Typed
Case Insensitive
Statically Linked
Rpida
Inicializaes/Finalizaes

asousa@fe.up.pt

--- 14 ---

Desenvolvimento Integrado - IDEs

Borland Turbo Pascal


DOS - IDE - 1983

Borland Delphi
Windows RAD - 1993

Borland Kylix
Linux - RAD - 2001
Actualmente clssico da Borland

Lazarus: RAD Cross Platform

Outro RAD muito diferente: MS .NET studio

asousa@fe.up.pt

--- 15 ---

Lazarus TimeLine

Free Pascal - 1993

FCP 1.0 2000

FPC 2.0 2005

Lazarus comea em 1999


(renascido depois do projecto Megido)

Lazarus 0.9.20 - 2007

Lazarus 1.0 brevemente !

asousa@fe.up.pt

--- 16 ---

FreePascal / Object Pascal

Object Reference Model

Herana, instanciao, propriedades, mtodos,


overloading, polimorfismo
(s em run time se vai saber o mtodo)

Private / Protected / Public

Cascata de criaes/libertaes

Excepes

asousa@fe.up.pt

--- 17 ---

Programao para os S.O. actuais:

Programao Visual !!!


Orientada aos Eventos !!!

Para cada aco na GUI ou cada evento, o S.O.


chama determinada rotina do programa

asousa@fe.up.pt

--- 18 ---

Robustez Multi-Thread -- Synchronize

Evitar conflitos entre threads (Thread Safe), ver:

http://wiki.lazarus.freepascal.org/index.php/Multithreaded_Application_Tutorial

Programa deve libertar processador para o SO sempre que


espera, ie., no deve haver ciclos de espera

Para programao grfica a eventos no necessrio


recorrer a mutex'es

asousa@fe.up.pt

--- 19 ---

Introduo ao Pascal

EBooks gratuitos
Essential Pascal e Essential Delphi
No URL:
http://www.marcocantu.com

Ver na biblioteca qualquer livro do mesmo autor!


Tutorial de Pascal_FPC
http://www.taoyue.com/tutorials/pascal/

asousa@fe.up.pt

--- 20 ---

FreePascal
FPC

asousa@fe.up.pt

--- 21 ---

Documentao FreePascal + Lazarus

Documentao de referncia do FreePascal (FPC)


ftp://ftp.freepascal.org/pub/fpc/docs-pdf/ref.pdf
Documentao do Lazarus:
http://lazarus-ccr.sourceforge.net/docs/
Tutoriais do Lazarus
http://wiki.lazarus.freepascal.org/Special:Allpages
Lazarus DB FAQ
http://wiki.lazarus.freepascal.org/index.php/Lazarus_DB_Faq

quase tudo o que disser respeito a kylix ou delphi !!!

asousa@fe.up.pt

--- 22 ---

Estrutura do Cdigo

Program Elementar;
begin
// ...
end. // termina com ponto final

asousa@fe.up.pt

--- 23 ---

Dicas para pascal

Atribuies :=

Comparaes =

Strong Typed (casts automticos limitados)

Case Insensitive

Inicializaes/Finalizaes

Blocos com begin/end

Programas e unidades terminam com end.

asousa@fe.up.pt

--- 24 ---

Estrutura do Cdigo

Program Elementar;
const
csAVOG : real = 6.02; // constante global
var
UmInteiro : integer;

// var global

begin
// ...
UmInteiro:=Trunc(csAVOG);
// ...
end.
asousa@fe.up.pt

--- 25 ---

Estrutura do Cdigo

O nome do program ser o


nome do ficheiro de disco
(elementar.pas) e
possivelmente dar o nome
do executvel

Um programa utiliza units do


sistema e do utilizador, que
so linkadas para produzir o
executvel

As units permitem dividir o


cdigo em blocos

Tipicamente 1 form implica


uma unit para encapsular
todo o cdigo associado

Program elementar;
Uses Forms {sistema}, MyUnit;
begin
// ...
Application.Run;
end.

asousa@fe.up.pt

--- 26 ---

Estrutura do Cdigo

O nome da unit ser o nome


do ficheiro de disco
(MyUnit.pas)

A poro de cdigo
Interface conhecida
pelos mdulos exteriores
unit

A poro implementation
local e inacessvel do
exterior

unit MyUnit;
interface
// definies e declaraes
// a exportar
implementation
// cdigo local unit
end.

asousa@fe.up.pt

--- 27 ---

Estrutura do Cdigo
unit MyUnit;
interface
uses A, B, C;

MyUnit utiliza e importa a


interface das unidades A,B,C

MyUnit exporta as declaraes de


AlmostZero e TotalSum

O programa unidades podem


utilizar MyUnit

Programa utiliza MyUnit

Passa a conhecer as variveis


globais da unidade MyUnit
(AlmostZero e Total)

const AlmostZero = 0.001;


var TotalSum: Real;
// ...

Program elementar;
Uses
Forms, MyUnit;
/// ...

asousa@fe.up.pt

--- 28 ---

Estrutura do Cdigo

// ...
implementation
uses
// outras units a importar/utilizar
D, E;
var // varivel local (no ser exportada)
UmInteiro : Integer;
procedure MyProcedure;
begin
// ...
end;
initialization
// Inicializao da unidade (opcional)
finalization
// Finalizao da unidade (opcional)
end.
asousa@fe.up.pt

--- 29 ---

IDE Lazarus

asousa@fe.up.pt

--- 30 ---

File,
New Application
Gere um Projecto
que inclui:
Programa
Unit (Forms)
Unit
2 Way !!!

Editor grfico
encontra cdigo
adequado (...)
Mudar nome de
componente muda
cdigo todo (...)

asousa@fe.up.pt

--- 31 ---

asousa@fe.up.pt

--- 32 ---

asousa@fe.up.pt

--- 33 ---

File, Save ALL: unit_ola, project_ola


Mudar Name da Form para Form_Ola
Caption vem mudada (ver no editor)
Colocar TButton na Form
Mudar Name para BProximo
Botes devem comear com letra B
Mudar Caption para Prximo

asousa@fe.up.pt

--- 34 ---

Fazendo Double Click no boto da form que estamos a


desenhar, o IDE leva-nos at ao cdigo que ser executado
quando (em run-time) o utilizador premir o boto uma vez
(evento OnClick)

procedure Tform_Ola.BProximoClick (Sender: TObject);


begin
|
end;

asousa@fe.up.pt

--- 35 ---

Cdigo do Projecto Elementar de Teste

procedure Tform_Ola.BProximoClick(Sender: TObject);


begin
BProximo.Caption:='Ol Mundo';
end;

Aps introduzir o cdigo mostrado acima, premir F9 ou


seleccionar Menu Run, Opo Run para compilar o cdigo
e execut-lo de seguida
Depois de compilar sem problemas, o programa gerado
executado e aparece a janela que desenhamos
Depois de carregar no boto, o texto inscrito no boto
caption alterado e passa mostrar Ol Mundo
Saia da aplicao carregando no x do canto da form

asousa@fe.up.pt

--- 36 ---

Cdigo do Projecto de teste 2

asousa@fe.up.pt

--- 37 ---

SnapShots do projecto de teste 2 (windows e linux)

asousa@fe.up.pt

--- 38 ---

Notas para iniciados

Para facilidade de localizao dos ficheiros importantes,


criar uma directoria para cada projecto novo

Criar o projecto e logo depois gravar todos os ficheiros


(Save All); gravar todos os ficheiros da aplicao na mesma
directoria

No alterar cdigo que no foi feito por ns !!!

Ligar logo as opes de verificao: Project,


Compiler_Options, Code:

asousa@fe.up.pt

--- 39 ---

IDE Avanado

asousa@fe.up.pt

--- 40 ---

Ajudas codificao: Code Templates

for (premir CTRL+J)

for | :=

forb (premir CTRL+J)

to

do

begin
end;

asousa@fe.up.pt

--- 41 ---

Ajudas codificao: Code Templates

If, CTRL+J => menu de templates


ifb,CTRL+J=>if| then/begin/end

asousa@fe.up.pt

--- 42 ---

Ajuda codificao: Completion

CTRL+SPACE: Context sensitive Completion

asousa@fe.up.pt

--- 43 ---

Ajuda codificao: Navegao em cdigo extenso

Bookmarks (mximo de 10 pontos de interesse no cdigo):


Para definir um ponto de interesse no cdigo:
CTRL+Shift+.. (teclas de 1 a 0)
Para levar o cursor at um ponto de interesse no
cdigo: CTRL+.. (teclas de 1 a 0)

Saltar entre Declarao e Cdigo de procedimento ou


funo: CTRL+ e CTRL+

Saltar para a declarao de varivel: CTRL+MouseClick

Saltar (de volta) para ponto anterior de edio: CTRL H

asousa@fe.up.pt

--- 44 ---

Ajuda codificao: Navegao entre janelas

F12: troca entre form e cdigo

F11: Object Inspector

CTRL+F12: View Units

Shift+F12: View Forms

asousa@fe.up.pt

--- 45 ---

Debugging

asousa@fe.up.pt

--- 46 ---

Debugging

Breakpoint

asousa@fe.up.pt

--- 47 ---

Debugging

Premir Ctrl+Alt+L para listar todas as variveis locais

Para o cursor do rato em cima de uma varivel para ver o


seu valor (funcionalidade em melhoramento)

Premir F7/F8 para single stepping

Premir F4 para ir at ao cursor

asousa@fe.up.pt

--- 48 ---

Help de contexto

Premir F1 leva a activar o browser para levar a uma pgina


de context sensitive help, ie, leva a um help associado ao
texto onde o cursor est

procedure Tform_Ola.BProximoClick(Sender: TObject);


begin
BProximo.Caption|:='Ol Mundo';
end;

Com o cursor no texto caption do boto, o help de


TControl.Caption mostrado no browser

asousa@fe.up.pt

--- 49 ---

Dvidas Frequentes

Procedure no devolve dados

Function devolve dados

If (x=y) then begin


x:=x+1;
end else begin // cuidado no pode ter ; !!!
x:=x+2;y:=x+2;
end;

Format( ' Total %d ' , [ N ] );

asousa@fe.up.pt

--- 50 ---

Funes

Function devolve um dado de determinado tipo

function InverteString ( S : string ) : string;


var
TempStr : string;
i
: integer;
Siz
: integer;
begin
TempStr:='';
Siz:=length(S);
if Siz>0 then
for I:=Siz downto 1 do
TempStr:=TempStr+S[I];
InverteString:=TempStr;
end;
asousa@fe.up.pt

--- 51 ---

Funes e tipos de parmetros

// Func1 passa param de entrada na funo por cpia


// Mudar S dentro da funo no altera S fora da funo
function func1 ( S : string ) : string;
// ...

// Func2 passa param por endereo (param. de entrada e sada)


function func2 ( var S : string ) : string;
// ...
// Func3 passa param const -> compilador no deixa alterar
// E S_out parmetro de sada
procedure func3 ( const S_in : string ; out S_out : string );
// ...

asousa@fe.up.pt

--- 52 ---

Funes multi parmetros

procedure func4 (const S1,S2 : string; out S3 : string) ;


function func5 ( i,j,k : integer ; s : string ) : string ;

asousa@fe.up.pt

--- 53 ---

ShowMessage

ShowMessage('Ol, isto um teste');

asousa@fe.up.pt

--- 54 ---

Pascal Avanado

asousa@fe.up.pt

--- 55 ---

Referncia

Prioridades:
unrios[@,not,-]
*,/,div,mod,and,shl,shr
+,-,or,xor,=,<>,<,>,<=,>=, in/is

Tipos bsicos
string / Pchar, integer, boolean, char,
TDateTime, Set, Pointer, variant...

high(vector)/low(vector)/sizeof(varivel)

Ord(...)+Chr(...)

asousa@fe.up.pt

--- 56 ---

Projecto, Unidade e Form

program Project1;
()
uses
() Unit1;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Project, New Project,


Application cria uma nova
aplicao vazia
criado um projecto vazio
e uma unidade vazia
associada a uma form vazia
Programa Project1
Utiliza a Unit1
Para ver este ficheiro fazer
Menu Project, View Source
Este cdigo gerado e
gerido automaticamente,

no necessrio
alterar nada !

asousa@fe.up.pt

--- 57 ---

Unidade e Form
unit Unit1;
interface
()
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(());
()
end;
var
Form1: TForm1;

Obs: A classe no descreve na


totalmente a form !
asousa@fe.up.pt

Na interface da Unit1
definida a TForm1 e a
varivel Form1
Neste caso a Form1 tem um
boto e um procedimento
Button1Click(...)
o programa (no a
unidade) que d instrues
ao S.O. para efectivamente
abrir a janela e execut-la
Adicionando componentes
form, o cdigo da definio
do tipo da form alterado

automaticamente

--- 58 ---

Unidade e Form

object Form1: TForm1


Left = 412
Height = 320
Top = 121
Width = 400
()
object Button1: TButton
Left = 86
Height = 25
Top = 70
Width = 75
OnClick = Button1Click
()
end
end

A descrio completa da
form estar no ficheiro .lfm
No alterar nada !

asousa@fe.up.pt

--- 59 ---

Tipos

Type
// Comear os tipos por 'T'
TUpCaseLetters = 'A'..'Z';
TDaysOfMonth

// subrange

= array [1..31] of Integer;

TMyDate = record
Month : Byte;
Day
: Byte;
Year : Integer;
end;

asousa@fe.up.pt

--- 60 ---

Tipos

type
// tipo enumerado
TColors = ( ColorRed, ColorGreen, ColorBlue ); // RGB
// set, isto , conjunto !!!
TSetOfLetters = set of Char;
var
AnArray: array [10..24] of Byte;
ColorCode: array [ColorRed .. ColorGreen] of Word;
Palette: set of TColors;

asousa@fe.up.pt

--- 61 ---

Operaes com Conjuntos (sets)

type
TSetOfLetters = set of Char;
var
Letters1, Letters2 : TConjLetras;
begin
Letters1 := ['A', 'B', 'C'];
Letters2 := [];
if ('A' in Letters1)
then ShowMessage('A');
if (['A','B'] <= Letters1) then ShowMessage('A,B');
if (['E'] <= Letters1)
then ShowMessage('Falso');
if (Letters2 = [])
then ShowMessage('Vazio');
end;

asousa@fe.up.pt

--- 62 ---

Range Check

type
TDozen = array [1..12] of Integer;
var
UmMes : TDozen;
procedure WorkSomethingOnADozen;
begin
UmMes[1] := 10;
UmMes[2] := 12;
UmMes[0] := 18; // erro compile-time
UmMes[25] := 18; // erro compile-time
end;

asousa@fe.up.pt

--- 63 ---

type
TBiDimVector = array [1..12, 1..12] of Integer;
var
ABiDimVector : TBiDimVector;

asousa@fe.up.pt

--- 64 ---

Apontadores

type
PointerToInt = ^Integer;
var
P: ^Integer;
X : Integer;
begin
P := @X;
// Muda varivel de duas formas diferentes
X := 10;
P^ := 20;
end;

asousa@fe.up.pt

--- 65 ---

Apontadores

var
P: ^Integer;
begin
New (P);

// criar / iniciar

P^ := 20;

// atribuir

ShowMessage (IntToStr (P^));


Dispose (P); // terminar
end;

asousa@fe.up.pt

--- 66 ---

Apontadores com deteco de limites (range check)

procedure TForm_Ola.Button1Click(Sender: Tobject);


var
x
: integer;
DayTemp : array [ 1 .. 31 ] of Integer;
begin
x:=123456;
DayTemp [x] := 18; // GPF Segmentation Fault
end;

asousa@fe.up.pt

--- 67 ---

IFs

if N>0 then begin


ShowMessage('Positivo');
if N>1 then begin
ShowMessage(' >1');
end;
end else begin // relativo ao N>0 (ie N<=0)
ShowMessage('Negativo');
if N<-1 then begin
ShowMessage(' <-1');
end;
end;

asousa@fe.up.pt

--- 68 ---

Case

case MyChar of
'+'
: Text := 'Soma';
'-'
: Text := 'Subtraco';
'*', '/' : Text := 'Multiplicao ou diviso';
'0'..'9' : Text := 'Algarismo';
'a'..'z' : Text := 'Minscula';
'A'..'Z' : Text := 'Maiscula';
else
Text := 'Outro Caracter';
end;

asousa@fe.up.pt

--- 69 ---

Ciclo for

...
Soma := 0;
for i := 1 to 10 do
Soma := Soma + i;
...

A varivel do ciclo
pode ser qualquer
ordinal, incluindo
tipos enumerados
Ciclos for so muito
mais restritivos em
Pascal que em C
Tal como em qualquer
outro ciclo for, o corpo
do ciclo pode ser no
executado nunca

...
Soma := 0;
for i := 10 downto 1 do
begin
Soma := Soma + i;
end;
...

asousa@fe.up.pt

--- 70 ---

Ciclos While e Repeat Until

While ( (I <= 100) and (J <= 100) ) do


begin
...
I := I + 1;
J := J + 1;
end;

repeat
...
I := I + 1;
J := J + 1;
until (I > 100) or (J > 100);

asousa@fe.up.pt

--- 71 ---

Procedimentos e funes

function DoubleVersion1 (Value: Integer) : Integer;


begin
DoubleVersion1 := Value * 2;
end;
function DoubleVersion2 (Value: Integer) : Integer;
begin
Result := Value * 2;
end;
procedure DoubleProc (var Value : Integer);
begin
Value := Value * 2;
end;

asousa@fe.up.pt

--- 72 ---

Vectores Dinmicos

Var DynArray : Array of Integer; // Vector Dinmico


procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength (DynArray, 100); // alocar
end;
procedure TForm1.BFillClick(Sender: TObject);
var I: Integer;
begin
for I := Low (DynArray) to High (DynArray) do
Array1 [I] := I;
end;
procedure TForm1.BGrowClick(Sender: TObject);
begin
SetLength (DynArray, 200); // mantm + cresce lim sup
end;

asousa@fe.up.pt

--- 73 ---

Formatao de Strings

string:=format ('%-8d,%f', [var_i,var_f]);

TYPE SPECIFIER
d (decimal)
x (hexadecimal)
p (pointer)
s (string)
e (exponential)

DESCRIPTION
The corresponding integer value is converted to a string of
decimal digits.
The corresponding integer value is converted to a string of
hexadecimal digits.
The corresponding pointer value is converted to a string expressed
with hexadecimal digits.
The corresponding string, character, or PChar value is copied to
the output string.
The corresponding floating-point value is converted to a string
based on exponential notation.

asousa@fe.up.pt

--- 74 ---

Formatao de Strings

f (floating point)
g (general)
n (number)

m (money)

The corresponding floating-point value is converted to a string


based on floating point notation.
The corresponding floating-point value is converted to the
shortest possible decimal string using either floating-point or
exponential notation.
The corresponding floating-point value is converted to a floatingpoint string but also uses thousands separators.
The corresponding floating-point value is converted to a string
representing a currency amount. The conversion is based on
regional settings-see the Delphi Help file under Currency and
date/time formatting variables.

asousa@fe.up.pt

--- 75 ---

Ciclos Prolongados

for i := 1 to VeryLargeNumber do begin


Application.ProcessMessages;
Total := Total + i;
end;
for i := 1 to VeryLargeNumber do begin
Application.HandleMessage; // Permite IdleTime
Total := Total + i;
end;

asousa@fe.up.pt

--- 76 ---

Excepes (i)

var
n2, n1, n0 : integer;
begin
try
n0 := 0;
n1 := 1;
n2 := n1 div n0;
ShowMessage('1 / 0 = '+IntToStr(n2));
except
on E : Exception do
begin
ShowMessage('Nome da classe = '+E.ClassName);
ShowMessage('Mensagem da excepo = '+E.Message);
end;
end;
end;

asousa@fe.up.pt

--- 77 ---

Excepes (ii)

...
except
// IO error
on E : EInOutError do
ShowMessage('IO error : '+E.Message);
// Dibision by zero
on E : EDivByZero do
ShowMessage('Div by zero error : '+E.Message);
// Catch other errors
else
ShowMessage('Unknown error');
end;

asousa@fe.up.pt

--- 78 ---

Excepes (iii)

var
number, zero : Integer;
begin
// Try to divide an integer by zero - to raise an exception
number := -1;
Try
zero
:= 0;
number := 1 div zero;
ShowMessage('number / zero = '+IntToStr(number));
finally
if number = -1 then
begin
ShowMessage('Not assigned - using default');
number := 0;
end;
end;
end;

asousa@fe.up.pt

--- 79 ---

Excepes (iv)

...
int2:=2;int1:=1;int0:=0;
vf2:=2.0;vf1:=1.0;vf0:=0.0;
try
case RadioGroup.ItemIndex of
0 : int2 := int1 div int0;
1 : vf2 := vf1 / vf0;
2 : assert(False,'Just Testing');
end;
Memo.Append('Sem erro:='+FloatToStr(vf2)+';'+ IntToStr(int2));
except
on E : EDivByZero do
Memo.Append('Div int por 0:'+e.ClassName+': '+e.Message);
on E : EZeroDivide do
Memo.Append('Div Virg Flt 0:'+e.ClassName+':'+e.Message);
on E : Exception
do Memo.Append('outro erro -- '+
e.ClassName+': '+e.Message);
end;
Memo.Append('Continua, Normal');
...

asousa@fe.up.pt

--- 80 ---

Variants
procedure TFormMain.Button1Click(Sender: TObject);
var
V : Variant;
I : Integer;
begin
V:='100';
I:=V;
Button1.Caption:='I = ' + IntToStr(I); // OK
V:='Something else';
I:=V;
Button1.Caption:='I = ' + IntToStr(I); // NOK
end;

Something else no um inteiro vlido


Na 2 atribuio gerada uma excepo

asousa@fe.up.pt

--- 81 ---

Cdigo Condicional (cross platform, etc)

{$IFDEF LINUX}
// Cdigo para Linux
{$ELSE}
// Cdigo para outras plataformas
{$ENDIF}

asousa@fe.up.pt

--- 82 ---

Componentes & Pacotes

Para acrescentar
funcionalidades, qualquer
programador pode criar
componentes

Components, Open Package

Package graph

asousa@fe.up.pt

--- 83 ---

Mais Controlos
Visuais Padro

asousa@fe.up.pt

--- 84 ---

Botes

TButton

TBitButton

TSpeedButton

asousa@fe.up.pt

--- 85 ---

Texto numa linha

TLabel

TEdit

TStatusBar

asousa@fe.up.pt

--- 86 ---

Caixa de texto (memo box)

TMemo

Baseado na classe TStrings


que permite muitas operaes
interessantes !

asousa@fe.up.pt

--- 87 ---

TMemo

... with FormMain.Memo do begin ...

Append('Mais Uma Linha');

Lines.SaveToFile('c:\memo.txt'); // windows

Lines.Delete(0); // apaga primeira linha

Lines[0]:='... substitui a 1a linha ...';

UmaStringGrande:=text; // toda a memo

Memo.Lines.LoadFromFile('~/memo.txt'); // linux

... end;

...

Obs1: Ver Scroll Bars, Wrap, ReadOnly, ...


Obs2: Ver varivel global DirectorySeparator
asousa@fe.up.pt

--- 88 ---

CheckBox / Group

TCheckBox

TCheckGroup

asousa@fe.up.pt

--- 89 ---

RadioGroup

TRadioGroup

asousa@fe.up.pt

--- 90 ---

ListBox e ComboBox

asousa@fe.up.pt

--- 91 ---

Image, PaintBox, Shape

TImage (.Picture)

TPaintBox (.Canvas)

TShape (.Canvas)

asousa@fe.up.pt

--- 92 ---

Caixas de dilogo Standard (Gravar, Abrir, ...)

Componentes que desaparecem


durante a execuo do cdigo

Chamam as caixas standard do S.O.

OpenDialog1, SaveDialog, SelectDirectoryDialog

Chamar mtodo execute

asousa@fe.up.pt

--- 93 ---

Temporizador

TTimer (separador system)

Tempo em milisegundos

Dificuldades em cumprir
restries de tempos curtos

asousa@fe.up.pt

--- 94 ---

Grficos

TBarChart

asousa@fe.up.pt

--- 95 ---

Menus

TMainMenu
Fazendo double click abre-se o editor de menus
possvel acrescentar diversas opes:
check box
cone
Tecla atalho
...

asousa@fe.up.pt

--- 96 ---

Componente de persistncia

TXMLPropStorage
(Separdor Misc)
(depois utilizar a propriedade da form.SessionProperties)

sada do programa grava-se estado actual dos elementos


listados em SessionProperties que sero carregados de volta
entrada, eliminando necessidade de gravar
explicitamente configuraes

Grava um ficheiro em formato XML

Existe um outro componente TIniPropStorage


que faz o mesmo com ficheiros INI
asousa@fe.up.pt

--- 97 ---

Aplices Multi Form

Para acrescentar ao projecto File, New Form (acrescenta


uma unidade para esta form)

Para mostrar uma form:


A form nova criada automaticamente
necessrio utilizar a unit correspondente:
uses UnitWhereFormSecondaryIs
FormSecondary.Show;

Para fechar fechar a form


FormMain.Close;

Para obrigar a ter apenas uma janela da aplicao activa:


FormSecondary.ShowModal;
asousa@fe.up.pt

--- 98 ---

Componentes
Externos teis

asousa@fe.up.pt

--- 99 ---

Componentes a utilizar

ZeosLib -

http://sourceforge.net/projects/zeoslib/

A ligao ao PostGreSQL nativa a partir da


verso Lazarus 0.9.12
Sdpo_Serial 5dpo component pack
lNnet - LightWeight Networking Library
http://wiki.lazarus.freepascal.org/lNet

Todos estes pacotes so (win32 + linux)

asousa@fe.up.pt

--- 100 ---

Sdpo Serial

Para utilizar SDPO_Serial sob Linux


uses cthreads em 1 em todas as units e no *.LPR

{$DEFINE UseCThreads} no *.LPR


(abrir o *.LPR atravs do Project Inspector)
[automtico no lazarus 0.9.20]
Recompilar o Lazarus e o LCL com a opo
-dUseCThreads
(Tools, Configure Build Lazarus e depois Build Lazarus)

Obs1: executar o programa na command line para obter


mensagens de erro adicionais

Obs2: a sincronizao (-dUSE_SYNCHRONIZE)


desnecessria a partir da verso 0.9.12 do Lazarus

asousa@fe.up.pt

--- 101 ---

Lazarus FAQs
After I installed a component, Lazarus crashes with the following message:
Threading has been used before cthreads was initialized. Make cthreads one of the first units in
your uses clause. Runtime error 211
How can I fix this?
Your freshly installed component is using threads. Fpc on *nix doesn't automatically include threading
support, but it must be intialized. This initialization is done in the cthreads unit. Every application
using the component needs to add this unit to the uses clause of the main program. Lazarus itself is
no exception. This can be done in two ways:
1) Change the source of ide/lazarus.pp: add the cthreads as first unit to the uses clause, so that is looks
like this:
uses
cthreads,
{$IFDEF IDE_MEM_CHECK}
...
and rebuild lazarus.

[su, cd laz_dir, make clean bigide ou make clean all]

asousa@fe.up.pt

--- 102 ---

Lazarus FAQs

2) In order to avoid modifying lazarus.pp file, a fpc compiler option could be used. Once package that
uses threads has been compiled, open menu Tools->Configure "build Lazarus". Configure "build
Lazarus" dialog will be shown, in field "Options:" type -Facthreads and then press "OK" button. The
next step is to install the package. Lazarus will be built with option -Facthreads which means that it
will treat main program as if unit cthreads where first in uses clause.
Hint:
Maybe your old (non-crashing) lazarus executable is stored as lazarus.old in the same directory as
the crashing lazarus executable.

asousa@fe.up.pt

--- 103 ---

Mais detalhes funcionamento Porta Srie

Comando exemplo envio:


SdpoSerial.WriteData(EditSend.text);

Receber:
Evento OnRxData tem cadncia imprevisvel algumas vezes pode-se receber byte a byte, outras no,
obrigatrio o programa lidar com este facto !!!
Exemplo de recepo:
SdpoSerial.SynSer.RecvPacket(0);

Cuidado com as permisses e os portos (tty0, ttyUSB0):


chmod a+rw /dev/tty*
chmod a+rwx /var/lock

asousa@fe.up.pt

--- 104 ---

RADs & acesso Bases de Dados

Cursor aponta para um tuplo (linha de tabela de BD)

Dataset coleco de tuplos (tabela de BD)

BD: Local ou Remota (Cliente / Servidor)


CLI - Call Level Interface
ODBC JDBC BDE

Propriedades ACID:
Atomicity-Consistency-Isolation-Durability

Middleware: CORBA, DCOM, DataSnap (=MIDAS)

D6 & Kylix dBExpress SQL Thin DB access Layer

asousa@fe.up.pt

--- 105 ---

Data Aware Objects (i)

SGBD

Query/
/Dataset

DataSource

asousa@fe.up.pt

DBGrid
DBEdit
DBLabel
...

--- 106 ---

Sequncia para ligar BD PGSQL em Lazarus 0.9.12


Colocar na form os componentes das respectivas tabs:
PQConnection - SQLdb
SQLQuery
- SQLdb
SQLTransaction - SQLdb
DataSource
- DataAccess
DBGrid
- DataControls
PQConnection preencher:
Transaction + Database + HostName + UserName + password
Verificar que SQLTransaction aponta para PQConnection
Na SQLQuery preencher:
Transaco + Database
SQL (exemplo: 'select * from anytable')
Na DataSource preencher DataSet como SQLQuery
Na DBGrid preencher DataSource

asousa@fe.up.pt

--- 107 ---

Data Aware Objects (ii) - DBGrid

asousa@fe.up.pt

--- 108 ---

Data Aware Objects (iii) - DBEdit

...
dbGrid.ReadOnly:= ... (sempre!!!)
...
SQLQuery.Post;
...
asousa@fe.up.pt

--- 109 ---

Alteraes directas Base de Dados

...
begin
enter:=chr(13)+chr(10);
s:='update copias set nalugueres=nalugueres+1 where'+
'codcopia='+IntToStr(EstaCopia); // string de cdigo SQL
try
PQConChange.Connected:=True;
PQConChange.ExecuteDirect('Begin Work;');
PQConChange.ExecuteDirect(s);
PQConChange.ExecuteDirect('Commit Work;');
PQConChange.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;

asousa@fe.up.pt

--- 110 ---

Observaes acerca de Lazarus e PGSQL

No utilizar dados tipo text mas sim varchar

No utilizar numeric mas antes inteiros ou float8

As tabelas devem ter uma chave primria

Utilizar nomes sempre e s com minsculas e sem caracteres


portugueses

obrigatrio proteger todas as operaes directas sobre a base de


dados com transaces

obrigatrio o ficheiro libpq.dll e as outras DLLs binrias do


PostGreSQL estarem no path do sistema operativo

asousa@fe.up.pt

--- 111 ---

Sockets com componente visual

Descarregar a partir de:


http://ovh.dl.sourceforge.net/sourceforge/lazarus-ccr/lnet-0.4.0.zip

Instalar o *.lpk run_time e depois *.lpk relativo ao IDE

asousa@fe.up.pt

--- 112 ---

lnet/visual/examples/tcpudp

...

FNet: TLNetComponent;

...

// TCP ou UDP

procedure TForm1.LTCPComponentReceive(aSocket: TLSocket);


var
s: string;
begin
if aSocket.GetMessage(s) > 0 then begin
MemoText.Append(s);
MemoText.SelStart:=Length(MemoText.Lines.Text);
FNet.IterReset;
if FIsServer then repeat
FNet.SendMessage(s, FNet.Iterator);
until not FNet.IterNext;
end;
end;

asousa@fe.up.pt

--- 113 ---

lnet/visual/examples/tcpudp

procedure TForm1.SendButtonClick(Sender: TObject);


var
AllOK: Boolean;
n: Integer;
begin
if Length(EditSend.Text) > 0 then begin
AllOk:=True;
if Assigned(FNet.Iterator) then repeat
n:=FNet.SendMessage(EditSend.Text, FNet.Iterator);
if n < Length(EditSend.Text) then begin
MemoText.Append('Error on send [' + IntToStr(n) + ']');
AllOK:=False;
end;
until not FNet.IterNext;
if FIsServer and AllOK then
MemoText.Append(EditSend.Text);
EditSend.Text:='';
end;
end;

asousa@fe.up.pt

--- 114 ---

lnet/visual/examples/tcpudp

procedure TForm1.ListenButtonClick(Sender: TObject);


begin
if FNet.Listen(StrToInt(EditPort.Text)) then begin
MemoText.Append('Accepting connections');
FIsServer:=True;
end;
end;

procedure TForm1.ConnectButtonClick(Sender: TObject);


begin
if FNet.Connect(EditIP.Text, StrToInt(EditPort.Text)) then
FIsServer:=False;
end;

asousa@fe.up.pt

--- 115 ---

lnet/visual/examples/tcpudp

procedure TForm1.DiconnectButtonClick(Sender: TObject);


begin
FNet.Disconnect;
MemoText.Append('Disconnected');
end;

procedure TForm1.SendEditKeyPress
(Sender: TObject; var Key: char);
begin
if Key = #13 then
SendButtonClick(Sender);
end;

asousa@fe.up.pt

--- 116 ---

TAChart

procedure TForm1.Button1Click(Sender: TObject);


var
Serie:TTASerie;
i:Integer;
begin
Serie:=TTASerie.Create(TAChart1);
TAChart1.AddSerie(Serie);
Serie.ShowLines:=True;
Serie.ShowPoints:=False;
Serie.Title:='Sinus';
for i:=-500 to 499 do
Serie.AddXY(i/10,Sin(i/10)*10,clBlack);
end;

asousa@fe.up.pt

--- 117 ---

Operator Overloading

type
complex = record
re : real;
im : real;
end;
// ...
Z2:=Z1;
//...
//
//
//
//
//
//

Atribuio de
record's do
mesmo tipo
Z2:=Z1
a atribuio de
todos os campos

type
complex = record
re : real;
im : real;
end;
var
R1
: real;
Z1,Z2 : complex;
// Operator Overloading
operator := (r : real) z : complex;
begin
z.re:=r;
z.im:=0.0;
end;

asousa@fe.up.pt

--- 118 ---

Ligaes interessantes

Mailing List do Lazaros, arquivo e pesquisa:


http://www.lazarus.freepascal.org/mailarchives
http://www.lazarus.freepascal.org/modules.php?op=modload&name=Search

Todos os Wiki's:
http://wiki.lazarus.freepascal.org/Special:Allpages

Lazarus & Pascal:


http://wiki.lazarus.freepascal.org/Lazarus_Documentation

Bases de dados:http://wiki.lazarus.freepascal.org/index.php/Lazarus_Database_Tutorial
http://wiki.lazarus.freepascal.org/TPSQL

RXLib:
http://wiki.lazarus.freepascal.org/RXfpc
http://www.alexs75.narod.ru/fpc/rxfpc/index.html

asousa@fe.up.pt

--- 119 ---

Ligaes interessantes

http://wiki.lazarus.freepascal.org/Lazarus_Faq

http://wiki.lazarus.freepascal.org/Installing_Lazarus

http://wiki.lazarus.freepascal.org/LCL_Defines

http://wiki.lazarus.freepascal.org/Getting_Lazarus

http://wiki.lazarus.freepascal.org/Icon_Editor

http://wiki.lazarus.freepascal.org/GLScene

http://wiki.lazarus.freepascal.org/Multiplatform_Programming_Guide

http://wiki.lazarus.freepascal.org/Multithreaded_Application_Tutorial

http://wiki.lazarus.freepascal.org/lNet

http://wiki.lazarus.freepascal.org/Pascal_Script

asousa@fe.up.pt

--- 120 ---

Programao Orientada a Eventos


+ FPC/Lazarus
- Fim -

asousa@fe.up.pt

--- 121 ---

Вам также может понравиться