Você está na página 1de 90

Centro de Treinamento Invictos Tecnologia (www.invictos.com.

br/cti ) – Delphi Básico

CURSO DE DELPHI BÁSICO

EMBARCADERO RAD STUDIO XE3

Página 1 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 2 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 3 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 4 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 5 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 6 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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).

Página 7 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 8 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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 deste formulário

Página 9 de 90
Versão 05/04/2013
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

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) If (cont=3) Then


{ Begin

} End
else else Begin
{
} End;
Laço de Repetição FOR for (i=0;i<=3;i++) for cont:=0 to 3 do
{ Begin

} End;

for (i=3;i>=0;i--) for cont:=3 downto 0 do


{ Begin

} End;

Laço de Repetição WHILE while( i <= 100 ) While (i<=100)

Página 11 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

{ Do Begin

} End;
Módulo ou resto da Divisão If ((4 % 2) ==0) If ((4 mod 2)=0)
{ Then Begin
printf ("é par “); 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

Página 12 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 13 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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
• 32-bit platforms 3.4e-4932 .. 1.1e+4932 10-20
Extended • 64-bit platforms 5.0e-324 .. 1.7e+308
15-16
63 63
Comp -2 +1 .. 2 -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

Página 14 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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;

Página 15 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 16 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 17 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 18 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 19 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 20 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

ssCtrl The CTRL pressionado


ssLeft Botão esquerdo do mouse
ssRight Botão Direito do Mouse
ssMiddle Botão 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 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,

Página 21 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 22 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 23 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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;

Página 24 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 25 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 26 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

É 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 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.

Página 27 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 28 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 29 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 30 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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);

Página 31 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 32 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 33 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 34 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 35 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 36 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 37 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 38 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 39 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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');

Página 40 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 41 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 42 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 43 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 44 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 45 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 46 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 47 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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”

Página 48 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 49 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 50 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

É 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”

Página 51 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

É 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.

Principais Propriedades

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

Página 52 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

// 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

Página 53 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 54 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 55 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 56 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 57 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

A função MostraMensagem2 não foi encontrada porque foi declarada depois da função que
necessita utilizá-la. O correto seria:

Página 58 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 59 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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 firebird sã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

Página 60 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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),

Página 61 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 62 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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'

Página 63 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 64 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 65 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 66 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 67 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 68 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 69 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 70 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 71 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 72 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 73 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 74 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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 ‘’ o apó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)

Página 75 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 76 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 77 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 78 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 79 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 80 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Página 81 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 82 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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.

Adicione uma IbQuery, conecte-a ao Ibdatabase principal da aplicação

Página 83 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 84 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 85 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 86 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 87 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 88 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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

Página 89 de 90
Versão 05/04/2013
Centro de Treinamento Invictos Tecnologia (www.invictos.com.br/cti ) – Delphi Básico

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:

Página 90 de 90
Versão 05/04/2013

Você também pode gostar