Prévia do material em texto
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 1 de 90
Versão 05/04/2013
CURSO DE DELPHI BÁSICO
EMBARCADERO RAD STUDIO XE3
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 2 de 90
Versão 05/04/2013
CONTEÚDO PROGRAMÁTICO
• Conhecendo a IDE do Delphi
• Projetos, Units e Formulários
• Pascal para Programadores C - Entenda as principais diferença e entendenda
a Delphi Language: Variáveis, operadores, laços de repetição (For, while e
repeat), estrutura de decisão (IF, then, else, case), Procedimento e Função,
uso de with com componentes e objetos.
• Estrutura de Programa e Escopo
• Programação 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
• Interação com o usuário através de Mensagens e Caixas de Entradas
(showmessage, messagedlg e inputquery).
• Criando Menus e Popup Menus
• Múltiplos Formulários
• O Poder da Classe StringList e o seu uso nos componentes Memo, ListBox,
Combobox e Rádio Group
• Uso da TabbedNotebook, PageControls, TrackBar e ProgressBar
• Status Bar e Toolbar
• Uso de Timers
• StringGrid básico para mostrar informações
• Criando Units com Funções
• Passando componentes e formulários de parâmetro
• Manipulando Arquivos Textos
• Desenvolvimento de um Software de Agenda com arquivo texto
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 3 de 90
Versão 05/04/2013
Conhecendo a IDE do Delphi
IDE (Integrated Development Environment), um ambiente integrado para desenvolvimento de
software
Welcome Page - Página de Boas Vindas
Nesta página você encontrará possibilidade de visualizar os projetos abertos recentemente,
criar novos projetos, verificar as novidades dos produtos Embarcadero, ter acesso a
documentação e helps entre outras funções.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 4 de 90
Versão 05/04/2013
Palheta Standard
Palheta responsável 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, porém você pode personalizar seu ambiente de trabalho, com as janelas e
posições das mesmas da forma que você preferir.
Palheta View
Responsável por Visualizar as units, formulários e alternar entre Visual (form) e Código (unit)
Palheta Debug
Palheta Responsável pela Depuração do Projeto, ou seja, compilar, compilar e executar,
pausar a depuração, fazer depuração linha a linha, entre outras opções de depuração.
Veremos a função de cada uma dessas opções mais adiante.
Tool Palette - Palheta de Ferramentas (Ctrl + Alt + P)
Nesta palheta você encontrará as ferramentas necessárias para trabalhar, quando não
estamos com nenhum projeto aberto a palheta de ferramentas mostrará os possíveis projetos
que podem ser criados.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 5 de 90
Versão 05/04/2013
No curso básico trabalharemos com projetos do tipo “VCL Forms Application”, dê dois cliques
sobre essa opção e um novo projeto será criado.
Veja que agora a Palheta de Ferramentas irá mostrar as opções 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 depuração (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 formulário e a palheta Estrutura mostrou
como eles estão organizados, ou seja o Edit1 e o Memo1 estão “dentro” do Formulário Form2.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 6 de 90
Versão 05/04/2013
Object Inspector – Palheta Inspetor de Objetos (F11)
Esta é uma das palhetas que teremos o maior contato durante o desenvolvimento, é através
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
Através 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 Básico
Página 7 de 90
Versão 05/04/2013
Projetos, Units e Formulários
Um projeto é uma coletânea de arquivos necessários para que um programa possa funcionar,
no Delphi XE3 existem diversos tipos de projetos, como por exemplo:
VCL Forms Aplicattion – Aplicação baseada em formulários 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 – Aplicação que pode ser usada em múltiplas plataformas
desktop (Windows, Mac Os), com componentes redesenhados e estilizados.
VCL Metropolis UI Application – Aplicação baseada em VCL, porém com recursos visuais do
tema Metropolis (Windows 8).
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 8 de 90
Versão 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
Programação de Aplicativos) do Windows, caso você troque a aparência do Windows, a
aplicação sofre modificações visuais, pois é a própria API do Windows que desenha os
componentes.
Um projeto é uma coletânea de units e formulários para gerar uma aplicação.
Uma unit (.pas) pode existir por si só.
Um formulário depende de uma Unit (.pas) e de um arquivo (.dfm), a unit contém o código
funcional da aplicação e arquivo “dfm” contém o código dos componentes visuais do formulário.
Exemplo de um projeto
Exemplo de uma unit que contém um formulário
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 9 de 90
Versão 05/04/2013
Entendendo a estrutura de uma UNIT
unit Unit2; //nome da Unit
interface //bloco de interface responsável pelas declarações
uses //declara as units (bibliotecas) que serão usadas
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
Type //criação de novos tipos
//Criando uma classe herdada da classe TFORM
TForm2 = class(TForm)
private
{ Private declarations }
Public
{ Public declarations }
end;
var //variáveis globais a esta unit
Form2: TForm2;
implementation //Bloco de implementação
{$R *.dfm}
//Área onde serão implementados os métodos, procedimentos e funções
end. //indica o fim da unit
Exemplo do dfm desteformulário
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 10 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 11 de 90
Versão 05/04/2013
Um pouco da Delphi Language e conversão de sintaxe
Como o foco de nosso curso são alunos que já tem um certo conhecimento em C ou Java,
explanaremos aqui as principais diferenças de sintaxe entre as duas linguagens.
Operadores
+ Soma
- Subtração
* Multiplicação
/ Divisão
Comentários
// comentário de uma linha
(*
Comentário em
Bloco
*)
{
Comentário em
Bloco
}
Em C Em Pascal
Atribuição = :=
Comparação == =
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;
Laço de Repetição 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;
Laço de Repetição WHILE while( i <= 100 ) While (i<=100)
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 12 de 90
Versão 05/04/2013
{
}
Do Begin
End;
Módulo ou resto da Divisão If ((4 % 2) ==0)
{
printf ("é par “);
}
If ((4 mod 2)=0)
Then Begin
Showmessage(‘é par’);
End;
Modularização: Funções e Procedimentos
Procedimentos
Em C
void soma()
{
}
Em Pascal
Procedure Soma;
Begin
End;
Funções
Em C
Int soma()
{
return 30; // sai da função nesta linha e retorna 30
}
Em Pascal
Function soma:integer;
Begin
Result:=30; //armazena 30 na variável de retorno, mas não sai nesta linha
Exit; //não obrigatório, mas serve para sair da função.
End;
Passagem de parâmetros em procedimentos e funções
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 Básico
Página 13 de 90
Versão 05/04/2013
result:=a+b;
End;
Passagem por referência
Em C
int soma (int& a,int& b)
{
}
Em Pascal
Function soma (var a,b:integer):integer;
Begin
End;
ESCOPO DE VARIÁVEIS
Assim como em C, se uma variável for declarada dentro de uma função, o escopo dela é apenas a
função.
Para declarar uma função em Pascal existem áreas específicas para esse procedimento, diferentemente
de C que uma variável pode ser declarada em qualquer parte do código.
Declarando variáveis dentro de um procedimento (entre o nome da função e o Begin)
Procedure Soma;
Var
A,b:integer;
Texto:string;
Begin
End;
Declarando uma variável Global a uma Unit (no var antes do implementation da unit, junto a variável do
formulário)
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 Básico
Página 14 de 90
Versão 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
Tipos Float
Tipo Faixa Aproximada Dígitos sig.
Real48 2.9e-39 .. 1.7e+38 11-12
Single 1.5e-45 .. 3.4e+38 7-8
Double 5.0e-324 .. 1.7e+308 15-16
Real 5.0e-324 .. 1.7e+308 15-16
Extended
• 32-bit platforms 3.4e-4932 .. 1.1e+4932
• 64-bit platforms 5.0e-324 .. 1.7e+308
10-20
15-16
Comp -263+1 .. 263-1 10-20
Currency -922337203685477.5808.. 922337203685477.5807 10-20
Tipo Booleano
Boolean aceita true ou false;
Tipo Data e hora
TDate guarda data
TTime guarda hora
TDateTime guarda data e hora
Tipos de caracteres
Char representação de 1 bytes (1 caracter)
String vetor de caracteres
Funções de String
S:=‘texto que será enviado para a variável S’;
A:=‘teste’;
B:=‘de texto’;
C:=A+B+’ usando concatenação de strings’;
Função length retorna a quantidade de caracteres de uma string
Quantidadecaracteres:=Length(C);
Uma string inicia em 1 e não em 0, então para percorrer uma string
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 15 de 90
Versão 05/04/2013
For cont:=1 to length(c) do
Begin
Stringfinal:=StringFinal + C[cont];
End;
Algumas funções importantes de conversões entre tipos
Na conversão o parâmetro deve conter um valor correto para o tipo destino, caso contrário gerará uma
excessão.
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 funções em um click de um botão
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 Básico
Página 16 de 90
Versão 05/04/2013
COMPONENTES BÁSICOS
Form – Formulário
Propriedades Principais
Name = Nome do Componente
Caption = Texto que aparece na barra de título
Color = Cor do Formulário
Font = Fonte do Formulário (fonte, tamanho, cor e estilos)
Height = Altura do Formulário
Width = Largura do Formulário
State = Estado que ele aparecerá
wsNormal = Normal
wsMaximized = Maximizado
wsMinimized - Minimizado
Position = Posição que o formulário aparecerá na tela
poDesigned = Posição do desenvolvimento
poDefault = Posição e tamanho determinado pelo SO
poDefaultPosOnly = Posição determinado pelo SO, porém tamanho não.
poDefaultSizeOnly = Tamanho controlado pelo SO, mas posição no desenvolvimento
poScreenCenter = Centro da tela, tamanho do desenvolvimento, no monitor default
poDesktopCenter = Centro do Desktop, mesmo com múltiplos monitores
poMainFormCenter Centro do Formulário Principal (quando janela secundário)
poOwnerFormCenter = Centro do Formulário proprietário (criador).
BorderStyle = Estilo da Borda
bsDialog = Não redimensionável, somente botão fechar.
bsSingle = Não redimensionável, menu de minimizar / maximizar.
bsNone = Não redimensionável, sem linha de borda visível.bsSizeable = Redimensionável
bsToolWindow = Igual bsSingle mas com uma barra de título menor.
bsSizeToolWin = Igual bsSizeable com uma barra de título menor.
KeyPreview = Intercepta as teclas pressionadas em outros componentes
Eventos
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 17 de 90
Versão 05/04/2013
Grande parte destes eventos existirão em outros componentes da VCL, portanto a explicação
para eles estendem-se para outros eventos, inclusive alguns códigos de eventos serão
exemplificados aqui em outros componentes, como por exemplo Edit’s.
OnCreate(Sender: TObject);
Procedimento invocado quando o formulário é criado na memória (instanciado)
Parâmetros
Sender do tipo Tobject = É um parâmetro 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 método, entre outras
manipulações mais avançadas.
procedure TForm3.FormCreate(Sender: TObject);
begin
end;
OnDestroy(Sender: TObject);
Procedimento invocado quando o formulário é destruído na memória (memória é liberada)
Parâmetros
Sender = Já estudado
procedure TForm3.FormDestroy(Sender: TObject);
begin
end;
OnShow(Sender: TObject);
Procedimento invocado quando o formulário é mostrado
Parâmetros
Sender = Já estudado
procedure TForm3.FormShow(Sender: TObject);
begin
end;
OnClose(Sender: TObject; var Action: TCloseAction);
Este evento é invocado no momento que o formulário recebe um comando de fechamento, seja
ele via código ao clicar no ícone para fechar ou com teclas de atalho (Alt+F4).
Parâmetros
Sender = já estudado
Action do tipo TCloseAction = É um parâmetro que indica a ação a ser tomada pelo formulário,
os possíveis valores são: caNone, caHide, caFree, caMinimize
Exemplo de como abortar o fechamento de um formulário
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 18 de 90
Versão 05/04/2013
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone; //exemplo de como abortar o fechamento do formulário
end;
OnActivate(Sender: TObject);
Este evento é invocado na ativação do Formulário (toda vez que a janela do formulário entra
em Foco)
Parâmetros
Sender = já estudado
procedure TForm3.FormActivate(Sender: TObject);
begin
end;
OnClick(Sender: TObject);
Este evento é invocado toda vez que o formulário recebe um click do mouse
Parâmetros
Sender = já estudado
procedure TForm3.FormClick(Sender: TObject);
begin
end;
OnDblClick(Sender: TObject);
Este evento é invocado toda vez que o formulário recebe um duplo click do mouse
Parâmetros
Sender = já estudado
procedure TForm3.FormDblClick(Sender: TObject);
begin
end;
OnKeyPress(Sender: TObject; var Key: Char);
Este evento é invocado toda vez que o formulário recebe o pressionamento de uma tecla
Parâmetros
Sender = já estudado
Key do tipo Char é sinalizado como o identificador var, isto significa que ele foi enviado via
referência e que seu valor pode ser alterado, esse parâmetro contém a tecla que foi
pressionada, portanto é possível fazer tratamento com esse parâmetro.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 19 de 90
Versão 05/04/2013
O formulário só intercepta o pressionamento de teclas em outros controles se a propriedade
KeyPreview estiver com true, caso contrário 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 código ASC da tecla) ele irá enviar o
Foco para o Edit1.
Se qualquer tecla diferente do 1 for pressionado a Key é anulada, enviando o código #0 para
ela, isso fará com o que for digitado seja descartado e nem seja mostrado no edit1.
No exemplo abaixo é um código que só aceitará numéricos 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 formulário recebe o pressionamento de uma tecla para
baixo.
procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
end;
A principal diferença entre o evento OnKeyPress e o evento OnKeyDown é que o evento
OnKeyPress não é chamado quando teclas que não são da tabela ASCII são pressionadas.
Teclas Alfa Numéricas (abc...1234...), acentos, Enter e BackSpace invocam o método
OnKeyPress, porém teclas de Função (F1,F2....), teclas de navegação (setas para cima, baixo,
esquerda e direita), teclas Shift e Control não invocam o método OnKeyPress, mas invocam o
método OnKeyDown.
A outra diferença entre as funções é que o parâmetro Key da OnKeyPress é um caracter ASC,
já o parâmetro Key da OnKeyDown é um caracter WORD, ou seja, é o código numérico da
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 20 de 90
Versão 05/04/2013
tecla e não seu correspondente na tabela ASC, até porque algumas teclas não tem
correspondente na tabela ASC como por exemplo as teclas de Função.
Algumas teclas tem constantes pré-definidas, assim você não precisará saber o código
numérico delas, a lista de constantes é imensa, para pesquisá-la inteira procure por “Virtual key
Codes” no Help do Delphi, ou use o link
ms-help://embarcadero.rs_xe3/rad/Virtual_Key_Codes.html
Listarei algumas importantes, com o código correspondente:
VK_LEFT = Tecla de Navegação para a Esquerda (37)
VK_RIGHT = Tecla de Navegação para a Direita (39)
VK_UP = Tecla de Navegação para Cima(38)
VK_DOWN = Tecla de Navegação para Baixo (40)
VK_DELETE = Tecla Delete (46)
VK_ESCAPE = Tecla ESC (27)
Parâmetros
Sender = já estudado
Key do tipo Word, contém o código numérico da tecla pressionada, pode ser alterado
Exemplo de como verificar se o ESC foi pressionado.
Primeira forma, usando o código da tecla
procedure TForm2. FormKeyDown (Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=27) //código 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;
Parâmetro Shift
O parâmetro Shift serve para indicar se teclas como o Shift, Ctrl, Alt, botões de mouse ou
dispositivos touchs estão pressionadas também.
Exemplo
if (ssCtrl in Shift)
Then Showmessage(‘Control pressionado’);
Alguns valores para o parâmetro:
ssShift Shift Pressionado
ssAlt Alt Pressionado
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 21 de 90
Versão 05/04/2013
ssCtrl The CTRL pressionado
ssLeft Botão esquerdo do mouse
ssRight Botão Direito do Mouse
ssMiddle Botão do Meio do Mouse
Exemplode 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 código enviado de parâmetro.
OnKeyUP (Sender: TObject; var Key: Word; Shift: TShiftState);
Este evento é invocado toda vez uma tecla é solta, inverso do onkeydown, ele segue os
mesmos parâmetros do OnKeyDown já estudado.
Label
Encontrado Palheta Standard
Propriedades Principais
Align = Alinhamento da Label dentro do proprietário
alBottom = Na parte inferior
alClient = Toma todo o proprietário
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 automático
Caption = Texto da Label
Enabled = Ativa ou não a Label
Font = Propriedades da Fonte
Color = Color de Fundo da Label
Transparent = Indica se a label terá fundo ou não
Visible = Indica se a label será mostrada ou não
WordWrap = Quebrar o texto automaticamente
Eventos principais
OnClick, OnDblClick,
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 22 de 90
Versão 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 opção)
Text = Texto do Edit
CharCase = Determina se será normal, minúscula ou maiúsculas
TabOrder = Ordem que o componente está no uso do TAB (mudança de foco)
PasswordChar = Caractere que será usado no lugar dos caracteres que forem sendo
digitados, ideal para campos de senha (password), para desabilitar esta opção deixe-a
preenchida com #0
Principais eventos
OnClick, OnDblClick, OnKeyPress, OnKeyDown, OnKeyUp (já estudados)
OnChange (Sender: Tobject);
Método invocado toda vez que o conteúdo do Edit sofre modificação.
Parâmetros
Sender = já estudado
procedure TForm3.Edit1Change(Sender: TObject);
begin
Self.edit2.text:=Self.edit1.text;
end;
OnEnter (Sender:TObject);
Este método é invocado quanto o edit recebe o foco
Parâmetro
Sender = Já estudado
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 23 de 90
Versão 05/04/2013
procedure TForm3.Edit1Enter(Sender: TObject);
begin
end;
OnExit (Sender:Tobject);
Este método é invocado quando o Edit perde o foco, ou seja, o foco é enviado para outro
controle.
Parâmetro
Sender = já estudado.
procedure TForm3.Edit1Exit(Sender: TObject);
begin
end;
SetFocus
Método que envia o foco para o componente.
Self.Edit1.setfocus;
Button = Botão
Encontrado na Palheta Standard
Principais Propriedades
Caption = Texto do Botão, o uso do caractere & indica o caractere de atalho para o botão.
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)
Funções Auxiliares
Now - variável global do tipo datetime que retorna a data e a hora atual
Showmessage - Utilizada para enviar uma mensagem simples ao usuário. Exemplos
Showmessage(‘Teste de Mensagem’);
Showmessage(‘A hora agora é ‘+timetostr(now)); //mensagem indicando a hora atual
Tratamento de Exceção (Except)
Se uma Exceção ocorrer no sistema sem o uso do bloco Try Except o sistema paralisa a
execução 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 Básico
Página 24 de 90
Versão 05/04/2013
As exceções são tratadas em bloco
Try
//regras de negócios
Except
//tratamento do erro
End;
Exemplo
Try
Strtoint(‘esta conversao vai gerar um erro’);
Showmessage(‘esta mensagem não será mostrada’);
Except
Showmessage (‘Erro na conversão de string para inteiro’);
//... aqui você pode digitar outros comandos
End;
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 25 de 90
Versão 05/04/2013
Exercício 01
Criar um projeto chamado calculadora, com a aparência abaixo
Nomes dos Componentes
EdtValorInteiro
EdtOperador
EdtValorFloat
BtCalcula
BtLimpar
LbResultado (label com o texto 0,00)
Regras de Negócio
• 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 contém um valor inteiro
válido, caso não 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 contém um operador (+ - / *)
válido, caso não 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 contém um valor float válido,
caso não tenha o sistema deve emitir uma mensagem erro e retornar o foco para o
EdtValorFloat.
• Ao clicar no botão BtCalcula o sistema deverá realizar a operação utilizando os valores
e o operador digitado, retornar o resultado na label LBRESULTADO e voltar o foco
para edtvalorinteiro.
• Ao clicar no Botão 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 Básico
Página 26 de 90
Versão 05/04/2013
CheckBox = Caixa de checagem
Encontrado Palheta Standard
Principais Propriedades
Checked = Propriedade que indica se a checkbox está marcada (“checkada”) ou não.
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 não selecionada');
RadioButton = Botão Radial
Encontrado Palheta Standard
É semelhante ao CheckBox, porém só permitido que um RadioButton do grupo esteja marcado
(checked).
Principais Propriedades
Checked = Propriedade que indica se o RadioButton está marcado (checked) ou não.
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 não selecionada');
Panel = Painel
Encontrado Palheta Standard.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 27 de 90
Versão 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 componentesdo Panel poderá ser
acessado, se um panel for movido, todos os componentes do panel serão movidos juntos com
ele.
Principais Propriedades
BevelOuter = Propriedade que indica a aparência 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 botão mostrado abaixo
e escolha a figura que deseja que seja mostrada no Image.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 28 de 90
Versão 05/04/2013
Stretch = Indica se a imagem será ajustada de acordo com o tamanho do objeto (esticada), não
recomendado em alguns casos devido a distorção 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 métodos
OnClick, OnDblClick (já estudados em outros componentes)
Picture.LoadFromFile(stringcomocaminho); = Função usada para Carregar uma imagem
do Disco.
Picture.SaveToFile(stringcomocaminho); = Função usada para Salvar uma imagem no
Disco.
Exemplos
Para carregar uma imagem do disco via código, use a função loadfromfile da propriedade
picture
Exemplo:
Self.Image1.Picture.LoadFromFile('d:\exemplo.png');
Posso abrir imagens de diversos tipos, no exemplo acima eu abri uma imagem do tipo PNG,
neste caso é necessário adicionar a minha lista de uses uma unit especial para este
tratamento: Vcl.imaging.pngimage
Uma dica para não precisar decorar o nome das units, é inserir dois Timages em um formulário
e inserir uma imagem jpeg e uma png, depois compilar, você perceberá que serão adicionadas
as units automaticamente na seção interface, após isso pode apagar os componentes do
formulário que as units continuarão.
Para salvar uma imagem que esteja em um TImage no disco utilize o comando
Picture.SavetoFile
Exemplo
Self.Image1.picture.savetofile(‘c:\temp\teste.jpeg’);
Lembrando que a extensão da imagem deve ser a mesma do arquivo que foi carregado, caso
necessite fazer conversão, como por exemplo abrir um bitmap e salvar em Jpeg existem
funções específicas 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 função 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 Básico
Página 29 de 90
Versão 05/04/2013
Principais Propriedades e Métodos
Execute; = Esse método executa o openpicturedialog, ele retorna True se o usuário
escolheu uma imagem ou false se o usuário cancelou a operação.
FileName = Indica o nome do arquivo escolhido pelo usuário.
Exemplo de Abertura de uma Imagem Usando o OpenPictureDialog
if (OpenPictureDialog1.Execute=False)
Then exit;
self.Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
SavePictureDialog
Encontrado na Palheta Dialogs
Semelhante ao OpenPictureDialog é um componente que abre a caixa de diálogo padrão do
Windows para salvar uma imagem.
Principais Propriedades e Métodos
Execute; = Esse método executa o savepicturedialog, ele retorna True se o usuário
escolheu uma imagem ou false se o usuário cancelou a operação.
FileName = Indica o nome do arquivo digitado pelo usuário.
Exemplo de como Salvar uma Imagem Usando o SavePictureDialog
if (SavePictureDialog1.Execute=False)
Then exit;
Self.Image1.Picture.SaveToFile(SavePictureDialog1.FileName);
BitButton
Encontrado na palheta Additional
É um botão com a possibilidade de inserir imagens.
Principais propriedades
Glyph = imagem que será mostrada no botão
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 30 de 90
Versão 05/04/2013
MaskEdit = Edit (caixa de texto) com Máscara
Encontrado Palheta Additional.
O MaskEdit é um Edit porém a opção de máscara de digitação, ideal para formatar a digitação
de telefones, campos de documentos (CPF, CNPJ) e datas.
Principais Propriedades
EditMask = Máscara que será aplicada, clique no botão mostrado abaixo para ver as opções de
máscaras pré-formatadas, porém nada impede que você crie sua própria máscara.
No exemplo acima foi utilizada uma máscara de data com dois dígitos no Ano.
Outras propriedades já estudadas
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 31 de 90
Versão 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)
Interação com o usuário com Mensagens e Caixas de Entrada
Showmessage = Mensagem Simples
Exemplo
Showmessage(‘Mensagem Simples’);
Messagedlg = Mensagem com Ícones e botões
Paramêtros
Messagedlg(Msg,DlgType,[Buttons],HelpCtx,DefaultButton);
Onde
Msg = String com a mensagem.
DlgType = Tipo de ícone que irá aparecer (mtwarning, mterror, mtinformation,
mtconfirmation)
Buttons = Botões que irão aparecer
mbOK, mbCancel, mbYes, mbNo, mbAbort, mbRetry, mbIgnore, mbAll,
mbNoToAll, mbYesToAll, mbClose
Cada botão desses tem um código de resposta se quisermos capturar qual foi
pressionado
mrOK, mrCancel, mrYes, mrNo, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll,
mrYesToAll, mrClose
HelpCtx = Código de erro se pressionado F1
DefaultBtn = Botão que estará com o Foco, este parâmetro não é obrigatório.
Exemplo simples com um botão
Messagedlg('Mensagem com um botao',mtinformation,[mbok],0);
Mensagem com dois botões
Messagedlg('Mensagem com dois botões', mtwarning,[mbyes,mbno],0);
Mensagem com botão default e com captura do botão pressionado
If (Messagedlg('Deseja sair?', mtconfirmation,[mbyes,mbno],0,mbno)=mrYes)
Then Showmessage('Você escolheu sair');
InputQuery = Pergunta com Caixa de Texto
Parâmetros
InputQuery(titulo,mensagem,variavelquevaireceber):boolean;
Exemplo de uso
procedure TForm3.BitBtn1Click(Sender: TObject);
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 32 de 90
Versão 05/04/2013
var
variavelString:String;
begin
variavelstring:= 'digite aqui... ';
if (inputquery('Título da Barra de Título','Texto da Mensagem - Digite seu nome',variavelstring)=True)
then Showmessage(' Seu nome é '+variavelString)
Else Showmessage(' Processo cancelado');
end;
Exercícios
Dicas de Exercício
Desenvolver uma Calculadora Completa
Desafio: Jogo da Velha
Disponível para Download com o Fonte
Dicas para Randomizar números
Randomize; //necessário 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 Básico
Página 33 de 90
Versão 05/04/2013
Este componente é usado para criação de Menus,após adicioná-lo no formulário, dê um duplo
click sobre ele para abrir o Editor de Menu.
Através do Editor é possível 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 criação de um Item separador, basta digitar – no lugar do caption.
Arraste os items com o mouse para mudar a posição deles, pressione delete para apagá-los e
insert para inserir novos itens.
Eventos
Para cada TMenuItem existe um método OnClick onde deve ser digitado o código que deseja
que seja executado.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 34 de 90
Versão 05/04/2013
Exemplo
procedure TForm3.Sair1Click(Sender: TObject);
begin
Self.Close;
end;
Popup Menu = Menu acionado pelo botão direito do Mouse
Encontrado na palheta Standard
Este menu é usado como uma lista suspensa de opções (popup), segue o mesmo princípio do
MainMenu para configuração de novos itens, clique duas vezes sobre ele e adicione os itens
que desejar.
Após configurar o PopupMenu é necessário indicar qual componente irá usá-lo, para isso
escolha o componente (Edit, botão, formulário) e depois escolha na propriedade PopupMenu o
componente configurado.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 35 de 90
Versão 05/04/2013
Exemplo em funcionamento
Múltiplos Formulários
As vezes faz-se necessário em uma aplicação conter mais de um formulário (form), para que
as funções possam distribuídas em múltiplas telas da aplicação.
Quando criamos uma Aplicação VCL ela é composta por um único formulário, o formulário
principal, caso este formulário seja fechado a aplicação é encerrada (o formulário padrão pode
ser alterado), para adicionar novos formulários clique no menu File \ New \ Vcl Form - Delphi
Veja que agora apareceram dois formulários na janela de navegação
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 36 de 90
Versão 05/04/2013
Para visualizar quais formulários fazem parte da aplicação você pode utilizar a Palheta View,
botão View Form (Shift+F12) conforme imagem abaixo:
No meu exemplo vou renomear o primeiro formulário criado como Fprincipal
E o segundo como Fauxiliar
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 37 de 90
Versão 05/04/2013
Se rodarmos a aplicação o formulário que será mostrado é o Fprincipal, porque ele foi primeiro
formulário a ser criado, se quiser alterar essa configuração, acesse:
Menu Project \ Options
Escolha o Item Forms e troque o Main Form, conforme figura abaixo
Nesta tela podemos também configurar quais formulário serão criados automaticamente pela
aplicação (auto-create), caso seja retirado um formulário desta lista é necessário fazer a
criação do mesmo (instanciá-lo na memória) antes de usá-lo e destruí-lo após o uso, porém
esse assunto não é escopo do nosso curso básico.
Formas de invocar outros formulários
Supondo que o nosso Main Form seja o Fprincipal, para acessar o Fauxiliar é necessário um
comando para mostrá-lo, existem duas formas de mostrar um formulário:
Chamadas Modais (janelas restritas) - Quando invocamos um formulário com uma chamada
modal todos os demais formulários abertos não poderão ser acessados até que este formulário
seja fechado.
Chamadas Não-Modais (janelas não restritas) – Quando invocamos um formulário com uma
chamada não-modal podemos acessar outros formulários 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 não-modal.
Adicionando a Unit correspondente
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 38 de 90
Versão 05/04/2013
Tanto em um método quanto no outro é necessário que a Unit do formulário que se deseja
invocar esteja listada na lista de units que serão usadas, elas podem estar adicionadas na lista
de uses do interface ou do implementation, caso você compile a aplicação sem adicionar a unit
o próprio Delphi irá avisá-lo disso:
Veja que a mensagem do exemplo foi
O Formulário Fprincipal está referenciando o formulário Fauxiliar declarado na unit Unit4 que
não está na sua lista de USES. Deseja adicioná-la?
Se você escolher a opção Yes o próprio Delphi irá adicioná-la a lista de uses, se escolhar não o
programa não será executado.
Chamadas Recursivas a Janelas Modais
Imagine a situação que o Formulário Fprincipal invoca o Fauxiliar em uma chamada
ShowModal e o Fauxiliar invoca o Fprincipal também em uma chamada ShowModal, o sistema
irá gerar um erro:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 39 de 90
Versão 05/04/2013
Porém nada impediria que o Fauxiliar invocasse outro Formulário qualquer em uma chamada
Showmodal.
Erro de referência Circular – Out of Memory
No exemplo acima o sistema não geraria erro em tempo de compilação porque os dois
formulários referenciam um ao outro na seção de implementation:
Porém se formos no Fauxiliar e trocarmos a referência a Unit3(Fprincipal) para a seção de
Interface, veja o erro que ocorre ao tentarmos compilar a aplicação:
Referência da Fprincipal a Fauxiliar na Interface
Referência da Fauxiliar a Fprincipal na interface
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 40 de 90
Versão 05/04/2013
Erro gerado pelo compilador
Foi gerado um erro de Out of Memory, nas versões anteriores do Delphi seria gerado um Erro
de Referência Circular, ou seja, duas units não podem referenciar uma a outra na seção de
interface, apenas na seção de implementation.
TStrings e TStringList
As classes TStrings e TStringList são classes poderosíssimas do Delphi que simulam listas
encadeadas de strings, contendo métodos para adicionar, remover, pesquisar, ordenar,
acessar e alterar itens desta lista, muitos componentes da VCL possuem propriedades do tipo
TStrings, portanto não é possível aprender estes objetos sem antes entender a classe Tstrings.
Para nossos exemplos iremos criar uma instância da classe TStringList que é uma
implementação da classe TStrings
TStringList
Usado para armazenar e manipular uma lista de strings. TStringList implementa as
propriedades e métodos abstratos introduzidas pela TStrings, e introduz novas propriedades,
eventos e métodos para:
• Classificar as strings na lista.
• Proibir duplicação de strings em listas ordenadas.
• Responder a alterações no conteúdo da lista.
• Controlar a classificação por ordem alfabética
Para fazer nossos testes iremos adicionar um botão ao nosso formulário 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 não será ordenada a cada inserção
//adicionando itens
Lista.Add('e-String 1');
Lista.Add('d-String 2');
Lista.Add('c-String 3');
Lista.Add('b-String 4');
Lista.Add('a-String 5');
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti) – Delphi Básico
Página 41 de 90
Versão 05/04/2013
Showmessage ('Lista Completa: '+#13+Lista.Text); //mostrando o texto completo (concatenação de
todos os itens)
Showmessage (lista[2]); //acessando um item específico 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
(concatenação de todos os itens)
Lista.Sort; //ordenando a lista em ordem alfabética
Showmessage ('Lista Ordenada '+#13+Lista.Text); //mostrando o texto completo (concatenação de
todos os itens)
Lista.CaseSensitive:=true;//indica que DEVE diferenciar maiúsculas e minúsculas
posicao:=lista.IndexOf('E-STRING 1');
if (posicao<0)
then Showmessage('String "E-STRING 1" não encontrada')
Else Showmessage('String "E-STRING 1" encontrada na posição '+inttostr(posicao));
Lista.CaseSensitive:=False;//indica que NÃO DEVE diferenciar maiúsculas e minúsculas
posicao:=lista.IndexOf('E-STRING 1');
if (posicao<0)
then Showmessage('String "E-STRING 1" não encontrada')
Else Showmessage('String "E-STRING 1" encontrada na posição '+inttostr(posicao));
//Gerar erro em caso de duplicação só funciona se a lista estiver marcada para ordenar na inserção
Lista.Sorted:=True;//indica que a lista será ordenada a cada inserção
Lista.Duplicates:=dupError;//indicando que deverá gerar erro se inserir um item duplicado
Try
Lista.Add('e-String 1');//forçando o erro
Finally
FreeAndNil(Lista);
End;
end;
Entendendo as funções usadas no exemplo
Lista:=TStringList.Create;
Neste comando estamos instanciando a classe TstringList na variável Lista (criando ela na
memória)
Lista.Clear;//limpa os itens
O método clear limpa os itens da lista, apagando-os
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 42 de 90
Versão 05/04/2013
Lista.Sorted:=False;//indica que a lista não será ordenada a cada inserção
O método sorted indica se a lista será ordenada ou não a cada inserção de itens.
Lista.Add('e-String 1');
O método add insere um novo item a lista
Showmessage ('Lista Completa: '+#13+Lista.Text);
No exemplo acima estamos usando o método text que retorna uma string com a concatenação
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 são caracteres de quebra de linha e
retorno (#13 e #10)
Showmessage (lista[2]);
No exemplo acima estamos acessando um item específico da lista, este comando retorna uma
string com o valor do item, o item de posição 3 da lista, digitamos 2 no exemplo porque o
primeiro item da lista é o item 0.
for cont := 0 to lista.Count-1 do Q
No exemplo acima estamos usando o comando COUNT que é um método que retorna a
quantidade de itens da lista
lista.Delete(2);
O método delete exclui um item da lista, no exemplo estamos excluindo o terceiro item da lista
Lista.Sort;
O método SORT ordena os itens da lista em ordem alfabética
Lista.CaseSensitive:=true;
O método CaseSensitive indica se a pesquisa deverá considerar a diferença entre maiúsculas
e minúsculas ou não.
posicao:=lista.IndexOf('E-STRING 1');
O método INDEXOF( ) retorna o índice do texto pesquisado dentro da lista, caso não seja
encontrado retorna o valor -1
FreeAndNil(Lista);
O método FreeAndNil é um método utilizado para desalocar (destruir) memória de objetos e
“setar” a variável para nil após isso, caso esqueçamos de destruir um objeto instanciado
manualmente geraremos fuga (leaks) de memória em nossa aplicação.
A regra geral é: Todo objeto que construímos manualmente, sem ligação de “parents”, temos
que desalocá-lo manualmente. A StringList é um exemplo de classe que deve ser desalocada
manualmente pois em sua criação não permite que adicionemos um parent.
Lista.Duplicates:=dupError;
O método Duplicates indicará como a Lista se comportar se receber um item duplicado, este
método só pode ser usado para gerar erro se a lista estiver marcada para ser ordenada
durante a inserção (Sorted=True) caso contrário ele não terá efeito algum. No exemplo acima
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 43 de 90
Versão 05/04/2013
foi configurado para gerar erro em caso de duplicação de itens, porém para testar esse método
é necessário que usemos o bloco de tratamento de exceções (Try Except) caso contrário a
exceção gerada pelo erro irá desviar o programa e a linha do freeandnil não será executada,
para garantirmos essa execução 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 não, 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');//forçando 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 não tivéssemos o bloco try finally o programa encerraria a execução 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 liberação de
memória (freeandnil), poderíamos utilizar também um bloco TryExcept, porém qualquer outro
desvio da aplicação “pularia” o comando de desalocação, o correto no uso do Try Finally é
envolver todo o código logo após 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 múltiplas linhas.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 44 de 90
Versão 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 métodos : clear, add, text, delete, indexof, count e acesso a itens [ ] , entre outros.
Lines .SaveToFile(nomearquivo); = salva o conteúdo do Lines em um arquivo físico
Lines.LoadfromFile(nomedoarquivo); = carrega o conteúdo de um arquivo texto para as linhas
do memo.
Exemplo de Manipulação 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 Três');
Showmessage(Memo1.Lines.text);
Memo1.Lines.Delete(1);
Showmessage(Memo1.Lines.text);
Showmessage('A posição do texto "Linha Três" é '+inttostr(Memo1.Lines.IndexOf('LINHA TRÊS')));
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 não permite a entrada de itens
digitando dentro do ListBox, é necessário adicioná-lo via comando.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 45 de 90
Versão 05/04/2013
Principais Propriedades
Align, BorderStyle, Color, Font, Enabled, Height, Width (estudado em outros componentes)
Sorted = Indica se a lista será ordenada na inserção
ItemIndex = Indica qual a posição 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 métodos : 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 Básico
Página 46 de 90
Versão 05/04/2013
Principais Propriedades
Align, CharCase, Color, Font, Enabled, Height, Width, Sorted, ItemIndex (estudado em outros
componentes)
DropDownCount = Quantidade de Itens que serão 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 métodos : 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 Básico
Página 47 de 90
Versão 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 métodos : 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 página atual e
para trocar a página atual.
Style : Configura o Estilo visual da Aba, os estilos são: tsButtons, tsFlatButtons,
Pages = Propriedade do Tipo TStrings que configura as páginas, clique no botão (...)
para iniciar o editor de Páginas do Componente, neste editor é possível editar o nome das
páginas, adicionar ou excluir novas páginas e alterar a disposição das mesmas.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 48 de 90
Versão 05/04/2013
Principais Eventos
OnChange(Sender: TObject; NewTab: Integer; var AllowChange: Boolean);
Esse evento é invocado quando ocorre uma tentative de mudança de Aba, o parâmetro
NewTab indica a aba que será mostrada e o parâmetro AllowChange indica se será permitida
ou não a mudança, sete esse parâmetro para false e a mudança não ocorrerá.
PageControls
Encontrado na Aba Win32
Principais Propriedades
TabIndex : Propriedade do Tipo integer que usamos para saber qual a Página atual e
para trocar a página atual.
Style : Configura o Estilo visual da Aba, os estilos são: tsButtons, tsFlatButtons,
tsTabs
TabPosition : Configura a posição da Aba, só funciona para o Estilho tsTabs
Principais Eventos
Onchanging : Método que é invocado ao tentar mudar de aba, ele antecede a mudança,
podendo inclusive ser usado para abortar a mudança.
Sintaxe: TabControl1Changing(Sender: TObject; var AllowChange: Boolean);
O parâmetro AllowChange serve para indicar se será permitido ou não a mudança, alterando
para false a mudança não ocorrerá.
OnChange : Método que é invocado após a mudança de aba.
Para criar novas Abas clique com o botão direito e escolha a Opção “New Page”
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 49 de 90
Versão 05/04/2013
TrackBar
Encontrado na palheta Win32
Principais propriedades
Min Valor Mínimo da Trilha
Max Valor Máximo
Frequency Frequência que será usada ao arrastar (incremento)
Position Posição atual
SelStart Início da Seleção
SelEnd Fim da Seleção
SliderVisible Indica se o marcador da trilha será visível
ShowSelRange Indica se mostra ou não a faixa de seleção
TickMarks Indica a posição dos marcadores (embaixo, cima ou duplo)
Principal Evento
OnChange Invicado toda vez que ocorre uma mudança no Track
ProgressBar
Encontrado na palheta Win32
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 50 de 90
Versão 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
painéis que serão usados para mostrar informações de Status.
Clique no botão (...) desta propriedade ou cliente com o botão direito sobre o componente no
formulário e escolha a Opção Panels Editor
No Editor clique na opção “Add New”, adicione quantos painéis desejar
Depois configure as opções dos painéis, conforme a figura abaixo:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 51 de 90
Versão 05/04/2013
É possível configurar o estilo, o texto, a largura do Painel entre outras opções.
Para acessar o texto do painel via código use a propriedade Panels, no exemplo estamos
alterando o texto do Panel com índice zero, para acessar outros painéis altere o valor do
índice.
StatusBar1.Panels[0].Text:='Teste';
ToolBar
Encontrado na palheta Win32
A Toolbar é uma barra de ferramentas, ideal para adicionar botões. Para adicionar um botão
clique com o botão direito e escolha a Opção “New Button”, é possível também adicionar
separadores visuais entre os botões, para isso clique com o botão direito e escolha a opção
“New Separator”
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 52 de 90
Versão 05/04/2013
É possível configurar cada botão da ToolBar individualmente, basta selecionar o botão que
deseja alterar as propriedades.
Adicionando imagens nos botões
Para adicionar imagens nos botões é necessário utilizar um ImageList, pois os botões não
possuem uma propriedade para inserir uma imagem por botão.
Adicione um ImageList
Timers
Encontrado na Palheta System
O Timer serve para executar códigos a cada X milissegundos.
PrincipaisPropriedades
Enabled = Inicia ou para o timer e indica se o mesmo ativado ou não
Interval = Inteiro que indica a quantidade de milissegundos que o timer irá temporizar
até a próxima execução (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 código 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 Básico
Página 53 de 90
Versão 05/04/2013
// Adicione aqui neste o bloco de códigos que deseja executar a cada
//Execução 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 múltiplas informações.
Principais Propriedades
ColCount : Inteiro que indica quantas colunas terão a Grid
RowCount : Inteiro que indica quantas linhas terão a Grid
FixedCols : Inteiro que indica quantas colunas fixas terão a Grid
FixedRows : Inteiro que indica quantas linhas fixas terão 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 Opções, listamos abaixo as mais importantes
goFixedVertLine : Indica se Mostrará as linhas de divisão vertical nas colunas fixas
goFixedHorzLine : Indica se mostrará as linhas de divisão horizontal nas linhas fixas
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 54 de 90
Versão 05/04/2013
goVertLine : Indica se mostrará as linhas verticais
goHorzLIne : Indica se mostrará as linhas horizontais
goRangeSelect : Indica se permitirá seleção em faixas de células
goDrawFocusSelected: Indica se a célula de foco será desenhada como selecionada
goRowSizing : Indica se as linhas poderão ser redimensionadas
goColSizing : Indica se as colunas poderão ser redimensionadas
goEditing : Indica se permitirá a edição dos dados das células
goTabs : Indica se o tab funcionará como navegação entre as células
goRowSelect : Indica se a linha ficará toda selecionada
goAlwaysShowEditor : Indica se sempre as células estarão em edição, sem necessidade de
pressionar alguma tecla para entrar em modo de edição.
Cells : Propriedade para acessar e alterando os dados das células
No exemplo abaixo estamos alterando o conteúdo da células 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 Básico
Página 55 de 90
Versão 05/04/2013
Funções Importantes
ExtractFilePath(Application.ExeName);
Retorna uma string com o caminho da aplicação.
FileExists(pcaminhodoexe);
Retorna se o arquivo indicando na string do parâmetro existe ou não
Criando Units
Muitas vezes é necessário o reaproveitamento de código, sendo assim a melhor maneira é
criando funções que podem ser usadas diversas units ou até mesmo por diversos projetos,
para isso é necessário a criação de units, desvinculadas de formulários, contendo as funções
importantes a serem reutilizadas, como orientação a objeto foge do escopo deste curso
ensinaremos a criação de units simples com funções.
Para criar uma nova unit
Menu File \ New \ Unit - Delphi
A nova unit será criada com um nome padrão, salve essa unit no menu File \ Save
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 56 de 90
Versão 05/04/2013
No exemplo abaixo salve minha unit com o nome de Uglobal
Na seção de interface digitaremos o cabeçalho das funções e na seção implementation a
implementação da função.
No exemplo abaixo criaremos uma função que mostra uma mensagem de informação
recebendo como parâmetro uma string com a mensagem que desejamos que seja mostrada
Veja que foi necessário a declaração do uso da unit Vcl.dialogs, pois a função Messagedlg já
estudada anteriormente pertence a unit.
Agora se quisermos aproveitar essa função em nosso programa basta que declaremos o uso
da Unit Uglobal nas units que queremos usá-la.
Como exemplo chamaremos a função a partir do click de um botão em outra unit.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 57 de 90
Versão 05/04/2013
Veja no exemplo acima que para poder utilizar as funções da unit Uglobal tivemos que declarar
o uso dela na seção implementation do form, isso pode ser feito utilizando o atalho Alt+F11 e
escolhendo a unit que desejamos usar.
Regra Importante
Como não estamos trabalhando com orientação a objetos, no caso do uso de múltiplos
procedimentos ou funções em uma unit em que uma função pode utilizar outra da mesma unit,
devemos declará-los na ordem de criação correta, ou seja, a função que será chamada por
outra deverá estar implementada antes da função que a usará. Exemplo de um erro:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 58 de 90
Versão 05/04/2013
A função MostraMensagem2 não foi encontrada porque foi declarada depois da função que
necessita utilizá-la. O correto seria:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 59 de 90
Versão 05/04/2013
Passagem de Parâmetro com classes
Quando passarmos uma classe de parâmetro estamos passando necessariamente como
referência, ou seja, tudo que modificarmos dentro da função no parâmetro, estará modificando
a classe original, portanto podemos passar qualquer classe de parâmetro para funções, desde
botões, labels ou até mesmo formulários. Veja o exemplo de um procedimento na nossa unit
UGlobal que recebe um formulário de parâmetro e troca o caption do mesmo.
Veja que a Unit Vcl.Forms teve que ser declarada na seção interface porque a classe TForm
está presente no parâmetro da função.
Para testar basta por um botão em um formulário e chamar a função:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 60 de 90
Versão 05/04/2013
DELPHI COM FIREBIRD
Não está no escopo do Curso, mas faremos uma breve apresentação sobre o uso de banco de
dados Firebird com Delphi, não pretendemos abordar teorias de banco de dados neste curso,
supõe-se que o aluno já conheça uma teoria fundamental de banco de dados envolvendo:
Tabelas, Chaves Primárias, Chaves Estrangeiras, Visões, Procedimentos, Gatilhos (triggers),
bem como os comandos sql : Select, Insert, Update e Delete
Criação de um novo banco de dados
Entre no IboConsole, conecte-se ao servidor local, o usuário e senha padrão do firebirdsão:
Sysdba
masterkey
Clique com o botão direito sobre a opção databases e escolha a opção 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 execução de comandos SQL
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 61 de 90
Versão 05/04/2013
Para executar comandos utilize a opção 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 botões 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 Básico
Página 62 de 90
Versão 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 precisão de duas casas decimais
Time = Hora
Foi definido que o campo código não poderá ser nulo
CODIGO INTEGER NOT NULL,
Foi definido que o campo código será a chave primária da tabela, ou seja, não 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 código 1 e o nome JOÃO, os demais
campos (colunas) ficarão com nulos pois não foram preenchidos no SQL
insert into tabagenda (codigo,nome) values (1,'JOÃO');
No exemplo abaixo vamos inserir um registro completo com as seguintes informações
Código 2
Nome Natal
Telefone 3411-7777
Data de Nascimento 31/12/2000
Salário 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
apóstrofo delimitando o conteúdo, o tipo Date é no formato mm/dd/yyyy ou seja mês/dia/ano e
que o tipo Decimal quando temos valores decimais delimitamos por . (ponto) e não 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 Básico
Página 63 de 90
Versão 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 não 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 minúscula em qualquer parte
do nome
Select * from tabagenda where nome like '%a%'
No exemplo abaixo pesquisamos nomes que contenham a letra N maiúscula no início
Select * from tabagenda where nome like 'N%'
No exemplo abaixo pesquisamos nomes que contenham a letra O maiúscula no fim
Select * from tabagenda where nome like '%O'
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 64 de 90
Versão 05/04/2013
Se não quisermos diferenciar maiúsculas e minúsculas podemos usar o comando Upper
No exemplo abaixo estamos pesquisando os nomes que contem a letra A independente de ser
maiúscula ou minúscula, pois estamos convertendo o resultado da pesquisa em maiúscula.
Select * from tabagenda where upper(nome) like '%A%'
Comando Select com ordenação 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 serão afetados
Exemplo de alteração do nome no registro codigo=1
update tabagenda set nome='João da Cruz' where codigo=1
Exemplo de alteração do nome e do telefone no registro codigo=1
update tabagenda set nome='João da Cruz', telefone=’3411-4444’ where codigo=1
Exemplo de alteração 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 código=1;
Delete from tabagenda where nome like ‘%tal%’
Controle Transacional
Comando Commit
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 65 de 90
Versão 05/04/2013
Confirma as alterações
Comando Rollback
Desfaz as alterações não confirmadas
PALHETA INTERBASE NO DELPHI
Usaremos a palheta Interbase para conexão com banco de dados Firebird
Para o primeiro exemplo faremos toda a conexão e acesso ao banco em um único formulário,
para isso adicione um componente IbDatabase e um IbTransaction
Ibdatabase
Este componente é responsável por efetuar a conexão com o Banco de Dados, é nele que
configuraremos o caminho do arquivo o usuário 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 configuração de conexão a um banco de dados local, já
configurando o caminho do banco de dados, o usuário e a senha.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 66 de 90
Versão 05/04/2013
Clique no botão Test para testar se as informações estão corretas.
Após isso configure a propriedade Default Transaction com a transação adicionada.
IbTransaction
Clique duas vezes sobre o componente e configure a opção Transaction Properties para Read
Commited
Essa configuração indica que só “veremos” os dados já comitados, caso alguma outra
transação esteja aberta não conseguiremos “enxergar” as alterações enquanto ela não for
“commitada”.
Para saber mais sobre transações 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 aplicação não efetuar um commit ou um rollback em caso de
encerramento da transação ele aplicará como Default (padrão) um RollBackRetaining,
perdendo as alterações que foram feitas na transação corrente.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti) – Delphi Básico
Página 67 de 90
Versão 05/04/2013
Já temos uma conexão preparada, no OnShow do Formulário vamos abrir a conexão e no
OnClose vamos encerrar a conexão.
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 Básico
Página 68 de 90
Versão 05/04/2013
Os comandos SQL são configurandos na propriedade SQL da IBquery, que é do tipo
TSTRINGS.
Exemplo de um comando de Seleção com a Query.
Seguindo a sequência dos comandos:
Ibquery1.Close;
Fecha a Query que estiver aberta, não 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 excessão, use o tratamento de excessão (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 Básico
Página 69 de 90
Versão 05/04/2013
Visualizando os dados da Query
Para visualizar os dados da Query usaremos um DBGRID da palheta Data Controls, porém
para ligar o DBGRID a Query é necessário 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 Básico
Página 70 de 90
Versão 05/04/2013
Criando um programa que permite a execução de SQLs dinâmicos
Adicione um MEMO no FORM e modifique o fonte do botão para:
Veja que agora os comandos a serem executados serão os comandos digitados no MEMO1.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 71 de 90
Versão 05/04/2013
Executando comandos Insert, Update e Delete
Para executar estes comandos é necessário trocar o comando Open para ExecSql, esses
comandos não retornam resultados.
Adicione um novo botão no FORM e adicione o código abaixo:
Toda vez que esses comando são executados eles geram transações para controlar as
alterações, quem é responsável por estas transações é o Componente IbTransaction, os
comandos Commit e Rollback devem ser usados como:
Ibtransaction1.CommitRetaining;
IbTransaction1.RollBackRetaining;
Existem também os comandos commit e rollback, mas não recomendo o uso pois ele fecha o
dataset depois de executados.
Para testar as transações crie dois botões na aplicação um para cada comando, conforme
exemplo:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 72 de 90
Versão 05/04/2013
Agora basta executar comandos de update, insert e delete e testar o uso das transações.
Navegando pelos Registros Retornados
É possível 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 variável 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 próximo registro.
Para exemplificar crie e codifique os botões conforme exemplo abaixo:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 73 de 90
Versão 05/04/2013
Acessando os dados dos registros retornados, via Código
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, não é um comando aconselhável
pois para que ele retorne o resultado completo é necessário que ele “navegue” por todos os
resultados para poder “contá-los”, ele pode ser útil em casos de saber se retornou 0 ou não,
por exemplo, agora em caso de saber exatamente quantos registros retornados, recomendo
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 74 de 90
Versão 05/04/2013
que primeiro seja dado um last para mover o cursor para o último registro, e logo após seja lido
o valor de recordcount, isso trará maior confiabilidade no resultado, mas não é uma técnica
adequada para resultados com grande volume de dados, pois é necessário que todos os
registros sejam “descarregados” para a aplicação 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 estaríamos resgatando o valor da Coluna
Código.
AsString representa que queremos o resultado “convertido” em uma string, podemos usar as
seguintes conversões:
IBQuery1.Fields[0].AsBoolean
IBQuery1.Fields[0].AsCurrency
IBQuery1.Fields[0].AsDateTime
IBQuery1.Fields[0].AsSingle
IBQuery1.Fields[0].AsFloat
IBQuery1.Fields[0].AsExtended
IBQuery1.Fields[0].AsInteger
Entre outras.
Acessando o Valor do Retorno pelo Nome do Campo (coluna)
IBQuery1.FieldByName('codigo').asstring
Neste exemplo estamos resgatando o valor da coluna código, independente da posição dela no
resultado e estamos convertendo esse valor para String.
Exemplo de uma consulta SQL que retorna apenas o código de uma tabela, mostraremos
todos os registros do resultado em caixas de mensagem (showmessage)
Passando parâmetros
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 75 de 90
Versão 05/04/2013
Quando desejamos passar um parâmetro para um comando, seja sele uma consulta, uma
inserção, uma modificação ou até mesmo uma deleção, podemos usar o comando
ParamByName. Exemplo:
Veja que no comando foi adicionado um parâmetro delimitado pelo :pcodigo isso indica ao
componente que naquele local do comando será inserido o valor do parâmetro PCODIGO, para
preencher esse valor usamos o comando
Ibquery1.ParamByName(‘pcodigo’).asinteger:=1;
Ou seja, indicamos ao componente para atribuir ao parâmetro PCODIGO o valor 1 em inteiro,
no final o sql é montado da seguinte maneira:
O uso de parâmetros 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 Apóstrofo para delimitar o resultado que queremos consultar,
ou seja, ela deveria ser construída assim:
Select * from tabteste where nome=’JOSE’
Porém se fôssemos fazer isso no componente precisaríamos cuidar a questão do apóstrofo
que já é delimitador de strings no delphi, então precisaríamos dobrar ‘’ oapóstrofo para que o
compilador não gere um erro, da seguinte maneira
Ibquery1.sql.add(‘Select * from tabteste where nome=’’JOSE’’ ‘);
Ou teríamos que construir o sql usando concatenação de valores da seguinte maneira:
Ibquery1.sql.add('select * from tabteste where nome='+#39+'JOSE'+#39);
Agora usando o parâmetro e indicando que o tipo do parâmetro é string (asstring) o próprio
componente se encarrega de montar o sql corretamente já adicionando o apóstrofo no valor.
Assim como podemos usar os diversos tipos
Ascurrency (o próprio componente adicionará o ponto se contiver valores decimais)
As Date ( o próprio componente irá adicionar o apóstrofo e inverter mm/dd/yyyy)
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 76 de 90
Versão 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, porém é possível fazer um acesso através 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 Básico
Página 77 de 90
Versão 05/04/2013
A propriedade VisibleButtons, indica quais botões devem ser mostrados, podemos omitir
botões que não serão usados, como os botões de insert, delete....
Como nosso datasource está “ligado” a um dataset Ibquery os botões de alteração dos dados
não são habilitados, eles se habilitariam se estivéssemos trabalhando com outros
componentes, como por exemplo o IbDataset que é um componente que configuramos os sqls
de modificação dos dados e de seleção, ou um IbTable.
Chave Primária controlada pelo Banco de Dados
Um dos recursos disponíveis para controlar a chave primária como sendo sempre única e
controlar a concorrência de múltiplos usuários para que não ocorra a duplicação de chaves é o
uso dos generators
Um generator é um código incremental que pode ser incrementado ou decrementado pela
aplicação ou pelo próprio banco de dados através 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 Básico
Página 78 de 90
Versão 05/04/2013
Usando DataModule no Delphi
DataModule é um local especial para abrigarmos nossos coponentes de acesso a dados,
podem também abrigar outros componentes que não sejam visuais, é uma forma interessante
de concentrarmos componentes para diversos formulários.
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 Básico
Página 79 de 90
Versão 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 é através de um
arquivo INI, que nada mais é que um arquivo texto com um padrão, de ele pode ser usado para
guardar diversas informações do sistema, como por exemplo o caminho do banco de dados e o
usuário padrão.
“Arquivos INI são arquivos de texto simples com uma estrutura básica. São normalmente
associados com o Microsoft Windows, mas também são utilizados em outras plataformas...
Propriedades
O elemento básico contido em um arquivo INI é a propriedade (ou parâmetro). Toda
propriedade tem um nome e um valor, delimitado por um sinal de igual(=). O nome aparece à
esquerda do sinal de igual.
nome=valor
Seções
Propriedades podem ser agrupadas em seções nomeadas arbitrariamente. O nome da seção
aparece em uma única linha, entre colchetes ([ e ]). Todas as propriedades após a declaração
da seção são associadas a esta seção. Não há um delimitador explícito de "final de seção";
seções terminam na próxima declaração de seção ou no final do arquivo. Seções não podem
ser aninhadas.
[seção]
Comentários
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 80 de 90
Versão 05/04/2013
Ponto-e-vírgula(;) indica o início de um comentário. Comentários continuam até o final da linha.
Qualquer coisa entre o ponto e vírgula e o final da linha é ignorada.
; texto de comentário “
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 através de um Arquivo INI
Exemplo de como Configurar a IbDatabase dinamicamente com o caminho do banco de dados
o usuário e a senha
No botão OnClick do Botão OK
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 81 de 90
Versão 05/04/2013
Componente IbTable
O componente IBTable não é um componente muito recomendado, devido a sua lentidão no
tratamento dos dados e de sua pobreza em relação a pesquisas, pois não trabalha com
comandos SQL. Porém ele pode ser útil em situações simples, como por exemplo um DBGRID
editável para trabalhar com pequeno volume de dados.
Exemplo de uso de um IbTable com DBGRID editável
Adicione um Ibtable e faça a ligação dele com a IBDatabase
Em um formulário específico, adicione um DBGRID um DBNavigator e um DataSource.
Faça a ligação do DataSource a IbTable através da propriedade DataSet.
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 82 de 90
Versão 05/04/2013
Faça a ligação do DbGrid e do DbNavigator ao DataSource através da propriedade DataSource
Agora quando chamarmos esse formulário configuraremos qual Tabela a IBTable irá se
conectar e abriremos ela. Para isso adicione no OnShow do formulário o código de exemplo:
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 83 de 90
Versão 05/04/2013
No OnClose do Formulário fechamos a tabela.
Desenvolvendo um simples Relatório com REPORT BUILDER
O report builder não é nativo no Delphi Xe3, portanto deve ser adquirido e instalado.
Adicione um TppDbPipeline da Palheta RBuilder
Esse componente será responsável por fazer a conexão com os componentes de Dados
(querys, tables...)
Adicione um TppReport da Palheta RBuilder
Esse componente será responsável pelo desenho do Relatório e todo o controle de impressão.
Para que o ppDbPipeline possa se conectar a uma fonte de dados precisaremos "liga-lo” a um
DataSource, indico então que seja adicionada uma query e um datasource específico para o
relatório.
Adicioneuma IbQuery, conecte-a ao Ibdatabase principal da aplicação
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 84 de 90
Versão 05/04/2013
Adicione um DataSource e “ligue-o” a Query do Relatório
Faça a ligação entre o ppDbPipeline e o DataSourceRelatório pela propriedade DataSource
Faça a ligação entre o ppReport e o ppDbPipeline pela propriedade DataPipeline do ppReport
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 85 de 90
Versão 05/04/2013
Para construirmos um relatório será necessário por hora estarmos conectado ao banco de
dados e com uma fonte de dados (query) aberta com dados, assim poderemos ver os campos
disponíveis para serem usados, porém após construir o relatório desconecte o Database, para
que ele possa ser configurado dinamicamente, como já ensinado anteriormente, quando a
aplicação estiver em execução.
Para conectar a aplicação, 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 responsável pelo relatório, através da propriedade
SQL
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 86 de 90
Versão 05/04/2013
Passe a Query para Active=True
Pronto, agora que temos nossa aplicação 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 relatório
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 87 de 90
Versão 05/04/2013
O Report Builder trabalha com “bandas”, que são regiões do relatório que são mostradas de
acordo com sua função, por exemplo:
Banda Title = Título, é mostrada apenas na primeira página do Relatório, ideal para
adicionarmos informações da empresa, logotipos e outras informações que só devem aparecer
uma única vez
Banda Summary = Sumário, é mostrada apenas na última página do Relatório, ideal para
adicionar informações finais, como totalizadores, frases finais, etc.
Header = Cabeçalho, é mostrado em todas as páginas na parte superior, pode ser configurada
para ser mostrada ou não na primeira e na última folha
Footer = Rodapé, é mostrada em todas as páginas na parte inferior da página, pode ser
configurada para ser mostrada ou não na primeira e na última folha
Banda Detail = Detalhe, é a banda principal do Relatório, é nela que será mostrada as
informações detalhes, ou seja, “que se repetem”, no relatório. Por exemplo em um relatório da
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 88 de 90
Versão 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 necessária de acordo com o número de registros a serem mostrados.
Palheta Standard Components
São componentes padrões como labels, memos, linhas, códigos de barras, várias de sistemas
(data, hora, número de página). Não são “ligadas” aos dados da fonte de dado, são
independentes.
Palheta Data Components
São os componentes “conectados” a fonte de dado escolhida, é composta por Labels, memos,
campos calculados, códigos de baras, etc.
Desenvolvendo um simples Relatório
Adicione uma Label da Palheta Standard Components na Banda Header e configure sua
“caption” para Relatório de Agenda
Adicione também labels que serão usadas para Identificar as Colunas Código, Nome e
Telefone, conforme desenho abaixo
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 89 de 90
Versão 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 ligação ao campo desejado na fonte
de Dados
Para Visualizar como o relatório está ficando clique na Aba PreView
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico
Página 90 de 90
Versão 05/04/2013
Após configurar o que desejar feche a janela do ReportBuilder e retorne para o projeto
Não se esqueça de desconectar o IbDatabase antes de distribuir sua aplicação, pois
“nem sempre” o caminho do banco de dados será o mesmo em todas as máquinas, e
por este motivo a aplicação irá gerar erros ao executar o programa.
Como “chamar” o relatório em tempo de execução
Adicione um botão ou um menu que deseja chamar a impressão do relatório e configure a
query que será a fornecedora de dados e simplesmente chame o método PRINT do ppReport,
conforme exemplo abaixo: