Programação Orientada A Eventos FreePascal + Lazarus
Programação Orientada A Eventos FreePascal + Lazarus
Programação Orientada A Eventos FreePascal + Lazarus
FreePascal + Lazarus
Professor Auxiliar
Depart. de Engenharia Electrotécnica e de Computadores
FEUP
● Introdução POE
● Solução FPC/Lazarus
● Resenha Histórica
● Básicos de FreePascal (Object Pascal)
● Lazarus IDE (e primeiro programa)
● Lazarus IDE avançado
(incluindo debugger e navegação em programas longos)
● FPC avançado (e algumas configurações do IDE)
● Controlos visuais (padrão) mais frequentes
● Componentes adicionais
● Funcionalidades acrescidas
▪ Independência de SO e ao hardware
● Abordagem JAVA: Máquina Virtual
▪ Byte Code a interpretar(/JIT Compile) é portável
▪ Lento (...)
● Outra abordagem (FPC/Lazarus):
▪ O ambiente de desenvolvimento e a linguagem asseguram a
correcta implementação das mesmas funcionalidades em
ambientes diferentes
▪ Portar para outro ambiente SO/HW implica recompilar
▪ Código executável convencional (rápido)
●
FPC+Lazarus portado para:
●
Processadores:
●
Intel x86, Amd64/x86 64, PowerPC, Sparc, ...
● Sistemas Operativos:
● Windows 32, Linux, FreeBSD, Mac OS X/Darwin,
• Borland:
• Turbo Pascal / B. Pascal + Delphi + Kylix
• Internet:
• Free Pascal + Lazarus
• Pascal (1971):
• Simplificação do Algol (1960)
• Genérica
• Educativa (ponteiros, “:= vs ==”,... )
• Strong Typed
• Case Insensitive
• Statically Linked
• Rápida
• Inicializações/Finalizações
• EBooks gratuitos
“Essential Pascal” e “Essential Delphi”
No URL:
http://www.marcocantu.com
• Tutorial de Pascal_FPC
http://www.taoyue.com/tutorials/pascal/
• Documentação 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
Program Elementar;
begin
// ...
• Atribuições :=
• Comparações =
• Strong Typed (casts automáticos limitados)
• Case Insensitive
• Inicializações/Finalizações
• Blocos com begin/end
• Programas e unidades terminam com end.
Program Elementar;
const
csAVOG : real = 6.02; // constante global
var
UmInteiro : integer; // var global
begin
// ...
UmInteiro:=Trunc(csAVOG);
// ...
end.
unit MyUnit;
• MyUnit utiliza e importa a
interface
interface das unidades A,B,C
uses A, B, C; • MyUnit exporta as declarações de
const AlmostZero = 0.001; AlmostZero e TotalSum
• O programa unidades podem
var TotalSum: Real;
utilizar MyUnit
// ...
Program elementar;
• Programa utiliza MyUnit
Uses
Forms, MyUnit; • Passa a conhecer as variáveis
globais da unidade MyUnit
/// ... (AlmostZero e Total)
// ...
implementation
procedure MyProcedure;
begin
// ...
end;
initialization
// Inicialização da unidade (opcional)
finalization
// Finalização da unidade (opcional)
end.
Gere um Projecto
que inclui:
Programa
Unit (Forms)
Unit
2 Way !!!
Editor gráfico
encontra código
adequado (...)
Mudar nome de
componente muda
código todo (...)
for | := to do
begin
forb (premir CTRL+J)
end;
Breakpoint
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;
• Prioridades:
• unários[@,not,-]
• *,/,div,mod,and,shl,shr
• +,-,or,xor,=,<>,<,>,<=,>=, in/is
• Tipos básicos
• string / Pchar, integer, boolean, char,
TDateTime, Set, Pointer, variant...
• high(vector)/low(vector)/sizeof(variável)
• Ord(...)+Chr(...)
unit Unit1;
• Na interface da Unit1 é
interface
definida a TForm1 e a
(●●●) variável Form1
• Neste caso a Form1 tem um
type
{ TForm1 } botão e um procedimento
Button1Click(...)
TForm1 = class(TForm) • É o programa (não a
Button1: TButton;
procedure Button1Click((●●●)); unidade) que dá instruções
(●●●) ao S.O. para efectivamente
end; abrir a janela e executá-la
var • Adicionando componentes à
Form1: TForm1; form, o código da definição
do tipo da form é alterado
Obs: A classe não descreve na automaticamente
totalmente a form !
Type
TMyDate = record
Month : Byte;
Day : Byte;
Year : Integer;
end;
type
// tipo enumerado
TColors = ( ColorRed, ColorGreen, ColorBlue ); // RGB
var
AnArray: array [10..24] of Byte;
ColorCode: array [ColorRed .. ColorGreen] of Word;
Palette: set of TColors;
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;
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;
var
ABiDimVector : TBiDimVector;
type
PointerToInt = ^Integer;
var
P: ^Integer;
X : Integer;
begin
P := @X;
// Muda variável de duas formas diferentes
X := 10;
P^ := 20;
end;
var
P: ^Integer;
begin
P^ := 20; // atribuir
end;
case MyChar of
'+' : Text := 'Soma';
'-' : Text := 'Subtracção';
'*', '/' : Text := 'Multiplicação ou divisão';
'0'..'9' : Text := 'Algarismo';
'a'..'z' : Text := 'Minúscula';
'A'..'Z' : Text := 'Maiúscula';
else
Text := 'Outro Caracter';
end;
repeat
...
I := I + 1;
J := J + 1;
until (I > 100) or (J > 100);
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 excepção = '+E.Message);
end;
end;
end;
...
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;
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;
...
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');
...
begin
V:='100';
I:=V;
Button1.Caption:='I = ' + IntToStr(I); // OK
V:='Something else';
I:=V;
Button1.Caption:='I = ' + IntToStr(I); // NOK
end;
{$IFDEF LINUX}
{$ELSE}
{$ENDIF}
• Para acrescentar
funcionalidades, qualquer
programador pode criar
componentes
• Package graph
● TButton
● TBitButton
● TSpeedButton
● TLabel
● TEdit
● TStatusBar
● TMemo
• Lines.SaveToFile('c:\memo.txt'); // windows
• Memo.Lines.LoadFromFile('~/memo.txt'); // linux
● TCheckBox
● TCheckGroup
● TRadioGroup
● TImage (.Picture)
● TPaintBox (.Canvas)
● TShape (.Canvas)
● TBarChart
● TMainMenu
▪ Fazendo double click abre-se o editor de menus
▪ É possível acrescentar diversas opções:
◦ check box
◦ Ícone
◦ Tecla atalho
◦ ...
● TXMLPropStorage
(Separdor Misc)
(depois utilizar a propriedade da form.SessionProperties)
● À saída do programa grava-se estado actual dos elementos
listados em SessionProperties que serão carregados de volta
à entrada, eliminando necessidade de gravar
explicitamente configurações
● Grava um ficheiro em formato XML
• ZeosLib - http://sourceforge.net/projects/zeoslib/
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.
SGBD
DBGrid
Query/ DBEdit
DataSource
/Dataset DBLabel
...
...
dbGrid.ReadOnly:= ... (sempre!!!)
...
SQLQuery.Post;
...
...
begin
enter:=chr(13)+chr(10);
s:='update copias set nalugueres=nalugueres+1 where'+
'codcopia='+IntToStr(EstaCopia); // string de código 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;
...
FNet: TLNetComponent; // TCP ou UDP
...
procedure TForm1.SendEditKeyPress
(Sender: TObject; var Key: char);
begin
if Key = #13 then
SendButtonClick(Sender);
end;
type
complex = record type
re : real; complex = record
im : real; re : real;
end; im : real;
end;
// ... var
Z2:=Z1; R1 : real;
//... Z1,Z2 : complex;
// Atribuição de
// record's do // Operator Overloading
// mesmo tipo
// Z2:=Z1 operator := (r : real) z : complex;
// é a atribuição de begin
// todos os campos z.re:=r;
z.im:=0.0;
end;
http://wiki.lazarus.freepascal.org/TPSQL
● RXLib:
▪ http://wiki.lazarus.freepascal.org/RXfpc
▪ http://www.alexs75.narod.ru/fpc/rxfpc/index.html
● 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
- Fim -