Lazarus g

March 26, 2018 | Author: Edimar Lino Nogueira | Category: Operating System, Computing, Technology, Digital Technology, Digital & Social Media


Comments



Description

Programação Orientada a EventosFreePascal + Lazarus Armando Jorge Sousa ([email protected]) Professor Auxiliar Depart. de Engenharia Electrotécnica e de Computadores FEUP Versão 9, 30 Março 2008 [email protected] --- 1 --- Índice ● 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 [email protected] --- 2 --- Introdução [email protected] --- 3 --- pt --.4 --- .Paradigma «Programação Orientada a Eventos» (POE) ● O SO fornece um sistema de processamento de eventos em ciclo ▪ Eventos podem ser clicks do rato. etc. ▪ A linguagem colabora mapeando callbacks ▪ Adicionando eventos à fila ● Os programas do utilizador são chamados pelo SO ▪ Processam o evento comunicado pelo SO e retornam ▪ O sistema operativo com interface gráfica 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. mensagens de rede.up. up.5 --- .pt --.Benefícios da Programação 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 mudanças de contexto (forçadas) ▪ Tornar transparentes os acessos remotos ou ao hardware ▪ Facilitar a programação gráfica / interactiva asousa@fe. up.pt --. começa aí e aí acaba [email protected] a abandonar quando se faz POE ● Abordagem procedimental pura ● A noção dos microcontroladores de “tempo para «queimar»” ● Loops de espera ● Operações de polling Abandonar em definitivo a noção de que o programa tem um ciclo principal.6 --- . up..7 --- ..Linguagens de programação modernas ● 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) [email protected] --. pt --.Lazarus [email protected] de camadas Lazarus / Delphi / Kylix FCL + LCL / VCL / CLX S..8 --- . Windows / S. FCL e LCL . Linux Maiores Funcionalidades Hardware ● VCL – Delphi ● CLX – Delphi>=6 e Kylix ● ● Funcionalidades Cross-Platform à custa de diversas camadas de software ● “Footprint” grande ● Não mais lentos por causa disso.O.O.up. pt --.FPC/Lazarus [email protected] --- .up. pt --. simples mas poderosa • Inclui excepções.up.Uma Solução Possível: Lazarus + FreePascal • “Freeware” with source • Sem royalties / GPL ! • Bibliotecas LGPL* (pode linkar estaticamente) • RAD (Rapid Application Development) • GUI altera código fonte após edição (2 way tool) • Cross Platform • Fácil ligação a diversos SGBD • Facilmente Extensível: pacotes e componentes • Permite POE ou não + facilidade de instalar servidores • Linguagem OO. variantes e operator overloading asousa@fe. moderna.10 --- . . Netware (libc and classic). FreeBSD. Sistemas Operativos: ● Windows 32.pt --. .Lazarus cross-platform ● FPC+Lazarus portado para: ● ● Processadores: ● Intel x86. Mac OS classic.up.. asousa@fe. OS/2.. Sparc. PowerPC. Amd64/x86 64. DOS.11 --- . Mac OS X/Darwin.. MorphOS. Linux. . Histórico [email protected] --- 12 --- História do Lázarus • Borland: • Turbo Pascal / B. Pascal + Delphi + Kylix • Internet: • Free Pascal + Lazarus • Lazarus feito em Lazarus + FPC, “autocompilável” ! [email protected] --- 13 --- História do Lázarus • Pascal (1971): • Simplificação do Algol (1960) • Genérica • Educativa (ponteiros, “:= vs ==”,... ) • Strong Typed • Case Insensitive • Statically Linked • Rápida • Inicializações/Finalizações [email protected] --- 14 --- 15 --- .IDE .pt --.2001 • Actualmente “clássico” da Borland • Lazarus: RAD Cross Platform • Outro RAD muito diferente: MS .IDEs • Borland Turbo Pascal • DOS .up.NET studio [email protected] • Borland Kylix • Linux .1983 • Borland Delphi • Windows – RAD .RAD .Desenvolvimento Integrado . 0 – 2000 • FPC 2.0 – 2005 • Lazarus começa em 1999 (renascido depois do projecto “Megido”) • Lazarus 0.20 .2007 • Lazarus 1.Lazarus TimeLine • Free Pascal .1993 • FCP 1.9.0 – brevemente ! [email protected] --.up.16 --- . overloading.pt --. instanciação. propriedades.FreePascal / Object Pascal • Object Reference Model • Herança.up. métodos.17 --- . polimorfismo (só em run time se vai saber o método) • Private / Protected / Public • Cascata de criações/libertações • Excepções asousa@fe. actuais: Programação Visual !!! Orientada aos Eventos !!! • Para cada acção na GUI ou cada evento.O.up.18 --- . o S.pt --.O. chama determinada rotina do programa asousa@fe.• Programação para os S. ie.pt --.up.Synchronize • Evitar conflitos entre threads (Thread Safe).org/index.19 --- . ver: http://wiki. não deve haver ciclos de espera • Para programação gráfica a eventos não é necessário recorrer a mutex'es [email protected]/Multithreaded_Application_Tutorial • Programa deve libertar processador para o SO sempre que espera.Robustez Multi-Thread -.lazarus..freepascal. up.Introdução ao Pascal • EBooks gratuitos “Essential Pascal” e “Essential Delphi” No URL: http://www.20 --- .com/tutorials/pascal/ [email protected] --.com • Ver na biblioteca qualquer livro do mesmo autor! • Tutorial de Pascal_FPC http://www.taoyue.marcocantu. FreePascal FPC [email protected] --- .pt --. lazarus.22 --- .freepascal.Documentação FreePascal + Lazarus •Documentação de referência do FreePascal (FPC) ftp://ftp.org/index.pdf • Documentação do Lazarus: http://lazarus-ccr.up.php/Lazarus_DB_Faq quase tudo o que disser respeito a kylix ou delphi !!! [email protected]/docs/ • Tutoriais do Lazarus http://wiki.pt --.lazarus.org/Special:Allpages • Lazarus DB FAQ http://wiki.org/pub/fpc/docs-pdf/ref.sourceforge.freepascal. end.Estrutura do Código Program Elementar.up..23 --- . // termina com ponto final [email protected] --. begin // .. up.pt --. [email protected] --- .Dicas para pascal • 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. end.Estrutura do Código Program Elementar... // var global begin // . [email protected] --- . // .pt --. // constante global var UmInteiro : integer. UmInteiro:=Trunc(csAVOG)..up. const csAVOG : real = 6.. Estrutura do Código • O nome do program será o nome do ficheiro de disco (elementar. Uses Forms {sistema}.up..Run..pas) e possivelmente dará o nome do executável • Um programa utiliza units do sistema e do utilizador. asousa@fe. Application.pt --. end.26 --- . begin // . MyUnit. que são linkadas para produzir o executável • As units permitem dividir o código em blocos • Tipicamente 1 form implica uma unit para encapsular todo o código associado Program elementar. Estrutura do Código • O nome da unit será o nome do ficheiro de disco (MyUnit.27 --- .pas) • A porção de código “Interface” é conhecida pelos módulos exteriores à unit • A porção “implementation” é local e inacessível do exterior unit MyUnit. interface // definições e declarações // a exportar implementation // código local à unit end. [email protected] --. up. interface uses A. B.C • MyUnit exporta as declarações de AlmostZero e TotalSum • O programa unidades podem utilizar MyUnit • Programa utiliza MyUnit • Passa a conhecer as variáveis globais da unidade MyUnit (AlmostZero e Total) const AlmostZero = 0. C. [email protected] do Código unit MyUnit. var TotalSum: Real. Uses Forms.B.001... • MyUnit utiliza e importa a interface das unidades A. /// . // ..pt --..28 --- . Program elementar. MyUnit. [email protected] --.Estrutura do Código // .. initialization // Inicialização da unidade (opcional) finalization // Finalização da unidade (opcional) end. begin // . implementation uses // outras units a importar/utilizar D. var // variável local (não será exportada) UmInteiro : Integer..up.. procedure MyProcedure..29 --- . end. E. up.30 --- .IDE Lazarus [email protected] --. pt --.File..) [email protected] --- ..up..)  Mudar nome de componente muda código todo (. New Application  Gere um Projecto que inclui:  Programa  Unit (Forms)  Unit  2 Way !!!  Editor gráfico encontra código adequado (. 32 --- [email protected] --. pt --.33 --- .up.asousa@fe. project_ola  Mudar “Name” da Form para “Form_Ola” “Caption” vem mudada (ver no editor)  Colocar TButton na Form  Mudar “Name” para BProximo  Botões devem começar com letra “B”  Mudar “Caption” para “Próximo” [email protected]. File.34 --- .pt --. Save ALL: unit_ola. up. o IDE leva-nos até ao código que será executado quando (em run-time) o utilizador premir o botão uma vez (evento “OnClick”) procedure Tform_Ola. begin | end.pt --.BProximoClick (Sender: TObject).35 --- . asousa@fe.• Fazendo Double Click no botão da form que estamos a desenhar. end.Caption:='Olá Mundo'. premir F9 ou seleccionar Menu Run. o texto inscrito no botão caption é alterado e passa mostrar “Olá Mundo” • Saia da aplicação carregando no x do canto da form [email protected] --. o programa gerado é executado e aparece a janela que desenhamos • Depois de carregar no botão.36 --- . Opção Run para compilar o código e executá-lo de seguida • Depois de compilar sem problemas.BProximoClick(Sender: TObject). begin BProximo.Código do Projecto Elementar de Teste procedure Tform_Ola. • Após introduzir o código mostrado acima. 37 --- .pt --.up.Código do Projecto de teste 2 asousa@fe. 38 --- .up.pt --.SnapShots do projecto de teste 2 (windows e linux) asousa@fe. gravar todos os ficheiros da aplicação na mesma directoria ● Não alterar código que não foi feito por nós !!! ● Ligar logo as opções de verificação: Project.up.Notas para iniciados ● Para facilidade de localização dos ficheiros importantes. Compiler_Options. Code: [email protected] --.39 --- . criar uma directoria para cada projecto novo ● Criar o projecto e logo depois gravar todos os ficheiros (Save All). up.pt --.IDE Avançado [email protected] --- . [email protected] --.41 --- .Ajudas à codificação: Code Templates for (premir CTRL+J) for | := forb (premir CTRL+J) to do begin end.up. Ajudas à codificação: Code Templates If. CTRL+J => menu de templates ifb.pt --.up.CTRL+J=>if| then/begin/end [email protected] --- . up.pt --.43 --- .Ajuda à codificação: Completion CTRL+SPACE: Context sensitive Completion asousa@fe. Ajuda à codificação: Navegação em código extenso ● Bookmarks (máximo de 10 pontos de interesse no código): ▪ Para definir um ponto de interesse no código: CTRL+Shift+.. (teclas de 1 a 0) ● Saltar entre Declaração e Código de procedimento ou função: CTRL+ e CTRL+ ● Saltar para a declaração de variável: CTRL+MouseClick ● Saltar (de volta) para ponto anterior de edição: CTRL H [email protected] --- . (teclas de 1 a 0) ▪ Para levar o cursor até um ponto de interesse no código: CTRL+.pt --.up. pt --.up.Ajuda à codificação: Navegação entre janelas ● F12: troca entre form e código ● F11: Object Inspector ● CTRL+F12: View Units ● Shift+F12: View Forms [email protected] --- . Debugging [email protected] --- .pt --.up. 47 --- .up.Debugging Breakpoint [email protected] --. Debugging ● Premir Ctrl+Alt+L para listar todas as variáveis locais ● Para o cursor do rato em cima de uma variável para ver o seu valor (funcionalidade em melhoramento) ● Premir F7/F8 para single stepping ● Premir F4 para ir até ao cursor [email protected] --- .pt --. 49 --- . leva a um help associado ao texto onde o cursor está procedure Tform_Ola. begin BProximo.BProximoClick(Sender: TObject).up. ie. o help de TControl. ● Com o cursor no texto caption do botão.Caption é mostrado no browser [email protected]|:='Olá Mundo'. end.Help de contexto ● Premir F1 leva a activar o browser para levar a uma página de context sensitive help.pt --. Dúvidas Frequentes • Procedure não devolve dados • Function devolve dados • If (x=y) then begin x:=x+1.pt --. • Format( ' Total %d ' .” !!! x:=x+2. end. end else begin // cuidado não pode ter “. [ N ] ).y:=x+2.up.50 --- . asousa@fe. [email protected] ! --.up. i : integer.51 --- . end. begin TempStr:=''. Siz : integer.Funções • Function devolve um dado de determinado tipo function InverteString ( S : string ) : string. if Siz>0 then for I:=Siz downto 1 do TempStr:=TempStr+S[I]. var TempStr : string. InverteString:=TempStr. Siz:=length(S). .Funções e tipos de parâmetros // Func1 passa param de entrada na função por cópia // Mudar S dentro da função não altera S fora da função function func1 ( S : string ) : string.52 --- . asousa@fe.. de entrada e saída) function func2 ( var S : string ) : string.pt --. // . // ....up. ! // Func2 passa param por endereço (param. out S_out : string ). // Func3 passa param const -> compilador não deixa alterar // E S_out é parâmetro de saída procedure func3 ( const S_in : string . // .. [email protected]ções multi parâmetros procedure func4 (const S1.up.53 --- . s : string ) : string .S2 : string. function func5 ( i.k : integer .pt --. out S3 : string) .j. isto é um teste').pt --.up.ShowMessage ShowMessage('Olá.54 --- . asousa@fe. pt --.Pascal Avançado [email protected] --- .up. or.mod.div.xor.up. char. TDateTime./.>=.. Set.Referência • Prioridades: • unários[@.-.pt --.56 --- ...)+Chr(. Pointer. integer.and.<>. in/is • Tipos básicos • string / Pchar.<. variant.<=.-] • *.. boolean.not. • high(vector)/low(vector)/sizeof(variável) • Ord(..=.shr • +.) asousa@fe.>.shl.. New Project. não é necessário alterar nada ! asousa@fe. end. • Project.CreateForm(TForm1. Application. Application cria uma nova aplicação 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. Form1).Initialize.57 --- . View Source • Este código é gerado e gerido automaticamente.Projecto. Application. begin Application.up.pt --.Run. (●●●) uses (●●●) Unit1. Unidade e Form program Project1. var Form1: TForm1. o código da definição do tipo da form é alterado automaticamente --. procedure Button1Click((●●●))..pt • Na interface da Unit1 é definida a TForm1 e a variável Form1 • Neste caso a Form1 tem um botão e um procedimento Button1Click(..58 --- . interface (●●●) type { TForm1 } TForm1 = class(TForm) Button1: TButton.O.up. para efectivamente abrir a janela e executá-la • Adicionando componentes à form. (●●●) end. Obs: A classe não descreve na totalmente a form ! asousa@fe.) • É o programa (não a unidade) que dá instruções ao S.Unidade e Form unit Unit1. up.pt --.59 --- .lfm • Não alterar nada ! [email protected] 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 descrição completa da form estará no ficheiro . Tipos Type // Começar os tipos por 'T' TUpCaseLetters = 'A'.60 --- .31] of Integer..pt --.. TMyDate = record Month : Byte.'Z'. Year : Integer. asousa@fe. end. Day : Byte. TDaysOfMonth // subrange = array [1.up. ColorGreen] of Word. var AnArray: array [10. // RGB // set.. [email protected] type // tipo enumerado TColors = ( ColorRed. isto é. ColorGreen..24] of Byte. Palette: set of TColors.pt --. conjunto !!! TSetOfLetters = set of Char. ColorBlue ).up.61 --- . ColorCode: array [ColorRed . Letters2 := []. end.pt --. begin Letters1 := ['A'. if ('A' in Letters1) then ShowMessage('A'). Letters2 : TConjLetras.Operações com Conjuntos (sets) type TSetOfLetters = set of Char.B'). 'C'].62 --- . if (Letters2 = []) then ShowMessage('Vazio').'B'] <= Letters1) then ShowMessage('A. 'B'. if (['E'] <= Letters1) then ShowMessage('Falso'). if (['A'. [email protected]. var Letters1. . begin UmMes[1] := 10.12] of Integer. asousa@fe. // erro compile-time end. UmMes[2] := 12. UmMes[0] := 18.up.pt --.Range Check type TDozen = array [1. var UmMes : TDozen. procedure WorkSomethingOnADozen.63 --- . // erro compile-time UmMes[25] := 18. 1.pt --.type TBiDimVector = array [1.64 --- . var ABiDimVector : TBiDimVector.12.up.12] of Integer. asousa@fe... pt --. // Muda variável de duas formas diferentes X := 10.up. var P: ^Integer. begin P := @X. P^ := 20.Apontadores type PointerToInt = ^Integer.65 --- . asousa@fe. X : Integer. end. // atribuir ShowMessage (IntToStr (P^)). // terminar end.Apontadores var P: ^Integer. asousa@fe. begin New (P). Dispose (P).66 --- .pt --.up. // criar / iniciar P^ := 20. DayTemp : array [ 1 .pt --. DayTemp [x] := 18.. var x : integer. begin x:=123456.Apontadores – com detecção de limites (range check) procedure TForm_Ola. asousa@fe. 31 ] of Integer.up.Button1Click(Sender: Tobject).67 --- . // GPF – Segmentation Fault end. if N>1 then begin ShowMessage(' >1').pt --. if N<-1 then begin ShowMessage(' <-1'). end. end. asousa@fe. end else begin // relativo ao N>0 (ie N<=0) ShowMessage('Negativo').68 --- . end.IFs if N>0 then begin ShowMessage('Positivo').up. '0'.pt --.'9' : Text := 'Algarismo'. end.Case case MyChar of '+' : Text := 'Soma'.69 --- . '*'.'z' : Text := 'Minúscula'.up. 'A'.'Z' : Text := 'Maiúscula'. else Text := 'Outro Caracter'.. '/' : Text := 'Multiplicação ou divisão'.. asousa@fe. '-' : Text := 'Subtracção'. 'a'.. Ciclo for ... Soma := 0; for i := 1 to 10 do Soma := Soma + i; ... • A variável do ciclo pode ser qualquer ordinal, incluindo tipos enumerados • Ciclos for são muito mais restritivos em Pascal que em C • Tal como em qualquer outro ciclo for, o corpo do ciclo pode ser não executado nunca ... Soma := 0; for i := 10 downto 1 do begin Soma := Soma + i; end; ... [email protected] --- 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); [email protected] --- 71 --- Procedimentos e funções 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; [email protected] --- 72 --- up. procedure TForm1. procedure TForm1. asousa@fe. begin SetLength (DynArray. begin SetLength (DynArray. // mantém + cresce lim sup end.73 --- . // alocar end. begin for I := Low (DynArray) to High (DynArray) do Array1 [I] := I. // Vector Dinâmico procedure TForm1.BFillClick(Sender: TObject). 200). var I: Integer. 100).FormCreate(Sender: TObject).pt --. end.Vectores Dinâmicos Var DynArray : Array of Integer.BGrowClick(Sender: TObject). or PChar value is copied to the output string.up. asousa@fe. 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 string. [var_i.Formatação de Strings string:=format ('%-8d. The corresponding floating-point value is converted to a string based on exponential notation.pt --. The corresponding pointer value is converted to a string expressed with hexadecimal digits.74 --- .%f'. The corresponding integer value is converted to a string of hexadecimal digits.var_f]). character. The conversion is based on regional settings-see the Delphi Help file under Currency and date/time formatting variables. The corresponding floating-point value is converted to a string representing a currency amount.pt --. The corresponding floating-point value is converted to a floatingpoint string but also uses thousands separators. [email protected]ção 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.up. The corresponding floating-point value is converted to the shortest possible decimal string using either floating-point or exponential notation.75 --- . for i := 1 to VeryLargeNumber do begin Application.up. end. [email protected]. Total := Total + i. end.pt --.HandleMessage.76 --- .Ciclos Prolongados for i := 1 to VeryLargeNumber do begin Application. // Permite IdleTime Total := Total + i. end. begin try n0 := 0. except on E : Exception do begin ShowMessage('Nome da classe = '+E. [email protected]). n1 := 1. n2 := n1 div n0.77 --- . ShowMessage('Mensagem da excepção = '+E.up.ClassName). n0 : integer. ShowMessage('1 / 0 = '+IntToStr(n2)). end.pt --. end.Excepções (i) var n2. n1. [email protected] --. // Dibision by zero on E : EDivByZero do ShowMessage('Div by zero error : '+E.. // Catch other errors else ShowMessage('Unknown error').Message). end.78 --- .Excepções (ii) . except // IO error on E : EInOutError do ShowMessage('IO error : '+E.up.Message).. end.to raise an exception number := -1.79 --- . zero : Integer. number := 1 div zero.using default'). ShowMessage('number / zero = '+IntToStr(number)). asousa@fe. finally if number = -1 then begin ShowMessage('Not assigned . begin // Try to divide an integer by zero . number := 0.pt --.Excepções (iii) var number. end. Try zero := 0. end.up. vf2:=2.int0:=0.Append('Continua.Append('Div int por 0:'+e.0. except on E : EDivByZero do Memo.'+ IntToStr(int2)).Message). end.up.Append('Sem erro:='+FloatToStr(vf2)+'..0..Excepções (iv) . end. on E : Exception do Memo.Append('outro erro -.'Just Testing'). int2:=2.ClassName+': '+e..Append('Div Virg Flt 0:'+e. 2 : assert(False.int1:=1. .vf1:=1.vf0:=0..ClassName+':'+e. on E : EZeroDivide do Memo. Normal').Message). Memo.pt --. [email protected]). Memo.ItemIndex of 0 : int2 := int1 div int0. try case RadioGroup.'+ e.0. 1 : vf2 := vf1 / vf0.80 --- .ClassName+': '+e. I:=V.Button1Click(Sender: TObject). Button1. I : Integer.up.pt --. I:=V. begin V:='100'. // OK V:='Something else'.Caption:='I = ' + IntToStr(I).81 --- .Variants procedure TFormMain. • Something else não é um inteiro válido •Na 2ª atribuição é gerada uma excepção asousa@fe. // NOK end. var V : Variant.Caption:='I = ' + IntToStr(I). Button1. etc) {$IFDEF LINUX} // Código para Linux {$ELSE} // Código para outras plataformas {$ENDIF} [email protected] --- .Código Condicional (cross platform.up.pt --. up.pt --.83 --- . qualquer programador pode criar componentes • Components.Componentes & Pacotes • Para acrescentar funcionalidades. Open Package • Package graph asousa@fe. Mais Controlos Visuais Padrão [email protected] --- .pt --.up. Botões ● TButton ● TBitButton ● TSpeedButton [email protected] --- .pt --.up. pt --.up.86 --- .Texto numa linha ● TLabel ● TEdit ● TStatusBar asousa@fe. 87 --- .pt --.up.Caixa de texto (memo box) ● TMemo ● Baseado na classe TStrings que permite muitas operações interessantes ! asousa@fe. . • UmaStringGrande:=text..'.up.88 --- ..LoadFromFile('~/memo.txt').Lines.. ReadOnly. Wrap. . Obs1: Ver Scroll Bars. // toda a memo • Memo..TMemo . with FormMain.... • Lines. • Append('Mais Uma Linha').Delete(0)... // windows • Lines.. substitui a 1a linha . ... // apaga primeira linha • Lines[0]:='.pt --..SaveToFile('c:\memo.txt'). Obs2: Ver variável global DirectorySeparator asousa@fe. // linux .Memo do begin . end. CheckBox / Group ● TCheckBox ● TCheckGroup [email protected] --- 89 --- RadioGroup ● TRadioGroup [email protected] --- 90 --- ListBox e ComboBox [email protected] --- 91 --- 92 --- .up.Canvas) ● TShape (. Shape ● TImage (.Picture) ● TPaintBox (. PaintBox.Canvas) [email protected] --. Abrir.93 --- . SelectDirectoryDialog ● Chamar método execute [email protected].. .pt --.. SaveDialog.) ● Componentes que desaparecem durante a execução do código ● Chamam as caixas standard do S.O.Caixas de diálogo Standard (Gravar. ● OpenDialog1. Temporizador ● TTimer (separador system) ● Tempo em milisegundos ● Dificuldades em cumprir restrições de tempos curtos [email protected] --.94 --- . up.pt --.Gráficos ● TBarChart [email protected] --- . .96 --- .pt --. [email protected] ● TMainMenu ▪ Fazendo double click abre-se o editor de menus ▪ É possível acrescentar diversas opções: ◦ check box ◦ Ícone ◦ Tecla atalho ◦ . up.Componente de persistência ● TXMLPropStorage (Separdor Misc) (depois utilizar a propriedade da form.pt --. eliminando necessidade de gravar explicitamente configurações ● Grava um ficheiro em formato XML ● Existe um outro componente TIniPropStorage que faz o mesmo com ficheiros INI [email protected] --- .SessionProperties) ● À saída do programa grava-se estado actual dos elementos listados em SessionProperties que serão carregados de volta à entrada. pt --.ShowModal.up. ● Para obrigar a ter apenas uma janela da aplicação activa: ▪ FormSecondary.Show.Aplicções Multi Form ● Para acrescentar ao projecto File. New Form (acrescenta uma unidade para esta form) ● Para mostrar uma form: ▪ A form nova é criada automaticamente ▪ É necessário utilizar a unit correspondente: uses UnitWhereFormSecondaryIs ▪ FormSecondary. [email protected] --- .Close. ● Para fechar fechar a form ▪ FormMain. Componentes Externos Úteis [email protected] --- .pt --. org/lNet • Todos estes pacotes são (win32 + linux) [email protected] --.freepascal.12 • Sdpo_Serial – 5dpo component pack • lNnet .100 --- .LightWeight Networking Library http://wiki.lazarus.net/projects/zeoslib/ • A ligação ao PostGreSQL é nativa a partir da versão Lazarus 0.Componentes a utilizar • ZeosLib - http://sourceforge. Sdpo Serial • Para utilizar SDPO_Serial sob Linux • uses cthreads em 1º em todas as units e no *.pt --.12 do Lazarus [email protected] --- . Configure Build Lazarus e depois Build Lazarus) • Obs1: executar o programa na command line para obter mensagens de erro adicionais • Obs2: a sincronização (-dUSE_SYNCHRONIZE) é desnecessária a partir da versão 0.LPR através do Project Inspector) [automático no lazarus 0.9.LPR •{$DEFINE UseCThreads} no *.up.LPR (abrir o *.20] • Recompilar o Lazarus e o LCL com a opção -dUseCThreads (Tools. .102 --- . Lazarus itself is no exception. {$IFDEF IDE_MEM_CHECK} .Lazarus FAQs After I installed a component. Fpc on *nix doesn't automatically include threading support. Every application using the component needs to add this unit to the uses clause of the main program. so that is looks like this: uses cthreads.. This can be done in two ways: 1) Change the source of ide/lazarus. cd laz_dir. [su. 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.up. make clean bigide ou make clean all] [email protected]: add the cthreads as first unit to the uses clause. but it must be intialized. Lazarus crashes with the following message: Threading has been used before cthreads was initialized. and rebuild lazarus.pt --. This initialization is done in the cthreads unit. up.Lazarus FAQs 2) In order to avoid modifying lazarus. Configure "build Lazarus" dialog will be shown. The next step is to install the package. Once package that uses threads has been compiled.pt --.old in the same directory as the crashing lazarus executable. Lazarus will be built with option -Facthreads which means that it will treat main program as if unit cthreads where first in uses clause. asousa@fe. in field "Options:" type -Facthreads and then press "OK" button.pp file. open menu Tools->Configure "build Lazarus".103 --- . a fpc compiler option could be used. Hint: Maybe your old (non-crashing) lazarus executable is stored as lazarus. • Receber: • Evento OnRxData tem cadência imprevisível algumas vezes pode-se receber byte a byte. ttyUSB0): chmod a+rw /dev/tty* chmod a+rwx /var/lock [email protected] --- . outras não.text). • Cuidado com as permissões e os portos (tty0.SynSer. é obrigatório o programa lidar com este facto !!! • Exemplo de recepção: SdpoSerial.up.WriteData(EditSend.Mais detalhes funcionamento Porta Série • Comando exemplo envio: SdpoSerial.RecvPacket(0).pt --. 105 --- .Call Level Interface ▪ ODBC JDBC BDE ● Propriedades ACID: Atomicity-Consistency-Isolation-Durability ● Middleware: CORBA. DCOM.pt --.RADs & acesso Bases de Dados ● Cursor – aponta para um tuplo (linha de tabela de BD) ● Dataset – colecção de tuplos (tabela de BD) ● BD: Local ou Remota (Cliente / Servidor) ▪ CLI .up. DataSnap (=MIDAS) ● D6 & Kylix dBExpress – SQL Thin DB access Layer asousa@fe. Data Aware Objects (i) SGBD Query/ /Dataset DataSource [email protected] --- . --.pt DBGrid DBEdit DBLabel .up.. 12 •Colocar na form os componentes das respectivas tabs: • PQConnection .9.SQLdb • SQLTransaction .DataAccess • DBGrid .pt --.up.SQLdb • SQLQuery .SQLdb • DataSource .107 --- .Sequência para ligar à BD PGSQL em Lazarus 0.DataControls •PQConnection preencher: • Transaction + Database + HostName + UserName + password •Verificar que SQLTransaction aponta para PQConnection •Na SQLQuery preencher: • Transacção + Database • SQL (exemplo: 'select * from anytable') •Na DataSource preencher DataSet como SQLQuery •Na DBGrid preencher DataSource asousa@fe. 108 --- .up.Data Aware Objects (ii) .pt --.DBGrid asousa@fe. . (sempre!!!) ..ReadOnly:= .. [email protected].. ...Data Aware Objects (iii) .. SQLQuery. dbGrid.DBEdit .up.109 --- ..pt --. begin enter:=chr(13)+chr(10).up.'). PQConChange.Append('ERRO:'+enter+ E. s:='update copias set nalugueres=nalugueres+1 where'+ 'codcopia='+IntToStr(EstaCopia). except on E : EDatabaseError do MemoLog.ClassName+enter+E.pt --.. asousa@fe. end.Message).ExecuteDirect('Begin Work. on E : Exception do MemoLog. PQConChange. // string de código SQL try PQConChange.ExecuteDirect('Commit Work. PQConChange.110 --- . PQConChange.Connected:=False.').Message).Append('ERROBD:'+enter+ E..ClassName+enter+E.ExecuteDirect(s).Alterações directas à Base de Dados .Connected:=True. end. dll e as outras DLLs binárias do PostGreSQL estarem no path do sistema operativo [email protected] --- .Observações acerca de Lazarus e PGSQL • Não utilizar dados tipo “text” mas sim “varchar” • Não utilizar “numeric” mas antes inteiros ou “float8” • As tabelas devem ter uma chave primária • Utilizar nomes sempre e só com minúsculas e sem caracteres portugueses • É obrigatório proteger todas as operações directas sobre a base de dados com transacções • É obrigatório o ficheiro libpq.up.pt --. zip ● Instalar o *.lpk relativo ao IDE [email protected] run_time e depois *.pt --.net/sourceforge/lazarus-ccr/lnet-0.Sockets com componente visual ● Descarregar a partir de: ▪ http://ovh.dl.112 --- . LTCPComponentReceive(aSocket: TLSocket). if FIsServer then repeat FNet.SelStart:=Length(MemoText.IterNext.Text). FNet: TLNetComponent.Lines.SendMessage(s. end. begin if aSocket. end.IterReset. FNet.. var s: string..up. until not FNet.113 --- . // TCP ou UDP procedure TForm1.Iterator).lnet/visual/examples/tcpudp .. asousa@fe. FNet. MemoText.GetMessage(s) > 0 then begin MemoText.pt --. ..Append(s). end. until not FNet.SendMessage(EditSend.Text).up. if Assigned(FNet.Append(EditSend. EditSend.Text. if FIsServer and AllOK then MemoText. AllOK:=False. FNet.Text) > 0 then begin AllOk:=True. end.Iterator). n: Integer.IterNext.pt --. begin if Length(EditSend. end. var AllOK: Boolean. if n < Length(EditSend. [email protected]('Error on send [' + IntToStr(n) + ']').Text) then begin MemoText.Iterator) then repeat n:=FNet.lnet/visual/examples/tcpudp procedure TForm1.SendButtonClick(Sender: TObject).114 --- .Text:=''. begin if FNet.Connect(EditIP. FIsServer:=True. begin if FNet.lnet/visual/examples/tcpudp procedure TForm1.ListenButtonClick(Sender: TObject). procedure TForm1.Text)) then begin MemoText.pt --. end. end.Append('Accepting connections').up.Text.Text)) then FIsServer:=False.115 --- . asousa@fe. end.ConnectButtonClick(Sender: TObject). StrToInt(EditPort.Listen(StrToInt(EditPort. SendEditKeyPress (Sender: TObject. var Key: char). MemoText. begin if Key = #13 then SendButtonClick(Sender).up. procedure TForm1.pt --. [email protected]/visual/examples/tcpudp procedure TForm1. begin FNet. end.DiconnectButtonClick(Sender: TObject).Disconnect.116 --- .Append('Disconnected'). end. Serie.Title:='Sinus'. var Serie:TTASerie. Serie.ShowLines:=True.pt --.AddSerie(Serie).clBlack). begin Serie:=TTASerie. for i:=-500 to 499 do Serie.Sin(i/10)*10. end. [email protected](TAChart1). i:Integer. Serie.ShowPoints:=False.117 --- . TAChart1.AddXY(i/10.up.TAChart procedure TForm1.Button1Click(Sender: TObject). //. end. z. // Operator Overloading operator := (r : real) z : complex. asousa@fe. end. Z1.. end..Z2 : complex.Operator Overloading type complex = record re : real.pt --.118 --- . begin z. // ... var R1 : real. im : real.up. im : real. // // // // // // Atribuição de record's do mesmo tipo Z2:=Z1 é a atribuição de todos os campos type complex = record re : real.im:=0. Z2:=Z1.0.re:=r. ru/fpc/rxfpc/index.php?op=modload&name=Search ● Todos os Wiki's: http://wiki.lazarus.Ligações interessantes ● Mailing List do Lazaros.freepascal.org/Lazarus_Documentation ● Bases de dados:http://wiki.lazarus.alexs75.narod.org/Special:Allpages ● Lazarus & Pascal: http://wiki.freepascal.up.org/index.php/Lazarus_Database_Tutorial http://wiki.freepascal.lazarus.org/TPSQL ● RXLib: ▪ http://wiki. arquivo e pesquisa: http://www.org/modules.freepascal.org/mailarchives http://www.freepascal.lazarus.lazarus.freepascal.pt --.119 --- .org/RXfpc ▪ http://www.lazarus.freepascal.html [email protected]. org/GLScene ● http://wiki.org/Multithreaded_Application_Tutorial ● http://wiki.freepascal.lazarus.Ligações interessantes ● http://wiki.freepascal.org/Installing_Lazarus ● http://wiki.freepascal.freepascal.lazarus.freepascal.lazarus.freepascal.lazarus.org/lNet ● http://wiki.freepascal.org/LCL_Defines ● http://wiki.freepascal.lazarus.lazarus.org/Icon_Editor ● http://wiki.org/Lazarus_Faq ● http://wiki.pt --.org/Pascal_Script [email protected]/Multiplatform_Programming_Guide ● http://wiki.120 --- .freepascal.lazarus.lazarus.lazarus.org/Getting_Lazarus ● http://wiki.lazarus. up.pt --.Programação Orientada a Eventos + FPC/Lazarus .121 --- .Fim - asousa@fe.
Copyright © 2024 DOKUMEN.SITE Inc.