a post il adelphi basic o 22062013

90
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

Upload: cleriston-ramos-de-brito-martins

Post on 19-Jan-2016

20 views

Category:

Documents


4 download

TRANSCRIPT

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

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,

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

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

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

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 ‘’ 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)

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. Adicione uma 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: