Centro de Treinamento Invictos Tecnologia (www.invictos.com.
br/cti ) Delphi Bsico
Pgina 1 de 90 Verso 05/04/2013
CURSO DE DELPHI BSICO EMBARCADERO RAD STUDIO XE3
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 2 de 90 Verso 05/04/2013
CONTEDO PROGRAMTICO
Conhecendo a IDE do Delphi Projetos, Units e Formulrios Pascal para Programadores C - Entenda as principais diferena e entendenda a Delphi Language: Variveis, operadores, laos de repetio (For, while e repeat), estrutura de deciso (IF, then, else, case), Procedimento e Funo, uso de with com componentes e objetos. Estrutura de Programa e Escopo Programao dirigida a eventos e objetos Conhecendo propriedades e eventos do Form, Label, Edit, Button, CheckBox, Radio Button, Panel, Image, BitButton e MaskEdit. OpenImageDialog e SaveImageDialog Interao com o usurio atravs de Mensagens e Caixas de Entradas (showmessage, messagedlg e inputquery). Criando Menus e Popup Menus Mltiplos Formulrios O Poder da Classe StringList e o seu uso nos componentes Memo, ListBox, Combobox e Rdio Group Uso da TabbedNotebook, PageControls, TrackBar e ProgressBar Status Bar e Toolbar Uso de Timers StringGrid bsico para mostrar informaes Criando Units com Funes Passando componentes e formulrios de parmetro Manipulando Arquivos Textos Desenvolvimento de um Software de Agenda com arquivo texto
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 3 de 90 Verso 05/04/2013 Conhecendo a IDE do Delphi
IDE (Integrated Development Environment), um ambiente integrado para desenvolvimento de software
Welcome Page - Pgina de Boas Vindas
Nesta pgina voc encontrar possibilidade de visualizar os projetos abertos recentemente, criar novos projetos, verificar as novidades dos produtos Embarcadero, ter acesso a documentao e helps entre outras funes.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 4 de 90 Verso 05/04/2013 Palheta Standard
Palheta responsvel por criar novas units, abrir units existentes, salvar a unit atual, salvar tudo e adicionar ou remover units externas aos nossos projetos.
Palheta Desktop
Esta palheta serve para configurarmos o nosso ambiente de trabalho, j existem alguns modelos prontos, porm voc pode personalizar seu ambiente de trabalho, com as janelas e posies das mesmas da forma que voc preferir.
Palheta View
Responsvel por Visualizar as units, formulrios e alternar entre Visual (form) e Cdigo (unit)
Palheta Debug
Palheta Responsvel pela Depurao do Projeto, ou seja, compilar, compilar e executar, pausar a depurao, fazer depurao linha a linha, entre outras opes de depurao. Veremos a funo de cada uma dessas opes mais adiante.
Tool Palette - Palheta de Ferramentas (Ctrl + Alt + P)
Nesta palheta voc encontrar as ferramentas necessrias para trabalhar, quando no estamos com nenhum projeto aberto a palheta de ferramentas mostrar os possveis projetos que podem ser criados.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 5 de 90 Verso 05/04/2013 No curso bsico trabalharemos com projetos do tipo VCL Forms Application, d dois cliques sobre essa opo e um novo projeto ser criado.
Veja que agora a Palheta de Ferramentas ir mostrar as opes de componentes referentes ao tipo de projeto escolhido:
Project Manager Gerenciador de Projetos (Ctrl +.Alt + F11)
Nesta palheta voc poder gerenciar os projetos abertos, visualizando seus arquivos, plataforma que ser usada para depurao (Windows, Mac, Ios..), adicionando e removendo novos arquivos ao projeto.
Structure Palheta de Estrutura dos componentes (Shift + Alt + F11)
No exemplo abaixo eu inseri dois componentes no formulrio e a palheta Estrutura mostrou como eles esto organizados, ou seja o Edit1 e o Memo1 esto dentro do Formulrio Form2.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 6 de 90 Verso 05/04/2013
Object Inspector Palheta Inspetor de Objetos (F11)
Esta uma das palhetas que teremos o maior contato durante o desenvolvimento, atravs dela que acessaremos as propriedades e eventos do componente selecionado, no exemplo abaixo foi selecionado um Edit (caixa de entrada) e o object inspector est listando todas as propriedades do mesmo, na segunda imagem o object inspector est listando todos os eventos do Edit selecionado.
Menu View
Atravs deste Menu voc poder abrir janelas e visualizar os atalhos para cada uma delas.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 7 de 90 Verso 05/04/2013
Projetos, Units e Formulrios
Um projeto uma coletnea de arquivos necessrios para que um programa possa funcionar, no Delphi XE3 existem diversos tipos de projetos, como por exemplo:
VCL Forms Aplicattion Aplicao baseada em formulrios VCL (Visual Component Library), biblioteca de componentes visuais, a VCL herda do Windows o visual de seus componentes, podendo inclusive serem modificados caso o tema do Windows seja modificado.
Firemonkey Desktop Application Aplicao que pode ser usada em mltiplas plataformas desktop (Windows, Mac Os), com componentes redesenhados e estilizados.
VCL Metropolis UI Application Aplicao baseada em VCL, porm com recursos visuais do tema Metropolis (Windows 8). Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 8 de 90 Verso 05/04/2013 Entre outros projetos.
Vcl Forms Applicattion
Este ser o projeto que utilizaremos durante o curso, baseado em uma biblioteca de componentes visuais, herdadas da API (Application Programming Interface - Interface de Programao de Aplicativos) do Windows, caso voc troque a aparncia do Windows, a aplicao sofre modificaes visuais, pois a prpria API do Windows que desenha os componentes.
Um projeto uma coletnea de units e formulrios para gerar uma aplicao. Uma unit (.pas) pode existir por si s. Um formulrio depende de uma Unit (.pas) e de um arquivo (.dfm), a unit contm o cdigo funcional da aplicao e arquivo dfm contm o cdigo dos componentes visuais do formulrio.
Exemplo de um projeto
Exemplo de uma unit que contm um formulrio
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 9 de 90 Verso 05/04/2013
Entendendo a estrutura de uma UNIT
unit Unit2; //nome da Unit
interface //bloco de interface responsvel pelas declaraes
uses //declara as units (bibliotecas) que sero usadas Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
Type //criao de novos tipos
//Criando uma classe herdada da classe TFORM TForm2 = class(TForm) private { Private declarations } Public { Public declarations } end;
var //variveis globais a esta unit Form2: TForm2;
implementation //Bloco de implementao
{$R *.dfm}
//rea onde sero implementados os mtodos, procedimentos e funes
end. //indica o fim da unit
Exemplo do dfm deste formulrio
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 10 de 90 Verso 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 11 de 90 Verso 05/04/2013 Um pouco da Delphi Language e converso de sintaxe
Como o foco de nosso curso so alunos que j tem um certo conhecimento em C ou Java, explanaremos aqui as principais diferenas de sintaxe entre as duas linguagens.
Operadores
+ Soma - Subtrao * Multiplicao / Diviso
Comentrios
// comentrio de uma linha
(* Comentrio em Bloco *)
{ Comentrio em Bloco
}
Em C Em Pascal Atribuio = := Comparao == = Estrutura condicional If (cont==3) {
} If (cont=3) Then Begin
End;
Estrutura condicional com else If (cont==3) {
} else { } If (cont=3) Then Begin
End else Begin
End; Lao de Repetio FOR for (i=0;i<=3;i++) {
}
for (i=3;i>=0;i--) {
}
for cont:=0 to 3 do Begin
End;
for cont:=3 downto 0 do Begin
End;
Lao de Repetio WHILE while( i <= 100 ) While (i<=100) Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 12 de 90 Verso 05/04/2013 {
} Do Begin
End; Mdulo ou resto da Diviso If ((4 % 2) ==0) { printf (" par ); } If ((4 mod 2)=0) Then Begin Showmessage( par); End;
Modularizao: Funes e Procedimentos
Procedimentos
Em C
void soma() {
}
Em Pascal
Procedure Soma; Begin
End;
Funes
Em C
Int soma() { return 30; // sai da funo nesta linha e retorna 30 }
Em Pascal
Function soma:integer; Begin Result:=30; //armazena 30 na varivel de retorno, mas no sai nesta linha Exit; //no obrigatrio, mas serve para sair da funo. End;
Passagem de parmetros em procedimentos e funes
Passagem por argumento
Em C
int soma (int a,int b) { return a+b; }
Em Pascal
Function soma (a,b:integer):integer; Begin Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 13 de 90 Verso 05/04/2013 result:=a+b; End;
Passagem por referncia
Em C
int soma (int& a,int& b) { }
Em Pascal
Function soma (var a,b:integer):integer; Begin End;
ESCOPO DE VARIVEIS
Assim como em C, se uma varivel for declarada dentro de uma funo, o escopo dela apenas a funo.
Para declarar uma funo em Pascal existem reas especficas para esse procedimento, diferentemente de C que uma varivel pode ser declarada em qualquer parte do cdigo.
Declarando variveis dentro de um procedimento (entre o nome da funo e o Begin)
Procedure Soma; Var A,b:integer; Texto:string; Begin End;
Declarando uma varivel Global a uma Unit (no var antes do implementation da unit, junto a varivel do formulrio)
var Form2: TForm2; Aglobal:integer; //aqui
implementation
{$R *.dfm}
....
TIPOS DE DADOS COMUNS
Inteiros
Tipo Faixa Aproximada ShortInt -128..127 SmallInt -32768..32767 Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 14 de 90 Verso 05/04/2013 LongInt -2147483648..2147483647 Integer -2147483648..2147483647 Int64 -2^63..2^63-1 Byte 0..255 Word 0..65535 LongWord 0..4294967295 Cardinal 0..4294967295 UInt64 0..2^64-1
TDate guarda data TTime guarda hora TDateTime guarda data e hora
Tipos de caracteres
Char representao de 1 bytes (1 caracter) String vetor de caracteres
Funes de String
S:=texto que ser enviado para a varivel S;
A:=teste; B:=de texto; C:=A+B+ usando concatenao de strings;
Funo length retorna a quantidade de caracteres de uma string Quantidadecaracteres:=Length(C);
Uma string inicia em 1 e no em 0, ento para percorrer uma string Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 15 de 90 Verso 05/04/2013
For cont:=1 to length(c) do Begin Stringfinal:=StringFinal + C[cont]; End;
Algumas funes importantes de converses entre tipos
Na converso o parmetro deve conter um valor correto para o tipo destino, caso contrrio gerar uma excesso.
Strtodate = Converte uma String para Data
Strtodatetime = Converte uma string para um campo data/hora
DateTimetostr = Converte um valor Data/Hora para String
Formatdatetime = Formata um valor Data/Hora convertendo para String
Strtoint = Converte uma string para um valor inteiro
StrtoCurr = Converte uma string para um valor currency
Strtofloat = Converte uma string para um valor de ponto flutuante
InttoStr = Converte um valor inteiro para uma string
CurrtoStr = Converte um valor currency para uma string
FloattoStr = Converte um valor de ponto flutuante para uma string
Exemplo de Uso das funes em um click de um boto
procedure TForm2.Button1Click(Sender: TObject); Var ValorData:Tdate; ValorDataHora:TDatetime; ValorString:String; ValorInteiro:integer; ValorCurrency:Currency; ValorFloat:Double; Begin
ValorData:=strtodate('01/01/2000'); ValorDataHora:=strtodatetime('01/01/2000 00:00'); ValorString:=datetostr(ValorData); ValorString:=FormatDatetime('yyyy/mm/dd', ValorDataHora); ValorInteiro:=strtoint('22'); ValorCurrency:=strtocurr('10,25'); ValorFloat:=strtofloat('10,2252'); ValorString:=inttostr(332); ValorString:=CurrtoStr(200.25); ValorString:=CurrtoStr(200.2566); End; Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 16 de 90 Verso 05/04/2013
COMPONENTES BSICOS
Form Formulrio
Propriedades Principais
Name = Nome do Componente Caption = Texto que aparece na barra de ttulo Color = Cor do Formulrio Font = Fonte do Formulrio (fonte, tamanho, cor e estilos) Height = Altura do Formulrio Width = Largura do Formulrio State = Estado que ele aparecer wsNormal = Normal wsMaximized = Maximizado wsMinimized - Minimizado
Position = Posio que o formulrio aparecer na tela poDesigned = Posio do desenvolvimento poDefault = Posio e tamanho determinado pelo SO poDefaultPosOnly = Posio determinado pelo SO, porm tamanho no. poDefaultSizeOnly = Tamanho controlado pelo SO, mas posio no desenvolvimento poScreenCenter = Centro da tela, tamanho do desenvolvimento, no monitor default poDesktopCenter = Centro do Desktop, mesmo com mltiplos monitores poMainFormCenter Centro do Formulrio Principal (quando janela secundrio) poOwnerFormCenter = Centro do Formulrio proprietrio (criador).
BorderStyle = Estilo da Borda bsDialog = No redimensionvel, somente boto fechar. bsSingle = No redimensionvel, menu de minimizar / maximizar. bsNone = No redimensionvel, sem linha de borda visvel. bsSizeable = Redimensionvel bsToolWindow = Igual bsSingle mas com uma barra de ttulo menor. bsSizeToolWin = Igual bsSizeable com uma barra de ttulo menor.
KeyPreview = Intercepta as teclas pressionadas em outros componentes
Eventos
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 17 de 90 Verso 05/04/2013 Grande parte destes eventos existiro em outros componentes da VCL, portanto a explicao para eles estendem-se para outros eventos, inclusive alguns cdigos de eventos sero exemplificados aqui em outros componentes, como por exemplo Edits.
OnCreate(Sender: TObject);
Procedimento invocado quando o formulrio criado na memria (instanciado)
Parmetros
Sender do tipo Tobject = um parmetro comum na maioria dos eventos, indica que invocou o evento (sender = remetente), o tipo dele o tipo de onde descendem todos os objetos da VCL, podemos usar este evento para saber qual componente invocou o mtodo, entre outras manipulaes mais avanadas.
procedure TForm3.FormCreate(Sender: TObject); begin
end;
OnDestroy(Sender: TObject);
Procedimento invocado quando o formulrio destrudo na memria (memria liberada)
Parmetros
Sender = J estudado
procedure TForm3.FormDestroy(Sender: TObject); begin
end;
OnShow(Sender: TObject);
Procedimento invocado quando o formulrio mostrado
Parmetros
Sender = J estudado
procedure TForm3.FormShow(Sender: TObject); begin
end;
OnClose(Sender: TObject; var Action: TCloseAction);
Este evento invocado no momento que o formulrio recebe um comando de fechamento, seja ele via cdigo ao clicar no cone para fechar ou com teclas de atalho (Alt+F4).
Parmetros
Sender = j estudado
Action do tipo TCloseAction = um parmetro que indica a ao a ser tomada pelo formulrio, os possveis valores so: caNone, caHide, caFree, caMinimize
Exemplo de como abortar o fechamento de um formulrio
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 18 de 90 Verso 05/04/2013 procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caNone; //exemplo de como abortar o fechamento do formulrio end;
OnActivate(Sender: TObject);
Este evento invocado na ativao do Formulrio (toda vez que a janela do formulrio entra em Foco)
Parmetros
Sender = j estudado
procedure TForm3.FormActivate(Sender: TObject); begin
end;
OnClick(Sender: TObject);
Este evento invocado toda vez que o formulrio recebe um click do mouse
Parmetros
Sender = j estudado
procedure TForm3.FormClick(Sender: TObject); begin
end;
OnDblClick(Sender: TObject);
Este evento invocado toda vez que o formulrio recebe um duplo click do mouse
Parmetros
Sender = j estudado
procedure TForm3.FormDblClick(Sender: TObject); begin
end;
OnKeyPress(Sender: TObject; var Key: Char);
Este evento invocado toda vez que o formulrio recebe o pressionamento de uma tecla
Parmetros
Sender = j estudado
Key do tipo Char sinalizado como o identificador var, isto significa que ele foi enviado via referncia e que seu valor pode ser alterado, esse parmetro contm a tecla que foi pressionada, portanto possvel fazer tratamento com esse parmetro.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 19 de 90 Verso 05/04/2013 O formulrio s intercepta o pressionamento de teclas em outros controles se a propriedade KeyPreview estiver com true, caso contrrio ele s tratar o evento se nenhum controle estiver com o Foco, porque se estiver com o Foco o tratamento do evento fica com o controle.
procedure TForm2.FormKeyPress(Sender: TObject; var Key: Char); begin
end;
Exemplos de tratamento de OnKeyPress em um Edit
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin
if (key=#13) then Self.Edit1.SetFocus;
if (key<>'1') then Key:=#0;
end;
Neste exemplo se a tecla pressionada foi o Enter (#13 o cdigo ASC da tecla) ele ir enviar o Foco para o Edit1.
Se qualquer tecla diferente do 1 for pressionado a Key anulada, enviando o cdigo #0 para ela, isso far com o que for digitado seja descartado e nem seja mostrado no edit1.
No exemplo abaixo um cdigo que s aceitar numricos no Edit e o Backspace (#8).
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not(key in ['0'..'9',#8]) then Key:=#0; end;
Neste exemplo foi usado o conceito de conjunto, entre os [ ] encontra-se os valores do conjunto.
OnKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState);
Este evento invocado toda vez que o formulrio recebe o pressionamento de uma tecla para baixo.
procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin end;
A principal diferena entre o evento OnKeyPress e o evento OnKeyDown que o evento OnKeyPress no chamado quando teclas que no so da tabela ASCII so pressionadas.
Teclas Alfa Numricas (abc...1234...), acentos, Enter e BackSpace invocam o mtodo OnKeyPress, porm teclas de Funo (F1,F2....), teclas de navegao (setas para cima, baixo, esquerda e direita), teclas Shift e Control no invocam o mtodo OnKeyPress, mas invocam o mtodo OnKeyDown.
A outra diferena entre as funes que o parmetro Key da OnKeyPress um caracter ASC, j o parmetro Key da OnKeyDown um caracter WORD, ou seja, o cdigo numrico da Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 20 de 90 Verso 05/04/2013 tecla e no seu correspondente na tabela ASC, at porque algumas teclas no tem correspondente na tabela ASC como por exemplo as teclas de Funo.
Algumas teclas tem constantes pr-definidas, assim voc no precisar saber o cdigo numrico delas, a lista de constantes imensa, para pesquis-la inteira procure por Virtual key Codes no Help do Delphi, ou use o link
Listarei algumas importantes, com o cdigo correspondente:
VK_LEFT = Tecla de Navegao para a Esquerda (37) VK_RIGHT = Tecla de Navegao para a Direita (39) VK_UP = Tecla de Navegao para Cima(38) VK_DOWN = Tecla de Navegao para Baixo (40) VK_DELETE = Tecla Delete (46) VK_ESCAPE = Tecla ESC (27)
Parmetros
Sender = j estudado
Key do tipo Word, contm o cdigo numrico da tecla pressionada, pode ser alterado
Exemplo de como verificar se o ESC foi pressionado.
Primeira forma, usando o cdigo da tecla
procedure TForm2. FormKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState); begin if (key=27) //cdigo do ESC Then Self.Close;//fecha o formulario end;
Segunda forma usando a constante Virtual key Code
procedure TForm2. FormKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState); begin if (key=VK_ESCAPE) Then Self.Close;//fecha o formulario end;
Parmetro Shift
O parmetro Shift serve para indicar se teclas como o Shift, Ctrl, Alt, botes de mouse ou dispositivos touchs esto pressionadas tambm.
Exemplo
if (ssCtrl in Shift) Then Showmessage(Control pressionado);
Alguns valores para o parmetro:
ssShift Shift Pressionado ssAlt Alt Pressionado Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 21 de 90 Verso 05/04/2013 ssCtrl The CTRL pressionado ssLeft Boto esquerdo do mouse ssRight Boto Direito do Mouse ssMiddle Boto do Meio do Mouse
Exemplo de como simular o Atalho Ctrl + T para selecionar todo o texto do Edit
procedure TForm3.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ((ssCtrl in Shift) and (chr(key)='T')) Then Self.Edit1.SelectAll; end;
Veja que foi usado o comando CHR(key), este comando retorna o caractere ASCII correspondente ao cdigo enviado de parmetro.
OnKeyUP (Sender: TObject; var Key: Word; Shift: TShiftState);
Este evento invocado toda vez uma tecla solta, inverso do onkeydown, ele segue os mesmos parmetros do OnKeyDown j estudado.
Label
Encontrado Palheta Standard
Propriedades Principais
Align = Alinhamento da Label dentro do proprietrio alBottom = Na parte inferior alClient = Toma todo o proprietrio alCustom = Sem alinhamento alLeft = Alinhado a esquerda alNone = Sem alinhamento alRight = Alinhado a direita alTop = Alinhado na parte superior Alignment = Alinhamento do texto dentro da label taCenter = No Centro taLeftJustify = Alinhado a esquerda taRightJustify = Alinhado a direita AutoSize = Tamanho automtico Caption = Texto da Label Enabled = Ativa ou no a Label Font = Propriedades da Fonte Color = Color de Fundo da Label Transparent = Indica se a label ter fundo ou no Visible = Indica se a label ser mostrada ou no WordWrap = Quebrar o texto automaticamente
Eventos principais
OnClick, OnDblClick, Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 22 de 90 Verso 05/04/2013
Edit = caixa de texto
Palheta Standard
Principais Propriedades
Align, Alignment, AutoSize, Color, Font, Enabled, Visible Maxlength = Quantidade maxima de caracteres (0 = desativa esta opo) Text = Texto do Edit CharCase = Determina se ser normal, minscula ou maisculas TabOrder = Ordem que o componente est no uso do TAB (mudana de foco) PasswordChar = Caractere que ser usado no lugar dos caracteres que forem sendo digitados, ideal para campos de senha (password), para desabilitar esta opo deixe-a preenchida com #0
Mtodo invocado toda vez que o contedo do Edit sofre modificao.
Parmetros
Sender = j estudado
procedure TForm3.Edit1Change(Sender: TObject); begin Self.edit2.text:=Self.edit1.text; end;
OnEnter (Sender:TObject);
Este mtodo invocado quanto o edit recebe o foco
Parmetro
Sender = J estudado
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 23 de 90 Verso 05/04/2013 procedure TForm3.Edit1Enter(Sender: TObject); begin end;
OnExit (Sender:Tobject);
Este mtodo invocado quando o Edit perde o foco, ou seja, o foco enviado para outro controle.
Parmetro
Sender = j estudado.
procedure TForm3.Edit1Exit(Sender: TObject); begin end;
SetFocus
Mtodo que envia o foco para o componente.
Self.Edit1.setfocus;
Button = Boto
Encontrado na Palheta Standard
Principais Propriedades
Caption = Texto do Boto, o uso do caractere & indica o caractere de atalho para o boto.
Exemplo: &Abrir = A Letra A ser o atalho (Alt A) pois foi precedida do caractere &
Enabled, Visible, TabOrder ( j estudados em outros componentes)
Principais eventos
OnClick, OnEnter, OnExit, OnKeyPress, OnKeyDown, OnKeyUp (j estudados em outros componentes)
Funes Auxiliares
Now - varivel global do tipo datetime que retorna a data e a hora atual
Showmessage - Utilizada para enviar uma mensagem simples ao usurio. Exemplos
Showmessage(Teste de Mensagem); Showmessage(A hora agora +timetostr(now)); //mensagem indicando a hora atual
Tratamento de Exceo (Except)
Se uma Exceo ocorrer no sistema sem o uso do bloco Try Except o sistema paralisa a execuo na linha que gerou o erro e mostra uma mensagem de erro na tela.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 24 de 90 Verso 05/04/2013 As excees so tratadas em bloco
Try //regras de negcios Except //tratamento do erro End;
Exemplo
Try Strtoint(esta conversao vai gerar um erro); Showmessage(esta mensagem no ser mostrada); Except Showmessage (Erro na converso de string para inteiro); //... aqui voc pode digitar outros comandos End;
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 25 de 90 Verso 05/04/2013
Exerccio 01
Criar um projeto chamado calculadora, com a aparncia abaixo
Nomes dos Componentes
EdtValorInteiro EdtOperador EdtValorFloat BtCalcula BtLimpar LbResultado (label com o texto 0,00)
Regras de Negcio
Ao entrar no programa os edits devem estar limpos, a lbresultado deve estar com o valor 0,00 e o foco deve estar no edtvalorinteiro Ao sair do EdtValorInteiro o sistema dever verificar se ele contm um valor inteiro vlido, caso no tenha o sistema deve emitir uma mensagem de erro e retornar o foco para o edtValorInteiro Ao sair do Edtoperador o sistema dever verificar se ele contm um operador (+ - / *) vlido, caso no tenha o sistema deve emitir uma mensagem de erro e retornar o foco para o EdtOperador Ao sair do EdtValorFloat o sistema dever verificar se ele contm um valor float vlido, caso no tenha o sistema deve emitir uma mensagem erro e retornar o foco para o EdtValorFloat. Ao clicar no boto BtCalcula o sistema dever realizar a operao utilizando os valores e o operador digitado, retornar o resultado na label LBRESULTADO e voltar o foco para edtvalorinteiro. Ao clicar no Boto limpar o sistema dever limpar os valores dos edits, deixar a lbresultado com o valor 0,00 e setar o foco para o edtvalorinteiro O foco deve estar correto de acordo com a ordem dos componentes na tela
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 26 de 90 Verso 05/04/2013 CheckBox = Caixa de checagem
Encontrado Palheta Standard
Principais Propriedades
Checked = Propriedade que indica se a checkbox est marcada (checkada) ou no.
Caption, Enabled, Visible, TabOrder ( j estudados em outros componentes)
Principais eventos
OnClick, OnEnter, OnExit, OnKeyPress, OnKeyDown, OnKeyUp (j estudados em outros componentes)
Exemplo
if (Self.CheckBox1.Checked=True) then Showmessage('Caixa selecionada') Else Showmessage('Caixa no selecionada');
RadioButton = Boto Radial
Encontrado Palheta Standard
semelhante ao CheckBox, porm s permitido que um RadioButton do grupo esteja marcado (checked).
Principais Propriedades
Checked = Propriedade que indica se o RadioButton est marcado (checked) ou no.
Caption, Enabled, Visible, TabOrder ( j estudados em outros componentes)
Principais eventos
OnClick, OnEnter, OnExit, OnKeyPress, OnKeyDown, OnKeyUp (j estudados em outros componentes)
Exemplo
if (Self.RadioButton1.Checked=True) then Showmessage('Caixa selecionada') Else Showmessage('Caixa no selecionada');
Panel = Painel
Encontrado Palheta Standard.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 27 de 90 Verso 05/04/2013 um painel que pode ser usado para organizar os componentes e criar grupos, por exemplo se um panel for desativado (enabled=false), nenhum dos componentes do Panel poder ser acessado, se um panel for movido, todos os componentes do panel sero movidos juntos com ele.
Principais Propriedades
BevelOuter = Propriedade que indica a aparncia do Painel.
Align, Caption, Enabled, Visible, TabOrder ( j estudados em outros componentes)
Principais eventos
OnClick, OnDblClick, OnEnter, OnExit (j estudados em outros componentes)
Exemplo
Self.Panel1.Enabled:=False;
Image = imagem
Encontrado na Palheta Additional.
Principais Propriedades
Picture = Propriedade que indica qual a imagem ser usada. Clique no boto mostrado abaixo e escolha a figura que deseja que seja mostrada no Image.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 28 de 90 Verso 05/04/2013 Stretch = Indica se a imagem ser ajustada de acordo com o tamanho do objeto (esticada), no recomendado em alguns casos devido a distoro da imagem no resultado final.
Proportional = Indica se a imagem ficar proporcional se for ajustada (stretch).
Align, Enabled, Visible ( j estudados em outros componentes)
Principais eventos e mtodos
OnClick, OnDblClick (j estudados em outros componentes)
Picture.LoadFromFile(stringcomocaminho); = Funo usada para Carregar uma imagem do Disco.
Picture.SaveToFile(stringcomocaminho); = Funo usada para Salvar uma imagem no Disco.
Exemplos
Para carregar uma imagem do disco via cdigo, use a funo loadfromfile da propriedade picture
Posso abrir imagens de diversos tipos, no exemplo acima eu abri uma imagem do tipo PNG, neste caso necessrio adicionar a minha lista de uses uma unit especial para este tratamento: Vcl.imaging.pngimage
Uma dica para no precisar decorar o nome das units, inserir dois Timages em um formulrio e inserir uma imagem jpeg e uma png, depois compilar, voc perceber que sero adicionadas as units automaticamente na seo interface, aps isso pode apagar os componentes do formulrio que as units continuaro.
Para salvar uma imagem que esteja em um TImage no disco utilize o comando Picture.SavetoFile
Lembrando que a extenso da imagem deve ser a mesma do arquivo que foi carregado, caso necessite fazer converso, como por exemplo abrir um bitmap e salvar em Jpeg existem funes especficas para isso.
Para limpar uma imagem do TImage sete a propriedade Picture para nil. Exemplo:
Self.image1.picture:=Nil;
OpenPictureDialog
Encontrado na Palheta Dialogs
um componente usado para encontrar imagens no computador, a principal funo dele navegar entre as pastas do computador e retornar o nome do arquivo escolhido.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 29 de 90 Verso 05/04/2013
Principais Propriedades e Mtodos
Execute; = Esse mtodo executa o openpicturedialog, ele retorna True se o usurio escolheu uma imagem ou false se o usurio cancelou a operao. FileName = Indica o nome do arquivo escolhido pelo usurio.
Exemplo de Abertura de uma Imagem Usando o OpenPictureDialog
Semelhante ao OpenPictureDialog um componente que abre a caixa de dilogo padro do Windows para salvar uma imagem.
Principais Propriedades e Mtodos
Execute; = Esse mtodo executa o savepicturedialog, ele retorna True se o usurio escolheu uma imagem ou false se o usurio cancelou a operao. FileName = Indica o nome do arquivo digitado pelo usurio.
Exemplo de como Salvar uma Imagem Usando o SavePictureDialog
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 30 de 90 Verso 05/04/2013
MaskEdit = Edit (caixa de texto) com Mscara
Encontrado Palheta Additional.
O MaskEdit um Edit porm a opo de mscara de digitao, ideal para formatar a digitao de telefones, campos de documentos (CPF, CNPJ) e datas.
Principais Propriedades
EditMask = Mscara que ser aplicada, clique no boto mostrado abaixo para ver as opes de mscaras pr-formatadas, porm nada impede que voc crie sua prpria mscara.
No exemplo acima foi utilizada uma mscara de data com dois dgitos no Ano.
Outras propriedades j estudadas
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 31 de 90 Verso 05/04/2013 Align, Alignment, AutoSize, Color, Font, Enabled, Visible, Maxlength, Text, CharCase, TabOrder e PasswordChar (estudados em outros componentes)
Principais Eventos
OnClick, OnDblClick, OnKeyPress, OnKeyDown, OnKeyUp, OnChange, OnEnter, OnExit ( j estudados em outros componentes)
Interao com o usurio com Mensagens e Caixas de Entrada
Onde Msg = String com a mensagem. DlgType = Tipo de cone que ir aparecer (mtwarning, mterror, mtinformation, mtconfirmation) Buttons = Botes que iro aparecer mbOK, mbCancel, mbYes, mbNo, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll, mbClose Cada boto desses tem um cdigo de resposta se quisermos capturar qual foi pressionado mrOK, mrCancel, mrYes, mrNo, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll, mrYesToAll, mrClose
HelpCtx = Cdigo de erro se pressionado F1 DefaultBtn = Boto que estar com o Foco, este parmetro no obrigatrio.
Exemplo simples com um boto
Messagedlg('Mensagem com um botao',mtinformation,[mbok],0);
Mensagem com dois botes
Messagedlg('Mensagem com dois botes', mtwarning,[mbyes,mbno],0);
Mensagem com boto default e com captura do boto pressionado
If (Messagedlg('Deseja sair?', mtconfirmation,[mbyes,mbno],0,mbno)=mrYes) Then Showmessage('Voc escolheu sair');
procedure TForm3.BitBtn1Click(Sender: TObject); Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 32 de 90 Verso 05/04/2013 var variavelString:String; begin variavelstring:= 'digite aqui... '; if (inputquery('Ttulo da Barra de Ttulo','Texto da Mensagem - Digite seu nome',variavelstring)=True) then Showmessage(' Seu nome '+variavelString) Else Showmessage(' Processo cancelado'); end;
Exerccios
Dicas de Exerccio
Desenvolver uma Calculadora Completa
Desafio: Jogo da Velha
Disponvel para Download com o Fonte
Dicas para Randomizar nmeros
Randomize; //necessrio antes de chamar o random PnumeroInteiro:=Random(100);//randomiza de 0 a 99
Main MENU = Menu principal
Encontrado na Palheta Standard
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 33 de 90 Verso 05/04/2013 Este componente usado para criao de Menus, aps adicion-lo no formulrio, d um duplo click sobre ele para abrir o Editor de Menu.
Atravs do Editor possvel criar novos items do menu (TmenuItem), alterar e excluir os existentes.
Principais Propriedades do TMenuItem
Caption = texto do menu (digitando ele criar um item separador) ShortCut = atalho que ser associado a este Item do Menu.
Exemplo de criao de um Item separador, basta digitar no lugar do caption.
Arraste os items com o mouse para mudar a posio deles, pressione delete para apag-los e insert para inserir novos itens.
Eventos
Para cada TMenuItem existe um mtodo OnClick onde deve ser digitado o cdigo que deseja que seja executado.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 34 de 90 Verso 05/04/2013
Exemplo
procedure TForm3.Sair1Click(Sender: TObject); begin Self.Close; end;
Popup Menu = Menu acionado pelo boto direito do Mouse
Encontrado na palheta Standard
Este menu usado como uma lista suspensa de opes (popup), segue o mesmo princpio do MainMenu para configurao de novos itens, clique duas vezes sobre ele e adicione os itens que desejar.
Aps configurar o PopupMenu necessrio indicar qual componente ir us-lo, para isso escolha o componente (Edit, boto, formulrio) e depois escolha na propriedade PopupMenu o componente configurado. Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 35 de 90 Verso 05/04/2013
Exemplo em funcionamento
Mltiplos Formulrios
As vezes faz-se necessrio em uma aplicao conter mais de um formulrio (form), para que as funes possam distribudas em mltiplas telas da aplicao.
Quando criamos uma Aplicao VCL ela composta por um nico formulrio, o formulrio principal, caso este formulrio seja fechado a aplicao encerrada (o formulrio padro pode ser alterado), para adicionar novos formulrios clique no menu File \ New \ Vcl Form - Delphi
Veja que agora apareceram dois formulrios na janela de navegao
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 36 de 90 Verso 05/04/2013 Para visualizar quais formulrios fazem parte da aplicao voc pode utilizar a Palheta View, boto View Form (Shift+F12) conforme imagem abaixo:
No meu exemplo vou renomear o primeiro formulrio criado como Fprincipal
E o segundo como Fauxiliar
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 37 de 90 Verso 05/04/2013 Se rodarmos a aplicao o formulrio que ser mostrado o Fprincipal, porque ele foi primeiro formulrio a ser criado, se quiser alterar essa configurao, acesse:
Menu Project \ Options
Escolha o Item Forms e troque o Main Form, conforme figura abaixo
Nesta tela podemos tambm configurar quais formulrio sero criados automaticamente pela aplicao (auto-create), caso seja retirado um formulrio desta lista necessrio fazer a criao do mesmo (instanci-lo na memria) antes de us-lo e destru-lo aps o uso, porm esse assunto no escopo do nosso curso bsico.
Formas de invocar outros formulrios
Supondo que o nosso Main Form seja o Fprincipal, para acessar o Fauxiliar necessrio um comando para mostr-lo, existem duas formas de mostrar um formulrio:
Chamadas Modais (janelas restritas) - Quando invocamos um formulrio com uma chamada modal todos os demais formulrios abertos no podero ser acessados at que este formulrio seja fechado.
Chamadas No-Modais (janelas no restritas) Quando invocamos um formulrio com uma chamada no-modal podemos acessar outros formulrios que estejam abertos.
Showmodal
Fauxiliar.Showmodal; //este comando invoca o Fauxiliar em uma chamada modal.
Show
Fauxiliar.Show;//este commando invoca o Fauxiliar em uma chamada no-modal.
Adicionando a Unit correspondente Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 38 de 90 Verso 05/04/2013
Tanto em um mtodo quanto no outro necessrio que a Unit do formulrio que se deseja invocar esteja listada na lista de units que sero usadas, elas podem estar adicionadas na lista de uses do interface ou do implementation, caso voc compile a aplicao sem adicionar a unit o prprio Delphi ir avis-lo disso:
Veja que a mensagem do exemplo foi
O Formulrio Fprincipal est referenciando o formulrio Fauxiliar declarado na unit Unit4 que no est na sua lista de USES. Deseja adicion-la?
Se voc escolher a opo Yes o prprio Delphi ir adicion-la a lista de uses, se escolhar no o programa no ser executado.
Chamadas Recursivas a Janelas Modais
Imagine a situao que o Formulrio Fprincipal invoca o Fauxiliar em uma chamada ShowModal e o Fauxiliar invoca o Fprincipal tambm em uma chamada ShowModal, o sistema ir gerar um erro:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 39 de 90 Verso 05/04/2013 Porm nada impediria que o Fauxiliar invocasse outro Formulrio qualquer em uma chamada Showmodal.
Erro de referncia Circular Out of Memory
No exemplo acima o sistema no geraria erro em tempo de compilao porque os dois formulrios referenciam um ao outro na seo de implementation:
Porm se formos no Fauxiliar e trocarmos a referncia a Unit3(Fprincipal) para a seo de Interface, veja o erro que ocorre ao tentarmos compilar a aplicao:
Referncia da Fprincipal a Fauxiliar na Interface
Referncia da Fauxiliar a Fprincipal na interface
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 40 de 90 Verso 05/04/2013
Erro gerado pelo compilador
Foi gerado um erro de Out of Memory, nas verses anteriores do Delphi seria gerado um Erro de Referncia Circular, ou seja, duas units no podem referenciar uma a outra na seo de interface, apenas na seo de implementation.
TStrings e TStringList
As classes TStrings e TStringList so classes poderosssimas do Delphi que simulam listas encadeadas de strings, contendo mtodos para adicionar, remover, pesquisar, ordenar, acessar e alterar itens desta lista, muitos componentes da VCL possuem propriedades do tipo TStrings, portanto no possvel aprender estes objetos sem antes entender a classe Tstrings.
Para nossos exemplos iremos criar uma instncia da classe TStringList que uma implementao da classe TStrings
TStringList
Usado para armazenar e manipular uma lista de strings. TStringList implementa as propriedades e mtodos abstratos introduzidas pela TStrings, e introduz novas propriedades, eventos e mtodos para:
Classificar as strings na lista. Proibir duplicao de strings em listas ordenadas. Responder a alteraes no contedo da lista. Controlar a classificao por ordem alfabtica
Para fazer nossos testes iremos adicionar um boto ao nosso formulrio e no evento on click iremos codific-lo da seguinte maneira:
procedure TFprincipal.Button2Click(Sender: TObject); var Lista:TStringList; posicao,cont:integer; begin Lista:=TStringList.Create;
Lista.Clear;//limpa os itens
Lista.Sorted:=False;//indica que a lista no ser ordenada a cada insero
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 41 de 90 Verso 05/04/2013 Showmessage ('Lista Completa: '+#13+Lista.Text); //mostrando o texto completo (concatenao de todos os itens)
Showmessage (lista[2]); //acessando um item especfico da lista (3 item)
for cont := 0 to lista.Count-1 do//percorrendo todos os itens da lista Begin Showmessage('Item '+inttostr(cont)+' '+lista[cont]); End;
lista.Delete(2); //apagando um item especifico da lista
Showmessage ('Apagado Item 2. Lista Completa'+#13+Lista.Text); //mostrando o texto completo (concatenao de todos os itens)
Lista.Sort; //ordenando a lista em ordem alfabtica
Showmessage ('Lista Ordenada '+#13+Lista.Text); //mostrando o texto completo (concatenao de todos os itens)
Lista.CaseSensitive:=true;//indica que DEVE diferenciar maisculas e minsculas posicao:=lista.IndexOf('E-STRING 1'); if (posicao<0) then Showmessage('String "E-STRING 1" no encontrada') Else Showmessage('String "E-STRING 1" encontrada na posio '+inttostr(posicao));
Lista.CaseSensitive:=False;//indica que NO DEVE diferenciar maisculas e minsculas posicao:=lista.IndexOf('E-STRING 1'); if (posicao<0) then Showmessage('String "E-STRING 1" no encontrada') Else Showmessage('String "E-STRING 1" encontrada na posio '+inttostr(posicao));
//Gerar erro em caso de duplicao s funciona se a lista estiver marcada para ordenar na insero Lista.Sorted:=True;//indica que a lista ser ordenada a cada insero Lista.Duplicates:=dupError;//indicando que dever gerar erro se inserir um item duplicado
Try Lista.Add('e-String 1');//forando o erro Finally FreeAndNil(Lista); End;
end;
Entendendo as funes usadas no exemplo
Lista:=TStringList.Create;
Neste comando estamos instanciando a classe TstringList na varivel Lista (criando ela na memria)
Lista.Clear;//limpa os itens
O mtodo clear limpa os itens da lista, apagando-os
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 42 de 90 Verso 05/04/2013 Lista.Sorted:=False;//indica que a lista no ser ordenada a cada insero
O mtodo sorted indica se a lista ser ordenada ou no a cada insero de itens.
Lista.Add('e-String 1');
O mtodo add insere um novo item a lista
Showmessage ('Lista Completa: '+#13+Lista.Text);
No exemplo acima estamos usando o mtodo text que retorna uma string com a concatenao de todas as strings da lista, note que na caixa de mensagem ele mostrou um item por linha, isso se d pelo fato que o separador dos itens na lista so caracteres de quebra de linha e retorno (#13 e #10)
Showmessage (lista[2]);
No exemplo acima estamos acessando um item especfico da lista, este comando retorna uma string com o valor do item, o item de posio 3 da lista, digitamos 2 no exemplo porque o primeiro item da lista o item 0.
for cont := 0 to lista.Count-1 do
No exemplo acima estamos usando o comando COUNT que um mtodo que retorna a quantidade de itens da lista
lista.Delete(2);
O mtodo delete exclui um item da lista, no exemplo estamos excluindo o terceiro item da lista
Lista.Sort;
O mtodo SORT ordena os itens da lista em ordem alfabtica
Lista.CaseSensitive:=true;
O mtodo CaseSensitive indica se a pesquisa dever considerar a diferena entre maisculas e minsculas ou no.
posicao:=lista.IndexOf('E-STRING 1');
O mtodo INDEXOF( ) retorna o ndice do texto pesquisado dentro da lista, caso no seja encontrado retorna o valor -1
FreeAndNil(Lista);
O mtodo FreeAndNil um mtodo utilizado para desalocar (destruir) memria de objetos e setar a varivel para nil aps isso, caso esqueamos de destruir um objeto instanciado manualmente geraremos fuga (leaks) de memria em nossa aplicao.
A regra geral : Todo objeto que construmos manualmente, sem ligao de parents, temos que desaloc-lo manualmente. A StringList um exemplo de classe que deve ser desalocada manualmente pois em sua criao no permite que adicionemos um parent.
Lista.Duplicates:=dupError;
O mtodo Duplicates indicar como a Lista se comportar se receber um item duplicado, este mtodo s pode ser usado para gerar erro se a lista estiver marcada para ser ordenada durante a insero (Sorted=True) caso contrrio ele no ter efeito algum. No exemplo acima Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 43 de 90 Verso 05/04/2013 foi configurado para gerar erro em caso de duplicao de itens, porm para testar esse mtodo necessrio que usemos o bloco de tratamento de excees (Try Except) caso contrrio a exceo gerada pelo erro ir desviar o programa e a linha do freeandnil no ser executada, para garantirmos essa execuo iremos utilizar o Bloco Try Finally
Blocos Try Finally
O bloco Try Finally utilizado quando queremos garantir que determinado comando seja executado independente de algum erro que possa ocorrer, ou no, mesmo que seja executado o comando exit; para sairmos de uma rotina, o comando que se encontra dentro do bloco Finally ser executado.
Try Lista.Add('e-String 1');//forando o erro Finally FreeAndNil(Lista); End;
No exemplo acima, a lista que tentaremos adicionar um novo item igual a outro ir gerar um erro, caso no tivssemos o bloco try finally o programa encerraria a execuo do procedimento nesta linha, como temos um bloco try finally obrigatoriamente ele ir passar pelos comandos que se encontram dentro do bloco Finally, neste caso o comando de liberao de memria (freeandnil), poderamos utilizar tambm um bloco TryExcept, porm qualquer outro desvio da aplicao pularia o comando de desalocao, o correto no uso do Try Finally envolver todo o cdigo logo aps o comando create. O Correto seria:
Lista:=TStringList.Create;
Try .... todo os comandos.... ... ... Finally FreeAndNil(Lista); End;
Memo = Memorando
Encontrado na Palheta Standard
uma caixa de entrada com mltiplas linhas.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 44 de 90 Verso 05/04/2013
Principais Propriedades
Align, Aligment, BorderStyle, CharCase, Color, Font, Enabled, MaxLength, Height, Width, WordWrap (estudado em outros componentes)
WantReturns = Indica se o Memo aceitar o uso da tecla ENTER para criar novas linhas WantTabs = Indica se o Memo aceitar o uso de TABS dentro do MEMO Text = Retorna uma String com todo o texto do Memo.
Lines = Propriedade do Tipo TStrings, controla as linhas do mesmo, podem ser aplicadas a ela os mtodos : clear, add, text, delete, indexof, count e acesso a itens [ ] , entre outros. Lines .SaveToFile(nomearquivo); = salva o contedo do Lines em um arquivo fsico Lines.LoadfromFile(nomedoarquivo); = carrega o contedo de um arquivo texto para as linhas do memo.
Exemplo de Manipulao da propriedade Lines do Tmemo
procedure TFprincipal.Button3Click(Sender: TObject); begin Memo1.Lines.Clear; Memo1.Lines.Add('Linha um'); Memo1.Lines.Add('Linha Dois'); Memo1.Lines.add('Linha Trs'); Showmessage(Memo1.Lines.text); Memo1.Lines.Delete(1); Showmessage(Memo1.Lines.text); Showmessage('A posio do texto "Linha Trs" '+inttostr(Memo1.Lines.IndexOf('LINHA TRS'))); Showmessage('A quantidade de Linhas '+inttostr(Memo1.Lines.Count) ); Memo1.Lines.savetofile('c:\temp\teste.txt');//salvando as linhas em um arquivo Memo1.lines.clear; Memo1.Lines.loadfromfile('c:\temp\teste.txt');//Abrindo um arquivo texto end;
Principais Eventos
OnChange, OnClick, OnEnter, OnExit, OnKeyPress, OnKeyDown, OnKeyUp (estudado em outros componentes)
ListBox = Caixa de Listagem
Encontrado na Palheta Standard uma Caixa de Listagens de Itens, semelhante ao memo mas no permite a entrada de itens digitando dentro do ListBox, necessrio adicion-lo via comando. Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 45 de 90 Verso 05/04/2013
Principais Propriedades
Align, BorderStyle, Color, Font, Enabled, Height, Width (estudado em outros componentes)
Sorted = Indica se a lista ser ordenada na insero ItemIndex = Indica qual a posio do Item que est selecionado, se nenhum estiver selecionado retorna -1
Exemplo de Uso
procedure TFprincipal.Button6Click(Sender: TObject); begin Showmessage('Item selecionado '+inttostr(ListBox1.ItemIndex)+' '+ListBox1.Items[ListBox1.ItemIndex]); end;
ITEMS = Propriedade do Tipo TStrings, controla as linhas do TListBox, podem ser aplicadas a ela os mtodos : clear, add, text, delete, indexof, count e acesso a itens [ ] , entre outros.
Principais Eventos
OnClick, OnEnter, OnExit, OnKeyPress, OnKeyDown, OnKeyUp (estudado em outros componentes)
ComboBox = Caixa Combo
uma caixa com uma lista suspenda de itens. Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 46 de 90 Verso 05/04/2013
Principais Propriedades
Align, CharCase, Color, Font, Enabled, Height, Width, Sorted, ItemIndex (estudado em outros componentes)
DropDownCount = Quantidade de Itens que sero mostrados na lista sem a barra de rolagem. Text = Texto que est sendo mostrado no Combo, nem sempre ele est associado a um item da lista, ele pode estar associado ao itemindex= -1
ITEMS = Propriedade do Tipo TStrings, controla as linhas do mesmo, podem ser aplicadas a ela os mtodos : clear, add, text, delete, indexof, count e acesso a itens [ ] , entre outros.
Principais Eventos
OnChange, OnClick, OnEnter, OnExit, OnKeyPress, OnKeyDown, OnKeyUp (estudado em outros componentes)
RadioGroup = Grupo de RadioButton
um Grupo da RadioButtons
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 47 de 90 Verso 05/04/2013 Principais Propriedades
Align, Color, Font, Enabled, Height, Width, ItemIndex (estudado em outros componentes)
ITEMS = Propriedade do Tipo TStrings, controla as linhas do mesmo, podem ser aplicadas a ela os mtodos : clear, add, text, delete, indexof, count e acesso a itens [ ] , entre outros.
Principais Eventos
OnClick, OnEnter, OnExit (estudado em outros componentes)
TabbedNotebook
Encontrado na Palheta Win 3.1
Principais Propriedades
PageIndex : Propriedade do Tipo integer que usamos para saber qual a pgina atual e para trocar a pgina atual. Style : Configura o Estilo visual da Aba, os estilos so: tsButtons, tsFlatButtons,
Pages = Propriedade do Tipo TStrings que configura as pginas, clique no boto (...) para iniciar o editor de Pginas do Componente, neste editor possvel editar o nome das pginas, adicionar ou excluir novas pginas e alterar a disposio das mesmas.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 48 de 90 Verso 05/04/2013
Principais Eventos
OnChange(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);
Esse evento invocado quando ocorre uma tentative de mudana de Aba, o parmetro NewTab indica a aba que ser mostrada e o parmetro AllowChange indica se ser permitida ou no a mudana, sete esse parmetro para false e a mudana no ocorrer.
PageControls
Encontrado na Aba Win32
Principais Propriedades
TabIndex : Propriedade do Tipo integer que usamos para saber qual a Pgina atual e para trocar a pgina atual. Style : Configura o Estilo visual da Aba, os estilos so: tsButtons, tsFlatButtons, tsTabs TabPosition : Configura a posio da Aba, s funciona para o Estilho tsTabs
Principais Eventos
Onchanging : Mtodo que invocado ao tentar mudar de aba, ele antecede a mudana, podendo inclusive ser usado para abortar a mudana.
Sintaxe: TabControl1Changing(Sender: TObject; var AllowChange: Boolean);
O parmetro AllowChange serve para indicar se ser permitido ou no a mudana, alterando para false a mudana no ocorrer.
OnChange : Mtodo que invocado aps a mudana de aba.
Para criar novas Abas clique com o boto direito e escolha a Opo New Page
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 49 de 90 Verso 05/04/2013
TrackBar
Encontrado na palheta Win32
Principais propriedades
Min Valor Mnimo da Trilha Max Valor Mximo Frequency Frequncia que ser usada ao arrastar (incremento) Position Posio atual SelStart Incio da Seleo SelEnd Fim da Seleo SliderVisible Indica se o marcador da trilha ser visvel ShowSelRange Indica se mostra ou no a faixa de seleo TickMarks Indica a posio dos marcadores (embaixo, cima ou duplo)
Principal Evento
OnChange Invicado toda vez que ocorre uma mudana no Track
ProgressBar
Encontrado na palheta Win32
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 50 de 90 Verso 05/04/2013
Principais Propriedades
Min, Max, Position (Estudados em outros componentes)
StatusBar
Encontrado na palheta Win32
Principais Propriedades
Panels = Propriedade do tipo TstatusPanels, nesta propriedade configuramos os painis que sero usados para mostrar informaes de Status.
Clique no boto (...) desta propriedade ou cliente com o boto direito sobre o componente no formulrio e escolha a Opo Panels Editor
No Editor clique na opo Add New, adicione quantos painis desejar
Depois configure as opes dos painis, conforme a figura abaixo: Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 51 de 90 Verso 05/04/2013
possvel configurar o estilo, o texto, a largura do Painel entre outras opes.
Para acessar o texto do painel via cdigo use a propriedade Panels, no exemplo estamos alterando o texto do Panel com ndice zero, para acessar outros painis altere o valor do ndice.
StatusBar1.Panels[0].Text:='Teste';
ToolBar
Encontrado na palheta Win32
A Toolbar uma barra de ferramentas, ideal para adicionar botes. Para adicionar um boto clique com o boto direito e escolha a Opo New Button, possvel tambm adicionar separadores visuais entre os botes, para isso clique com o boto direito e escolha a opo New Separator
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 52 de 90 Verso 05/04/2013
possvel configurar cada boto da ToolBar individualmente, basta selecionar o boto que deseja alterar as propriedades.
Adicionando imagens nos botes
Para adicionar imagens nos botes necessrio utilizar um ImageList, pois os botes no possuem uma propriedade para inserir uma imagem por boto.
Adicione um ImageList
Timers
Encontrado na Palheta System
O Timer serve para executar cdigos a cada X milissegundos.
Principais Propriedades
Enabled = Inicia ou para o timer e indica se o mesmo ativado ou no Interval = Inteiro que indica a quantidade de milissegundos que o timer ir temporizar at a prxima execuo (1000 = 1segundo)
Evento
OnTimer = Este evento disparado quando o tempo configurado em Interval estourar, lembre-se de desativar o timer dentro deste evento para evitar que o mesmo seja chamado recursivamente caso o intervalo seja muito pequeno, ou caso o cdigo que seja executado neste evento seja muito demorado. Uma dica usar um bloco Try Finally. Exemplo:
procedure TForm8.Timer1Timer(Sender: TObject); begin Timer1.Enabled:=False;
Try Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 53 de 90 Verso 05/04/2013 // Adicione aqui neste o bloco de cdigos que deseja executar a cada //Execuo do Timer
Finally Timer1.Enabled:=True; End;
end;
StringGrid
Encontrado na palheta Additional
O componente StringGrid um componente que implementa uma grade (linhas e colunas) de Strings, um componente muito interessante para mostrar mltiplas informaes.
Principais Propriedades
ColCount : Inteiro que indica quantas colunas tero a Grid RowCount : Inteiro que indica quantas linhas tero a Grid FixedCols : Inteiro que indica quantas colunas fixas tero a Grid FixedRows : Inteiro que indica quantas linhas fixas tero a grid FixedColor : Cor das Colunas e Linhas Fixas Row : Inteiro que Indica a linha atual ou altera a linha atual Col : Inteiro que Indica a coluna atual ou altera a coluna atual
Options : Conjunto de Opes, listamos abaixo as mais importantes goFixedVertLine : Indica se Mostrar as linhas de diviso vertical nas colunas fixas goFixedHorzLine : Indica se mostrar as linhas de diviso horizontal nas linhas fixas Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 54 de 90 Verso 05/04/2013 goVertLine : Indica se mostrar as linhas verticais goHorzLIne : Indica se mostrar as linhas horizontais goRangeSelect : Indica se permitir seleo em faixas de clulas goDrawFocusSelected: Indica se a clula de foco ser desenhada como selecionada goRowSizing : Indica se as linhas podero ser redimensionadas goColSizing : Indica se as colunas podero ser redimensionadas goEditing : Indica se permitir a edio dos dados das clulas goTabs : Indica se o tab funcionar como navegao entre as clulas goRowSelect : Indica se a linha ficar toda selecionada goAlwaysShowEditor : Indica se sempre as clulas estaro em edio, sem necessidade de pressionar alguma tecla para entrar em modo de edio.
Cells : Propriedade para acessar e alterando os dados das clulas
No exemplo abaixo estamos alterando o contedo da clulas posicionada na coluna 0 e na linha 1.
StringGrid1.Cells[0,1]:='Teste Col 0 Linha 1';
Exemplo de um Grid preenchido
Acessando colunas e linhas inteiras
Propriedades Rows e Cols
Exemplos:
Rows[0].clear; //limpando a linha zero Cols[1].clear;//limpando a coluna um
Rows[0].text; //acessando todo o texto, todos os itens, da linha zero
Cols[1].indexof(abc); //procurando a palavra abc na coluna 1 se existir ele retorna o ndice do item, que corresponde a linha que ele se encontra.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 55 de 90 Verso 05/04/2013 Funes Importantes
ExtractFilePath(Application.ExeName);
Retorna uma string com o caminho da aplicao.
FileExists(pcaminhodoexe);
Retorna se o arquivo indicando na string do parmetro existe ou no
Criando Units
Muitas vezes necessrio o reaproveitamento de cdigo, sendo assim a melhor maneira criando funes que podem ser usadas diversas units ou at mesmo por diversos projetos, para isso necessrio a criao de units, desvinculadas de formulrios, contendo as funes importantes a serem reutilizadas, como orientao a objeto foge do escopo deste curso ensinaremos a criao de units simples com funes.
Para criar uma nova unit
Menu File \ New \ Unit - Delphi
A nova unit ser criada com um nome padro, salve essa unit no menu File \ Save
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 56 de 90 Verso 05/04/2013
No exemplo abaixo salve minha unit com o nome de Uglobal
Na seo de interface digitaremos o cabealho das funes e na seo implementation a implementao da funo.
No exemplo abaixo criaremos uma funo que mostra uma mensagem de informao recebendo como parmetro uma string com a mensagem que desejamos que seja mostrada
Veja que foi necessrio a declarao do uso da unit Vcl.dialogs, pois a funo Messagedlg j estudada anteriormente pertence a unit.
Agora se quisermos aproveitar essa funo em nosso programa basta que declaremos o uso da Unit Uglobal nas units que queremos us-la.
Como exemplo chamaremos a funo a partir do click de um boto em outra unit.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 57 de 90 Verso 05/04/2013
Veja no exemplo acima que para poder utilizar as funes da unit Uglobal tivemos que declarar o uso dela na seo implementation do form, isso pode ser feito utilizando o atalho Alt+F11 e escolhendo a unit que desejamos usar.
Regra Importante
Como no estamos trabalhando com orientao a objetos, no caso do uso de mltiplos procedimentos ou funes em uma unit em que uma funo pode utilizar outra da mesma unit, devemos declar-los na ordem de criao correta, ou seja, a funo que ser chamada por outra dever estar implementada antes da funo que a usar. Exemplo de um erro:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 58 de 90 Verso 05/04/2013
A funo MostraMensagem2 no foi encontrada porque foi declarada depois da funo que necessita utiliz-la. O correto seria:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 59 de 90 Verso 05/04/2013
Passagem de Parmetro com classes
Quando passarmos uma classe de parmetro estamos passando necessariamente como referncia, ou seja, tudo que modificarmos dentro da funo no parmetro, estar modificando a classe original, portanto podemos passar qualquer classe de parmetro para funes, desde botes, labels ou at mesmo formulrios. Veja o exemplo de um procedimento na nossa unit UGlobal que recebe um formulrio de parmetro e troca o caption do mesmo.
Veja que a Unit Vcl.Forms teve que ser declarada na seo interface porque a classe TForm est presente no parmetro da funo.
Para testar basta por um boto em um formulrio e chamar a funo:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 60 de 90 Verso 05/04/2013
DELPHI COM FIREBIRD
No est no escopo do Curso, mas faremos uma breve apresentao sobre o uso de banco de dados Firebird com Delphi, no pretendemos abordar teorias de banco de dados neste curso, supe-se que o aluno j conhea uma teoria fundamental de banco de dados envolvendo: Tabelas, Chaves Primrias, Chaves Estrangeiras, Vises, Procedimentos, Gatilhos (triggers), bem como os comandos sql : Select, Insert, Update e Delete
Criao de um novo banco de dados
Entre no IboConsole, conecte-se ao servidor local, o usurio e senha padro do firebird so:
Sysdba masterkey
Clique com o boto direito sobre a opo databases e escolha a opo Create Database
Escolha o arquivo que deseja criar
Digite um nome no Alias (Apelido) que ser mostrado na rvore de databases.
Abra o Interactive SQL para execuo de comandos SQL
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 61 de 90 Verso 05/04/2013
Para executar comandos utilize a opo Execute Query, ou use um dos atalhos CTRL + E ou CTRL+ENTER
Para navegar entre os comandos j executados use CTRL+P e CTRL+N (previous e next), ou use os botes de atalho.
Criando Tabelas
CREATE TABLE TABAGENDA ( CODIGO INTEGER NOT NULL, NOME VARCHAR(100), TELEFONE VARCHAR(20), DATANASCIMENTO DATE, SALARIO DECIMAL(6,2), Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 62 de 90 Verso 05/04/2013 HORACADASTRO TIME,
PRIMARY KEY (CODIGO) );
No exemplo acima criamos uma tabela com diversos campos, os tipos usados acima foram
Integer = Inteiro Varchar(100) = String de 100 caracteres Varchar(20) = String de 20 caracteres Date = Data Decimal(6,2) = ponto fluante com preciso de duas casas decimais Time = Hora
Foi definido que o campo cdigo no poder ser nulo
CODIGO INTEGER NOT NULL,
Foi definido que o campo cdigo ser a chave primria da tabela, ou seja, no poder se repetir:
PRIMARY KEY (CODIGO)
Comando Insert
Sintaxe
Insert into nometabela (campos) values (valores dos campos);
No exemplo abaixo estamos inserindo um registro com o cdigo 1 e o nome JOO, os demais campos (colunas) ficaro com nulos pois no foram preenchidos no SQL
insert into tabagenda (codigo,nome) values (1,'JOO');
No exemplo abaixo vamos inserir um registro completo com as seguintes informaes
Cdigo 2 Nome Natal Telefone 3411-7777 Data de Nascimento 31/12/2000 Salrio 1500,75 Hora do Cadastro 14:25
insert into tabagenda (codigo,nome,telefone,datanascimento,salario,horacadastro) values (2,'Natal','3411-7777','12/31/2000',1500.75,'14:25')
Veja no exemplo acima que os tipos Varchar, Date e Time foram inseridos utilizando um apstrofo delimitando o contedo, o tipo Date no formato mm/dd/yyyy ou seja ms/dia/ano e que o tipo Decimal quando temos valores decimais delimitamos por . (ponto) e no utilizamos o separador de milhar.
Comando Select simples
Estrutura simples
Select campos from nomedatabela
Exemplo Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 63 de 90 Verso 05/04/2013
Select codigo,nome from tabagenda
Podemos utilizar o * (asterisco) para que o comando retorno todos os campos (colunas)
Select * from tabagenda
Comando Select simples com filtro where
Select campos from nometabela where REGRAS
Exemplos
Select * from tabagenda where codigo=1
Select * from tabagenda where nome=Natal
Select * from tabagenda where codigo>0
Select * from tabagenda where codigo<>1
Usando and
Select * from tabagenda where codigo>0 and nome=Natal
Usando or
Select * from tabagenda where codigo=1 or nome=Natal
Usando and e or
Select * from tabagenda where (codigo=1 or codigo=2 ) and Nome<>TESTE
Verificando nulos
Select * from tabagenda where telefone is null
Verificando no nulos
Select * from tabagenda where not telefone is null
Pesquisando Substrings com like
O % indica qualquer coisa
No exemplo abaixo pesquisamos nomes que contenham a letra a minscula em qualquer parte do nome
Select * from tabagenda where nome like '%a%'
No exemplo abaixo pesquisamos nomes que contenham a letra N maiscula no incio
Select * from tabagenda where nome like 'N%'
No exemplo abaixo pesquisamos nomes que contenham a letra O maiscula no fim
Select * from tabagenda where nome like '%O'
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 64 de 90 Verso 05/04/2013 Se no quisermos diferenciar maisculas e minsculas podemos usar o comando Upper
No exemplo abaixo estamos pesquisando os nomes que contem a letra A independente de ser maiscula ou minscula, pois estamos convertendo o resultado da pesquisa em maiscula.
Select * from tabagenda where upper(nome) like '%A%'
Comando Select com ordenao do resultado (order by)
Ordenando os resultados pelo nome
Select * from tabagenda where upper(nome) like '%A%' Order by nome
Ordenando os resultados pelo nome em ordem descrescente
Select * from tabagenda where upper(nome) like '%A%' order by nome desc
Ordenando pelo nome logo em seguida pelo codigo
Select * from tabagenda where upper(nome) like '%A%' order by nome,codigo
Comando Update
Sintaxe do comando
Update nometabela set campo=novovalor where filtros
Se o where for omitido, todos os registros da tabela sero afetados
Exemplo de alterao do nome no registro codigo=1
update tabagenda set nome='Joo da Cruz' where codigo=1
Exemplo de alterao do nome e do telefone no registro codigo=1
update tabagenda set nome='Joo da Cruz', telefone=3411-4444 where codigo=1
Exemplo de alterao do horacadastro de todos os registros
update tabagenda set horacadastro='10:00'
Comando Delete
Sintaxe
Delete from nomedatabela where condicaodefiltragem
Exemplo
Delete from tabagenda where cdigo=1; Delete from tabagenda where nome like %tal%
Controle Transacional
Comando Commit
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 65 de 90 Verso 05/04/2013 Confirma as alteraes
Comando Rollback
Desfaz as alteraes no confirmadas
PALHETA INTERBASE NO DELPHI
Usaremos a palheta Interbase para conexo com banco de dados Firebird
Para o primeiro exemplo faremos toda a conexo e acesso ao banco em um nico formulrio, para isso adicione um componente IbDatabase e um IbTransaction
Ibdatabase
Este componente responsvel por efetuar a conexo com o Banco de Dados, nele que configuraremos o caminho do arquivo o usurio e a senha do Banco de Dados. Voc pode configur-lo clicando duas vezes sobre o componente ou configurando propriedade a propriedade no Object Inspector.
Segue abaixo um exemplo de uma configurao de conexo a um banco de dados local, j configurando o caminho do banco de dados, o usurio e a senha.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 66 de 90 Verso 05/04/2013
Clique no boto Test para testar se as informaes esto corretas.
Aps isso configure a propriedade Default Transaction com a transao adicionada.
IbTransaction
Clique duas vezes sobre o componente e configure a opo Transaction Properties para Read Commited
Essa configurao indica que s veremos os dados j comitados, caso alguma outra transao esteja aberta no conseguiremos enxergar as alteraes enquanto ela no for commitada.
Para saber mais sobre transaes recomendo a leitura deste artigo: http://www.firebase.com.br/fb/artigo.php?id=2461
Depois no Object Inspector configure a propriedade DefaultAction para TARollBackRetaining, isso indicar que quando a aplicao no efetuar um commit ou um rollback em caso de encerramento da transao ele aplicar como Default (padro) um RollBackRetaining, perdendo as alteraes que foram feitas na transao corrente.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 67 de 90 Verso 05/04/2013
J temos uma conexo preparada, no OnShow do Formulrio vamos abrir a conexo e no OnClose vamos encerrar a conexo.
Ibquery
Ibquery o componente que nos d a liberdade de executarmos qualquer tipo de SQL no banco de dados.
Configure a propriedade Database ligando-a a IbDatabase1.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 68 de 90 Verso 05/04/2013
Os comandos SQL so configurandos na propriedade SQL da IBquery, que do tipo TSTRINGS.
Exemplo de um comando de Seleo com a Query.
Seguindo a sequncia dos comandos:
Ibquery1.Close;
Fecha a Query que estiver aberta, no podemos executar outra query sem antes fechar a query anterior
Ibquery1.Sql.clear;
Limpa o comando SQL que do tipo TSTRINGS
Ibquery1.Sql.add(...);
Adiciona um comando a propriedade SQL que do tipo TSTRINGS
Ibquery1.Open;
Executa o comando digitado na propriedade SQL, caso o comando esteja errado ser gerado uma excesso, use o tratamento de excesso (TRY EXCEPT) para controlar isso. Comandos SELECT usam o comando OPEN, comandos insert, update e delete usam o comando EXECSQL.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 69 de 90 Verso 05/04/2013 Visualizando os dados da Query
Para visualizar os dados da Query usaremos um DBGRID da palheta Data Controls, porm para ligar o DBGRID a Query necessrio um componente da palheta Data Access, o TDataSource.
Configure a propriedade Dataset do DataSource apontando para a IbQuery
Configure a propriedade DataSource do DBGRID apontando para o DataSource1
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 70 de 90 Verso 05/04/2013
Criando um programa que permite a execuo de SQLs dinmicos
Adicione um MEMO no FORM e modifique o fonte do boto para:
Veja que agora os comandos a serem executados sero os comandos digitados no MEMO1.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 71 de 90 Verso 05/04/2013 Executando comandos Insert, Update e Delete
Para executar estes comandos necessrio trocar o comando Open para ExecSql, esses comandos no retornam resultados.
Adicione um novo boto no FORM e adicione o cdigo abaixo:
Toda vez que esses comando so executados eles geram transaes para controlar as alteraes, quem responsvel por estas transaes o Componente IbTransaction, os comandos Commit e Rollback devem ser usados como:
Ibtransaction1.CommitRetaining;
IbTransaction1.RollBackRetaining;
Existem tambm os comandos commit e rollback, mas no recomendo o uso pois ele fecha o dataset depois de executados.
Para testar as transaes crie dois botes na aplicao um para cada comando, conforme exemplo:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 72 de 90 Verso 05/04/2013
Agora basta executar comandos de update, insert e delete e testar o uso das transaes.
Navegando pelos Registros Retornados
possvel navegar pelos registros retornados por uma consulta SQL, para isso dispomos dos comandos abaixo;
First; Move o cursor para o primeiro registro, por default quando a consulta executada o cursor j se encontra no primeiro registro.
Last; Move o cursor para o ltimo registro. Quando estamos neste registro e tentamos nos mover mais um, a varivel EOF recebe o valor true, indicando que chegamos ao final do resultado (EOF = End of file).
Prior; Move o cursor para o registro anterior ao atual.
Next; Move o cursor para o prximo registro.
Para exemplificar crie e codifique os botes conforme exemplo abaixo: Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 73 de 90 Verso 05/04/2013
Acessando os dados dos registros retornados, via Cdigo
O resultado de uma consulta SQL preenche o que chamamos de Fields (campos), assim podemos acessar cada Campo (coluna) do resultado retornado. Veja abaixo alguns comandos que podem ser usados
Ibquery1.RecordCount; Retorna quantos registros foram retornados na consulta SQL, no um comando aconselhvel pois para que ele retorne o resultado completo necessrio que ele navegue por todos os resultados para poder cont-los, ele pode ser til em casos de saber se retornou 0 ou no, por exemplo, agora em caso de saber exatamente quantos registros retornados, recomendo Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 74 de 90 Verso 05/04/2013 que primeiro seja dado um last para mover o cursor para o ltimo registro, e logo aps seja lido o valor de recordcount, isso trar maior confiabilidade no resultado, mas no uma tcnica adequada para resultados com grande volume de dados, pois necessrio que todos os registros sejam descarregados para a aplicao para que o recordcount retorne o valor correto.
IbQuery1.Fields.Count; Retorna quantos campos (colunas) foram retornadas na consulta
Acessando o Valor dos Fields pelo ndice do retorno
IBQuery1.Fields[0].AsString
Neste exemplo estamos capturando o valor da primeira coluna do Retorno, se o nosso sql tivesse retornado as colunas Codigo|Nome|Valor estaramos resgatando o valor da Coluna Cdigo.
AsString representa que queremos o resultado convertido em uma string, podemos usar as seguintes converses:
Acessando o Valor do Retorno pelo Nome do Campo (coluna)
IBQuery1.FieldByName('codigo').asstring
Neste exemplo estamos resgatando o valor da coluna cdigo, independente da posio dela no resultado e estamos convertendo esse valor para String.
Exemplo de uma consulta SQL que retorna apenas o cdigo de uma tabela, mostraremos todos os registros do resultado em caixas de mensagem (showmessage)
Passando parmetros
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 75 de 90 Verso 05/04/2013 Quando desejamos passar um parmetro para um comando, seja sele uma consulta, uma insero, uma modificao ou at mesmo uma deleo, podemos usar o comando ParamByName. Exemplo:
Veja que no comando foi adicionado um parmetro delimitado pelo :pcodigo isso indica ao componente que naquele local do comando ser inserido o valor do parmetro PCODIGO, para preencher esse valor usamos o comando
Ibquery1.ParamByName(pcodigo).asinteger:=1;
Ou seja, indicamos ao componente para atribuir ao parmetro PCODIGO o valor 1 em inteiro, no final o sql montado da seguinte maneira:
O uso de parmetros nos d liberdade de montarmos sqls mais facilmente, sem nos preocuparmos com algumas regras de acordo com o tipo do campo. Exemplo:
Suponha que a coluna NOME seja do tipo varchar, ou seja, STRING, o correto em uma consulta como essa seria usar o Apstrofo para delimitar o resultado que queremos consultar, ou seja, ela deveria ser construda assim:
Select * from tabteste where nome=JOSE
Porm se fssemos fazer isso no componente precisaramos cuidar a questo do apstrofo que j delimitador de strings no delphi, ento precisaramos dobrar o apstrofo para que o compilador no gere um erro, da seguinte maneira
Ibquery1.sql.add(Select * from tabteste where nome=JOSE );
Ou teramos que construir o sql usando concatenao de valores da seguinte maneira:
Ibquery1.sql.add('select * from tabteste where nome='+#39+'JOSE'+#39);
Agora usando o parmetro e indicando que o tipo do parmetro string (asstring) o prprio componente se encarrega de montar o sql corretamente j adicionando o apstrofo no valor.
Assim como podemos usar os diversos tipos
Ascurrency (o prprio componente adicionar o ponto se contiver valores decimais) As Date ( o prprio componente ir adicionar o apstrofo e inverter mm/dd/yyyy)
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 76 de 90 Verso 05/04/2013
Resgatando um registro do DBGRID
Para saber em que linha do resultado o DBGRID encontra-se posicionado, basta acessarmos o Dataset que gerou o resultado, ou seja, nos nossos exemplos a IbQuery1, o fato de caminharmos, ou seja deslocarmos o ponteiro no DBGRID na verdade estamos caminhando no resultado da Ibquery, porm possvel fazer um acesso atravs do DBGRID. Exemplo:
Veja a Ordem, o Grid acessa o DataSource, que Acessa o Dataset que no nosso exemplo a IbQuery1
O mesmo comando poderia ser escrito da seguinte maneira:
Ibquery1.Fieldbyname(codigo).asstring
Usando o TDbNavigator
Esse componente encontra-se na palheta Data Controls, e serve para navegar pelos resultados.
Configure a propriedade DataSource ao DataSource1
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 77 de 90 Verso 05/04/2013
A propriedade VisibleButtons, indica quais botes devem ser mostrados, podemos omitir botes que no sero usados, como os botes de insert, delete....
Como nosso datasource est ligado a um dataset Ibquery os botes de alterao dos dados no so habilitados, eles se habilitariam se estivssemos trabalhando com outros componentes, como por exemplo o IbDataset que um componente que configuramos os sqls de modificao dos dados e de seleo, ou um IbTable.
Chave Primria controlada pelo Banco de Dados
Um dos recursos disponveis para controlar a chave primria como sendo sempre nica e controlar a concorrncia de mltiplos usurios para que no ocorra a duplicao de chaves o uso dos generators
Um generator um cdigo incremental que pode ser incrementado ou decrementado pela aplicao ou pelo prprio banco de dados atravs de procedures e triggers.
Criaremos um generator de exemplo, para isso execute o seguinte comando no ISQL
CREATE GENERATOR GENTESTE;
Comando Sql para Incrementar um Generator e resgatar seu resultado
SELECT GEN_ID(GENTESTE,1) CODIGO FROM RDB$DATABASE
Exemplo no Delphi, usando um component IbQuery Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 78 de 90 Verso 05/04/2013
Usando DataModule no Delphi
DataModule um local especial para abrigarmos nossos coponentes de acesso a dados, podem tambm abrigar outros componentes que no sejam visuais, uma forma interessante de concentrarmos componentes para diversos formulrios.
Para criar um DataModule
Menu File \ New \ Other
Na janela New Itens escolha a categoria Delphi Files \ Data Module
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 79 de 90 Verso 05/04/2013
Exemplo de um DataModulo concentrando os principais componentes de acesso ao banco de dados
Para usar os componentes do DataModulo em outras units basta acrescentar a Unit do DataModulo a lista de uses da unit desejada.
Usando Arquivos INI para resgatar o caminho no Banco de Dados Dinamicamente
Uma das formas de se resgatar o caminho do banco de dados dinamicamente atravs de um arquivo INI, que nada mais que um arquivo texto com um padro, de ele pode ser usado para guardar diversas informaes do sistema, como por exemplo o caminho do banco de dados e o usurio padro.
Arquivos INI so arquivos de texto simples com uma estrutura bsica. So normalmente associados com o Microsoft Windows, mas tambm so utilizados em outras plataformas...
Propriedades
O elemento bsico contido em um arquivo INI a propriedade (ou parmetro). Toda propriedade tem um nome e um valor, delimitado por um sinal de igual(=). O nome aparece esquerda do sinal de igual.
nome=valor
Sees
Propriedades podem ser agrupadas em sees nomeadas arbitrariamente. O nome da seo aparece em uma nica linha, entre colchetes ([ e ]). Todas as propriedades aps a declarao da seo so associadas a esta seo. No h um delimitador explcito de "final de seo"; sees terminam na prxima declarao de seo ou no final do arquivo. Sees no podem ser aninhadas.
[seo]
Comentrios Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 80 de 90 Verso 05/04/2013 Ponto-e-vrgula(;) indica o incio de um comentrio. Comentrios continuam at o final da linha. Qualquer coisa entre o ponto e vrgula e o final da linha ignorada. ; texto de comentrio Fonte: http://pt.wikipedia.org/wiki/INI_%28formato_de_arquivo%29
Exemplo de um arquivo INI
[CONFIGURACOES]
caminho=D:\AULA\Agenda\Agenda.FDB
Exemplo de Como resgatar o caminho do banco de dados atravs de um Arquivo INI
Exemplo de como Configurar a IbDatabase dinamicamente com o caminho do banco de dados o usurio e a senha
No boto OnClick do Boto OK
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 81 de 90 Verso 05/04/2013
Componente IbTable
O componente IBTable no um componente muito recomendado, devido a sua lentido no tratamento dos dados e de sua pobreza em relao a pesquisas, pois no trabalha com comandos SQL. Porm ele pode ser til em situaes simples, como por exemplo um DBGRID editvel para trabalhar com pequeno volume de dados.
Exemplo de uso de um IbTable com DBGRID editvel
Adicione um Ibtable e faa a ligao dele com a IBDatabase
Em um formulrio especfico, adicione um DBGRID um DBNavigator e um DataSource.
Faa a ligao do DataSource a IbTable atravs da propriedade DataSet.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 82 de 90 Verso 05/04/2013
Faa a ligao do DbGrid e do DbNavigator ao DataSource atravs da propriedade DataSource
Agora quando chamarmos esse formulrio configuraremos qual Tabela a IBTable ir se conectar e abriremos ela. Para isso adicione no OnShow do formulrio o cdigo de exemplo:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 83 de 90 Verso 05/04/2013
No OnClose do Formulrio fechamos a tabela.
Desenvolvendo um simples Relatrio com REPORT BUILDER
O report builder no nativo no Delphi Xe3, portanto deve ser adquirido e instalado.
Adicione um TppDbPipeline da Palheta RBuilder
Esse componente ser responsvel por fazer a conexo com os componentes de Dados (querys, tables...)
Adicione um TppReport da Palheta RBuilder
Esse componente ser responsvel pelo desenho do Relatrio e todo o controle de impresso.
Para que o ppDbPipeline possa se conectar a uma fonte de dados precisaremos "liga-lo a um DataSource, indico ento que seja adicionada uma query e um datasource especfico para o relatrio.
Adicione uma IbQuery, conecte-a ao Ibdatabase principal da aplicao Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 84 de 90 Verso 05/04/2013
Adicione um DataSource e ligue-o a Query do Relatrio
Faa a ligao entre o ppDbPipeline e o DataSourceRelatrio pela propriedade DataSource
Faa a ligao entre o ppReport e o ppDbPipeline pela propriedade DataPipeline do ppReport
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 85 de 90 Verso 05/04/2013
Para construirmos um relatrio ser necessrio por hora estarmos conectado ao banco de dados e com uma fonte de dados (query) aberta com dados, assim poderemos ver os campos disponveis para serem usados, porm aps construir o relatrio desconecte o Database, para que ele possa ser configurado dinamicamente, como j ensinado anteriormente, quando a aplicao estiver em execuo.
Para conectar a aplicao, configure o IBdatabase manualmente, clicando duas vezes sobre ele.
Depois passe a propriedade connected dele para True
Agora insira o SQL de pesquisa na Ibquery responsvel pelo relatrio, atravs da propriedade SQL
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 86 de 90 Verso 05/04/2013
Passe a Query para Active=True
Pronto, agora que temos nossa aplicao conectada no banco de dados e com uma query com dados, em tempo de desenvolvimento, vamos dar um duplo clique sobre o componente ppReport para desenhar nosso relatrio
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 87 de 90 Verso 05/04/2013
O Report Builder trabalha com bandas, que so regies do relatrio que so mostradas de acordo com sua funo, por exemplo:
Banda Title = Ttulo, mostrada apenas na primeira pgina do Relatrio, ideal para adicionarmos informaes da empresa, logotipos e outras informaes que s devem aparecer uma nica vez Banda Summary = Sumrio, mostrada apenas na ltima pgina do Relatrio, ideal para adicionar informaes finais, como totalizadores, frases finais, etc. Header = Cabealho, mostrado em todas as pginas na parte superior, pode ser configurada para ser mostrada ou no na primeira e na ltima folha Footer = Rodap, mostrada em todas as pginas na parte inferior da pgina, pode ser configurada para ser mostrada ou no na primeira e na ltima folha
Banda Detail = Detalhe, a banda principal do Relatrio, nela que ser mostrada as informaes detalhes, ou seja, que se repetem, no relatrio. Por exemplo em um relatrio da Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 88 de 90 Verso 05/04/2013 agenda ela ir mostrar os dados propriamente ditos da agenda, como nome, telefone... de acordo como quisermos, configuramos ela uma nica vez e ela se encarrega de se repetir quantas vezes necessria de acordo com o nmero de registros a serem mostrados.
Palheta Standard Components
So componentes padres como labels, memos, linhas, cdigos de barras, vrias de sistemas (data, hora, nmero de pgina). No so ligadas aos dados da fonte de dado, so independentes.
Palheta Data Components
So os componentes conectados a fonte de dado escolhida, composta por Labels, memos, campos calculados, cdigos de baras, etc.
Desenvolvendo um simples Relatrio
Adicione uma Label da Palheta Standard Components na Banda Header e configure sua caption para Relatrio de Agenda
Adicione tambm labels que sero usadas para Identificar as Colunas Cdigo, Nome e Telefone, conforme desenho abaixo Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 89 de 90 Verso 05/04/2013
Adicione agora 03 DbText da Palheta Data Components na Banda Detail
Alinhe-os conforme desenho abaixo
Configure agora individualmente cada DbText fazendo a ligao ao campo desejado na fonte de Dados
Para Visualizar como o relatrio est ficando clique na Aba PreView Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) Delphi Bsico Pgina 90 de 90 Verso 05/04/2013
Aps configurar o que desejar feche a janela do ReportBuilder e retorne para o projeto
No se esquea de desconectar o IbDatabase antes de distribuir sua aplicao, pois nem sempre o caminho do banco de dados ser o mesmo em todas as mquinas, e por este motivo a aplicao ir gerar erros ao executar o programa.
Como chamar o relatrio em tempo de execuo
Adicione um boto ou um menu que deseja chamar a impresso do relatrio e configure a query que ser a fornecedora de dados e simplesmente chame o mtodo PRINT do ppReport, conforme exemplo abaixo: