P. 1
Delphi 2005 - Básico

Delphi 2005 - Básico

|Views: 1.146|Likes:
Publicado pormarcoaureliomarques

More info:

Published by: marcoaureliomarques on Aug 13, 2010
Direitos Autorais:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/21/2012

pdf

text

original

gondraf@hotmail.

com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 1 de 272

Capitulo I – Definições Sistema Operacional: Conjunto de pequenos softwares capazes de controlar as diversas funções de um hardware. Exemplos: WINDOWS, LINUX, DOS, UNIX... etc Linguagem: Conjunto de códigos capazes de descrever uma ação a ser realizada por um processador ou sistema computacional. Linguagem estruturada: É toda linguagem onde as linhas de comando seguem uma seqüência lógica continua ou em rotinas interligadas entre si. Exemplos: CLIPPER, BASIC, FORTRAN, NATURAL, C... etc Linguagem orientada a objeto: É a linguagem onde se utilizam formas gráficas (Objetos) com características próprias e independentes, capazes de realizar um procedimento através de uma ação que assim o determine. Exemplos: DELPHI, VISUAL BASIC,... etc Constantes: São informações que possuem um valor predefinido, que não se altera durante um processo. As constantes podem ser classificadas em numéricas ou alfanuméricas também conhecidas como strings: Exemplo A:=5 A:= B*30 A:=’Delphi’ A:=’Delphi ‘+’2005’ Constante 5 30 ‘Delphi’ ‘Delphi’ e ‘2005’ Tipo Numérica Numérica String String Característica Aceita cálculos numéricos Se apresenta sempre fora de aspas Se apresenta sempre entre aspas Aceita cálculos lógicos

Variáveis: São posições definidas na memória e reservadas para guardar dados ou resultados de cálculos. As variáveis podem ser: Tipo Variant Integer Real ou Doublé String Boolean ou Lógico Descrição Assume qualquer valor Assume um valor inteiro Assume um valor real Assume um valor string (alfa-numérico) Assume um valor lógico Exemplo V1: Variant; I: Integer; D: Double; S: string; B:Boolean;

Com exceção das variáveis do tipo variant, toda variável possui uma faixa de abrangência para guardar valores, dependo a capacidade de armazenamento a variável pode ser: Variável Integer Integer/Longint Longword/Cardinal Byte Int64 Shortint Smallint Word Faixa de abrangência De Até -2.147.483.648 2.147.483.647 0 4.294.967.295 0 255 -263 2631 -128 128 -32.768 32.767 0 65.535 Formato Sinal Positivo/Negativo Positivo Positivo Positivo/Negativo Positivo/Negativo Positivo/Negativo Positivo Bits 32 32 8 64 8 16 16

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32
Faixa de abrangência De Até -5 * 10324 1,7 * 10308 -2,9 *1039 1,7 * 1038 45 -1,5 * 10 3,4 * 1038 324 -5 * 10 1,7 * 10308 4951 -3,6 * 10 1,1 * 104932 63 -2 + 1 263 - 1 18 -9 * 10 9 * 1018 Faixa de abrangência 1 caracter 255 caracteres Aproximadamente 231 caracteres Aproximadamente 230 caracteres Faixa de valores Verdadeiro False 1 0 Diferente de 0 0 Diferente de 0 0 Diferente de 0 0

Página 2 de 272

Variável Real ou Doublé Real Real48 Single Doublé Extended Comp Currency Variável String Char String / ShortString AnsiString WideString Variável Lógica Boolean ByteBool WordBool LongBool

Formato Dígitos 1516 1112 78 1516 1920 1920 1920

Bits 64 48 32 64 80 64 64

Memória ocupada 1 byte De 2 até 256 bytes De 4 bytes até 4 gigabytes De 4 bytes até 4 gigabytes Formato Tipo associado Byte Byte Word Integer/Longint

Bits 8 8 16 32

As variáveis serão sempre representadas por letras, podendo ou não, serem seguidas por outras letras ou números e nunca estarão entre de aspas. Exemplos: Nome:String; A1:Integer; Preço_de_custo:Currency. Operadores: São símbolos ou expressões capazes de gerar um cálculo lógico ou aritmético. Os operadores são classificados segundo seu cálculo, podendo ser: • • • • • • Atribuição: Atribuir valores a uma variável ou propriedade de um objeto; Aritmético: Efetuam cálculos aritméticos; Lógicos: Efetuam cálculos lógicos; Relacionais: Efetuam cálculos relacionais; Set: São operadores predefinidos em funções; ou @ retorna o endereço de uma variável, função, procedimento ou método.

Operadores de atribuição: Operador : Exemplo Variável:Integer

Operadores aritméticos: Operador + * / Div Operação Adição Subtração Multiplicação Divisão Inteiro da divisão Tipo do operando Inteiro, real Inteiro, real Inteiro, real Inteiro, real Inteiro Tipo Resultante Inteiro, real Inteiro, real Inteiro, real Real Inteiro Exemplo X+Y Result - 1 P * 45 X/2 Total div x

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32
Resto da divisão Inteiro Inteiro

Página 3 de 272

Mod

Y mod 6

Observação: O operador + quando utilizado com dados string provocará a concatenação destes. Exemplo: A,B,C:String; A:= ‘Curso de ‘; B:=’Delphi’; C:=A+B; C resulta em Curso de Delphi. Operadores lógicos: Operador Not And Or Xor Operação negação conjuncão disjunção disjunção exclusiva Tipo do operando Boolean Boolean Boolean Boolean Tipo Resultante Boolean Boolean Boolean Boolean Exemplo not (C in MySet) D and (T > 0) A or B A xor B

Operadores set: Operador + * <> >= <= = In Operação união diferença intersecção desigualdade superset subset igualdade membership Tipo do operando set set set set set set set set, ordinal Tipo Resultante set set set Boolean Boolean Boolean Boolean Boolean Exemplo Set1 + Set2 S-T S*T MySet <> S1 S1 >= S2 Q <= MySet S2 = MySet A in Set1

Operadores relacionais: Operador = <> > < >= <= Operação igualdade desigualdade maior que menor que maior ou igual menor ou igual Tipo do operando simple, class, class reference, interface, string, packed string simple, class, class reference, interface, string, packed string simple, string, packed string, PChar simple, string, packed string, PChar simple, string, packed string, PChar simple, string, packed string, PChar Tipo Resultante Boolean Boolean Boolean Boolean Boolean Boolean Exemplo A=I X<>Y X>Y X<Y X>=Y X<=Y

Dados: São todas as informações fornecidas pelo usuário. Banco de Dados: São meios lógicos de armazenamento de dados. Os bancos de dados geralmente são criados separadamente dos aplicativos e são acessados por estes a partir de ferramentas que interagem com gerenciadores específicos para cada tipo. Rotina: É a descrição de cada parte integrante de um aplicativo.

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 4 de 272

As rotinas visam dividir um aplicativo em pequenas partes capazes de transcrever e executar uma tarefa específica, como exemplo, suponha que uma distribuidora de livros resolva controlar seus pedidos às editoras e o volume de livros repassados aos seus clientes e para facilitar este trabalho, resolve dividi-lo em seções: Seção Compras Vendas Funções 1–Identificar as editoras 2-Identificar os livros das editoras 3-Escolher os livros e comprar 1-Identificar os clientes 2-Separar e entregar os livros escolhidos Rotinas 1-Cadastro de editoras 2-Cadastro de livros 3-Entrada dos livros 1-Cadastro de clientes 2-Saída dos livros

Procedimento: É cada uma das ações realizadas por uma rotina: Exemplo: Rotina Cadastro de editoras Procedimentos 1. Verificar se editora já foi cadastrada 2. Se não foi cadastrada, então pegar uma nova ficha 3. Transcrever os dados da editora para a ficha 4. Confirmar a veracidade dos dados 5. Se dados conferem então colocar a ficha no arquivo.

Comandos: São termos, palavras reservadas, que servem para transcrever os procedimentos humanos aplicados a uma rotina para linguagem compreendida pelo computador. Estruturas: São comandos que dispostos em certa ordem executam uma função comum. Geralmente as estruturas apresentam um início e um fim e dentre estes são descritos procedimentos. As estruturas podem ser classificadas em:

1) Estrutura de bloco: É a estrutura que controla o projeto e cada procedimento nele descrito,
determinando seu início e fim. O bloco também pode conter declarações de constantes, tipos, variáveis, procedimentos, e funções; estas declarações têm que preceder a parte de declaração do bloco. Estruturas de decisão: Provocam desvios no fluxo do projeto de acordo com a entrada fornecida pelo usuário ou resultante de um cálculo. Estruturas de loop ou laço: Provocam a repetição de um ou vários procedimentos de acordo com uma condição previamente descrita. Estruturas consecutivas: Executa uma sucessão de declarações constituintes. Estruturas de exceção: Desvia o fluxo do projeto quando ocorre um erro na execução normal de um programa ou outro evento a interrompa.

2) 3) 4) 5)

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 5 de 272

Capitulo II – Componentes básicos da orientação a objetos Classe: São moldes através dos quais criamos objetos. Exemplo: type TFprincipal = class(TForm) Panel1: TPanel; Label1: TLabel; Label2: TLabel; Objeto: Abstração que agrupa características e comportamentos. Exemplo: object BitBtn1: TBitBtn Left = 168 Top = 240 Width = 199 Height = 31 Caption = '&Confirmar e encaminhar' TabOrder = 4 OnClick = BitBtn1Click Glyph.Data = {76060000424D} End;

Instância: É o objeto propriamente dito. Possui características próprias. Propriedade: Define as característica dos objetos de uma classe. Exemplo:

Método: Define o comportamento dos objetos de uma classe.

Exemplo: (Evento OnClick do objeto Button1 montado sobre o formulário Form1) procedure TForm1.Color:=clYellow. Exemplo: (Procedimento disparado pelo evento OnClick do objeto Button1) procedure TForm1. Capitulo III – Apresentação do Delphi 2005 Tela de Abertura Módulos carregados . Tempo de Projeto: É o tempo utilizado pelo desenvolvedor durante a confecção do projeto. end. Define a comunicação entre objetos. end. begin Form1. Procedimento: É a ação a ser realizada após o disparo de um evento.Button1Click(Sender: TObject). Evento: É um gatilho que quando disparado pelo usuário realiza um procedimento.Button1Click(Sender: TObject). Tempo de Execução: É o tempo utilizado pelo usuário final para execução do projeto após o término da sua confecção ou pelo desenvolvedor para realização de testes.Color:=clYellow. begin Form1. Interface: Conjunto de mensagens que define o comportamento de um objeto (Protocolo).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 6 de 272 Mensagem: Representa uma ação do objeto ou uma mudança de estado.gondraf@hotmail.

gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Barra de Ferramentas Página 7 de 272 VCL Form Application for WIN 32 Menu Principal Página de Códigos Gerente do projeto Caixa de Estrutura Object Inspector Barra de status Formulário Paleta de objetos .

. Botão minimizar Botão fechar Caixa de seleção de objetos Paleta de eventos Paleta de propriedades No Object inspector encontram-se duas abas: Propriedades (Properties) e eventos (Events). onde a primeira determina as características do objeto selecionado e a segunda indica quais são os eventos suportados por este objeto. serão apresentados conforme sua necessidade nos capítulos a seguir. Além das abas encontra-se uma outra região indicativa do nome e da classe do objeto selecionado.gondraf@hotmail. Caixa de estruturas (Structure): É a região do DELPHI onde se apresentam todos os objetos dispostos em um formulário (Form). Botão minimizar Botão Fechar Mover para baixo Mover para cima Excluir objeto Incluir objeto Objetos A Paleta de Componentes: É a principal barra de ferramenta. Os componentes contidos nas abas da paleta de componentes são alvos de nosso estudo. pois contem barras que classificam e guardam os componentes (objetos) que serão utilizados durante o desenvolvimento de projetos em Delphi. portanto.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 8 de 272 Object Inspector: É a conexão entre o a parte visual (Form) e a parte codificada (Unit) de sua aplicação.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Botão minimizar Botão fechar Botão filtrar Página 9 de 272 Botão desfazer seleção Botão habilitar/desabilitar categoria Categoria selecionada Objetos da categoria Gerente do projeto (Project Manager): Mostra todo o projeto disposto em forma de árvore permitindo acesso a página de códigos ou formulário. bem como permite a localização de objetos. Botão minimizar Botão minimizar Seleciona projeto Remove unit/form do projeto Inclui nova unit/form ao projeto Unit/form do projeto Modelo do projeto Explorador de base de dados .gondraf@hotmail. procedimentos e funções contidas no projeto.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 10 de 272 O Formulário: Form: O mesmo que formulário.gondraf@hotmail. Unit: É a região onde se escrevem os procedimentos. é a região onde serão dispostos os objetos. Barra de rolagem Linhas de códigos Mostra a unit Mostra o form Mostra o histórico Tecla insert Número da coluna Número da linha . nas linguagens estruturadas representariam a tela do projeto. é a parte estrutural do Delphi também chamada de página de códigos.

Interface {Especifica o que será exportado pela UNIT a fim de ser utilizados por outros módulos} [uses <lista de units>. Implementação dos métodos.gondraf@hotmail. Constante e tipos locais a UNIT e .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 11 de 272 Estrutura de uma Unit: Unit <identificador>.] <definições> [Initialization {Código executado automaticamente quando um aplicativo que utiliza a UNIT é executado} <instruções>] [Finalization {Código executado automaticamente quando um aplicativo que utiliza a UNIT é finalizado} <instruções>] end.] <seções de declaração> Implementation {Declaração de Variáveis. [uses <lista de units>.

Panel1. .Color:=clred. por exemplo: o semáforo possui luzes que podem ascender em cores distintas desse modo “cor” seria uma propriedade do semáforo e a cor acessa seria sua característica.Se o semáforo é um objeto então ele possui algumas propriedades. imagine a seguinte proposição: . . Panel1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 12 de 272 Capitulo IV – Os primeiros contatos Para entender o funcionamento de uma linguagem orientada a objeto. .Color:=clyellow.Color:=clgreen.gondraf@hotmail. da mesma forma. o semáforo também pode ser considerado como objeto. Uma vez montado o projeto pressione ou F9 para executá-lo.Assim de acordo com o botão pressionado pelo agente de uma determinada luz do semáforo ascende e as demais apagam. .Em uma rua movimentada foi colocado um semáforo para controlar o tráfego de veículos e próximo a este existe uma cabine de onde um agente o trânsito determina o momento em que as luzes deverão ser acesas.Podemos então dizer que cada botão é um objeto utilizado pelo agente. Resumindo temos: Objeto Botão Verde Botão Amarelo Botão Vermelho Evento Clicar Clicar Clicar Procedimento Cor do semáforo = Verde Cor do semáforo = Amarelo Cor do semáforo = Vermelho Prática 01: O primeiro projeto Objeto Button1 Button2 Button3 Propriedade Caption = Verde Caption = Amarelo Caption = Vermelho Evento OnClick OnClick OnClick Procedimento Panel1.

form1. Panel1.Exercício 01: O objetivo dessa prática é alterar algumas propriedades do objeto TPanel.Width:=form1. Para alterar a largura.Top:=form1.Color:=clred.Height+1. form1. form1. “propriedade width”.Height:=form1. “propriedade top”. clicando sobre os botões. Para alterar o comprimento.Height:=form1.Color:=clyellow.Height+1. conforme descrito a seguir: Objeto Button1 Button2 Button3 Propriedade Caption = Amarelo Caption = Verde Caption = Vermelho Evento OnClick OnClick OnClick Procedimento Form1. usaremos os botões 8 e 9. usaremos os botões 1.Top+1. conforme descrito a seguir: Objeto Button6 Button7 Propriedade Caption = Mais Largo Caption = Menos Largo Evento OnClick OnClick Procedimento form1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 13 de 272 Prática 02: Alterando algumas propriedades do formulário. Para alterar a cor. Uma vez montado o projeto pressione ou F9 para executá-lo. 2 e 3.Color:=clgreen. Panel1. Prática 03 .Width+1. “propriedade height”. Complete a tabela e escreva os procedimentos conforme o formulário a seguir: . usaremos os botões 6 e 7. usaremos os botões 4 e 5. conforme descrito a seguir: Objeto Button4 Button5 Propriedade Caption = Mais Largo Caption = Menos Largo Evento OnClick OnClick Procedimento form1.gondraf@hotmail.Top:=form1.Width-1.Top-1.Width:=form1. “propriedade color”. conforme descrito a seguir: Objeto Button8 Button9 Propriedade Caption = Mais Alto Caption = Mais Baixo Evento OnClick OnClick Procedimento form1. Para alterar a altura.

9) Estruturas consecutivas: Executa uma sucessão de declarações constituintes.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 14 de 272 Formulário: Objeto Button1 Button2 Button3 Button4 Propriedade Caption Caption Caption Caption Valor Evento OnClick OnClick OnClick OnClick Procedimento Capitulo V – Estruturas Estrutura é um conjunto de ações interligadas entre si contendo um comando que caracteriza o seu início e um outro seu fim as estruturas controlam todo o projeto. tipos. 10) Estruturas de exceção: Desvia o fluxo do projeto quando ocorre um erro na execução normal de um programa ou outro evento a interrompa. 7) Estruturas de decisão: Provocam desvios no fluxo do projeto de acordo com a entrada fornecida pelo usuário ou resultante de um cálculo..gondraf@hotmail. e funções. deviam o fluxo do projeto e controlam as possíveis exceções. procedimentos. End.. . O uso do ponto ao final após o End. variáveis. onde o primeiro determina o início da estrutura e o segundo o seu fim. determinando seu início e fim. controlam repetições. As estruturas podem ser classificadas em: 6) Estrutura de bloco: É a estrutura que controla o projeto e cada procedimento nele descrito. porém quando o comando End é sucedido do ponto e vírgula indica o fim da estrutura. O bloco também pode conter declarações de constantes. estas declarações têm que preceder a parte de declaração do bloco. Um ponto e vírgula após um comando indicam que ainda existem comandos ou declarações pertencentes a estrutura. a) Estrutura de bloco: Esta estrutura é sempre composta pelos comandos Begin . indica o fechamento do projeto. 8) Estruturas de loop ou laço: Provocam a repetição de um ou vários procedimentos de acordo com uma condição previamente descrita. provocam tomadas de decisões.

Forrar a cama. montaremos um projeto para somar dois números inteiros. Inicio. Trabalhar. Desligar o carro. Preparar a comida. Pegar o carro. Ler o número e guardar em B. Sair do quarto. Rotina asseio. Mostrar C. Ler o número e guardar em A. Fim. Perguntar qual o segundo número. Comer.C como variáveis numéricas.B.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 15 de 272 Exemplo 01: Para entender a estrutura de bloco tomemos como exemplo um fato cotidiano de acordar. Fim. Fim. Ir ao trabalho. Fim. Objeto Form1 Label1 Label2 Label3 Edit1 Valor Soma de dois números Primeiro número: Segundo número: Resultado: Vazio (null) Evento Procedimento Estrutura Princpal OnKeyPres s Edit1KeyPress . Sentar a mesa.gondraf@hotmail. Inicio. Inicio Rotina despertar. Prática 04:Baseado no exemplo 02. Inicio Acordar. Fim. Inicio Perguntar qual o primeiro número. Rotina alimentação. Fazer C = A + B. pegar o carro e ir até o trabalho. Rotina trabalhar. Declarar A. Tomar banho. Estruturas Secundárias Estrutura bloco Propriedade Caption Caption Caption Caption Text Exemplo 02: Somar 02 números e mostrar o resultado: Rotina somar dois números. Inicio Escovar os dentes. Fim.

end. end.'9']) then key:=#0.C:integer. begin Variáveis A. Converte um valor string em um Verifica se a tecla pressionada Está entre 0 e 9 valor inteiro A função inttostr(integer):string. var Key: Char). var A. . Label3. B e C do tipo A:=strtoint(edit1. A função strtoint(string):integer.com Fábio José de Gondra Ramos Delphi 2005 for win32 Text Caption Vazio (null) Soma OnKeyPres s OnClick Página 16 de 272 Edit2 Button1 Formulário: Edit2KeyPress Button1Click Procedimentos: procedure TForm1.gondraf@hotmail. Variável Key Tipo caracter Guarda a tecla pressionada procedure TForm1.Edit1KeyPress(Sender: TObject. C:=A+B. end. begin if not (key in ['0'. inteira B:=strtoint(edit2.Text).Edit2KeyPress(Sender: TObject.Text).B.. var Key: Char)..Button1Click(Sender: TObject). procedure TForm1. Converte um valor inteiro em um valor string Comentários: Pratica 05 – Exercício 02: Monte um projeto capaz de calcular a média aritmética entre 4 números inteiros quaisquer.'9']) then key:=#0.Caption:='Resultado:'+inttostr(C). begin if not (key in ['0'.

.Else. Senão..... Estrutura If . Assim: Início .. b) Estruturas de decisão: Muitas vezes em um projeto o processador precisa decidir entre dois ou mais valores. utilizam a estrutura If. Então.. enquanto os comandos que estiverem após o else serão desprezados. Then . acendendo a lâmpada e quando ele é aberto. Caso a condição seja falsa os comando existente após o then serão desprezados sendo executados apenas os comandos que estiverem após o Else.. Para entender melhor esta estrutura de decisão imagine um interruptor de uma lâmpada. As estruturas de decisões podem ser classificadas em: • Estrutura de decisão única. para tanto o desenvolvedor deverá dirigir o fluxo do projeto de acordo com a entrada fornecida pelo usuário ou resultante de um cálculo.Else.then. Then .End. • Estrutura de decisão múltipla. As estruturas de decisão utilizam operadores relacionais. Quando o interruptor é fechado permite a passagem da corrente elétrica.. Else a decisão é única e quando for verdadeira os comandos que estiverem após o Then serão executados...com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 17 de 272 Condições propostas: Deve-se travar o teclado evitando-se a digitação de caracteres não numéricos... utiliza a estrutura Case. podendo também fazer uso de operadores lógicos.......gondraf@hotmail.) Na estrutura If . Else…: (Se. interrompe-se a passagem da corrente elétrica e a lâmpada não acende....

gondraf@hotmail.Color:=clyellow else panel1.ItemIndex=0 then panel1. begin if RadioGroup1. end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 18 de 272 Indique a posição do interruptor. Se a posição o interruptor é fechada então A lâmpada está acessa Senão A lâmpada está apagada Fim Pratica 06: Acendendo uma lâmpada: Baseado na explicação acima monte o seguinte projeto. Formulário: Objeto Form1 Panel1 Panel1 RadioGroup1 RadioGroup1 RadioGroup1 Procedimentos: Propriedade Caption Caption Color Caption Items ItemIndex Valor Pratica 06 Vazio (null) clBlack Interruptor Acender a lâmpada Apagar a lâmpada 1 Evento Procedimento OnClick RadioGroup1Click procedure TForm1. Comentários: .RadioGroup1Click(Sender: TObject).Color:=clblack.

parteinteira:=int(valordaraiz). partefracionaria:real. begin valoremreal:=strtofloat(edit1. edit2. valordaraiz:real. Formulário: Objeto Form1 Label1 Label2 Label3 Label4 Label5 Edit1 Edit2 Edit3 Edit4 Button1 GroupBox1 GroupBox1 RadioButton1 RadioButton2 Procedimentos: Propriedade Caption Caption Caption Caption Caption Caption Text Text Text Text Caption Caption Enabled Caption Caption Valor Pratica 07 Digite um número: Resultado: Raiz: Parte inteira: Parte decimal: Vazio (null) Vazio (null) Vazio (null) Vazio (null) Verificar Resultados: False Exata Inexata Evento Procedimento OnKeyPres s Edit1KeyPress OnClick Button1Click procedure TForm1. valordaraiz:=sqrt(valoremreal). parteinteira:real. definir se é exata ou inexata e separar a parte inteira da parte decimal.Button1Click(Sender: TObject).Text). .gondraf@hotmail.Text:=floattostr(valordaraiz). var valoremreal:real. calcular sua raiz quadrada. partefracionaria:=valordaraiz-parteinteira.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 19 de 272 Prática 07: O objetivo desta prática é descobrir se um número é par ou ímpar.

Caption:=edit1..Text+' é um número par' else label2. Else .Text:=floattostr(parteinteira). of. End a decisão é baseada em múltipla escolha sendo executados apenas os comandos que satisfaçam a condição. - Estrutura Case. edit4. procedure TForm1.Text:=floattostr(partefracionaria). Condições propostas: O aluno será aprovado se obter uma média >= 6. Else… End: (Caso.. edit4. end.Text:='0'. .Edit1KeyPress(Sender: TObject. Fim) Na estrutura Case ..Checked:=true.Text:=floattostr(parteinteira)... obtendo como saída... edit3. end else begin radiobutton2. Senão.. end. Comentários: Pratica 08 – Exercício 03: Monte um projeto onde o usuário informe o nome do aluno e 04 notas. a média aritmética das notas fornecidas e situação em que o aluno se encontra. edit3..Text+' é um número impar'.'9']) then key:=#0.. end... if partefracionaria=0 then begin radiobutton1.gondraf@hotmail..Text) mod 2 =0 then label2. var Key: Char).Checked:=true. begin if not (key in ['0'.. of...com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 20 de 272 if strtoint(edit1.Caption:=edit1. de.. baseando-se na condição abaixo.

Else.Color Valor Pratica 09 ’c:\delphi 2005\pratica 09\ carro1. begin case carro of ..Timer1Timer(Sender: TObject). Pratica 09: Controlando o trânsito. o motorista nunca receberá mais que uma mensagem ao mesmo tempo.. Formulário: Objeto Form1 Image1 Image1 Timer1 RadioGroup1 RadioGroup1 RadioGroup1 Shape1 Shape2 Shape3 Shape1 Shape2 Shape3 Variáveis: Clausula Private Procedimentos: Propriedade Caption Picture Autosize Enabled Caption Items ItemIndex Shape Shape Shape Brush.bmp’ Evento OnActivate Procedimento Form1Activate True False Semáforo Pare Atenção Siga 0 stCircle stCircle stCircle clBtnface clBtnface clRed OnTimer OnClick Timer1Timer RadioGroup1Click Variável Carro Tipo Integer procedure TForm1..of.Color Brush. só aceita condições com valores inteiros.gondraf@hotmail..com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 21 de 272 Atenção: A estrutura Case. Para entender melhor o funcionamento desta estrutura imagine um semáforo controlando o fluxo de veículos.FormActivate(Sender: TObject). begin carro:=0. a cada cor acessa uma mensagem é enviada ao motorista e como apenas uma cor acende por vez. procedure TForm1. end.. End..Color Brush.

Brush. shape1. end. timer1. shape1.Color:=clred.ItemIndex of 0:begin timer1.Color:=clbtnface.Enabled:=true.Interval:=500. end.Brush. shape3.Color:=clbtnface.Brush. 2:begin timer1. timer1.Picture.Color:=clbtnface.LoadFromFile('c:\delphi 2005\pratica 09\carro1. procedure TForm1.Brush.LoadFromFile('c:\delphi 2005\pratica 09\carro2.Brush.gondraf@hotmail. shape2. shape2. end. end. 1:begin image1.10 R$ 0. shape3.Enabled:=false.Color:=clbtnface.bmp').Brush.bmp'). 1:begin timer1. end.Color:=clbtnface.Color:=clyellow.Color:=clgreen. end. end. shape2. shape3. shape1.RadioGroup1Click(Sender: TObject). begin case radiogroup1.Color:=clbtnface.08 R$ 0.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 22 de 272 0:begin image1.Brush. carro:=0.Enabled:=true.Brush. end.Interval:=50.05 . end. carro:=1.Picture.Brush.06 R$ 0. Comentários: Pratica 10: Promovendo descontos Esta prática visa calcular o valor a ser cobrado por uma empresa de cópias de acordo com a quantidade de xérox retiradas em um mês conforme a tabela abaixo: Quantidade de cópias Até 50 De 51 a 100 De 101 a 150 Acima de150 Valor por cópia R$ 0.

begin if not (key in ['0'. var Key: Char).#8]) then key:=#0. end..'9'.testatecla(Sender: TObject.gondraf@hotmail.bmp Evento OnKeyPres s OnKeyPres s OnKeyPres s OnKeyPres s Procedimento Testatecla Testatecla Testatecla Testatecla OnClick BitBtn1Click Procedimentos: procedure TForm1. .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 23 de 272 Formulário: Objeto Form1 LabeledEdit1 LabeledEdit1 LabeledEdit2 LabeledEdit2 LabeledEdit3 LabeledEdit3 LabeledEdit4 LabeledEdit4 Label1 Label2 Label3 StaticText1 StaticText1 StaticText2 StaticText2 StaticText3 StaticText3 BitBtn1 BitBtn1 Propriedade Caption EditLabelCaption LabelPosition EditLabelCaption LabelPosition EditLabelCaption LabelPosition EditLabelCaption LabelPosition Caption Caption Caption Caption BorderStyle Caption BorderStyle Caption BorderStyle Caption Glyph Valor Pratica 10 Quantidade de xérox na primeira semana lpLeft Quantidade de xérox na segunda semana lpLeft Quantidade de xérox na terceira semana lpLeft Quantidade de xérox na quarta semana lpLeft Total de xérox: Valor por xérox: Total a pagar: 0 sbsSuken 0 sbsSuken 0 sbsSuken Calcular C:\Arquivos de programas\ arquivos comuns\ borland shared\images\buttons\ calculat.

BitBtn1Click(Sender: TObject).00 Acima de R$ 300.. begin if (labelededit1.. to.150:valor:=0. end.00 a R$ 300. For.00 a R$ 250. total:=soma*valor.00 c) Percentual de desconto 10% 20% 30% 40% Estruturas de loop ou laço: Muitas vezes em um projeto o desenvolvedor necessita repetir um determinado procedimento de forma controlada..com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 24 de 272 procedure TForm1.05. A sucessão sempre é executada pelo menos uma vez porque expressão não é avaliada até depois da primeira repetição.total). statictext2. até) (Enquanto..gondraf@hotmail.Text='') or (labelededit4.. . Until.Caption:=formatfloat('R$0.. var valor. statictext1. 100. statictext3. Comentários: Pratica 11 – Exercício 04: Uma empresa resolve realizar uma promoção com descontos entre 10 e 40 por cento de acordo com o total a ser pago pelo cliente conforme a tabela a seguir: Valor total comprado Até R$ 100..00 De R$ 251. Quando o resultado da expressão é satisfeita.00 De R$ 101.10. end...49:valor:=0. else valor:=0.total:real. o repeat termina. Until: O Repeat executa sua sucessão de declarações constituintes continuamente e testa a expressão depois de cada repetição....Text='') or (labelededit2. do // For.Text)+strtoint(labelededit3.. São três as estruturas de laço: • • • Repeat.Text='') or (labelededit3.. a esta repetição denominamos laço ou loop. case soma of 0.deverá dirigir o fluxo do projeto de acordo com uma condição previamente descrita..Text)+strtoint(labelededit4. do..Caption:=formatfloat('R$0..06.Text='') then showmessage('Existe pelo menos uma semana sem quantidade!') else begin soma:=strtoint(labelededit1.. faça) (Para.. até. 50.08. faça) ..Repeat.00'..valor).99:valor:=0. end. soma:integer.Text).Text)+strtoint(labelededit2. (Repita..00'.. While. downto… do.Caption:=inttostr(soma).

repeat listbox1. end. begin if (key< chr(48)) or (key > chr(57)) then key:=chr(0).Button1Click(Sender: TObject). var i:integer. inc(i). end..Items.. Until. var Key: Char).Edit1KeyPress(Sender: TObject.Add('Repetição nº:'+inttostr(i)). listbox1.gondraf@hotmail.Text)<i. until strtoint(edit1. begin i:=1.Clear. Formulário: Objeto Label1 Edit1 Button1 Propriedade Caption Text Caption Valor Indique o número de repetições: Vazio (null) Aplicar Evento OnKeyPress OnClick Procedimento Edit1KeyPress Button1Click Procedimentos: procedure TForm1. procedure TForm1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 25 de 272 Pratica 12: Demonstração do Repeat . Comentários: .

Para entender melhor o funcionamento desta estrutura proceda da seguinte maneira. através de uma incrementação...Clear. listbox1. Comentários: . downto.Text)>i do begin inc(i).Button1Click(Sender: TObject). begin listbox1.. Para entender melhor o funcionamento desta estrutura proceda da seguinte maneira. . begin i:=0. end. (clausula downto). Comentários: Pratica 13 – Exercício 05: Usando a estrutura de laço monte um projeto capaz e fazer a combinação de 15 números aleatórios para gerar cartões da sena. for i:=1 to strtoint(edit1. do // For.Button1Click(Sender: TObject). quando o valor final é alcançado.While.. Abra o projeto anterior e altere o procedimento OnClick do objeto Button1 para: procedure TForm1. end. Quando o resultado da expressão é não é mais satisfeita.. o for termina. ou decrementação. end.. do: Executa sua sucessão de declarações constituintes continuamente até que o valor inicial atinja o valor final.Clear. listbox1..com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 26 de 272 . var i:integer. Abra o projeto anterior e altere o procedimento OnClick do objeto Button1 para: procedure TForm1.Items..Add('Repetição nº:'+inttostr(i)).Text) do listbox1. var i:integer. o while termina. while strtoint(edit1.. do: Executa sua sucessão de declarações constituintes continuamente e testa a expressão antes de cada repetição.Add('Repetição nº:'+inttostr(i)). to. (clausula to).For..gondraf@hotmail.Items.

.Text). campos.Selected. faça) Para entender melhor o funcionamento desta estrutura monte o projeto descrito a seguir. end.Name:=edit3.. font. Comando: With. end. procedimentos ou propriedades. Color:=colorbox2.Selected. caption:=edit4. . begin with panel1 do begin font.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 27 de 272 d) Estruturas consecutivas: Executa uma sucessão de declarações baseadas em condições onde se referenciam objetos. font.Button1Click(Sender: TObject). classes..do Formulário: Objeto Form1 Label1 Label2 Label3 Label4 Label5 Label6 Button1 Propriedade Caption Caption Caption Caption Caption Caption Caption Caption Valor Pratica 14 Tamanho da fonte: Largura da borda: Nome da fonte: Rótulo: Cor da fonte: Cor do painel: Aplicar Evento Procedimento OnClick Button1Click Procedimentos: procedure TForm1. do (Com.. Pratica 14: Demonstração do With..Text.Color:=colorbox1.gondraf@hotmail.Text..Size:=strtoint(edit1.

try . Capitulo VI – Bancos de dados: Os bancos de dados são estruturas capazes de armazenar informações fornecidas por usuários para utilizações futuras.Esta declaração tenta dividir Y por Z. end. Exemplo: try X := Y/Z. a bem da verdade os dados serão armazenados em tabelas e estas por sua vez comporão estruturas maiores denominadas bancos ou bases de dados.gondraf@hotmail. ..... // process file F finally CloseFile(F). end. ler ou armazenar dados em uma tabela é necessário a presença de uma ferramenta conhecida como gerenciador de bancos de dados. . Como exemplo de gerenciadores de bancos de dados temos: • • BDE Administrator (Borland Database Engine).Try… finally – Tenta executar um bloco. except on EZeroDivide do HandleZeroDivide.. except (Tentar… Exceptualmente) try.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 28 de 272 Comentários: e) Estruturas de exceção: Desvia o fluxo do projeto quando ocorre um erro ou outra interrupção na execução normal de um programa. se uma interrupção provocar uma parada no fluxo de execução do projeto. finally (Tentar… Finalmente) Try… Except – Tenta executar um bloco de comandos caso não consiga. Exemplo: Reset(F). .. Estruturas: • • - try. MSSQL (Microsoft Structure Query Linguage). Para que uma linguagem consiga abrir. (erro:divisão por zero). o fluxo geraria uma interrupção que tenderia a interromper a execução do projeto. mas se uma exceção é encontrada é chamada uma rotina nomeada HandleZeroDivide de EZeroDivide. o uso do finally o interpretará como fim do processo executando um segundo bloco de comandos. com o uso do except um segundo bloco tentará ser executado.

Paradox. e bancos de dados de texto. BDE dá para a Microsoft Windows 95 e Windows NT Aplication um acesso direto inclusive de compartilhamento a múltiplas fontes de dados. . os drives. Alias: É um “pseudônimo”. Você pode adicionar os drivers Microsoft ODBC e criar através do Borland SQL vínculos com outros servidores de SQL. como Tables e Querys. ACCESS. Aba de definições (DataBases): Nesta aba são definidos os alias que indicarão onde serão definidos os tipos. IntraBuilder®. C++Builder®. A Interface de Programa de Aplicação extensa do BDE (API) escrita direto em C e C++ aperfeiçoaram o acesso ao BDE e seus drives embutidos para dBASE. Junto com seus drivers de banco de dados e API consistente. DB2. Em tempo de execução o fomentador de aplicação interage com BDE criando vários objetos. mas será exigido endereçar um banco de dados de SQL. e Visual dBASE® for Windows. o local. Orientação a Objeto: BDE é orientado a objeto. Estes objetos de runtime manipulam entidades de banco de dados. FoxPro. a forma de acesso e comportamento das bases de dados que poderão se acessadas mediante o chamamento do alias. Arquitetura: A arquitetura do BDE inclui numerosos serviços compartilhados utilizados pelos drives de banco de dados e outras funções. e Sybase.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 29 de 272 O BDEAdministrator: Introdução ao Borland DataBase Engine O BDE é uma ferramenta utilizada para fazer a conectividade entre o Delphi. Um alias não é exigido para endereços de bancos de dados locais. inclusive Informix. InterBase. dBASE. (cadeia de trabalho). ACCESS. Aba de configurações (Configuration): Nesta aba são definidos as configurações dos drives e comportamento do sistema. O conteúdo incluído nos drives do BDE habilita acesso consistente para fontes de dados standards: Paradoxo.gondraf@hotmail. Paradox® for Windows. Aplicações de BDE usam pseudônimos para conectar se com bancos de dados compartilhados. e bancos de dados de texto. um nome e um conjunto de parâmetros que descrevem um recurso de Network. Oracle. FoxPro.

gondraf@hotmail. LangDriver: Informa o idioma do drive. 4096. Type: Tipo do servidor para o qual este drive conecta. Configurando o Drive Paradox: Net Dir: Determina o local onde será armazenado o arquivo PDOXUSRS. Os blocos ocupam múltiplos de 1024 bytes dispostos nos seguintes níveis: Nível 5 and 7 Nível 3 and 4 Default: 1024. 2048. arquivo baseado em servidor).NET. descritos a seguir: Forma de acesso Estrutura Paradox DB2 DBase FoxPro Informix Interbase MSAccess MSSQL Oracle Sybase SQLServer Microsoft Access Driver Microsoft Text Driver Microsoft Excel Driver Microsoft dBase Driver Microsoft Paradox Driver Microsoft Visual FoxPro Driver Microsoft FoxPro VFP Driver Microsoft VFP dBase Driver Nativo ODBC Usaremos este gerenciador com o drive nativo paradox em nossos exemplos. Block Size: Determina o tamanho do bloco resevado para aramazenamento das tabelas Paradox. 16384 e 32768 1024. 2048 e 4096 2048 . Version: Informa a versão interna do drive. Pode ser SERVER (servidor de SQL) ou FILE (standard.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 30 de 272 Os drives carregados pelo BDE são divididos em dois grupos: Native e ODBC.

StrictIntegrty: Integridade Referente. Level: Determina o formato utilizado na criação de tabelas Paradox temporárias: Nivel 7 tabelas Paradox para Windows 32-bit. especifique Paradox nível 4 ou nível 5. Para acessarmos as tabelas que utilizam este gerenciador utilizaremos os componentes da paleta BDE. Pode ser qualquer inteiro que varia de 1 a 100. Nivel 4 formato de tabelas STANDARD introduzido em Paradox 4.0). por exemplo. Para usar campos Blob. se FALSE. Default: TRUE.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 31 de 272 Fill Factor: Porcentagem de bloco de disco atual que deve ser enchido antes do Paradox alocar outro bloco de disco para arquivos de índice. Só escolha Nível 7 se você precisa das características de posicionamento avançadas aplicadas para aquele formato de tabela.0. Você pode usar o nível mais baixo possível para forçar a compatibilidade para um nivel anterior. você pode mudar a tabela. Default: 95 Nota: valores Menores oferecem desempenho melhor mas aumentam o tamanho de índices.5 e versões anteriores Default: Nível 4.gondraf@hotmail. índices secundários.0. Paradoxo 4. Valores maiores dão arquivos de índice menores mas aumentam o tempo para criação de um índice. mas você arrisca a integridade de seus dados. Nivel 5 tabelas Paradoxo 5. e integridade referente. Especificações das tabelas Paradox se podem ser modificadas usando aplicações que não se apóiam na integridade referente (como. .0 Nivel 3 formato de tabelas usadas por Paradox 3. se TRUE você estará impossibilitado mudar uma tabela com integridade referente que usa Paradox 4.

Capitulo VII – O DataBase Desktop (DBD): Uma das principais finalidades das linguagens de programação é a de controlar o armazenamento de informações de forma permanente. Ao se trabalhar com armazenamento de dados. modificar “Tables” (Tabelas de dados) e “Query” (Tabelas de consultas) nos formatos Paradox. ordenar. ver. OBS: Para utilizar qualquer uma destas estruturas os gerenciadores devem estar instalados no equipamento de desenvolvimento. isto é. O DataBase Desktop é um utilitário que nos permite cria. e SQL. . excluir ou alterar informações mantidas em um meio. o primeiro capaz de criar tabelas e segundo capaz de torná-las acessíveis ao delphi. dois softwares deverão estar instalados no computador.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 32 de 272 O MSSQL Server: Para acessarmos as tabelas que utilizam este gerenciador utilizaremos os componentes da paleta dbGo. a possuir a capacidade de incluir. dBASE. A este meio chamaremos de tabela.gondraf@hotmail.

isto é. O comando edit apontara para preferências enquanto a opção open não for aberta e se encarregará de determinar as preferência de edição do usuário.. query ou SQL Salva uma tabela. query ou SQL Salva uma tabela. abrirá o Borland DataBase Engine (BDE)..0): Menu Barra de ferramentas Área de trabalho Barra de status No menu encontramos os seguintes comandos: Comando File Edit Tools Window Help Descrição Menu de controle de arquivos Menu de edição de arquivos e preferências Menu de ferramentas Menu de exibição de janelas Menu de ajuda do DBD O comando file apresenta a seguinte lista de subcomandos: Subcomando New Open Close Save Save As.. query ou SQL Fecha uma tabela. porém se a opção open estiver ativa os comandos do menu serão alterados.. query ou SQL Abre uma tabela. O comando tools apresenta a seguinte lista de subcomandos: Subcomando Alias manager. Working Directory. query ou SQL em outra Define um diretório como de trabalho Define um diretório como privado Caso a opção open seja selecionada os comandos do menu serão alteradas como veremos a seguir. Private Directory. Descrição Cria uma nova tabela..gondraf@hotmail.. gerenciador de bases de dados da Borland .. Descrição Ativa o gerenciador de Alias.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 33 de 272 Visão geral do DBD (versão:7.

adição. zerar. cada uma com sua características próprias. iniciaremos com a estrutura Paradox em sua versão 7. Campos: São espaços predeterminados onde serão armazenados os dados. classificar. Os tipos dos dados disponíveis variarão de acordo com a estrutura escolhida.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 34 de 272 Utilities Password Ativa uma lista de funções capazes de realizar cópias. associadas as diversas linguagens de programação existentes. Capitulo VIII – Trabalhando com o DataBase Desktop: Para iniciarmos o trabalho com o DBD. A forma de armazenamento dos dados juntamente com a grande quantidade de aplicativos capazes de criar tabelas. no nosso caso. Tamanho (Size): Determina o número máximo de caracteres fornecidos pelo usuário. números. fornecer informações. &. Registros ou Recordes: É o conjunto de campos. or = ou qualquer outro carácter ASCII .gondraf@hotmail. Chaves: São ordens de classificação dos registros. Tipo (Type): Determina o tipo do dado que será aceito pelo campo. subtração.0. Tipo do campo Alpha Símbolo A Tamanho 1 . Nome do campo (Field Name): Determina o nome que será usado para identificação do campo. #. Chave (Key): Determina se o campo é chave de índice da tabela. em seguida devemos analisar os dados que serão armazenados. Nesta análise devem ser levados em consideração os seguintes pontos: Número do campo (Field Roster): É uma classificação onde são ordenados os campos.255 Valor suportado Letras. renomear e reestruturar tabelas. criaremos uma nova pasta na unidade c: e a chamaremos de “Delphi 2005”. fizeram com que surgissem várias estruturas ou tipos de tabelas. símbolos especiais como %. Por essa razão o desenvolvedor terá que identificar e ajustar o delphi àquela que melhor lhe convir. Para se criar uma tabela precisaremos de alguns conceitos básicos: Dados: São todas as informações fornecidas pelo usuário. Cria senhas para acessos a tabelas O comando window estará inabilitado até que a opção open seja ativada e apresentará a seguinte lista de subcomandos: Subcomando Cascade Tile top and bottom Side by side Arrange icons Close all Descrição Exibirá as janelas das tabelas na forma de cascata Exibirá as janelas das tabelas uma abaixo da outra Exibirá as janelas das tabelas uma ao lado da outra Organizará as janelas em icones Fecha todas as janelas O comando help abrirá a ajuda do DBD.

é um campo somente de leitura (não editável). isto é. e um ponto de fração decimal.240** Guarda arquivos formatted memo 0 . . --Guarda horas no formato DD:MM:AAAA --Guarda a data e hora atual 1 .240*** Armazena tipos diferentes de dados. som. . --Qualquer número inteiro entre -32767 e 32767 --Qualquer número inteiro na faixa que vai de -2147483648 a 2147483647 --Guarda datas entre 1 de Janeiro de 9999 AC até 31 de Dezembro 9999 AD.255 Campos de bytes só devem ser usados por usuários avançados que precisam trabalhar com dados que a tabela não consegue interpretar. 0 . 0 . permitindo acesso mais rápido. campos binários requerem um tamanho porque eles são armazenados na tabela e não em um arquivo separado. --Formata os números para forma de moeda com até seis dígitos após a vírgula. documentos. Campos binários não requerem um tamanho porque eles são armazenados em um arquivo separado (o . A tabela começa com o número 1 e soma um número para cada registro subseqüente.MB arquivam).EPS.PCX. como imagens. mas em arquivos separados. a tabela não pode exibir ou pode interpretar campos binários. . --Campos lógicos contêm valores que representam verdadeiro ou falso (True ou False). --Campos autoincrement contêm um inteiro longo.GIF. Um uso comum de um campo binário é armazenar códigos de barra ou tiras magnéticas. não na tabela. Campos de bytes distintos. 1 . isto é. .BMP. e .TIF.240*** Guardam imagens nos formatos . e assim por diante.240** Guarda arquivos memo 0 . um sinal. Apagando um registro não muda os valores de campo de outros registros. Você não precisa especificar um tamanho para campos de OLE porque eles não são armazenados na tabela. O campo de OLE lhe proporciona um modo para ver e manipular estes dados dentro do Paradox.com Fábio José de Gondra Ramos Delphi 2005 for win32 N $ S I D T @ M F G O --- Página 35 de 272 Number Money Short Long Integer Date Time Timestamp Memo Formatted Memo Graphic OLE Logical Autoincrement L + Binary B Bytes Y Um campo que pode conter só números.gondraf@hotmail. Um uso comum de um campo binário é armazenar som.240*** Campos binários só devem ser usados por usuários avançados que precisam trabalhar com dados que a tabela não consegue interpretar. a tabela não pode interpretar campos bytes.

“New” e “Table”: . se você especifica um valor de 45 ao campo. O Banco de dados guarda na tabela o memo inteiro se ele é menor que o tamanho determinado. você pode economizar espaço e tempo fixando o tamanho de campo de memo igual ou maior que este tamanho.32* Página 36 de 272 BCD Campos BCD contêm dados numéricos em formato BCD (Codigo Decimal Binário). * * * Opcional Obs: Se todos seus memos são menores que um determinado tamanho (por exemplo. quando a tabela executa cálculos com dados BCD. Porém.MB). * * Campos Memo ou Formated Memo podem ter um tamanho virtual.F. O campo tipo BCD é provido principalmente para compatibilidade com outras aplicações que usam dados BCD. devolvendo o resultado para BCD. o Banco de dados guarda os primeiros 45 caracteres na tabela e armazena o campo de memo inteiro em outro arquivo (com a extensão . A tabela interpreta dados BCD corretamente de outras aplicações que usam BCD. converte os dados para o tipo de flutuante. Por exemplo. O memo inteiro é armazenado fora da tabela. Use campos BCD quando você quer executar cálculos com um nível mais alto de precisão que aquele disponível com o uso de outros campos numéricos. agora abra o DBD e escolha as opções: “File”.com Fábio José de Gondra Ramos Delphi 2005 for win32 # 0 . 200 caráter).P. A partir deste conhecimento criaremos uma tabela simples conforme a descrição abaixo: Nome do campo Identidade CPF Nome Nascimento Logradouro Numero Complemento Bairro Cidade Estado CEP Ativo Tipo Alfanumérico Alfanumérico Alfanumérico Data Alfanumérico Numérico Alfanumérico Alfanumérico Alfanumérico Alfanumérico Alfanumérico Lógico Tamanho 10 14 50 50 50 30 30 2 10 Chave Sim Descrição Guarda o número da identidade Guarda o número do C. * Número de dígitos depois do ponto de fração decimal. O valor especificado se refere ao tamanho da Base de dados do arquivo memo da tabela (1 a 240 caracteres para memo e 0 a 240 caracteres para formated memo). Guarda o nome Guarda a data de nascimento Guarda o nome da rua Guarda o numero da casa Guarda dados complementares Guarda o nome do bairro Guarda o nome da cidade Guarda o nome do estado Guarda o número do cep Guarda a situação Crie a pasta: “C:\Delphi 2005\Tabelas”. Cálculos em campos BCD não são executados tão depressa quanto em outros campos numéricos.gondraf@hotmail.

gondraf@hotmail. . preencha conforme a tabela descrita anteriormente. conforme a figura acima e click sobre OK.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 37 de 272 Aponte o tipo da tabela para Paradox 7. Aparecerá a janela de edição de tabelas em Paradox.

Opção: File seguida das opções Open e Table.gondraf@hotmail. Opção: File seguida das opções Open e Table.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 38 de 272 Após a montagem a sua tabela deverá ter a seguinte forma: Click sobre o botão Save As em seguida localize a pasta “C:\Delphi 2005\Tabelas”. b) Em seguida utilize as opções do comando Record para navegar: . proceda da seguinte maneira: a) Abra a tabela. Exercício 06: Agora crie uma tabela com base nas instruções abaixo e salve no diretório C:\Delphi 2005\Tabelas com o nome de acessos: Campo Usuario Senha Nivel de acesso Tipo Alpha Alpha Number Tamanho 30 6 Chave Sim Incrementando registros de uma tabela: Para se incluir registros a uma tabela sem conduto ter que fazer um projeto para isso. proceda da seguinte maneira: a) Abra a tabela. b) Uma vez a aberta a tabela o menu sofrerá uma alteração passando a ter os seguintes comandos: Comando File Edit Tools View Table Record Window Help Descrição Menu de controle de arquivos Menu de edição de arquivos e preferências Menu de ferramentas Menu de visualização de registros Menu de controle sobre a tabela Menu de controle sobre registros da tabela Menu de exibição de janelas Menu de ajuda do DBD c) Com a tabela aberta escolha a opção Edit Data do comando Table ou pressione F9: d) A gravação será automática sempre que houver um deslocamento a nível de registro. Navegando pelos registros de uma tabela: Para se navegar sobre os registros de uma tabela sem conduto ter que fazer um projeto para isso. Dê o nome de “Pessoal” à tabela e click em salvar.

(com repetições válidas). “a princípio”. proceda da seguinte maneira: c) Abra a tabela. Para melhor entendimento criaremos dois índices secundários: o primeiro Unique (sem repetições válidas). proceda da seguinte maneira: a) Escolha a opção restructure no comando Tools: b) Em seguida abra a tabela. no entanto. Os índices podem ser primários ou secundários. o índice primário é chamado também a chave (KEY). Organizando os registros de uma tabela: Um índice é um arquivo que determina a ordem em uma tabela.db”. d) Em seguida coloque a tabela sob a forma de edição localize o registro que deseja excluir e pressione Ctrl+Del. os dados armazenados. para o campo Nome da tabela “Pessoal. Para se criar índices secundários em uma tabela sem conduto ter que fazer um projeto para isso. portanto se a tabela já existir teremos que reestruturá-la.com Fábio José de Gondra Ramos Delphi 2005 for win32 Tecla de atalho F12 F11 Ctrl+F11 Ctrl+F12 Página 39 de 272 Opção Next Previous First Last Descrição vai para o Próximo registro vai para o registro Anterior vai para o Primeiro registro vai para o Último registro Excluindo registros de uma tabela: Para se excluir os registros de uma tabela sem conduto ter que fazer um projeto para isso. O paradox. No paradox. a criação de índices secundários não afetaram. os dados contidos nestes deverão ser ajustados para a nova forma do campo ou serão perdidos se o campo for excluído. mas os índices deles/delas trabalham diferentemente. o dBASE. No processo de reestruturação se alterarmos a forma dos campos ou excluirmos algum campo. Opção: File seguida das opções Open e Table. para o campo CPF e o segundo Maintained.gondraf@hotmail. Criando índices secundários: Os índices secundários geralmente são criados durante a confecção da tabela. e o SQL usam índices para organizar os registros em uma tabela. .

e organiza a tabela de forma decrescente no segundo caso.gondraf@hotmail. . Geralmente usam-se os data-module’s quando a tabelas são compartilhadas entre vários formulários. por exemplo: CPFIDX Agora proceda de maneira semelhante para o campo Nome. promovem a distinção de maiúsculas e minúsculas no primeiro caso. O Data-Module: Como já mencionamos o Data-Module é um tipo especial de formulário. alterando. a opção do índice para Maintained na caixa Index options e salvando com o nome: NOMIDX Observações: As opções Case sensitive e Descending. em seguida marque a opção Unique na caixa Index options. Uma vez definido o campo e a opção do índice clica-se sobre o botão OK e informa-se o nome para o arquivo de índice. Capitulo IX – Incluindo tabelas em um formulário: Existem duas maneiras de se trabalhar com tabelas em formulários: a primeira delas introduz a tabela diretamente sobre o formulário onde se vai trabalhar. Exercício 07: Abra a tabela Acessos. na caixa de rolagem Table Properties.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 40 de 272 Uma vez aberta a tabela selecione a opção Secundary Indexes. porém. Em seguida click sobre o botão Define. onde se colocam as tabelas a serem utilizadas no projeto. Surgirá então a janela de definições descrita a seguir: Selecione o campo CPF e click sobre a seta de adição. e a segunda consiste em utilizar-se de um tipo especial de formulário denominado Data-Module. Sugestão: Monte o nome do índice associando o campo a terminação idx. O data-module possui apenas dois eventos: OnCreate – Ocorre sempre que uma aplicação inicializa o data-module.db e inclua 03 registros.

e sempre que o data-module for destruído. a aplicação pode os inicializar. ele fechará as tabelas antes de se destruir.gondraf@hotmail. . Se o módulo de dados contém Timer. Por exemplo: Pode-se se escrever um procedimento que autorize o fechamento de tabelas. uma aplicação pode estabelecer uma conexão com o banco de dados ou com as tabelas imediatamente. OnDestroy – Ocorre sempre que o data-module foi destruído.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 41 de 272 Por exemplo: Se um data-module contém os componentes database ou table e dataset. (cronômetros). neste evento.

Após a abertura da janela apresentada ao lado. (atalho para a pasta onde estão as tabelas). 3. . definiremos um “ALIAS”.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 42 de 272 Com relação as propriedades.Click em Ok para confirmar o drive. ASCIIDRV: ASCII text. e o chamaremos de dados. para tabelas . convêm mencionar a seguinte: OldCreateOrder – Está propriedade do tipo boolean. DBASE: dBASE e FoxPro. porem. Alias: É um “pseudônimo”. 4 – Agora altere o nome do Alias de Standard para dados. Aplicações de BDE usam pseudônimos para conectar se com bancos de dados compartilhados.DB. Em seguida configuraremos as opções para o alias criado para o drive escolhido: TYPE: Tipo do servidor para o qual este drive conecta. e neste inserir objetos capazes de acessar a tabela. Quando se cria um Alias indicando Standard como disponibilizados três drives: PARADOX: Paradox.gondraf@hotmail. selecione Standard como Database Driver Name (nome do drive para a base de dados). um nome e um conjunto de parâmetros que descrevem um recurso de Network. DEFAULT DRIVER: Drive padrão: PARADOX. PATH: É o caminho onde o banco de dados está armazenado.Selecione a opção Object no menu opções e nesta selecione New ou pressione Ctr+N: 2.DBF. para tabelas . para tabelas . Criando um alias paradox: 1.TXT. (cadeia de trabalho). Pratica 15: Incluindo uma senha Após a criação da tabela “Acessos”. apresenta False como default. o que assegura que o evento Oncreate seja executado após a finalização das instâncias dos demais construtores e que o evento OnDestroy seja executado antes das instâncias dos demais destructors. precisaremos criar o data module. DBASE ou ASCIIDRV.

iv) Selecione o ícone Data Module e pressione OK.Para as nossas tabelas configuraremos os parâmetros do alias conforme a tabela abaixo: Parâmetro TYPE DEFAULT DRIVER ENABLE BCD PATH Valor STANDARD PARADOX FALSE C:\Delphi 2005\Tabelas 6. Formulário Data Module: Objeto Propriedade Valor Evento Procedimento .gondraf@hotmail. Agora que já temos um alias criado partiremos para a criação o data module. Default é FALSE.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 43 de 272 ENABLE BCD: Specifica se BDE traduz campos numéricos e decimais em valores de ponto flutuantes ou valores em decimal codificado binário (BCD). 5. decimais e campos numéricos são convertidos para BCD. Quando ENABLE BCD é fixado para TRUE.00000000001). Valores de BCD eliminam os erros de arredondamento associados com matemática de ponto flutuante (exemplo: 3 * (2/3) resultando em 2. Criando o data module: i) Crie uma nova aplicação para win32. ii) Click em File // New // Other iii) Click em Delphi Projects // Delphi Files.Agora resta-nos apenas salvar o nosso alias: Opções: Object e Save As.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Name DM OnCreate OnDestroy Name DatabaseName TableName Name DataSet TAcessos Dados Acessos. Agora que o data module está pronto montaremos um formulário para entrada do usuário e sua senha. end.gondraf@hotmail. end.DataModuleDestroy(Sender: TObject). Digitados os procedimentos.DB DSAcessos TAcessos Página 44 de 272 Data-module Data-module Data-module Table1 Table1 Table1 DataSource1 DataSource1 DatamoduleCreate DatamoduleDestroy Alteradas as propriedades deve-se indicar quais campos da tabela estarão disponíveis ao projeto. begin TAcessos. Salve o data moule com o nome UDM.Open.DataModuleCreate(Sender: TObject).Close. Formulário: . Dê um click duplo no objeto TAcessos e selecione Add All Fiels: Procedimentos: procedure TDM. procedure TDM. begin TAcessos.

Forms. Classes. Graphics. begin tentativas:=0. begin . Procedimentos: procedure TFSenha. private tentativas:integer. Messages. StdCtrls.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 45 de 272 Objeto Form1 Form1 Panel1 Panel1 Panel1 Panel1 Panel1 Panel1 Label1 Label2 Edit1 Edit2 BitBtn1 BitBtn1 BitBtn2 BitBtn1 Propriedade Caption Caption Border Style BevelInner BevelOuter BevelWidth BorderWidth Caption Caption Text Text Caption Glyph Caption Glyph Valor Pratica 15 Evento OnActivate Procedimento Form1Activate Vazio (null) bsSingle bvLowered bvRaised 2 2 Usuário: Senha: Vazio (null) Vazio (null) Verificar C:\arquivos de programas\ arquivos comuns\Borland Shared \Images\Buttons\Key Cancelar C:\arquivos de programas\ arquivos comuns\Borland Shared \Images\Buttons\DoorOpen Tipo Integer OnClick BitBtn1Click OnClick BitBtn2Click Clausula Private Uses Variável Tentativas Valor Parâmetro Acrescentar UDM uses Windows. ExtCtrls. end. Dialogs.udm. Buttons. Variants. procedure TFSenha. Controls.BitBtn1Click(Sender: TObject). SysUtils.gondraf@hotmail.FormActivate(Sender: TObject).

[mbok].SetFocus.chave=usuário? begin if dm.Text.1).senha=senha? showmessage('acesso permitido!') // Chama o formulario de menu else begin tentativas:=tentativas+1. . // Zerar entrada da senha edit2.SetKey. // Retornar a entrada do usuário end. // Incrementar Tentativas em 1 MessageDlg('Senha Inválida!'. // Emitir mensagem Edit1.Text:=''. end.BitBtn2Click(Sender: TObject). // Incrementar Tentativas em 1 MessageDlg('Usuário não autorizado!'.Text:=edit1.mterror. procedure TFSenha. // Zerar entrada do usuário Edit1. é móvel e ativo com o pressionamento do botão direito do mouse. // Emitir mensagem edit2. Os menus do delphi se classificam em dois tipos: MainMenu: Menu principal. // Ativa a chave de índices dm.chave dm. Comentários: // Fecha projeto Capitulo X – Incluindo menus em um formulário: A montagem de menus é algo bastante comum em aplicativos que seguem os padrões Windows. PopUpMenu: Menu flutuante.TAcessosUsuario. isto é. é fixo e normalmente ocupa a posição superior da janela do aplicativo.gondraf@hotmail.Text then // campo. // Encerrar projeto end else begin dm.GotoKey.[mbok].Text:=''. // Atribui usuário campo. end else begin inc(tentativas. end. end.[mbCancel]. aplicativos que se executam em janelas.SetFocus.TAcessos.TAcessos. são geralmente utilizados como menus auxiliares.0).TAcessosSenha. Tanto no MainMenu como no PopupMenu. begin Halt.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 46 de 272 if tentativas=3 then // Tentativas=3? begin MessageDlg('Acesso Negado!'. // Busca chave if dm.Text then // campo.mtinformation. // Emitir mensagem Halt.TAcessosUsuario. // Retornar a entrada da senha end.Text=Edit1.0). existem duas propriedades que trabalharam da mesma forma: Items: usada para criar os itens do menu e Images: usada para colocar ícones ao lado dos itens do menu.0).mterror.Text=Edit2.

gondraf@hotmail. Prática 16 – Montando um formulário de controle Formulário: Objeto Form1 Form1 Image1 Image1 Image1 Image1 Propriedade Caption Name AutoSize Stretch Align Picture Valor Pratica 16 Fpratica16 True True alClient C:\Delphi 2005\images\Borland1 &Cadastros C&lientes &Produtos &Fornecedores F&uncionarios &Movimentos &Entradas &Saídas C&onsultas &Cadastros C&lientes &Produtos &Fornecedores F&uncionarios &Movimentos &Entradas &Saídas &Sair Evento Procedimento Mainmenu1 Items Após a digitação dos procedimentos salve a unit com o nome Upratica16 Comentários: .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 47 de 272 Os itens criados nos MainMenu e PopUpMenu se comportam como novos objetos e possuem propriedades e eventos próprios.

Pronto as duas práticas agora pertencem ao mesmo projeto. no entanto. 2. ShowModal. proceda da seguinte forma: 1. SysUtils. Dialogs. Selecione a unit Upratica16 e click em ok. não permitindo acesso às janelas abertas anteriores a atual. dando assim uma visão maior sobre projetos em delphi. Forms. tanto pelo fato da quantidade de objetos utilizados. como por uma questão de lógica e organização. precisamos criar uma interface entre seus códigos e seu formulários. a)Abertura de formulário: Comandos: Show. Graphics. Add file to project.udm. Classes.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 48 de 272 Capitulo XI – Trabalhando com mais de um formulário: É comum na maioria dos projetos a presença de vários formulários. ExtCtrls. incluímos Upratica16. Variants. que corresponde ao nome da unit da pratica 16: uses Windows. StdCtrls. Na barra de ferramentas click sobre 3. mantendo disponível as janelas abertas anteriores a atual O comando ShowModal abre um formulário em uma janela. . O comando Show abre um formulário em uma janela. Messages. Controls. Para criar tal interface utilizamos ao final da clausula USES da unit do projeto de senhas. Para anexar as práticas.gondraf@hotmail. Abra a prática 16. Os formulários precisam ser abertos e após seu uso novamente fechados para evitar seu acúmulo na memória do computador. Prática 17 – Anexando formulários: Observe as práticas 16 e 17. verifique que de certo modo eles se completam. Buttons.Upratica16. O que vamos fazer agora é anexar estas duas práticas em um único projeto.

.Show 55 Else 56 Observe a linha 55 da página de códigos do formulário FSenha: Fpratica16. para isso altere a linha 55 do procedimento Click do bitbtn1 do formulário FSenha para: Antes da alteração Linha Procedimento if dm.Text then 54 Fpratica16. dando-lhe o nome de pratica17.gondraf@hotmail. O comando Halt fecha todas as janelas de um projeto.ShowModal Execute o projeto e mova a janela do menu principal de forma a enxergar o formulário de senha.TAcessosSenha. encerrando a aplicação e retirando-a da memória.. O comando Close retornando à janela aberta anteriormente. Comentários: Após a alteração Linha Procedimento if dm.Show Execute o projeto e mova a janela do menu principal de forma a enxergar o formulário de senha. precisamos chamar o formulário da pratica 16 caso o usuário seja aceito e sua senha seja válida. Comentários: Agora substitua a linha 55 da página de códigos do formulário FSenha por: Fpratica16. em seguida clique sobre ele..com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 49 de 272 Embora as unit´s estejam interligadas. este objeto foi criado pelo delphi quando incluímos o item Sair no mainmenu1.TAcessosSenha. Comentários: b) Fechamento de formulário: Comandos: Close. juntamente com todas as bases de dados. em seguida clique sobre ele. Halt. Inclua ao projeto o evento click no objeto Sair1.Text=Edit2.Text=Edit2. procedure TForm1..Sair1Click(Sender: TObject).Text then 54 55 showmessage('acesso permitido!') 56 else Antes e executar vamos salvar como um novo projeto: No menu principal click sobre File e escolha a opção: Save projet as.

incrementar registros e atualizar a tabela. Comentários: Substitua o comando Close do Sair1Click por Halt e execute o projeto Comentários: Capitulo XII – Estruturando um projeto: Para facilitar o trabalho com vários formulários geralmente se faz um esboço de visualização. onde se divide o projeto em blocos de acordo com sua aplicabilidade: A seguir está demonstrado um diagrama simples. incrementar registros e atualizar a tabela. A estas rotinas podem estar associados formulários e unit´s ou simplesmente unit´s quando se tratarem de funções ou processos internos de máquina. end.gondraf@hotmail. 1-Início 2-Localiza base de dados 3-Identifica a tabela . Execute o projeto e clique em sair. para leitura de registros de uma tabela armazenada em um banco de dados. Observe a presença de rotinas em cada processo. para leitura de registros de uma tabela armazenada em um banco de dados.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 50 de 272 begin Close. A seguir está demonstrado um algoritmo simples.

2-Se não: 6.1-Voltar para definição de ação 5  Alteração de registros: 1-Abrir formulário 2-Preparar campos de formulário 3-Entrar com dado 4-Buscar chave 5-Chave existe? 6-Se sim: 6.1.8.1-Se sim: 6.7.2 6.8.2.7.2-Se não: 7.2.3-Preparar tabelas para recebimento de dados 7.7.1-Voltar para definição de ação 7-Se não: 7.3-Voltar para definição de ação 5 7-Se não: 7.2-Informar ao usuário 6.7.2-Informar ao usuário 4.1-Informar ao usuário 7.1-Identificar a razão 4.2.2-Se sim: 4.6-Dados gravados com sucesso? 6.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 51 de 272 4-É possível abrir a tabela? 4.3-Criticar valores 6.1.1-Retornar para ação  .gondraf@hotmail.7-Incluir novos registros? 7.6-Informar usuário 7.4-Gravar dados 7.8.1-Mostrar valores 6.1-Ativar chave de índices 5-Definir ação: 6-Caso ação:  Inclusão de novos registros: 1-Abrir formulário 2-Preparar campos de formulário 3-Entrar com dado 4-Buscar chave 5-Chave existe? 6-Se sim: 6.8.2-Voltar para definição de ação 5  Exclusão de registros: 1-Abrir formulário 2-Preparar campos de formulário 3-Entrar com dado 4-Buscar chave 5-Chave existe? 6-Se sim: .1.1-Retornar para ação  .2-Criticar valores 7.5-Dados gravados com sucesso? 7.1-Entrar com valores 7.4-Preparar tabelas para recebimento de dados 6.1-Se não: 4.5-Gravar dados 6.2-Alterar valores 6.2 7.7-Informar usuário 6.1-Se sim: 7.1.8-alterar outros registros? 6.1-Mostrar dados 6.

onde cada opção possui rotinas próprias agrupadas em blocos denominados de cadastros.2.1-Informar ao usuário 7.1-Se sim: 7.2.2.1. excluir e consultar registros de uma base e clientes.1.1-Se sim: 6.2.2. por sua vez representa um formulário e uma página de código. o cadastro de clientes.2.2.1.2.1.1-Voltar p/ definição de ação 5 6.2-Se não: 6.2-Se não: 6.2.2.1-Voltar para definição de ação 5 7-Se não: 7.2.1.2. localizando e excluindo dados de uma tabela em tempo de execução: Observando a prática 17 notamos que falta dá continuidade às opções apresentadas pelo mainmenu.1.1-Excluir dados 6.2.2.2-Voltar para äefinição de ação 5 6.2-Fechar formulário 9.2-Excluir outro? 7.2.1. Para podermos escrever estas rotinas precisamos primeiro montar a tabela: .1.1-Informar ao usuário 6.2-Dados excluídos com sucesso? 6.2.1.1.2.1-Se sim: 6.1. que tem como objetivo inclui.2.2.1.2.1.gondraf@hotmail.Voltar para definição de ação 5 Fim Observações: O algoritmo descrito acima poderá ser escrito de maneiras diferentes.1.2.1.2.2.2.Se não: 9.1.2. dependendo apenas da linha de raciocínio do desenvolvedor.2.2. movimentos e consultas.1.2.2.2.1.2-Exclui dados? 6.1.1-Fechar tabela 9.2.2.1-Se sim: 6.1-Retornar para ação  .1.2.1.1.2.2.2.1-Mostrar valores 6.2-Excluir outros registros? 6.1-Voltar para definição de ação 5 8-Fim dos casos 9-Finalizar? 9.1-Retornar para ação  .2 7.2 6.2.1-Se sim: 9.2-Se não: 7.2.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 52 de 272 6.1-Informar ao usuário 6. A prática a seguir visa montar um desses formulários. Capitulo XIII – Incluindo.1.2. Cada bloco.2-Se não: 6.2.

gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 53 de 272 Tabela de clientes: Índices secundários: Feita a tabela vamos para o delphi onde abriremos a prática 17 e salvamos como prática 18: Agora criaremos o formulário para cadastros de clientes: .

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 54 de 272 Prática 18 – Cadastro de clientes: Com o projeto Pratica18 aberto. crie um novo formulário: Agora monte o seguinte formulário: Objeto Form1 Label1 Label2 Label3 Label4 Label5 Label6 Propriedade Caption Visible Caption Caption Caption Caption Caption EdgeBorders Valor Cadastro de clientes Evento OnActivate Procedimento FormActivate ToolBar1 Images ShowCaptions List False Bairro Cidade Estado CEP Telefone Ebleft=true ebTop=true ebRight=true ebBottom=true ImageList1 True True .gondraf@hotmail.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name Caption Name EditLabel.Caption LabelPosition Visible .Strings Name Sorted OnClick etipoClick ComboBox1 Items.Caption LabelPosition Name EditLabel.Strings novo Novo primeiro Primeiro anterior Anterior proximo Proximo ultimo Ultimo salvar Salvar excluir Excluir localizar Localizar fechar Fechar ecodigo Código lpleft alBottom False Buscar alBottom DM.Caption LabelPosition Align Enabled Caption Align DataSource ReadOnly Caption Name Caption Items.Strings MaskEdit2 LabeledEdit2 LabeledEdit3 Name Visible Name EditLabel.DSClientes True Aplicar elocaliza Localizar por: Cliente Código CPF CNPJ ebuscar etipo Tipo 2 Físico Jurídico ebairro True 13 de julho Aruana Atalaia Centro Jabotiana Santa Tereza ecpf_cnpj False ecliente Cliente lpleft erg_insestadual Código lpleft False OnClick OnClick OnClick OnClick OnClick OnClick OnClick OnClick OnClick OnExit Página 55 de 272 Toolbutton1 Toolbutton2 Toolbutton3 Toolbutton4 Toolbutton5 Toolbutton6 Toolbutton7 Toolbutton8 Toolbutton9 novoClick primeiroClick anteriorClick proximoClick ultimoClick salvarClick excluirClick localizarClick fecharClick ecodigoExit Labelededit1 Panel1 Label7 DBGrid1 BitBtn1 OnDblClick DBGrid1DblClick OnClick OnClick BitBtn1Click elocalizaClick RadioGroup1 MaskEdit1 RadioGroup2 Name Name Caption Columns Items.gondraf@hotmail.

Buttons. db.Caption LabelPosition Name EditLabel. ComCtrls.com Fábio José de Gondra Ramos Delphi 2005 for win32 Name EditLabel. ebairro.Text:=''. excluir. udm. etipo.Text:=''.ItemIndex:=-1.Caption LabelPosition Name EditLabel.FormActivate(Sender: TObject). private acao:integer. SysUtils.Text:=''.Enabled:=false.gondraf@hotmail. ExtCtrls. procedure TFclientes.Enabled:=false. ImgList. Forms.Strings Name EditMask MaxLength Text Name EditMask MaxLength Text Name Align Caption MaskEdit3 MaskEdit4 Panel2 ImageList1 Procedimentos: uses Windows. DBGrids. Messages. // limpeza dos campos ecodigo. begin //desabilitação dos botões salvar.Strings Name Sorted elogradouro Logradouro lpleft ecomplemento Complemento lpleft enumero Número lpleft ecidade True Aracaju Estância Itabaiana Nossa Senhora da Glória eestado True AL AM BA PE SE ecep 99999-999 9 Vazio (null) etelefone (99)9999-9999 13 Vazio (null) mensagens alBottom Defina uma ação Página 56 de 272 LabeledEdit4 LabeledEdit5 LabeledEdit6 ComboBox2 ComboBox3 Items.Caption LabelPosition Name Sorted Items. Grids. ecpf_cnpj.Text:=''. Classes. Graphics. ecliente. Mask. ToolWin. StdCtrls. Controls. Variants. Dialogs. .

Text. end. ecliente. ecidade.TClientesCliente. elogradouro.ItemIndex:=-1.Text.Text:=dm. ecomplemento.novoClick(Sender: TObject). procedure TFclientes.TClientesRg_insestaudal. ecliente.Text:=dm. end.Text:=''. //direcionando o focus ecodigo.Text:=''.Text.Text:=''. ecidade. //informando ao usuário mensagens. begin //definicao da acao acao:=2. ecomplemento.ItemIndex:=dm. ecep.SetFocus.Caption:='Rotina de inclusão de registros'.primeiroClick(Sender: TObject).TClientesBairro. enumero.Text:=dm. etipo. eestado.Text.TClientesEstado.Text. erg_insestadual. ecidade.TClientesCpf_cnpj.Text:=''.gondraf@hotmail.Text:=''.First. // localização do primeiro registro dm. erg_insestadual.Text. begin //definicao da acao acao:=1.Text:=''.TClientesComplemento.Text:=''.Text:=dm.Text:=''. ecomplemento.Text:=''. enumero. eestado.TClientesNumero.Value.Text.Text:=''.Text:=''. elogradouro. etelefone. ecep.Text.Text:=''.Text:=dm. ecpf_cnpj.Text:=dm. //inicialização da acao acao:=0. etipo.Text:=''.Text:=dm.TClientesTelefone.TClientesCidade.Text:=dm. ecpf_cnpj. enumero.Text:=''. //transferencia dos dados da tabela para o formulario ecodigo. elogradouro.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 57 de 272 erg_insestadual.Text.Text:=''.TClientesTipo.TClientesCep. //informando ao usuário .Text:=dm.Text:=dm. ebairro. procedure TFclientes.TClientesLogradouro. etelefone.Text. eestado.Text:=dm.Text:=''.Text.Text:=''.Text.Text:=''. ecep.Open.Text:=dm.TClientesCodigo.Text:=''. //abertura da tabela dm.Text:=''. // limpeza dos campos ecodigo.TClientes.TClientes. etelefone. ebairro.

Text:=dm. ecep.TClientesCidade.Text. etipo.Text:=dm. begin //definicao da acao acao:=2.Text:=dm.Text.Caption:='Rotina de navegação de registros'.TClientesComplemento.TClientesTelefone.TClientesRg_insestaudal.TClientesEstado.ItemIndex:=dm.Text:=dm.TClientes.TClientesLogradouro.TClientesTipo.TClientesCodigo. ecpf_cnpj.Text.Text. ecep.Text.Text:=dm.Text. etelefone. etipo.Next.Text:=dm. procedure TFclientes. ecomplemento.Text.TClientesCliente. //informando ao usuário mensagens.Prior.TClientes. procedure TFclientes. elogradouro. procedure TFclientes.TClientesCliente. erg_insestadual.Text:=dm.ultimoClick(Sender: TObject).Caption:='Rotina de navegação de registros'.TClientes.TClientesEstado. ecidade. // localização do ultimo registro dm. ecomplemento.TClientesCidade.Text:=dm.Text:=dm. ecliente. //transferencia dos dados da tabela para o formulario ecodigo.ItemIndex:=dm.Text.Text.Value.TClientesTipo. ecliente.TClientesComplemento.TClientesCep.Text:=dm.TClientesCpf_cnpj. elogradouro. enumero. //informando ao usuário mensagens.TClientesTelefone. enumero. eestado.Text:=dm. end. ebairro. ecpf_cnpj.TClientesCodigo. // localização do proximo registro dm. etelefone.Text. ebairro. eestado.Text:=dm.Text:=dm. erg_insestadual.Text:=dm.proximoClick(Sender: TObject).Text:=dm.Text.Text:=dm.Text.gondraf@hotmail.TClientesBairro.TClientesCpf_cnpj.Text:=dm.TClientesLogradouro. //transferencia dos dados da tabela para o formulario ecodigo.anteriorClick(Sender: TObject).Text.Text:=dm. //transferencia dos dados da tabela para o formulario .Text:=dm.TClientesNumero.Text.Text.Text.TClientesBairro.Text:=dm.Text.Text.Caption:='Rotina de navegação de registros'.Text:=dm.Text:=dm. // localização do registro anterior dm.Text:=dm.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 58 de 272 mensagens.Text. ecidade.Text.Value.Text.Text. begin //definicao da acao acao:=2.TClientesCep.Text.Text. begin //definicao da acao acao:=2.Last.Text:=dm.TClientesNumero.TClientesRg_insestaudal. end. end.

Text.Text:=eestado. dm.Text.Text:=''.Text.TClientesTipo.Text:=''.TClientesEstado. dm.TClientesCodigo.Text.TClientesComplemento.TClientes.Text. ecep.TClientesRg_insestaudal.TClientes.Text:=ecpf_cnpj. ebairro. ecpf_cnpj. dm. //desabilitação dos botões salvar.Text:=dm.Text:=ecodigo.Text.TClientesComplemento.Text:=dm.ItemIndex:=dm.TClientesCep. //informando ao usuário mensagens.Edit. dm.Text.TClientesRg_insestaudal.Value.Text:=erg_insestadual.Enabled:=false.TClientesCliente.Text.Text:=dm.TClientesCpf_cnpj.TClientesLogradouro.TClientesNumero. ecliente.Text.Text:=''.Text:=dm. etipo.Text:=etelefone.TClientesCliente.Text. ecliente. erg_insestadual.Caption:='Rotina de navegação de registros'. ecpf_cnpj.TClientesCidade. dm. ebairro.ItemIndex:=-1.TClientesTelefone.Text:=dm.Text:=''. dm.Text.Text:=elogradouro.Text:=''. begin //informando ao usuário mensagens. elogradouro.Post.Text.TClientesTelefone. // limpeza dos campos ecodigo. dm. excluir. dm.Text:=dm.Text.Text:=dm.ItemIndex. enumero. elogradouro.Enabled:=false.Append.TClientesTipo.Text. //critica de permissão if ecodigo. dm.Text. alteração // transfere dados do formulario para a tabela dm.gondraf@hotmail. etipo.TClientesNumero.Text.TClientesCodigo.Text:=ebairro. ecomplemento.Text:=dm.salvarClick(Sender: TObject). dm. erg_insestadual. end. // cria um registro em branco dm.TClientesCidade.Text:=dm. // grava dados dm.Text. // coloca a tabela em modo de edição. eestado.TClientesLogradouro.Text:=enumero. dm.Text='' then showmessage('Codigo não informado ou inexistente!') else begin if acao=1 then dm. // mensagem ao usuario showmessage('Registro salvo!'). end.Text:=dm.Text:=ecidade. procedure TFclientes.Text:=dm. .Text. dm.Text:=ecep.Text.Caption:='Rotina de gravação de registros'.TClientesCpf_cnpj.Text.Text:=ecomplemento.Text.TClientesEstado. etelefone. ecidade.TClientesBairro.Value:=etipo.Text.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 59 de 272 ecodigo.TClientesBairro.Text:=ecliente.TClientes.Text:=''.Text.Text:=dm.Text.TClientesCep.

Text then begin // informando ao usuario showmessage('Registro já existe'). begin //informando ao usuário mensagens.Text:=''. // limpeza dos campos ecodigo.Caption:='Rotina de exclusão de registros'.Delete.Text:=''.TClientes.Text:=''.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 60 de 272 ecomplemento. procedure TFclientes. ecomplemento.Text:=dm.Text:=''.Text:=''. ecpf_cnpj. ebairro. // exclusão do registro dm.Text:=''.Text:=''.TClientesCodigo.ecodigo. .Text:=''.Text:=''.Text.Text:=''. ecliente. ecep. // mostranddo os dados ecodigo. end. etelefone. //inicialização da acao acao:=0.Text.Text<>'' then begin // vericando se alguma acao foi definida case acao of 0:begin //informando ao usuario showmessage('Nenhuma acao foi definida'). procedure TFclientes.Text:=''. //desabilitação dos botões salvar.Text:=''.Text:=''.TClientesCodigo.Text:=''.Caption:='Defina uma ação'. eestado. ecep. mensagens. ecidade. end.ecodigoExit(Sender: TObject).Text:=''. //informação ao usuario showmessage('Registro excluído'). eestado.Enabled:=false.Text:=''. if ecodigo. elogradouro.[locaseinsensitive]).ItemIndex:=-1.TClientes.Locate('codigo'. begin if ecodigo.gondraf@hotmail. enumero. erg_insestadual.excluirClick(Sender: TObject). ecidade.Text:=''. excluir. etelefone. end.Text=dm. 1:begin //verificando se o registro já existe dm.Enabled:=false. //inicialização da acao acao:=0.Text:=''. etipo. enumero.

TClientesTelefone.TClientesEstado. etelefone.ItemIndex:=dm. erg_insestadual.Text. mensagens.Text:=dm.Text:=dm.Text:=dm.Text:=dm. eestado.Text=dm.Text. end. excluir.Enabled:=true.Text:=dm.Enabled:=false.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 61 de 272 etipo. ecep.ItemIndex:=dm.Text:=dm. ecomplemento.Enabled:=true. excluir.Text.TClientesEstado. etelefone.TClientesTelefone.Text:=dm.Text.TClientesNumero.Text.Text:=dm.Enabled:=false. etipo.Text:=dm. ecpf_cnpj.Enabled:=false.TClientesCep.gondraf@hotmail.TClientesBairro. erg_insestadual. end else begin //redefinição dos botões salvar.Text. ecpf_cnpj.Text:=dm. 2:begin //verificando se o registro já existe dm. end.Text:=dm. ecidade.Enabled:=false. elogradouro.TClientesComplemento. end.Caption:='Ação redefinda para navegação'.Text:=dm.Value.Text:=dm. ecomplemento.Text:=dm.Text. end else begin // informando ao usuario showmessage('Registro não existe'). enumero.TClientesCpf_cnpj.Text.Text.TClientesCidade.Text.TClientesTipo.Text.TClientesRg_insestaudal.ecodigo.Text.Text:=dm.TClientesLogradouro.Text. ecliente. ecliente.TClientesTipo.TClientes.TClientesCodigo. excluir.Text:=dm.Value.Text:=dm. enumero.Enabled:=true.Text. end.Text then begin // mostrando os dados ecodigo. ebairro. excluir.Text:=dm. //redefinição dos botões salvar.Text:=dm.TClientesNumero. ecep.Text. elogradouro.Text.TClientesRg_insestaudal.Text.[locaseinsensitive]). //redefinição dos botões salvar.TClientesLogradouro. if ecodigo.Text.Text.TClientesCliente.Text.TClientesCep.TClientesCliente.TClientesCpf_cnpj. ebairro. . //redefinindo acao acao:=2. ecidade.Text:=dm.Text.Text:=dm.Text:=dm. //redefinição dos botões salvar.Text.TClientesCodigo.Text:=dm.TClientesCidade. eestado.TClientesComplemento.Locate('codigo'.Text.TClientesBairro.Enabled:=true.Text. end.

J.Visible:=false. 0:begin label1.ItemIndex:=0. erg_insestadual.P.G.TClientes. begin case etipo.ItemIndex of -1:begin label1.EditMask:=''. if ecodigo.gondraf@hotmail.EditMask:='99. ebuscar. ecpf_cnpj.EditLabel. excluir.Visible:=false. begin panel1.Est. // fechamento do formulário fclientes. ecpf_cnpj.Close. end.Visible:=true.:'. erg_insestadual.Visible:=true.N. begin case elocaliza.P. 1:begin label1. procedure TFclientes. erg_insestadual.Visible:=true.Caption:='Defina uma ação'.:'.Text:=''.Visible:=false.0'.Visible:=true.Text='' then begin // redefinindo acao acao:=0.999.elocalizaClick(Sender: TObject). end.Caption:='C.Close. ecpf_cnpj.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 62 de 272 end.etipoClick(Sender: TObject).999-99. end. ecpf_cnpj.Caption:='R. ecpf_cnpj.F.0'. end. end. end. begin //fechamento da tabela dm.Visible:=true. end.:'.ItemIndex of 0:begin . label1. procedure TFclientes.Enabled:=false. mensagens.Caption:='C. end.localizarClick(Sender: TObject). erg_insestadual.:'. procedure TFclientes.Caption:='I.Enabled:=true.fecharClick(Sender: TObject). erg_insestadual.Visible:=true. label1.999.999/9999-99. ebuscar. //redefinição dos botões salvar.EditLabel. procedure TFclientes.EditMask:='999.Enabled:=false. end. elocaliza.

ebuscar.gondraf@hotmail.IndexName:=''.Text:=''.First.Width:=ecliente. end.Width:=ecodigo.TClientesCodigo.FindNearest([strtoint(ebuscar. ecliente.First.Value.Locate('CPF_CNPJ'. dm.EditMask:='999. dm. begin // mostrando os dados ecodigo.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 63 de 272 // ajustando a chave de índices dm.ebuscar.TClientes. end.999-99.TClientes.Width. begin case elocaliza.0'.999/9999-99. ebuscar.TClientesCliente.SetKey.Text:=''. ebuscar. dm.TClientes.First.BitBtn1Click(Sender: TObject).TClientesCpf_cnpj. dm.Width:=ecpf_cnpj.TClientes.TClientesTipo. etipo.Text.Width.Text. //configurando campo de busca ebuscar.Width. procedure TFclientes.TClientes.TClientes.IndexName:='idcliente'. end.EditMask:='99.IndexName:=''. ebuscar. end.TClientes.TClientes. end.TClientes.Text:=dm.999.Text:=''. ebuscar.Text.EditMask:=''. end. . 3:begin // ajustando a chave de índices dm. end.TClientes.Text.Width:=ecpf_cnpj. ecpf_cnpj. ebuscar. dm.SetKey.Text:=''.Text:=dm.Text.Width.SetKey.Text]).Text:=dm.999.[locaseinsensitive]). ebairro.TClientes.TClientes. //configurando campo de busca ebuscar.First.3:dm.TClientesBairro. ebuscar.TClientes.SetKey. 1:dm. dm.TClientes.FindNearest([ebuscar. dm. //configurando campo de busca ebuscar. 2. end. ebuscar. 2:begin // ajustando a chave de índices dm.ItemIndex of 0:dm.Text:=dm.TClientes. procedure TFclientes. //configurando campo de busca ebuscar. dm.DBGrid1DblClick(Sender: TObject).ItemIndex:=dm.0'.0'. 1:begin // ajustando a chave de índices dm.IndexName:=''.Text)]).EditMask:='9999999.

não existe um pedido de confirmação. e • Mensagens de diálogo.Text.TClientesNumero. As instruções podem ser classificadas em: • Mensagens simples ou avisos.TClientesLogradouro. Comentários: Exercício 08 – Crie um cadastro de produtos e um cadastro de fornecedores.TClientesRg_insestaudal. uma vez pressionados o usuário perde o controle sobre a ação. elogradouro.gondraf@hotmail. excluir.TClientesCep.TClientesEstado.Enabled:=true.Text:=dm.Text.Text. ecidade. ecep.Enabled:=true. enumero.TClientesComplemento.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 64 de 272 erg_insestadual.Text:=dm. Capitulo XIV – Respondendo a mensagens Observe os comportamentos dos botões salvar e excluir na prática 18. As mensagens simples ou avisos.Text:=dm. isto é.Text. são geralmente utilizadas para passar informações ao usuários onde não se necessitem de confirmação para executar ou cancelar um processamento. As mensagens são funções especiais definidas pelo delphi onde o desenvolvedor passa informações de advertência.Text.Text.Text:=dm.Text.Text:=dm. o registro será salvo ou excluído.Text.Text:=dm. As mensagens de diálogos.Text:=dm. end. são aquelas que necessitam da confirmação do usuário para execução ou cancelamento de um processo. . //redefinição dos botões salvar. ecomplemento.TClientesTelefone. eestado.TClientesCidade. //redefinindo a ação acao:=2.Text:=dm. etelefone. erro ou instruções ao usuário.

gondraf@hotmail. A tabela seguinte lista os valores de TMsgDlgBtn por cada tipo de botão que pode aparecer na caixa de mensagem. Utilize MessageDlg para expor uma caixa de mensagem e obter a resposta do usuário.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 65 de 272 Mensagens simples ou avisos: Comando: ShowMessage(dado string). Sintaxe: MessageDlg(Msg: String. e MessageDlgPos. MessageDlg: Exibe uma caixa de diálogo no centro de tela. e o valor correspondente que é devolvido se o usuário seleciona aquele botão: Botão pressionado mbOk mbCancel mbYes mbNo mbAbort mbRetry mbIgnore Resposta mrOk mrCancel mrYes mrNo mrAbort mrRetry mrIgnore Prática 19 – Utilizando o comando messagedlg Formulário: . DlgType: TMsgDlgType. Mensagens de diálogo: Comandos: MessageDlg. Descrição: Variável Msg DlgType Botões HelpCtx Tipo String TMsgDlgType TMsgDlgButtons Longint Descrição é o conteúdo da mensagem indica o propósito do diálogo indicam que botões devem aparecer na caixa de mensagem especifica o contexto ID para o tópico de ajuda que deverá aparecer quando o usuário clica o botão de ajuda ou aperta F1 enquanto o diálogo é exibido MessageDlg: Devolve o valor do botão que o usuário selecionou. HelpCtx: Longint). Botões: TMsgDlgButtons.

end.0).0).mterror.mtwarning.mtconfirmation.com Fábio José de Gondra Ramos Delphi 2005 for win32 Propriedade Caption Caption Items Valor Pratica 19 Indique o tipo da mensagem Informação Atenção Erro Confirmação Página 66 de 272 Objeto Form1 RadioGroup1 Evento OnClick Procedimento RadioGroup1Click Procedimentos: procedure TForm1.mbcancel].RadioGroup1Click(Sender: TObject).'.mtconfirmation.[mbyes.[mbyes.mbno].mbno].mbno]. Comentários: Prática 20 – Utilizando o comando messagedlg Formulário: Objeto Form1 BitBtn1 Procedimentos: Propriedade Caption Caption Valor Pratica 20 Excluir Evento Procedimento procedure TForm1. begin case radiogroup1. end. Comentários: Prática 21 – Utilizando o comando messagedlgpos Formulário: .[mbyes.[mbretry. end. 2:messagedlg('Não posso salvar os dados!'.mbno].mtinformation.ItemIndex of 0:messagedlg('Você deve informar todos os dados!'. begin if messagedlg('Confirma exclusão?'. 3:messagedlg('Confirma exclusão dos dados!'.0)=mryes then showmessage('Exclusão confirmada!') else showmessage('Exclusão cancelada!').0).[mbyes.BitBtn1Click(Sender: TObject). 1:messagedlg('Cuidado! risco de perder os dados.0).gondraf@hotmail.

Como sabemos os procedimentos ocorridos na linguagem orientada a objetos são independentes.Text + ' e na coluna:'+ labelededit1. note que existem rotinas que se repetem várias vezes durante a confecção da página de código: // limpeza dos campos // transferencia dos dados da tabela para o formulário // mostrando os dados Observe agora o procedimento elocalizarclick. Text.Text). portanto uma única rotina escrita poderá ser utilizada por diversos objetos e por diversas vezes.strtoint(labelededit2. mudando-se apenas o seu valor. Comentários: Exercício 09 – Na prática 18. end.[mball.Text)). note que os comandos utilizados para ajustar a chave e índices e configurar os campos de busca são comuns para cada uma das opções case. inclua na rotina de exclusão uma mensagem de confirmação para decisão do usuário. quando este procedimento realizar um cálculo qualquer (lógico ou aritmético) e devolver algum valor ao objeto que o disparou teremos uma função.gondraf@hotmail.0. . Capitulo XV – Rotinas especiais (Procedures e Funções) Observe a prática 18. begin messagedlgpos('Mensagem na linha:'+ labelededit2. mtinformation.BitBtn1Click(Sender: TObject).strtoint(labelededit1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 67 de 272 Objeto Form1 BitBtn1 Labelededit1 Labelededit2 Procedimentos: Propriedade Caption Caption Caption Caption Valor Pratica 21 Aplicar Indique a coluna da mensagem Indique a linha da mensagem Evento Click Procedimento BitBtn1Click procedure TForm1.mbno]. porém se nenhum valor for devolvido a este objeto teremos uma procedure.

Text:=''.Text:=''. procedure Limparcampos().Text:=''. procedure limparcampos(). para isso localize o comentário \\ limpeza dos campos.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 68 de 272 Para criar a procedure limparcampos. precisamos reservar um espaço na memória para sua colocação. assim utilizaremos a cláusula Var para sua declaração. elogradouro. a cláusula implementation para sua descrição. begin with fclientes do begin ecodigo.. end.Text:=''. etipo. ecomplemento. Na cláusula Var inclua: procedure limparcampos().Text:=''. ecidade. end. var Fclientes: TFclientes. enumero.Text:=''. etelefone. substitua as linhas que executam a limpeza por limparcampos().Text:=''.Text:=''. . ecep.Text:=''. Agora que a procedure já foi criada é só chamá-la.Text:=''.Text:=''.ItemIndex:=-1.gondraf@hotmail. erg_insestadual. Na cláusula implementation inclua: procedure limparcampos() e digite seu conteúdo. ecpf_cnpj. para criar o procedimento limparcampos proceda a seguinte descrição. ecliente. conforme descrição. nos procedimentos da unit de fclientes. eestado. ebairro. Abra a pratica 18 e nela o formulário FClientes.Text:=''.

elogradouro. etipo. ecep.Text:=''.Text:=dm.Text:=dm.Text.Text.TClientesCidade. erg_insestadual.Text:=''.ItemIndex:=dm. procedure Limparcampos().Text:=''.Text:=''. Na cláusula implementation inclua: procedure mostrardados() e digite seu conteúdo.Text.ItemIndex:=-1. ebairro.TClientesCliente. ecep. elogradouro. . ecidade. portanto podem ser substituídas por uma procedure que denominaremos de procedure mostrardados(). etelefone.Text:=''. Na cláusula Var inclua: procedure mostrardados().Text:=''.Text:=dm.Text:=dm.Text:=''. ecomplemento. ecpf_cnpj.Text. ebairro.TClientesTipo.Text:=dm. FormActivate NovoClick SalvarClick ExcluirClick As rotinas // transferencia dos dados da tabela para o formulário e // mostrando os dados.Text:=dm.Text:=''. procedure Mostrardados().TClientesTelefone.Text.TClientesCpf_cnpj. var Fclientes: TFclientes.TClientesComplemento. fazem a mesma coisa. eestado. ecliente. begin with fclientes do begin ecodigo.TClientesCep. erg_insestadual.Text.TClientesBairro.Text.gondraf@hotmail. procedure Mostrardados().Text. ecidade.Text. Nos Procedimentos Limparcampos().Text.TClientesCodigo.TClientesLogradouro. etipo. ecomplemento.Text:=''.Text:=''. end.Text. end.Text:=''.Text:=dm.Text:=dm. etelefone.Text:=dm.TClientesEstado.Value. eestado.TClientesNumero.Text.com Fábio José de Gondra Ramos Delphi 2005 for win32 Substitua por Página 69 de 272 Localize // limpeza dos campos ecodigo. enumero.Text:=dm.Text:=dm. ecliente. ecpf_cnpj.Text:=''.Text:=dm. enumero.TClientesRg_insestaudal.

Text:=dm.Text.TClientesCidade. uses Windows. Criaremos então uma função onde passaremos os objetos que sofrerão alterações e seus valores e a denominaremos de função ajustabusca.TClientesCliente. Localize // mostrando os dados ou // transferencia dos dados da tabela para o formulário codigo.Text:=dm. ecep.Text. Substitua por Nos procedimentos elogradouro.index os objetos que sofrem alterações são os mesmos. ebairro.ItemIndex:=dm. Graphics.editmascara:TMaskedit.Text. ecomplemento.Text. ecliente.TClientesLogradouro.Text:=dm. porém ainda há mais por fazer.TClientesCpf_cnpj.TClientesNumero. ComCtrls.Text:=dm.Text. conforme descrição. Messages. SysUtils. Forms. ToolWin.TClientesComplemento. Grids. DBGrids.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 70 de 272 Agora substitua as linhas que mostram os dados por mostrardados(). note que para cada valor do item. Como estamos utilizando uma variável tipo TTable teremos que acrescer a biblioteca DBTables na cláusula uses da unit do formulário de clientes.TClientesCep.Text:=dm.Text.Text. erg_insestadual. ImgList. udm. etelefone.texto:string.Text:=dm.TClientesBairro. etipo. Dialogs.indice. function ajustabusca(tabela:TTable.TClientesTelefone. Variants. Controls. ecpf_cnpj. ExtCtrls. este tipo de comportamento sugere que de acordo com o item escolhido devemos informar seu valor. Classes. Agora na cláusula var acrescemos a declaração da função: . enumero. DBTables. apenas os valores atribuídos se alteram.Text:=dm. Mask. cabe ao programador usar a nomeclatura que melhor lhe convir.. db.TClientesTipo.Text:=dm.Text. ecidade. Nesta função são criadas algumas variáveis representando objetos do formulário e outras representando os possíveis valores que eles possam assumir: Variável Tabela Editmascara Índice Mascara Texto Campo Tipo TTable TMaskEdit String String String TLabeledEit Valor Assume o valor de uma Table Assume o valor de um MaskEdit Guarda um valor string Guarda um valor string Guarda um valor string Assume o valor de um Labelededit Obs: Os nomes atribuídos as variáveis de uma função não são convencionados.mascara. Observe o evento elocalizaClick.Text.Text:=dm.Text:=dm.Text:=dm. Buttons.Text.Text:=dm. mostrardados() primeiroClick anteriorClick proximoClick ultimoClick ecodigoExit DBGrid1DblClick Depois que montamos algumas procedures e substituímos no nosso projeto observamos que um grande número de linhas foram suprimidos.TClientesCodigo.campo:tlabelededit):boolean. StdCtrls.Text.Value.gondraf@hotmail.TClientesRg_insestaudal.TClientesEstado.Text. eestado.

indice.999-99. editmascara.''. result:=true. vamos aplicar ao evento elocalizaClick: procedure TFclientes. begin tabela.''.ebuscar.999.''.TClientes. procedure Limparcampos(). Comentários: Capitulo XVI – Localizando dados em uma tabela De nada adianta incluir dados em uma tabela se não tiver um meio de localizar o que foi incluído.SetKey.TClientes.''. editmascara.ebuscar.ebuscar.campo:tlabelededit):boolean.Width:=campo.0'.editmascara:TMaskedit.'idcliente'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 71 de 272 var Fclientes: TFclientes.0'. end.campo:tlabelededit):boolean.texto:string. end.'99. Uma vez descrita a função. 2:ajustabusca(dm.First. begin case elocaliza.0'.TClientes.ecliente).indice.ecodigo).ItemIndex of 0:ajustabusca(dm.elocalizaClick(Sender: TObject).ebuscar.editmascara:TMaskedit.EditMask:=mascara.''.'9999999.Text:=''. editmascara.Width.999.texto:string.gondraf@hotmail. 3:ajustabusca(dm.999/9999-99. end. tabela.'999.''.erg_insestadual).''. procedure Mostrardados().''. tabela. function ajustabusca(tabela:TTable.TClientes. 1:ajustabusca(dm.mascara. Para isso alguns métodos foram incorporados ao delphi: Uso de coringa Uso de parâmetro Não Não Não Não Sim Não Não Uso de Chave Método Características Gotokey GotoNearest FindKey FindNearest Locate RecNo First Sim Sim Sim Sim Não Não Não Não Não Não Não Não Não Não Localiza um único registro com exatidão Localiza o registro que mais se assemelha Localiza um único registro com exatidão Localiza o registro que mais se assemelha Localiza um registro com base em um dado ou parte deste Localiza um registro com base no número de registro ou informa o número do registro atual Localiza o primeiro registro da tabela . Em seguida descrevemos a função na cláusula implementation: function ajustabusca(tabela:TTable.mascara.IndexName:=indice.erg_insestadual).

Formulário: Objeto Form1 RadioGroup1 Propriedade Caption Caption Items Caption Name Caption Name EditLabel. em seguida feche a pratica e inicie uma nova aplicação. FindNearest) Abra a pratica 18 e inclua 10 registros no cadastro de clientes.Caption LabelPosition Caption Caption Valor Pratica 22 Método GotoKey GotoNearest FindKey FinNearest Método GotoKey ou FindKey GB1 Método GotoNearest ou FindNearest GB2 Código: Lpleft Cliente: Lpleft Localizar Localizar Evento OnActivate OnClick Procedimento Form1Activate RadioGroup1Click GroupBox1 GroupBox2 LabeledEdit1 LabeledEdit2 BitBtn1 BitBtn2 OnClick OnClick BitBtn1Click BitBtn2Click .Caption LabelPosition EditLabel.com Fábio José de Gondra Ramos Delphi 2005 for win32 Não Não Não Não Não Não Não Não Não Não Não Não Não Não Sim Página 72 de 272 Prior Next Last Filtered Filter Localiza o registro anterior ao atual Localiza o registro seguinte ao atual Localiza o último registro da tabela Habilita/desabilita o uso de filtros Separa um grupo de registros segundo uma condição Prática 22 – Localizando registros (métodos GotoKey. GotoNearest.gondraf@hotmail. FindKey.

begin vergroupbox(gb1.bg2:TGroupBox.DB TClientes Código Cliente Cpf / cnpj Rg /I.false). bg2.Visible:=ver2.com Fábio José de Gondra Ramos Delphi 2005 for win32 Name DataBaseName TableName DataSet Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption DataSource DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField TClientes Dados Clientes.ver1. procedure TForm1. begin bg1. end.gb2. result:=true.gondraf@hotmail.Estaudal Logradouro Número Complemento Bairro Cidade Estado Cep Telefone Página 73 de 272 Table1 DataSource1 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 DbGrid1 DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12 DataSource1 DataSource1 Código DataSource1 Cliente DataSource1 Cpf_cnpj DataSource1 Rg_inestadual DataSource1 Logradouro DataSource1 Numero DataSource1 Complemento DataSource1 Bairro DataSource1 Cidade DataSource1 Estado DataSource1 Cep DataSource1 Telefone Nome Vergroupbox Rotinas especiais Função Procedimentos: function vergroupbox(bg1.FormActivate(Sender: TObject).false. .ver2:boolean):boolean.Visible:=ver1.

procedure TForm1.FindKey([labelededit1. end. tclientes.ItemIndex=0) or (radiogroup1.BitBtn1Click(Sender: TObject). end else tclientes. end else tclientes.false. procedure TForm1.FindNearest([labelededit2. end.ItemIndex=0 then begin tclientescodigo. tclientes. end.Text.Open.RadioGroup1Click(Sender: TObject).gb2.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 74 de 272 tclientes.Text. end. if radiogroup1. begin tclientes.BitBtn2Click(Sender: TObject).Text:=labelededit2.false) else vergroupbox(gb1. tclientes.SetKey. tclientes.ItemIndex:=-1.GotoNearest.Text]).gb2. begin tclientes. if radiogroup1.true.IndexName:='idcliente'.Text]).true). begin if (radiogroup1.IndexName:=''.Text:=labelededit1.ItemIndex=0 then begin tclientescodigo. procedure TForm1. Comentários: .gondraf@hotmail.ItemIndex=2) then vergroupbox(gb1.GotoKey. radiogroup1.SetKey.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 75 de 272 Prática 23 – Localizando registros (métodos Recnº) Formulário: Objeto Form1 GroupBox1 LabeledEdit1 BitBtn1 Table1 DataSource1 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 Label13 DbGrid1 Propriedade Caption Caption Name EditLabel.gondraf@hotmail.size Font.Estaudal Logradouro Número Complemento Bairro Cidade Estado Cep Telefone Registro nº: Evento OnActivate Procedimento Form1Activate OnClick BitBtn1Click Registros 14 Fsbold DataSource1 .Caption LabelPosition Caption Name DataBaseName TableName DataSet Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Name Font.style DataSource Valor Pratica 23 Método RecNº GB1 Registro: Lpleft Localizar TClientes Dados Clientes.DB TClientes Código Cliente Cpf / cnpj Rg /I.

Visible:=false.RecNo).Visible:=false. registros.Caption:='Registro n°:'+inttostr(tclientes.Caption:='Registro n°:'+inttostr(tclientes.Text).RecNo).Prior. end. begin gb1.Button1Click(Sender: TObject).Button3Click(Sender: TObject). end. end.RecNo:=strtoint(labelededit1. gb1.First. registros. procedure TForm1. .Open.RecNo). registros. tclientes. procedure TForm1.gondraf@hotmail.Visible:=false. begin tclientes. procedure TForm1.RecNo).Visible:=false.Button2Click(Sender: TObject). begin gb1. procedure TForm1. end. registros. begin gb1. begin tclientes.Caption:='Registro n°:'+inttostr(tclientes.Caption:='Registro n°:'+inttostr(tclientes.com Fábio José de Gondra Ramos Delphi 2005 for win32 DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource1 Código DataSource1 Cliente DataSource1 Cpf_cnpj DataSource1 Rg_inestadual DataSource1 Logradouro DataSource1 Numero DataSource1 Complemento DataSource1 Bairro DataSource1 Cidade DataSource1 Estado DataSource1 Cep DataSource1 Telefone Página 76 de 272 DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12 Procedimentos: procedure TForm1. gb1. tclientes.FormActivate(Sender: TObject).Visible:=false.BitBtn1Click(Sender: TObject).

end. begin gb1. end.Button4Click(Sender: TObject). procedure TForm1.RecNo). registros.gondraf@hotmail.Visible:=false.Next. begin gb1.Caption LabelPosition Valor Pratica 24 Método Locate GB1 Valor:: Lpleft Evento OnActivate Procedimento Form1Activate . end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 77 de 272 tclientes.Visible:=true. tclientes.Last.Caption:='Registro n°:'+inttostr(tclientes. Comentários: Prática 24 – Localizando registros (métodos Locate) Formulário: Objeto Form1 GroupBox1 LabeledEdit1 Propriedade Caption Caption Name EditLabel. procedure TForm1.Caption:='Registro n°:'+inttostr(tclientes.Button5Click(Sender: TObject). registros.RecNo).

FormActivate(Sender: TObject). .Estaudal Logradouro Número Complemento Bairro Cidade Estado Cep Telefone DataSource1 DataSource1 Código DataSource1 Cliente DataSource1 Cpf_cnpj DataSource1 Rg_inestadual DataSource1 Logradouro DataSource1 Numero DataSource1 Complemento DataSource1 Bairro DataSource1 Cidade DataSource1 Estado DataSource1 Cep DataSource1 Telefone Procedimentos: procedure TForm1.Estadual Parâmetro: Case Insensitive (completo) Partial Key (Parcial) Página 78 de 272 BitBtn1 Table1 DataSource1 RadioGroup1 OnClick BitBtn1Click RadioGroup2 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 DbGrid1 DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12 Código Cliente Cpf / cnpj Rg /I.gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Caption Name DataBaseName TableName DataSet Caption Items Caption Items Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption DataSource DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField Localizar TClientes Dados Clientes.DB TClientes Campos: Código Cliente CPF_CNPJ RG_Ins.

Locate('cliente'.Locate('codigo'. end.BitBtn1Click(Sender: TObject).Text. end.ItemIndex of 0:begin if radiogroup2.labelededit1.gondraf@hotmail.Open.labelededit1. 3:begin if radiogroup2.Text. begin case radiogroup1.Text. radiogroup1. end.labelededit1.ItemIndex:=-1.Locate('rg_inestaudal'.Locate('rg_inestaudal'.ItemIndex=0 then tclientes.Locate('codigo'.[lopartialKey]).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 79 de 272 begin tclientes.[lopartialKey]). end.ItemIndex:=-1.Text.ItemIndex=0 then tclientes. end.ItemIndex=0 then tclientes. procedure TForm1.[locaseinsensitive]) else tclientes.labelededit1. end.labelededit1.Text. 2:begin if radiogroup2. 1:begin if radiogroup2. end.Locate('cpf_cnpj'.labelededit1. radiogroup2.Locate('cliente'.[locaseinsensitive]) else tclientes.[locaseinsensitive]) else tclientes.[locaseinsensitive]) else tclientes.Text.labelededit1.Text.Locate('cpf_cnpj'.Text.labelededit1.ItemIndex=0 then tclientes.[lopartialKey]).[lopartialKey]). Comentários: .

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 80 de 272 Prática 25 – Localizando registros (métodos Filter) Formulário: Objeto Form1 GroupBox1 LabeledEdit1 BitBtn1 Table1 DataSource1 Label1 Label2 Label3 Label4 Label5 Label6 Label7 Label8 Label9 Label10 Label11 Label12 DbGrid1 DBEdit1 DBEdit2 Propriedade Caption Caption Name EditLabel.DB TClientes Código Cliente Cpf / cnpj Rg /I.Caption LabelPosition Caption Name DataBaseName TableName DataSet Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption DataSource DataSource DataField DataSource DataField Valor Pratica 25 Método Filter GB1 Epressão: Lpleft Localizar TClientes Dados Clientes.Estaudal Logradouro Número Complemento Bairro Cidade Estado Cep Telefone Evento Procedimento OnClick BitBtn1Click DataSource1 DataSource1 Código DataSource1 Cliente .gondraf@hotmail.

tclientes.BitBtn1Click(Sender: TObject). .gondraf@hotmail. begin tclientes.Filter:=labelededit1. inclua no menu de consultas do projeto Pratica 18. end.Close.Open.Text. tclientes.com Fábio José de Gondra Ramos Delphi 2005 for win32 DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource1 Cpf_cnpj DataSource1 Rg_inestadual DataSource1 Logradouro DataSource1 Numero DataSource1 Complemento DataSource1 Bairro DataSource1 Cidade DataSource1 Estado DataSource1 Cep DataSource1 Telefone Página 81 de 272 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBEdit7 DBEdit8 DBEdit9 DBEdit10 DBEdit11 DBEdit12 Procedimentos: procedure TForm1.Filtered:=true. Comentários: Exercício 10 – Crie consultas para o seu projeto Agora que vimos algumas práticas de consultar dados de uma tabela. tclientes. tclientes.Filtered:=false.

porém estes objetos exigem que os campos sejam do mesmo tipo. ou não sincrônica quando apenas o campo de uma das tabelas sofre alteração. procedimentos ou funções capazes de associarem campos de tabelas diferentes. definida e conhecida como SQL. Existe também uma Linguagem EStruturada de Questões (Consultas). baseada nas estruturas das tabelas e capazes de gerar relacionamentos entre elas. pode ser sincrônica. as relações também podem ser feitas através de métodos. Existem objetos capazes de criar relações entre tabelas.gondraf@hotmail. Tabela de materiais: . Para entendermos os relacionamentos entre tabelas vamos criar 03 tabelas e salva-las no alias dados.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 82 de 272 Capitulo XVII – Relacionando tabelas A relação entre tabelas consiste basicamente na interligação entre os campos das tabelas a se relacionar. quando os campos relacionais das duas tabelas sofrem alterações simultaneamente. Além dos objetos e do SQL.

gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 83 de 272 Com a tabela criada preencha os seguintes registros: Tabela de Vendas: Com a tabela criada preencha os seguintes registros: Tabela de itens Com a tabela criada preencha os seguintes registros: .

pas a esta pratica e inclua os seguintes objetos: Objeto Table1 Table2 Table3 DataSource1 DataSource2 DataSource3 Formulário: Name TMateriais TVendas TItens DSMateriais DSVendas DSItens DataBaseName Dados Dados Dados TableName Materiais.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 84 de 272 Prática 26 – Relacionamento I Anexe a unit dm.color Valor Pratica 26 200 400 200 400 200 400 200 400 Clientes AlTop AlCenter clBlue 12 clWhite Evento OnActivate Procedimento Form1Activate .db Dataset TMateriais TVendas TItens Objeto Form1 ScrollBox1 ScrollBox2 ScrollBox3 ScrollBox4 StaticText1 Propriedade Caption Height Width Height Width Height Width Height Width Caption Align Alignment Color Font.db Vendas.db Itens.gondraf@hotmail.size Font.

begin filtro:='Cliente='+dm.TVendas.TClientesCodigo. dm.Close.TVendas. .TVendas. var filtro:string.Filtered:=false. dm.com Fábio José de Gondra Ramos Delphi 2005 for win32 Caption Align Alignment Color Font. dm.color Caption Caption Caption Caption Caption Caption DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataField DataSource DataSource DataSource Cupons AlTop AlCenter clBlue 12 clWhite Itens do cupom AlTop AlCenter clBlue 12 clWhite Materiais AlTop AlCenter clBlue 12 clWhite Código Classe Produto Preço de custo Preço de venda Saldo Página 85 de 272 StaticText2 StaticText3 StaticText4 Label1 Label2 Label3 Label4 Label5 Label6 DBEdit1 DBEdit2 DBEdit3 DBEdit4 DBEdit5 DBEdit6 DBGrid1 DBGrid2 DBGrid2 DSMateriais Código DSMateriais Classe DSMateriais Produto DSMateriais Preço de custo DSMateriais Preço de venda DSMateriais Saldo DSClientes DSVendas DSItens Inclua a biblioteca DB na claúsula USES Procedimentos: procedure TForm1. end.Filtered:=true. procedure TForm1.TVendas.DBGrid1DblClick(Sender: TObject).DBGrid3DblClick(Sender: TObject).gondraf@hotmail.size Font.color Caption Align Alignment Color Font.size Font.Text. dm.size Font.color Caption Align Alignment Color Font. dm.Open.TVendas. var filtro1:string.Filter:=filtro.

Formulário: Objeto Form1 Bitbtn1 Bitbtn2 Bitbtn3 Label1 Label2 Label3 Label4 Label4 LabeledEdit1 LabeledEdit1 LabeledEdit2 LabeledEdit2 LabeledEdit3 LabeledEdit3 Propriedade Caption Caption Caption Caption Caption Caption Caption Caption Caption Caption Name Caption Name Caption Name Valor Pratica 27 Adicionar Salvar Novo Cliente Material Itens Vendas Material Quantidade N° do cupom Cupom Total do cupom Totalcupom Preço de venda Pvenda Evento OnActivate OnClick OnClick OnClick Procedimento Form1Activate Bitbtn1Click Bitbtn2Click Bitbtn3Click . end. dm. dm.TItens.DBGrid4DblClick(Sender: TObject).TVendasCupom.Text.Text. dm.gondraf@hotmail.Filtered:=true. procedure TForm1. begin dm.dm.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 86 de 272 begin filtro1:='Cupom='+dm.TItens.Filtered:=false.Locate('codigo'.pas a esta pratica. end.TMateriais.[locaseinsensitive]). dm.Open. dm. Comentários: Prática 27 – Relacionamento II Adicione a unit dm.TItensMaterial.TItens.TItens.Close.Filter:=filtro1.TItens.

Items.BitBtn2Click(Sender: TObject).Add(dm. dm.Text='' then quantidade. begin if totalcupom.Open. end.Count-1 do begin dm. end.TVendas.DSVendas Itens vendidos: LB1 LB2 Página 87 de 272 LabeledEdit4 LabeledEdit4 DBLookupComboBox1 DBLookupComboBox1 DBLookupComboBox1 DBLookupComboBox2 DBLookupComboBox2 DBLookupComboBox2 DBGrid1 DBGrid2 GroupBox1 ListBox1 ListBox2 Procedimentos: procedure TForm1.Last. lb2. procedure TForm1.Add(quantidade.Text)).TVendas.gondraf@hotmail. .DBLookupComboBox1Click(Sender: TObject).Text:='0'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Caption Name ListSource KeyField ListField ListSource KeyField ListField DataSource DataSource Caption Name Name Quantidade Quantidade Dm. begin dm.Text)*strtofloat(pvenda. begin for i:=0 to lb1.Text).Edit.TClientes. var i:integer.Text:=floattostr(stotal+strtofloat(totalcupom.Text). lb1.BitBtn1Click(Sender: TObject). procedure TForm1. proximo:=dm.Text:=dm.TItens. dm. var proximo:integer.BitBtn3Click(Sender: TObject).Clear.Text). dm.FormActivate(Sender: TObject).Open.TItens.TMateriais.Items.Text:='0'. procedure TForm1. totalcupom.Append. begin pvenda.Text:=inttostr(proximo).TVendas.Text='' then totalcupom. end. begin dm.DSItens Dm. lb2. procedure TForm1. dm.Clear. stotal:=strtofloat(quantidade. if quantidade. cupom.TMateriaisCodigo.RecNo+1.Open.Open. end.TItensCupom.TMateriaisPreodeVenda.Text:=cupom.TItens.DSMateriais Código Produto Dm.DSClientes Código Cliente Dm. dm. var stotal:real.Text. lb1.Text.

Estas tabelas recebem o nome de Query e se originam de Tabelas já existentes.Text.Items.Strings[i]. UNION – Promove a união de dois ou mais SELECT’s promovendo uma única saída. através do DataBase Desktop. ORDER BY – Determina a classificação.Text:=lb2. QBE Query. que compõem-se de comandos simples: • • • • • • • SELECT – Seleciona um. Criando uma query pelo DataBase Desktop Abra o DBD e escolha a opção: File. isto é.. Comentários: Capitulo XVIII – O SQL As vezes temos a necessidade de criar tabelas auxiliares para fins de consultas ou impressão. end. dm.TItensMaterial.Text:=totalcupom.Text:=cupom..Append. dm. HAVING – Determina uma condição para um GROUP BY.TVendas. FROM – Especifica as tabelas a serem usadas pelo SELECT.TItensQuantidade. WHERE – Especifica uma condição a ser usada na seleção dos campos. tabelas que terão um tempo de vida curto e que tendem a ser criadas pelo projeto em tempo de execução e a ser excluída tão logo o projeto seja fechado se não forem salvas.DB. dm.TVendasCliente.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 88 de 272 dm. algum.Edit. New.AsDateTime:=date. automaticamente a esta query será adicionada um script SQL.TVendas. Selecione o alias Dados e escolha a tabela Clientes. normalmente as query baseiam-se em uma Linguagem Estruturada de Questões.Post..TClientesCodigo.Text. Click em Abrir: . GROUP BY – Cria grupos onde serão organizados os campos. dm.Text:=dm.TVendasData. isto é. dm. a ordem em que os campos devem ser mostrados.Post. (Structured Query Linguage). conhecida com SQL. dm. bastando somente para isto alterar os parâmetros da SQL...AsDateTime:=date+30. dm. A relação entre as query’s e o SQL é única.Strings[i].TVendas.TVendasValor.Text.TVendasVencimento. dm. dm.gondraf@hotmail. ou todos os campos de uma ou algumas tabelas. ao se gerar uma query de maneira manual. o que nos possibilita afirmar que podemos alterar em tempo de execução toda a forma de uma query..Items. end.TItens..Text:=lb1.TVendasCupom. dm.

DB" ORDER BY Codigo. Tipo. Cep. Complemento. Cep. Logradouro.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 89 de 272 Dê um click sobre o checkbox da tabela: “Clientes.DB”. Bairro.gondraf@hotmail. Numero. Cpf_cnpj. Rg_insestaudal. Numero. Logradouro. Para verificar o resultado execute-a pressionando sobre o botão: Run Query: Para verificar os parâmetros da SQL pressione sobre o botão: Show SQL: SELECT DISTINCT Codigo. Click sobre o botão Run SQL e observe o resultado de nossa query: Criando uma relação entre duas tabelas através do query de modo interativo Novamente entraremos no DBD e criarem uma nova query com base na tabela Clientes. . Bairro. Cpf_cnpj. Tipo. Complemento. Estado. Rg_insestaudal. Cidade. Cliente. Telefone FROM ":Dados:Clientes. Telefone A clausula DISTINCT é opcional e indica que o nome dos campos não se repetem para a tabela indicada pela clausula FROM. Estado. Cliente. Cidade. Esta pronta a nossa query.

Tipo.gondraf@hotmail.Codigo. D. D1. D.Cep.Cupom.Codigo) ORDER BY D. D. D1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 90 de 272 Em seguida click no botão Add Table e escolha no alias curso a tabela Vendas.Vencimento FROM ":Dados:Clientes.DB e logo em seguida no campo Cliente de Vendas. D.Logradouro. D1.Codigo.Telefone.Cidade. D.Data.Tipo. D.Cupom.Data. D.Cliente = D. D. Estas letras representam os ALIAS criados pelo SQL para este exemplo.Complemento. D. D.Valor. click em Show SQL. D. D. D.Cpf_cnpj.Cliente. D1.Vencimento Observe a presença das letras D e d1 que aparecem antes dos nomes dos campos nas clausulas SELECT.Complemento. D1.Numero. D. D.Rg_insestaudal.DB e selecione todos os seus campos: Agora criaremos uma relação entre estas duas tabelas pressionado o botão join Tables e clicando sobre os campos Codigo de Clientes.DB" D.DB" D1 WHERE (D1. ":Dados:Vendas. D1. . D. D.Bairro.Valor. D1. D. WHERE e ORDER BY e depois dos nomes das tabelas na clausula FROM.Logradouro.Rg_insestaudal.Cliente. D.Telefone.Cliente. SELECT DISTINCT D. D1.Bairro.db: Agora observe o resultado obtido clicando sobre o botão Run Query. Veremos agora como está a arrumação do nosso SQL. D. D1. D. D1. D. D.Cpf_cnpj.Estado.Cep.Cliente.Numero.Cidade.Estado. D.

DB e Cupom em Itens.DB e selecione todos os seus campos: Agora criaremos uma relação entre estas duas tabelas pressionado o botão join Tables e clicando sobre os campos Codigo de Clientes.DB e no campo Codigo da tabela Clientes. Criando uma relação entre três tabelas através do query de modo interativo Novamente entraremos no DBD e criarem uma nova query com base na tabela Clientes.DB e logo em seguida no campo Cliente de Vendas.DB: .DB que está armazenada em C:\Curso de delphi ou simplesmente Alias Curso: Em seguida click no botão Add Table e escolha no alias curso a tabela Vendas.db.DB. esta relação se apresenta no SQL através da clausula WHERE.gondraf@hotmail. novamente pressione o botão Join Tables e selecione os campos Cupom de Vendas.DB e selecione todos os seus campos: Em seguida click no botão Add Table e escolha a tabela Itens.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 91 de 272 Observe também que ao criarmos um JOIN no campo Cliente da tabela Vendas. criamos uma relação entre elas.

D2.Cupom) ORDER BY D.Estado.Complemento. D. D2.gondraf@hotmail.Material. D1.Cidade.DB" D.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 92 de 272 Uma vez criadas as relações. D2. D1. D1.Complemento. D1.Codigo.Data.Cupom.Telefone. D.Codigo. D.Valor.Rg_insestaudal. D. D.Numero. itens e materias em tempo de execução Formulário: Objeto Form1 Query1 DataSource1 Propriedade Caption DataBaseName SQL DataSet Valor Pratica 28 Dados Strings. D.Bairro. D1. D. verifique como ficaram os parâmetros do SQL: SELECT DISTINCT D. D. D.Cep. D.Valor.Quantidade Observe a presença do operador AND na clausula WHERE.Data.Cupom.Vencimento.Numero.Cupom. D..Estado.Codigo) AND (D2. D1. D2. D. ":Dados:Itens.Cidade.Cupom = D1. D2. D. D.DB" D2 WHERE (D1.Cliente.Cliente. ":Dados:Vendas. D2.Cliente = D.Telefone.Vencimento.Cliente.Tipo. D2. Prática 28 – Criando o relacionamento entre as tabelas clientes. pois os joins criados durante a confecção do query estão representados por esta clausula.Tipo.Cpf_cnpj. D1.Ctrl. vendas.Cupom. D1. D.Logradouro.Cpf_cnpj. D.Material.Cep. D. Query1 Evento OnActivate Procedimento Form1Activate .Logradouro. D1.Quantidade FROM ":Dados:Clientes. D. D.Rg_insestaudal. D.Cliente.Bairro.DB" D1. D1. D.Ctrl. D. D. D. D2..

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 93 de 272 Query1. Itens C.Open. end.Cupom) and (C. begin query1.Material=D.Codigo=B. Comentários: Prática 29 – Selecionando todas as compras de um cliente Formulário: Objeto Form1 Query1 DataSource1 Table1 DataSource2 Label1 BitBtn1 DBGrid1 DBLookupCombobox1 Procedimentos: Propriedade Caption DataBaseName DataSet Name DataBaseName TableName DataSet Name Caption Caption DataSource ListSource KeyField ListField Valor Pratica 29 Dados Query1 DSQuery Dados Clientes Table1 DSTable Cliente Aplicar DSQuery DSTable Código Cliente Evento OnActivate Procedimento Form1Activate OnClick Bitbtn1Click .Cliente) and (B.Codigo) Procedimentos: procedure TForm1. Materiais D WHERE (A.Cupom=C.FormActivate(Sender: TObject)..SQL Strings. Vendas B. SELECT * FROM Clientes A.gondraf@hotmail..

Cliente) and (B.cliente='''+table1cliente. Materiais D'). procedure TForm1.SQL. procedure TForm1.SQL. Vendas B.SQL.SQL.Clear. query1. end. begin table1.Open.Open.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 94 de 272 procedure TForm1.BitBtn1Click(Sender: TObject).Add('SELECT *'). begin query1. begin query1.Add('WHERE (A. query1.Codigo=B. end.Cupom) (C. end.Material=D. query1.Text+''''+')'). query1.Cupom=C. Itens C.Button1Click(Sender: TObject).Codigo) and (A. Comentários: and Operadores WHERE Classe Aritméticos Operador + * / = <> > < >= <= AND OR NOT IN BETWEEN e AND EXISTS LIKE IS NULL Operação Adição Subtração Multiplicação Divisão Igual a Diferente de Maior que Menor que Maior ou igual Menor ou igual União Intersecção Negação Contido em uma lista Compreendido em uma faixa Cria uma subconsulta baseada na clausula WHERE Permite o uso de mascaras Verifica a presença de campos vazios Comparação Lógicos Especiais .Open.Add('FROM Clientes A.FormActivate(Sender: TObject). var condicao:string.gondraf@hotmail.

saldo From materiais Order by saldo desc 05 – Consulta materiais com campo saldo vazio Select material. saldo From materiais Where material like “%ANEL %” 09 – Consulta materiais e saldo cujo material termine com NADOR Select material. saldo From materiais Where saldo>100 and saldo<500 03 – Consulta materiais e saldo em ordem crescente Select material. saldo From materiais Where material like “ %NADOR” . saldo From materiais Where saldo is not null 07 – Consulta materiais e saldo cujo material comece com C Select material.gondraf@hotmail. saldo From materiais Where material like “C %” 08 – Consulta materiais e saldo cujo material possua a string ANEL Select material. saldo From materiais Order by saldo 04 – Consulta materiais e saldo em ordem decrescente Select material. saldo From materiais Where saldo>100 02 – Consulta materiais com saldo maior que 100 e menor que 500 Select material. saldo From materiais Where saldo is null 06 – Consulta materiais com campo saldo preenchido Select material.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 95 de 272 Exemplos de consultas 01 – Consulta materiais com saldo maior que 100 Select material.

estado From clientes Where estado IN (“SE”. saldo From materiais 02 – Média Select Avg(saldo) From materiais 03 – Mínimo Select Min(saldo) From materiais 04 – Máximo Select Max(saldo) From materiais 05 – Soma Select Sum(saldo) From materiais Função Retorna a consulta em maiúscula Retorna a média dos valores armazenados um campo Retorna o menor valor armazenado em um campo Retorna o maior valor armazenado em um campo Retorna a soma dos valores armazenados em um campo .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 96 de 272 10 – Consulta clientes que morem em SE e AL Select cliente.gondraf@hotmail. “AL”) Funções SQL UPPER AVG MIN MAX SUM Exemplos de consultas 01 – Maiúsculas Select Upper(material).

BMP.WMW e MID. dentre estes softwares de interpretação de arquivos AVI.gondraf@hotmail. Formulário: Objeto Form1 MediaPlayer1 Propriedade Caption Visible Name Caption Items Name Caption RadioGroup1 RadioGroup2 Items RadioGroup3 Name Caption Items Name Caption RadioGroup4 Items Valor Pratica 30 False RGWav Arquivos WAV Telefone Impressora Sim Não RGAvi Arquivos AVI Delphi Microsoft Cool RGMid Arquivos MID Música 1 Música 2 Música 3 RGWmw Arquivos WMW WMV 1 WMV 2 WMV 3 Evento Procedimento Click RGWavClick Click RGAviClick Click RGMdiClick Click RGWmwClick .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 97 de 272 Capitulo XIX – Trabalhando com mídias O delphi através de suas bibliotecas consegue criar interfaces com diversos softwares. Crie uma nova aplicação e inclua um novo formulário ao já existente. Prática 30 – Lendo mídias com uso de objetos O MediaPlayer é um objeto que simula o Windows Média Player. Inclua na clausula USES a biblioteca MPlayer e a Unit2.

Close. begin ativaplay(mediaplayer1.arquivo:String):boolean.RGWavClick(Sender: TObject).'\Delphi 2005\midias\Wmv\'+rgwmv. end.Play. procedure TForm1.RGWmvClick(Sender: TObject).Open.arquivo:String):boolean. begin som. procedure TForm1.RGMidClick(Sender: TObject). begin ativaplay(mediaplayer1. end.Strings[rgmid. end.Items. procedure TForm1.itemindex]+'.MID'). begin ativaplay(mediaplayer1. result:=true. Comentários: .itemindex]+'.Items.FileName:=arquivo. begin ativaplay(mediaplayer1.'\Delphi 2005\midias\Wav\'+rgwav.Items.itemindex]+'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 98 de 272 Crie a função: Function ativaplay(som:TMediaPlayer.AVI'). na clausula VAR Procedimentos: Function ativaplay(som:TMediaPlayer.Strings[rgavi.WMV'). procedure TForm1.itemindex]+'.gondraf@hotmail. som. som.Items. end.'\Delphi 2005\midias\Avi\'+rgavi.WAV'). end.Strings[rgwav.RGAviClick(Sender: TObject). som.Strings[rgwmv.'\Delphi 2005\midias\Mid\'+rgmid.

SND_ASYNC). SndPlaySound(arquivo.RGSNDClick(Sender: TObject).gondraf@hotmail.Items.RGPlayClick(Sender: TObject).Strings[rgsnd.Items. begin arquivo:=PChar('\Delphi 2005\midias\Wav\'+rgplay. PlaySound(arquivo. var arquivo:Pchar. que será a responsável pelas funções: SndPlaySound e PlaySound que farão o papel do mediaplayer.2.SND_ASYNC). end.itemindex]+'.itemindex]+'. Comentários: . var arquivo:Pchar.WAV'). begin arquivo:=PChar('\Delphi 2005\midias\Wav\'+rgsnd. end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 99 de 272 Prática 31 – Tocando sons wave via função Neste projeto utilizaremos a biblioteca MMSystem.WAV').Strings[rgplay. procedure TForm1. no entanto estas funções só conseguem abrir os arquivos WAV. Não esqueça de incluir a biblioteca MMSystem à clausula Uses do projeto: Formulário: Objeto Form1 Propriedade Caption Name Caption RadioGroup1 Items RadioGroup1 Name Caption Items Valor Pratica 31 RGSN Utilizando método SNDPLAYSOUND Telefone Impressora Sim Não RGplay Utilizando método PLAYSOUND Telefone Impressora Sim Não Evento Click Procedimento RGsndClick Click RGplayClick Procedimentos: procedure TForm1.

end. Prática 32 – Trabalhando com diálogos Formulário: Objeto Form1 GroupBox1 GroupBox2 RichEdit1 RichEdit1 Image1 Image1 Propriedade Caption Caption Caption Lines Align Align Stretch Arquivo Imagem Valor Trabalhando Dialog’s Arquivo Imagem Evento com Procedimento MainMenu1 Texto Impressão Sair Procedimentos: alClient alClient True Novo Abrir Salvar Abrir Salvar Alterar fonte Alterar cor Localizar Substituir Imprimir Ajustar impressora procedure TForm1.FileName). .LoadFromFile(opendialog1. os diálogos disponíveis controlam as fontes. arquivos e impressoras que por ventura estajam incorporados ao sistema computacional.Execute=true then richedit1.gondraf@hotmail.Abrir1Click(Sender: TObject).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 100 de 272 Capitulo XX – Trabalhando com diálogos: Os Diálogos são objetos que criam vínculos com funções internas do windows. cores.Lines. begin if opendialog1.

FindText.Clear. procedure TForm1.Salvar1Click(Sender: TObject). FoundAt := FindText(FindDialog1. end. end. procedure TForm1.Execute=true then image1. begin FindDialog1.Font:=FontDialog1.FileName). procedure TForm1.Picture. end.Top).Novo1Click(Sender: TObject).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 101 de 272 procedure TForm1. StartPos.[stMatchCase]). StartPos. begin if SavePictureDialog1.Color:=ColorDialog1.Width. procedure TForm1.Localizar1Click(Sender: TObject). if FoundAt <> -1 then begin . começa do início do texto} if SelLength <> 0 then StartPos := SelStart + SelLength else StartPos := 0. var FoundAt: LongInt.Position := Point(RichEdit1. begin if ColorDialog1.FindDialog1Find(Sender: TObject). begin if FontDialog1. RichEdit1.Abrir2Click(Sender: TObject).FileName).gondraf@hotmail. FindDialog1. ToEnd. end. // define o início e o fim do texto procurado begin with RichEdit1 do begin {começa a procura depois da seleção atual se há um caso contrário. {ToEnd é o tamanho a partir do StartPos para o fim do texto no RichEdit} ToEnd := Length(Text) . procedure TForm1. end. procedure TForm1.FileName).Font.Lines. ToEnd: Integer.Alterarfonte1Click(Sender: TObject). begin if SaveDialog1. begin RichEdit1.Execute=true then Richedit1. end. end.StartPos.Execute=true then Image1.Execute=true then RichEdit1.Execute.Left + RichEdit1.Execute=true then RichEdit1. begin if OpenPictureDialog1.Salvar2Click(Sender: TObject).Picture.SaveToFile(SaveDialog1. procedure TForm1.SaveToFile(SavePictureDialog1.LoadFromFile(OpenPictureDialog1.Color.Alterarcor1Click(Sender: TObject).

if SelPos > 0 then begin RichEdit1.Position := Point(RichEdit1. end.Execute.Text).Lines. end else MessageDlg('Concluída'. Comentários: .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 102 de 272 SetFocus. ReplaceDialog1. RichEdit1. end. [mbOk]. begin with TReplaceDialog(Sender) do begin {Procura o texto com busca em case-sensitive no RichEdit1} SelPos := Pos(FindText. RichEdit1. procedure TForm1.gondraf@hotmail.1.Width. SelLength := Length(FindDialog1.SelStart := SelPos . end.Execute. procedure TForm1. {Substitui o texto selecionado pelo texto indicado} RichEdit1.Execute=true then RichEdit1. 0). begin if PrintDialog1.Left + RichEdit1. var SelPos: Integer. procedure TForm1. mtError.SelLength := Length(FindText). begin Halt.Substituir1Click(Sender: TObject). procedure TForm1. end. begin FindDialog1. end.Top). end. end.Imprimir1Click(Sender: TObject). end.SelText := ReplaceText. begin PrinterSetupDialog1.Print('Impressão do Arquivo'). SelStart := FoundAt.ReplaceDialog1Replace(Sender: TObject).Ajustarimpressora1Click(Sender: TObject).FindText). end. RichEdit1.Sair1Click(Sender: TObject). procedure TForm1.

um desenvolvedor um pouco mais experiente poderá. seriam realizados a nível de sistema operacional. seja utilizando objetos destinados para tal ou carregando ferramentas Shell do próprio windows. no entanto. Prática 33 – Localizando e executando arquivos via objetos Formulário: . tais procedimentos feitos por um operador de micro. executar estes procedimentos a nível de projeto.gondraf@hotmail. pastas e arquivos: As vezes em um projeto é necessário se localizar uma pasta para gravação de um arquivo ou localizar um arquivo para exclusão ou cópia. entretanto.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 103 de 272 Considerações: Existem algumas propriedades dos diálogos devem ser mencionadas por se tratarem de propriedades de uso constante nos tratamentos de diálogos: Propriedade FileName Descrição Indica o nome do arquivo que deverá ser aberto ou salvo por um diálogo Indica qual o tipo de arquivo (extensão) deverá ser filtrado Indica qual o diretório inicial para busca ou gravação de arquivo Indica o texto que deverá ser procurado Diálogo OpenDialog SaveDialog OpenPictureDialog SavePictureDialog OpenDialog SaveDialog OpenPictureDialog SavePictureDialog OpenDialog SaveDialog OpenPictureDialog SavePictureDialog ReplaceDialog FindDialog Filter InitialDir FindText Capitulo XXI – Trabalhando unidades.

gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Propriedade Caption Unidade: Pasta: Filtro: Arquivos: DirList FileList FileList Filter SimplePanel Caption Caption Valor Pratica 33 Evento Página 104 de 272 Objeto Form1 Label1 Label2 Label3 Label4 DriveComboBox1 DirectoryListBox1 FilterComboBox1 FileListBox1 StatusBar1 BitBtn1 BitBtn2 Procedimento DirectoryListBox1 FileListBox1 FileListBox1 Ver abaixo True Abrir Fechar Click Click Click FileListBox1Click BitBtn1Click BitBtn2Click Propriedade filter do FilterComboBox1: Procedimentos: procedure TForm1.BitBtn1Click(Sender: TObject). procedure TForm1.exe '+StatusBar1. begin StatusBar1.SimpleText).exe '+StatusBar1. var arquivo:PChar.SimpleText:=FileListBox1. 2:arquivo:=pChar('c:\arquivos de programas\internet explorer\iexplore. end. procedure TForm1. end. // Executa um aplicativo baseado no windows end. begin case filtercombobox1. end. winexec(arquivo.SimpleText). begin close.ItemIndex of 0:arquivo:=pChar('c:\windows\notepad.FileListBox1Click(Sender: TObject).FileName. 3:arquivo:=pChar(StatusBar1.SW_Show).SimpleText). Comentários: Prática 34 – Um gerenciador de arquivos .BitBtn2Click(Sender: TObject).

gondraf@hotmail. .Detalhes1Click(Sender: TObject).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 105 de 272 Formulário: Objeto Form1 Panel1 ShellComboBox1 ShellTreeView1 ShellListView1 Panel2 Edit1 BitBtn1 PopUpMenu1 Propriedade Caption Menu Caption Align ShellListView ShellTreeView Root UseShellImages ShellListView ShellComboBox Root Align ShellComboBox ShellTreeView PopUpMenu Align Caption Alignment Visible Text Caption Items Images MainMenu1 Items Valor Pratica 34 MainMenu1 Endereço: alTop ShellListView1 ShellTreeView1 rfDesktop True ShellListView1 ShellComboBox1 rfDesktop alLeft ShellComboBox1 ShellTreeView1 PopUpMenu1 alClient Nova Pasta: alLeftJustify False Vazio (null) Ok Nova Pasta ImageList1 Arquivo Criar Nova Pasta Fechar Visualizar Detalhes Ícones pequenos Ícones grandes Lista Evento Procedimento Click BitBtn1Click Procedimentos: procedure TForm1.

procedure TForm1.ViewStyle:=vsIcon. procedure TForm1.Text).SetFocus.BitBtn1Click(Sender: TObject).Lista1Click(Sender: TObject).Fechar1Click(Sender: TObject).Visible:=true. procedure TForm1. // Cria diretório panel3. // Ajusta para lista end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 106 de 272 begin ShellListView1.Iconesgrandes1Click(Sender: TObject).ViewStyle:=vsSmallIcon. begin ShellListView1. end. begin ShellListView1.Path+'\'. end. procedure TForm1.Criarnovapasta1Click(Sender: TObject). begin ShellListView1. procedure TForm1.Text:=ShellTreeView1. // Ajusta para detalhes end.ViewStyle:=vsList. // Ajusta para icones grandes end.gondraf@hotmail. begin MKDir(edit1.ViewStyle:=vsReport. begin panel3. edit1. procedure TForm1. //copia o caminho para edit1 edit1.Iconespequenos1Click(Sender: TObject). end. // Ajusta para icones pequenos end. Comentários: . begin close.Visible:=false.

Color Name Visible Name Visible Name Visible Name Visible Name Visible Align Align PopupMenu ShowGlyphs Valor Pratica 35 StatusBar1 alTop clNavy clWhite Floppy False Fixed False Network False CDRom False RamDisk False alClient alClient PopArquivos True Evento OnCreate Procedimento Form1Create OnChange OnChange DirectoryOutline1Change FileList1Change OnMouseDown FileList1MouseDown .gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 107 de 272 Prática 35 – Outro gerenciador de arquivos Formulário: Objeto Form1 Panel1 Image1 Image2 Image3 Image4 Image5 ScrollBox1 DirectoryOutline1 FileList1 Propriedade Caption Name Align Color Font.

gondraf@hotmail.Color Font.Color Font.Style Caption Name Caption Name Caption Name Caption Name Caption Caption Align Visible Name Caption Caption Caption Align BorderStyle Caption Color Font.com Fábio José de Gondra Ramos Delphi 2005 for win32 Align Align Visible Name Caption Name Caption Name Caption Align BorderStyle Caption Color Font.Style Name Name Caption Name alBottom alBottom False Arquivo Arquivo Caminho Caminho Modificacoes Modificacoes alTop sbsSunken Propriedades clNavy clWhite [fsBold] Attributos ReadOnly &Read Only Archive &Archive System &System Hidden &Hidden OK alBottom False diretorio Diretorio De Para alTop sbsSunken Move. Copia clNavy clWhite [fsBold] Origem Destino OK PopArquivos Abrir Mover Copiar Deletar Renomear Propriedades Página 108 de 272 TabSet1 ScrollBox2 Label1 Label2 Label3 StaticText1 GroupBox1 CheckBox1 CheckBox2 CheckBox3 CheckBox4 BitBtn1 ScrollBox3 Label4 Label5 Label6 OnClick BitBtn1Click StaticText2 Edit1 Edit2 BitBtn2 OnClick OnClick OnClick OnClick OnClick OnClick OnClick BitBtn2Click Abrir1Click MoveCopiaRenomeia MoveCopiaRenomeia Deletar1Click MoveCopiaRenomeia Propriedades1Click PopupMenu1 Items . Renomeia.

Network. DestName: string). procedure CopyFile(const FileName.Graphic).Tabs. var Drive: Char.Graphic). Menus. AddedIndex: Integer.AddObject(Drive. Grids. Tabs. // Destino inválido SFCantMove = 'Impossível mover o arquivo %s'. begin for Drive := 'a' to 'z' do begin case GetDriveType(PChar(Drive + ':\')) of // Verifica o tipo do drive DRIVE_REMOVABLE: // Diskete AddedIndex := TabSet1. function ExecuteFile(const FileName.Tabs.AddObject(Drive. function GetFileSize(const FileName: string): LongInt.Graphic). DestName: string).Sair1Click(Sender: TObject). DRIVE_CDROM: // CDRom AddedIndex := TabSet1. Floppy.Picture. end. Params.AddObject(Drive. Graphics. Fixed.Tabs. end. // Impossivel movimento implementation const // Mensagens de erro SInvalidDest = 'Destino %s não existe'. FileCtrl. ShellAPI. end. function FileDateTime(const FileName: string): TDateTime. begin Close. FromFile. DRIVE_REMOTE: // Drive de rede AddedIndex := TabSet1. DefaultDir: string. // Destino inválido EFCantMove = class(EStreamError). RtlConsts. SysUtils. // Impossivel movimento procedure TForm1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 109 de 272 Procedimentos: uses Windows.Graphic). Classes. function HasAttr(const FileName: string. . Forms. if UpCase(Drive) = FileList1.Picture. DRIVE_FIXED: // Winchester AddedIndex := TabSet1. Buttons. RamDisk. procedure TForm1. Attr: Word): Boolean.gondraf@hotmail. CDRom.Graphic). ExtCtrls. Consts.AddObject(Drive.Tabs. Messages. Controls. else AddedIndex := 0.Picture.TabIndex := AddedIndex.Picture. ToFile: string).AddObject(Drive. Outline. DirOutln. StdCtrls. private // Procedimentos e funções criadas procedure ConfirmChange(const ACaption. DRIVE_RAMDISK: // RamDrive AddedIndex := TabSet1. Dialogs. type // Identificadores de erro EInvalidDest = class(EStreamError). end. procedure MoveFile(const FileName.Picture.Drive then TabSet1. ShowCmd: Integer): THandle.Tabs.FormCreate(Sender: TObject).

TabSet1MeasureTab(Sender: TObject. procedure TForm1. %d bytes'. end.Caption:=Nomedodiretorio+'\'+Nomedoarquivo. end.Caption := ''.FileList1Change(Sender: TObject). try DirectoryOutline1. StatusBar1.TabSet1Change(Sender: TObject. procedure TForm1.Directory. Index: Integer. Nomedoarquivo := Format('%s. begin nomedodiretorio:=DirectoryOutline1. var Bitmap: TBitmap.TabSet1DrawTab(Sender: TObject.Caption := DirectoryOutline1.Objects[Index]). GetFileSize(tamanho)]). var TabWidth: Integer).Directory := DirectoryOutline1.Directory. raise. with TabCanvas do . procedure TForm1. begin FileList1. end. end.Drive := TabSet1. 2 + BitmapWidth).Width. NewTab: Integer.Drive := TabSet1. with FileList1 do begin if ItemIndex >= 0 then begin Tamanho:= Items[ItemIndex].gondraf@hotmail. except on EInOutError do // Verifica erro de entrada e saída begin AllowChange := False. var BitmapWidth: Integer. var AllowChange: Boolean).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 110 de 272 procedure TForm1. end. begin if not (csDesigning in ComponentState) then begin AllowChange := True.Directory. DirectoryOutline1. [tamanho. Inc(TabWidth. end. Selected: Boolean). StatusBar1. end else StatusBar1.Objects[Index]). R: TRect.Tabs[TabSet1.DirectoryOutline1Change(Sender: TObject).Nomedodiretorio. end.Tabs.TabIndex][1]. procedure TForm1. begin // Este procedimento mostra a imagem na aba do TabSet Bitmap := TBitmap(TabSet1. TabCanvas: TCanvas.Tamanho: string.Tabs. end.Tabs[NewTab][1]. var Nomedoarquivo. Index: Integer. begin // Este Procedimento determina o comprimento das abas do TabSet BitmapWidth := TBitmap(TabSet1.

// informa ao usuário end.Caption := DateTimeToStr(FileDateTime(FileList1. begin with FileList1 do if MessageDlg('Delete '+FileName+'?'. Bitmap). TextOut(R.Caption). Archive.Checked := (Attributes and faSysFile) = faSysFile.0)=mrYes then if DeleteFile(FileName) then Update. ToFile: string). Arquivo. procedure TForm1. procedure TForm1. Caminho. NewAttributes: Word. end.Arquivo1Click(Sender: TObject). TabSet1. // Atualiza lista showmessage('Operação executada!').Checked := (Attributes and faReadOnly) = faReadOnly.Left + 2 + Bitmap. end.ItemIndex]. mbNo]. var FileSelected: Boolean.Enabled := FileSelected. Abrir1. ToFile]).Deletar1Click(Sender: TObject). Deletar1.// Renomeia FileList1. begin // Este procedimento mostra os atributos do arquivo scrollBox2.Caption := FileList1. .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 111 de 272 begin Draw(R. [ACaption.Checked := (Attributes and faArchive) = faArchive. var Attributes. [mbYes.Top + 4.Enabled := FileSelected. Propriedades1.gondraf@hotmail. ToFile) // Copia do arquivo else if ACaption='Renomear' then RenameFile(FromFile. a renomeação ou o movimento de um arquivo if MessageDlg(Format('%s %s to %s?'. mtConfirmation. begin // Este procedimento habilita uma ação do PopArquivo para o arquivo selecionado FileSelected := FileList1. System.mbNo]. 0) = mrYes then begin if ACaption='Mover' then MoveFile(FromFile.Width.ConfirmChange(const ACaption.Enabled := FileSelected. ReadOnly.Left. Copiar1.[mbYes. procedure TForm1.Top + 2.Checked := (Attributes and faHidden) = faHidden. Attributes := FileGetAttr(Arquivo.mtConfirmation. FromFile. ToFile) // Movimento do arquivo else if ACaption='Copiar' then CopyFile(FromFile.Caption := FileList1.ItemIndex >= 0. Mover1.FileName)).Items[FileList1. // Deleta o arquivo e atualiza a lista end.Enabled := FileSelected. procedure TForm1. ToFile).Visible:=true. Modificacoes.Directory. procedure TForm1. Renomear1.Propriedades1Click(Sender: TObject).Enabled := FileSelected. end. Hidden.Update. begin // Este procedimento confirma a copia. R. R. end.Tabs[Index]). end.MoveCopiaRenomeia(Sender: TObject). FromFile.Enabled := FileSelected.

Dest: Integer.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 112 de 272 begin // Este procedimento define as ações de copia.CreateFmt(SFOpenError. if Sender = Mover1 then StaticText2.Visible:=true.gondraf@hotmail. se existir sobrepõe} if Dest < 0 then raise EFCreateError.clone do nome arquivo } else Destination := Destination + '\' + ExtractFileName(FileName). begin // Este procedimento executa um arquivo with FileList1 do begin if HasAttr(FileName.Directory. procedure TForm1.''. Origem. DirectoryOutline1. { .. Source. ChunkSize).FileList1MouseDown(Sender: TObject.CreateFmt(SFCreateError. Button: TMouseButton. DestName: string). begin end. Shift: TShiftState. Destination: TFileName.Directory. { copia em blocos de 8K 8x1024 bytes} begin // Este procedimento copia o arquivo em blocos Destination := ExpandFileName(DestName). } begin Len := Length(Destination). Destino. { Títulos } Len: Integer. { lê Bloco } . CopyBuffer^. { cria arquivo de saída. // Tamanho do destino if Destination[Len] = '\' then Destination := Destination + ExtractFileName(FileName) { . { abre arquivo de origem } if Source < 0 then raise EFOpenError. faDirectory) then { se destino é um diretorio. try Dest := FileCreate(Destination). movimento ou renomeação ScrollBox3.Text := ''. { aloca o buffer } try Source := FileOpen(FileName. ChunkSize). end.Directory := FileName else end. GetMem(CopyBuffer.Text := FileList1. Diretorio. fmShareDenyWrite). { expande o caminho de destino } if HasAttr(Destination..CopyFile(const FileName..Caption := 'Mover' else if Sender = Copiar1 then StaticText2. try repeat BytesCopied := FileRead(Source. X. procedure TForm1.SW_SHOW). Y: Integer).Caption := 'Copiar' else if Sender = Renomear1 then StaticText2..clone do nome do arquivo } end..Abrir1Click(Sender: TObject). { nome do caminho de destino } const ChunkSize: Longint = 8192. // Procedimentos externos procedure TForm1.. [Destination]). var CopyBuffer: Pointer.FileName. { buffer de copia } BytesCopied: Longint.Caption := 'Renomear' else Exit.Caption := DirectoryOutline1. [FileName]).faDirectory) then ExecuteFile(FileName. end.

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 113 de 272

if BytesCopied > 0 then { Já foi lido tudo?... } FileWrite(Dest, CopyBuffer^, BytesCopied); { ...escreve bloco } until BytesCopied < ChunkSize; { continue até o fim do bloco } finally FileClose(Dest); { fechar o arquivo de destino } end; finally FileClose(Source); { fechar o arquivo de origem } end; finally FreeMem(CopyBuffer, ChunkSize); { liberar o buffer } end; end; procedure TForm1.MoveFile(const FileName, DestName: string); var Destination: string; begin // Este procedimento movimenta o arquivo Destination := ExpandFileName(DestName); { expande o caminho de destino } if not RenameFile(FileName, Destination) then { renomeia o arquivo de destino } begin if HasAttr(FileName, faReadOnly) then { O arquivo é somente de leitura?... } raise EFCantMove.Create(Format(SFCantMove, [FileName])); {Não é possível mover ou deletar} CopyFile(FileName, Destination); { copia o arquivo para destino...} end; end; function TForm1.GetFileSize(const FileName: string): LongInt; var SearchRec: TSearchRec; begin // Esta função calcula e retorna o tamanho do arquivo try if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then Result := SearchRec.Size else Result := -1; finally SysUtils.FindClose(SearchRec); end; end; function TForm1.FileDateTime(const FileName: string): System.TDateTime; begin // Retorna a data de criação do arquivo Result := FileDateToDateTime(FileAge(FileName)); end; function TForm1.HasAttr(const FileName: string; Attr: Word): Boolean; var FileAttr: Integer; begin // Captura os atributos do arquivo FileAttr := FileGetAttr(FileName); if FileAttr = -1 then FileAttr := 0; Result := (FileAttr and Attr) = Attr; end; function TForm1.ExecuteFile(const FileName, Params, DefaultDir: string;ShowCmd: Integer):THandle;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 114 de 272

var zFileName, zParams, zDir: array[0..79] of Char; begin // Executa o arquivo através de um comando SHELL Result:=ShellExecute(Application.MainForm.Handle,nil, StrPCopy(zFileName,FileName),StrPCopy(zParams, Params), StrPCopy(zDir,DefaultDir),ShowCmd); end; procedure TForm1.BitBtn1Click(Sender: TObject); begin ScrollBox2.Visible:=false; end; procedure TForm1.BitBtn2Click(Sender: TObject); begin // confirma se ação é de copia, renomeação ou movimento if Destino.Text <> '' then ConfirmChange(StaticText2.Caption, Origem.Text, Destino.Text); ScrollBox3.Visible:=false; end; Comentários:

Capitulo XXII – Trabalhando com gráficos: TChart é o componente mais importante em biblioteca de TeeChart. TChart deriva de TPanel e herda toda sua funcionalidade. Em resumo, TChart é um standard componente básico do TPanel com muitas capacidades específicas para desenhos com propósitos gráficos. Você pode criar gráficos em tempo de projeto ou em run time. Os componentes TeeChart também podem estar em uma Forma de ActiveX, e dividem-se em três componentes básicos:

• TChart – Contido na paleta Additional, gera gráficos dinâmicos com valores randômicos ou • TDBChart – Contido na paleta Data Controls, gera gráficos dinâmicos com valores obtidos de •
uma Tabela ou Query. TQRChart – Contido na paleta QReport, introduz gráficos em um relatório gerado pelo QuickReport. informados.

Para a criação do TChart ou TDBChart, existem muitos passos comuns. Descreveremos a seguir tais passos. 1. 2. 3. Crie um novo formulário e inclua um objeto TChart ou TDBChart; Ajuste o tamanho do Chart, para sua melhor visualização; Com o botão direito do mouse, click sobre o Chart;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 115 de 272

- About TeeChart – Informa sobre o TeeChart; - Edit Chart – Abre a tela de edição do Chart;

- Print Preview – Ajusta a impressora e permite a impressão de um Chart;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 116 de 272

- Export Chart – Envia um Chart para a memória ou arquivo de imagem;

4. 5. 6. 7. 8.

Click sobre Edit Chart; Click sobre a aba Chart e nesta escolha a aba Series; Click sobre ADD... para começar a adição de novas séries: Escolha as series que comporão nosso gráfico; Os passos seguintes serão pessoais e dependerão do projeto.

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 117 de 272

Para melhor entendimento dos Chart’s faremos agora a nossa prática. Prática 36 – Criando gráficos: Formulário:

Objeto Form1 Panel1

Panel2

Panel3

CheckBox1 CheckBox2

TrackBar1 Label1 Label2

Propriedade Caption Caption Align Name Visible Caption Align Name Visible Caption Align Name Visible Name Caption Name Caption Checked Name Max Min Position Caption Caption

Valor Pratica 36 Vazio (null) alBottom Panelanimacao False Vazio (null) alBottom PanelZoom False Vazio (null) alBottom Panel3D False Animar Animar Pizza Dimensao 3D True Velocidade 30 1 5 Lento Rápido

Evento

Procedimento

OnClick OnClick

animarClick dimensaoClick

com Fábio José de Gondra Ramos Delphi 2005 for win32 Caption Name Caption Name Caption Name Caption Name Caption Caption Caption Caption Text Name Text Name Text Name Text Name Name Max Min Associate Position Name Max Min Associate Position Name Max Min Associate Position Name Max Min Associate Position Caption Name Caption Visible Text Name Text Name Caption Name Caption Name Interval Ver a seguir Fechar Fechaanimacao Mais Zoom Zoommais Menos Zoom Zoommenos Fechar Fechazoom Percentual de 3D: Rotação: Perspectiva: Inclinação: 15 Percentual3D 360 Rotacao 0 Perspectiva 0 Inclinacao UpDpercentual 100 1 Percentual3D 15 UpDRotacao 360 0 Rotacao 360 UpDPerspectiva 360 0 Perspectiva 0 UpDInclinacao 360 0 Inclinacao 0 Fechar Fecha3d Valores False Vazio (null) Valor Vazio (null) Descricao Anexar Anexar Fechar FechaValores 10 OnClick OnClick OnClick Página 118 de 272 BitBtn1 BitBtn2 BitBtn3 BitBtn4 Label3 Label4 Label5 Label6 Edit1 Edit2 Edit3 Edit4 FechaanimacaoClick ZoommaisClick ZoommenosClick FechazoomClick OnChange OnChange OnChange OnChange percentual3dChange RotacaoChange PerspectivaChange InclinacaoChange UpDown1 UpDown2 UpDown3 UpDown4 BitBtn5 GroupBox1 Edit5 Edit6 BitBtn6 BitBtn7 Timer1 Button2 Chart1 OnClick Fecha3dClick OnClick OnClick OnTimer OnClick AnexarClick FecharvaloresClick Timer1Timer Button2Click .gondraf@hotmail.

Visible:=true. prossiga da seguinte forma: 1 – Inclua um objeto Chart ao formulário. begin for i:=0 to 3 do grafico. // ativa a série indicada por número grafico.Series[i].numero:integer):Boolean.Active:=false. 7 – Da galeria inclua uma série do tipo Bar.. . implementation Function ativachart(grafico:TChart. 10 – Altere o título da série incluída para Areas. var i:integer. Criação de função: Para determinar qual série deverá ser ativa. 14 – Altere o título da série incluída para Linhas. 2 – Altere a propriedade Align para alClient. Procedimentos: procedure TForm1. 11 – Da galeria inclua uma série do tipo Pie. ou dê um click com o botão direito do mouse e selecione Edit Chart. 6 – Selecione ADD. // mostra o gráfico result:=true.Series[numero]. 13 – Da galeria inclua uma série do tipo Fast Line. end. var tt:TchartTitle.numero:integer):Boolean. 3 – Dê um click duplo sobre o chart.. criamos uma função capaz ativar e desativar uma série: Var Form1: TForm1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Configurar Informar valores Animar Zoom 3D e posicoes Gráfico de Barras Gráfico de Áreas Gráfico de Pizza Gráfi co de Linhas OnClick OnClick OnClick OnClick OnClick OnClick OnClick OnClick Página 119 de 272 Informarvalores1Click Animar1Click Zoom1Click 3Deposicoes1Click Grficodebarras1Click Grficodereas1Click Grficopizza1Click Grficodelinhas1Click MainMenu1 Items Visualizar Para ajustar o nosso chart.. 9 – Da galeria inclua uma série do tipo Area. 4 – Selecione a aba Chart.gondraf@hotmail. Uma vez ajustadas as propriedades descreveremos os procedimentos. // desativa todas as séries grafico. 12 – Altere o título da série incluída para Pizza.. 5 – Na aba Chart selecione Series. 8 – Altere o título da série incluída para Barras.Active:=true.Grficodebarras1Click(Sender: TObject). Function ativachart(grafico:TChart.

Clear.Timer1Timer(Sender: TObject).Text:=’’.Visible:=false.animarClick(Sender: TObject).Text:=’’.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 120 de 272 begin ativachart(chart1. . deletando seus valores series4. // indica que a série 2 deverá ser ativa end.Items. procedure TForm1. end. // zera descricao GroupBox1. // limpa o listbox1 listbox2.Strings[i].Informarvalores1Click(Sender: TObject). // mostra o groupbox1 end. procedure TForm1. chart1. deletando seus valores series3. end.Series[t].Add(strtoint(listbox1.Count-1 do chart1.3). begin // verifica se o checkbox animar foi clicado if animar. // oculta o groupbox1 series1. deletando seus valores for t:=0 to 3 do begin // o laço abaixo carrega os valores do listbox1 e listbox2 nas séries1. procedure TForm1.Clear.Clear. procedure TForm1.c:integer. // Limpa a série4.1). // indica que a série 3 deverá ser ativa end.listbox2. // Limpa a série1.gondraf@hotmail.2). deletando seus valores series2. begin ativachart(chart1. procedure TForm1. begin // se o checkbox está ativo efetua a rotação da serie3 (pizza) a cada 10 ms if animar. begin groupbox1.Button2Click(Sender: TObject).AnimatedZoom:=true.Clear. // Limpa a série3. // limpa o listbox2 valor.Items.clTeeColor). var i.AnimatedZoomSteps:=2. var t:longint.Checked=true then begin series3.Visible:=true.Position).Rotate(velocidade. // indica que a série 0 deverá ser ativa end. // zera valor descricao.Clear. // indica que a série 1 deverá ser ativa end.Strings[i]). begin ativachart(chart1.3 e 4 do Chart for i:=0 to listbox1.Clear. procedure TForm1. end. end.2.t. begin ativachart(chart1.Checked=true then chart1.Grficodereas1Click(Sender: TObject). begin listbox1. procedure TForm1. // Limpa a série2.Grficopizza1Click(Sender: TObject).0).Grficodelinhas1Click(Sender: TObject).

ZoomPercent(80). descricao. procedure TForm1.Series[t].Add(descricao. // oculta o groupbox1 series1.ZoommaisClick(Sender: TObject).AnexarClick(Sender: TObject).dimensaoClick(Sender: TObject). procedure TForm1.Visible:=false. procedure TForm1. begin // habilita / desabilita os objetos contidos no panel3d de acordo com o valor de dimensao (CheckBox) . // adiciona valor ao listbox1 listbox2. end.Text).ZoommenosClick(Sender: TObject).Items. begin panelzoom.FechazoomClick(Sender: TObject). begin panelzoom. begin chart1.listbox2.Animar1Click(Sender: TObject).Text:=’’.Text:=’’. var i.FecharvaloresClick(Sender: TObject).t.gondraf@hotmail. // apaga os valores da serie4 for t:=0 to 3 do begin // o laço abaixo adiciona valores as series for i:=0 to listbox1. // aumenta o gráfico em 110% end.c:integer.clTeeColor). // oculta o panel de animação end. // apaga os valores da serie1 series2. begin groupbox1.Items. // apaga os valores da serie2 series3.Clear.Strings[i]). // oculta o panel de zoom end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 121 de 272 end.Visible:=false. procedure TForm1.Text). procedure TForm1.Clear. procedure TForm1. begin Panelanimacao.Add(valor.Count-1 do Chart1.Visible:=false. end. // diminui o gráfico para 80% end. // mostra o panel de zoom end.Add(strtoint(listbox1. begin Panelanimacao. begin listbox1. begin Chart1. // adiciona descrição ao listbox2 valor. procedure TForm1. end. // apaga os valores da serie3 series4. // mostra o panel de animação end.Strings[i].Visible:=true. procedure TForm1.Items.Visible:=true.Clear.Clear.ZoomPercent(110).Items.FechaanimacaoClick(Sender: TObject).Zoom1Click(Sender: TObject). procedure TForm1.

View3D:=dimensao. end.Enabled:=dimensao.Fecha3dClick(Sender: TObject).Enabled:=dimensao.percentual3dChange(Sender: TObject).Enabled:=dimensao.Text).Checked.Enabled:=dimensao.gondraf@hotmail.// ajusta o tamanho do chart end.Checked. UpDInclinacao. procedure TForm1.Enabled:=dimensao. Inclinacao. Label6.Enabled:=dimensao. procedure TForm1. begin // ajusta a inclinação do chart Chart1. Label3. Rotacao.Enabled:=dimensao. procedure TForm1.PerspectivaChange(Sender: TObject). UpDPercentual.Visible:=true. procedure TForm1. end.Text). procedure TForm1.Text).View3DOptions. UpDRotacao. portanto crie uma base de dados contendo os campos descritos a seguir.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 122 de 272 chart1. procedure TForm1.Perspective:=strtoint(perspectiva. Perspectiva. // oculta o panel3d end. Label5.Enabled:=dimensao.RotacaoChange(Sender: TObject). // mostra o panel3d end.Checked. Label4. begin chart1.Enabled:=dimensao.Checked.Checked.Checked.Checked.Checked.Checked. begin // ajusta o ângulo de rotação do chart Chart1.Tilt:=Strtoint(inclinacao.Rotation:=strtoint(rotacao. .N3Deposicoes1Click(Sender: TObject).Checked. begin // ajusta a perspectiva do chart Chart1. end.Enabled:=dimensao. Comentários: Prática 37 – Criando gráficos com tabelas: Este projeto tem como finalidade gerar um gráfico utilizando o objeto dbchart com dados obtidos através de uma tabela ou query.Enabled:=dimensao. begin Panel3d.InclinacaoChange(Sender: TObject). end.Enabled:=dimensao.Checked.View3DOptions.Text).Chart3DPercent:=strtoint(percentual3d.Visible:=false. Percentual3d.Checked. begin Panel3d. UpDPerspectiva.Checked.View3DOptions.

Montagem do Formulário: Propriedades: Objeto Form1 Panel1 Panel2 CheckBox1 CheckBox2 GroupBox1 Propriedade Caption Align Align Caption Checked Caption Checked Align Valor Pratica 36 alLeft alClient Legenda True Marcas True alBottom Evento OnActivate OnClose Procedimento FormActivate FormClose OnClick OnClick CheckBox1Click CheckBox2Click . esta variação será transferida para o dbchart. salve na pasta C:/Delphi 2005/tabelas e carregue dados conforme tabela abaixo: Descricao João Ana Paula Pedro Carlos Valor 16 9 6 14 10 O objeto dbchart possui a mesma função do chart. porém os valores utilizados nas possíveis series serão obtidos dos registros contidos na tabela.com Fábio José de Gondra Ramos Delphi 2005 for win32 Field Name Descricao Valor Type Alpha Short Size 10 Key Página 123 de 272 Uma vez criada a tabela. sempre que um valor armazenado em um campo sofrer uma alteração.gondraf@hotmail.

CheckBox1Click(Sender: TObject). Procedimentos: procedure TForm1.gondraf@hotmail. begin // mostra ou oculta as marcas de acordo com o marco de checagem do checkbox2 .CheckBox2Click(Sender: TObject).Open. end. // fecha a tabela antes de fechar o formulário end.FormClose(Sender: TObject. procedure TForm1. procedure TForm1.Checked. var Action: TCloseAction).com Fábio José de Gondra Ramos Delphi 2005 for win32 Caption Estilo das marcas Valor Percentual Título Título e Valor Título e percentual 0 Tgrafico Dados Grafico.Close.ShowInLegend:=checkbox1. selecione Data Source e ajuste as opções conforme a figura abaixo: Terminado os ajustes das propriedades devemos descrever os procedimentos necessários para controlar o nosso projeto. begin // mostra ou oculta a legenda de acordo com o marco de checagem do checkbox1 series1. procedure TForm1. na aba Series. // abre a tabela sempre que o form é ativo end. begin Tgrafico. begin Tgrafico.db Tgrafico alClient DataSource1 alClient Adicione uma Pie Serie Página 124 de 272 RadioGroup1 Items ItemIndex Name DatabaseName TableName DataSet Align DataSource Align SeriesList OnClick RadioGroup1Click Table1 DataSource1 DBGrid1 DBChart1 Em DBChart1.FormActivate(Sender: TObject).

Marks.Marks.Marks. end. Comentários: . 2:series1.Style:=smsLabel.Visible:=Checkbox2.Style:=smsLabelValue. 1:series1.ItemIndex of 0:series1. 3:series1.Checked. end. procedure TForm1. 4:series1.Style:=smsValue.Marks.RadioGroup1Click(Sender: TObject).marks. begin // Este procedimento determina o estilo das marcas a serem mostradas case radiogroup1.Style:=smsPercent.gondraf@hotmail.Style:=smsLabelPercent.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 125 de 272 series1. end.Marks.

• O arquivo de conteúdo (. Digite Tópico1 no texto da nota de rodapé. Este arquivo consiste de texto simples com a ajuda de alguns caracteres especiais e outros atributos de formatação que definem os tópicos de ajuda e os relacionamentos entre eles. e em seguida criaremos links entre eles e definiremos entradas no índice para cada um deles. e um tópico de conteúdo. você usa notas de rodapé com caracteres customizados para denotar o título de um tópico.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 126 de 272 Capitulo XXIII – Literatura complementar Literatura 01 – Criando o arquivo de ajuda O Help ou arquivo de ajuda está constituído por três arquivos básicos: • O arquivo de projeto (. você precisa compor o texto de ajuda propriamente dito.RTF). Dentro de cada tópico. Antes de você criar o arquivo de projeto ou o arquivo de conteúdo.CNT). sua seqüência de navegação. Cada um dos três arquivos contém instruções especiais que controlam a construção e o comportamento do arquivo de ajuda gerado. e suas entradas no índice. Você organiza o texto por tópicos. .gondraf@hotmail. Isto irá denotar o identificador do tópico ou a string de contexto.HPJ). Criando o identificador do tópico Posicione o cursor exatamente antes da palavra Tópico e insira uma nota de rodapé com o caractere #. Você usa atributos especiais de texto para denotar links de um tópico para outro. colocando cada tópico em uma página separada. Logo a seguir você verá outros tópicos. Caracteres especiais e atributos de texto usados na composição de arquivos de ajuda Símbolo/Atributo # $ K + Duplo sublinhado Texto escondido Significado Define o identificador do tópico que será usado para se fazer referência a este tópico Define o título do tópico Define uma entrada no índice ou um conjunto de entradas (palavras chave) Define a ordem deste tópico na seqüência de navegação Define um salto para outro tópico Identifica o tópico para onde saltar Construindo o arquivo texto de ajuda Utilizando o Microsoft Word criaremos quatro tópicos sendo: três tópicos simples. Vamos iniciar digitando o primeiro tópico: Tópico 1 Este é o texto de ajuda do tópico 1. Os outros tópicos que estabelecerem links com este irão usar este identificador para criar o link. seu número. e • O arquivo de texto no formato rich-text (.

e no menu Bookmark. Você pode formatar a primeira linha do tópico como qualquer título. e então selecione a palavra Tópico1 e esconda-a com o comando Formatar/Fonte/Oculto.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 127 de 272 Criando o título do tópico Reposicione o cursor antes da palavra Tópico e insira uma nota de rodapé com o caractere $.Primeiro. Tópico 3. Agora que o Tópico1 está definido. Quando o usuário clicar nela. Digite Tópico1.Tópico 1. A . Último Linkando dois tópicos Depois que os tópicos foram criados. o título e palavras chaves destes dois tópicos. Usualmente. Você pode usar um tamanho de fonte maior e negrito para destacá-lo. você pode linkar o segundo com o primeiro. e use sublinhado simples ao invés de usar sublinhado duplo. O Word permite pesquisar tópicos usando seus títulos. Tópico 1. você pode criar os dois tópicos restantes de acordo com o texto abaixo: Tópico 2 Tópico 3 Insira as notas de rodapé para o identificador. o título que você especificar deverá ser o mesmo que o texto da primeira linha do tópico. Digite Tópico 1 no texto da nota de rodapé. o Tópico 1 será exibido. Agora crie dois links como foi feito anteriormente. Segundo Tópico 3 Tópico3 Tópico 3 Tópico3. O link na palavra primeiro deverá chamar o Tópico 1 e o link na palavra segundo deverá chamar o Tópico 2. Tópico 2.gondraf@hotmail. Use o mesmo tipo de notas de rodapé customizadas que você usou para o Tópico 1 e não esqueça de formatar a primeira linha de cada tópico de maneira a salientá-la e inserir uma quebra de página entre eles. porém no Tópico 3 e usando as palavras primeiro e segundo. Na tabela abaixo você verá como ficam as notas de rodapé dos três tópicos: Notas de rodapé dos tópicos de exemplo Símbolo # $ K Tópico 1 Tópico1 Tópico 1 Tópico1. Criando as palavras chaves do tópico Insira uma nota de rodapé com o caractere K antes da palavra Tópico e digite Tópico1. Estas entradas irão aparecer no índice do arquivo de ajuda. A seguir selecione a palavra primeiro e formate-a com duplo sublinhado usando o comando Formatar/Fonte/Sublinhado/Duplo. Primeiro Tópico 2 Tópico2 Tópico 2 Tópico2. Criando os tópicos restantes Insira uma quebra de página após o texto do tópico. então é uma boa idéia colocar títulos nos tópicos. e ajudarão os usuários a encontrar mais facilmente os tópicos de interesse. O título que você especificar para um tópico é exibido na lista de histórico do WinHelp. na caixa de diálogo Pesquisa. Posicione o cursor logo após a palavra primeiro no segundo tópico (sem espaços). Isto irá transformar a palavra primeiro em um link para o Tópico 1. Todas as definições de tópicos terminam com uma quebra de página. Terceiro.

você terminou o arquivo com o texto de ajuda. crie as notas de rodapé como você já fez anteriormente e nas três use apenas o texto Conteúdo. . é que este não salta diretamente para o tópico. Você poderia informar um número de seqüência fixo para cada tópico. Primeiro. Agora. basta linkar cada um dos tópicos usando o sublinhado duplo. então insira uma quebra de página no começo do seu arquivo. Depois que você terminar de especificar a seqüência de navegação. Este tópico consiste em nada mais do que o título e links para os outros tópicos. que é o aplicativo distribuído pela Borland para criação de arquivos de ajuda: Help Author A primeira coisa que você precisa fazer é habilitar a opção Help Author no menu File. Repita este processo para os outros três tópicos. A especificação auto diz ao compilador de ajuda para numerar os tópicos seqüencialmente conforme eles aparecem no arquivo de ajuda. Segundo. Depois das notas de rodapé. A seguir. mas usar auto é mais flexível pois permite a inserção de mais tópico sem precisar reorganizar a seqüência dos demais tópicos. O compilador de help assume que o tópico de conteúdo é o primeiro no arquivo contendo o texto de ajuda. agora você precisa criar um tópico chamado Conteúdo no seu arquivo de ajuda. Salve o arquivo no formato rich-text (RTF) com o nome de teste. faz com que diversas informações adicionais sobre seu sistema de ajuda seja exibida enquanto você o está construindo. Você pode mover-se para o começo ou o fim do seu arquivo de ajuda usando Ctrl+Shif+Home e Ctrl+Shift+End. E digite o seguinte texto: Conteúdo do arquivo de ajuda de exemplo Tópico 1 Tópico 2 Tópico 3 Depois disto. ele habilita que você se mova para trás e para frente no seu arquivo de ajuda (sem considerar se você habilitou os botões de navegação) usando Ctrl+Shift+Left e Ctrl+Shift+Right. como o número dos tópicos de ajuda como se você navegasse através deles. mas sim exibe-o em uma janela pop-up.rtf. A Figura 1 lhe mostra a tela resultante. Criando o arquivo de conteúdo da ajuda Utilizaremos o aplicativo Help Workshop ou simplesmente HCW.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 128 de 272 diferença deste tipo de link para o anterior. só falta mais uma coisa a fazer antes de passarmos para os arquivos de projeto e conteúdo. clique na opção New no menu File e selecione Help Contents.gondraf@hotmail.EXE. Posicione o cursor imediatamente depois da palavra exemplo no tópico de conteúdo e insira uma nota de rodapé com o caractere + e no seu texto digite auto. Criando o tópico de conteúdo Até agora já criamos os tópicos do arquivo de ajuda e os links entre eles. Você precisa determinar a ordem em que o usuário irá mover-se seqüencialmente através dos tópicos no seu arquivo de ajuda. Habilitar esta opção libera vários benefícios.

Digite Arquivo de ajuda de exemplo na caixa Default title.cnt na caixa Contents file (. Depois disto. A seguir. Clique OK para salvar. Uma vez de volta para o diálogo Window Properties.CNT).CNT ao projeto Clique o botão Options e especifique Conteúdo para Default topic e Arquivo de ajuda de exemplo para Help title.hlp na caixa Default filename. salve suas configurações clicando em OK para sair do diálogo. A Figura 2 lhe mostra a tela resultante.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 129 de 272 Digite . clique o botão Add Below e repita o processo para os três tópicos que você criou.gondraf@hotmail.RTF). A primeira coisa que o Help Workshop faz é lhe pedir o nome do arquivo do projeto. Criando o arquivo de projeto da ajuda Selecione New no menu File e selecione Help Project. Adicionando seus arquivos . O diálogo de definição de conteúdo do Help Workshop Depois de ter adicionado o último tópico à lista. A seguir. clique em Files e especifique seu teste. você está pronto para salvar seu arquivo de conteúdo. Adicionando botões de navegação ao projeto Clique o botão Windows. Salve-o juntamente com o arquivo RTF com o nome de teste.rtf na caixa Rich Text Format files (. A seguir. então clique no botão Save. Clique OK para salvar seu novo tipo de janela.RTF e . então clique em Compression e especifique Maximum. O Help Workshop adicionará a extensão HPJ para este arquivo. e seu teste. Posicione no diretório onde você colocou os outros arquivos e digite teste para o nome do arquivo. e então digite main no diálogo Create a Window./teste. e Conteúdo na caixa Topic ID. clique o . clique o botão Add Above e digite Conteúdo do arquivo de ajuda de exemplo na caixa Title do diálogo que irá aparecer.cnt.

Clique OK para salvar suas alterações. O drop-down Mapped Topic ID permite a você simular uma aplicação passando um identificador de ajuda de contexto para o WinHelp. Estes número serão usados em sua aplicação para linkar elementos do programa com o sistema de ajuda. e você verá o diálogo View Help File. O TESTE.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 130 de 272 botão Buttons e marque o checkbox Browse. A seguir. A Figura 3 mostra os resultados da compilação. É uma boa idéia deixar um espaço grande entre seus tópicos para que você consiga adicionar novos tópicos entre eles sem reorganizá-los. Tópico2 e 200 e Tópico3 e 300. Quando você terminar o mapeamento dos tópicos. Isto permite que os elementos da aplicação para a qual esta ajuda está sendo desenvolvida possam exibir o conteúdo da ajuda quando o usuário solicita a ajuda sensitiva ao contexto. clique Add.HPJ como ele aparece inicialmente no Help Workshop Mapeando os identificadores de tópicos Antes de retornar à tela principal do Help Workshop. Isto irá habilitar os botões de navegação do WinHelp fazendo com que você possa navegar através de sua ajuda usando a seqüência que você definiu anteriormente.gondraf@hotmail. O log do compilador mostra o resultado da compilação do projeto . usando os seguintes valores para Tópic ID e Mapped numeric-values respectivamente: Tópico1 e 100. você está pronto para salvar o projeto e compilá-lo. Selecione Run WinHelp no menu File. Testando seu arquivo de ajuda Você pode facilmente testar seu arquivo de ajuda sem sair do Help Workshop. Agora repita o procedimento para os demais tópicos. Clique o botão Save and Compile que está na parte inferior da tela. clique o botão Map. Clique OK para salvar seu mapeamento. e digite Conteúdo na caixa Topic ID e 0 (zero) na caixa Mapped numeric-value.

Linkando o arquivo de ajuda com a sua aplicação O passo final ao integrar ajuda Windows com a sua aplicação é linkar o arquivo de ajuda com a sua aplicação e configurar a ajuda de contexto corretamente. Depois selecione Application. Carregue o Delphi e selecione Project/Options no menu. Agora basta colocar o número identificador do tópico na propriedade HelpContext de cada componente que você queira e pronto. Você deverá ver o tópico Conteúdo.gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 131 de 272 Clique o botão View Help para abrir o seu arquivo de ajuda recentemente criado. . Informe o nome do arquivo de ajuda neste espaço e clique OK. Você verá que a entrada para o arquivo de ajuda está em branco.

RvDataSetConnection: Exporta um DataSet do projeto Delphi para o projeto Rave.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 132 de 272 Literatura 02 – O Rave Report Preparando a Aplicação Tomando como base a nossa aplicação final. . Configuração dos componentes Rave na aplicação Delphi RvDataSetConnection Name: rvdsEmp DataSet: Table1 RvSystem Name: rvsysEmp TitlePreview: Previsão do Relatório TitleSetup: Opções de Impressão TitleStatus: Status de Impressão RvProject Name: rvprjEmp Engine: rvsysEmp Agora execute um duplo clique sobre o componente RvProject para abrir o Rave Visual Designer.gondraf@hotmail. RvSystem:Responsável pelo envio do relatório para a impressora ou para a tela de Preview. vamos selecionar o Data Module dados e colocar nele 3 componentes da palheta Rave: RvProject: Responsável pela ligação entre o projeto Delphi e o projeto de relatórios Rave.

atual . no Painel de Propriedades.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 133 de 272 Rave Visual Designer Configurações Gerais File . selecione RaveProject e.gondraf@hotmail. altere a propriedade Units para unMM (milímetros) Explicação sobre a propr.New File Save: Empregados.rav Barra de ferramentas Palhetas de componentes Painel da Árvore de objetos Painel de Propriedades A Página Na Árvore de Objetos.

selecione Page1 e no Painel de Propriedades.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 134 de 272 Na Árvore de Objetos. altere as propriedades: FullName: Relatório Geral de Empregados Name: rptEmpGeral Ainda na Árvore de Objetos. ou então clica no botão correspondente da barra de ferramentas . precisamos criar um Data Object.New Data Object. . Isto nos dará acesso DataSets criados dentro do nosso projeto Delphi. e dentro dele selecione Report1. Para isso você seleciona File . Acesso aos Dados Para termos acesso aos dados que iremos imprimir. Aparecerá a tela: aos Selecione Direct Data View. No Painel de Propriedades. configure as seguintes propriedades.gondraf@hotmail. Depois clique Next. selecione Report Library.

no nosso caso. Selecione-o e clique Finish. Deixe uma área livre no final da página. Na Árvore de Objetos. lá criaremos nosso rodapé de página. . selecione a palheta Report e traga para a Página um componente Region . Desenhando o Relatório Nas palhetas de componentes. apenas 1. Ele determina e delimita a área de impressão da página.gondraf@hotmail. Redimensione o componente Region de modo que ocupe quase toda a área da folha.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 135 de 272 Aparecerão todos os componentes RvDataSetConnection que colocamos no projeto Delphi. veremos todos os campos de tbEmp. Selecione DataView1 e altere as propriedades mostradas acima.

Com o objeto Band1 selecionado.gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 136 de 272 componente Region redimensionado rodapé de página Nas palhetas de componentes. . altere as seguintes propriedades: . selecione a palheta Report e traga para Region1 um objeto Band .e um objeto DataBand relatório. Eles serão usados para criarmos as áreas de impressão do Eles aparecerão no topo de Region1.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 137 de 272 BandStyle: Selecione: Body Header (Cabeçalho) First (Primeira página) New Page (Nova página) ControllerBand: DataBand1 Name: PageHeader Selecione o objeto Band2 e altere as propriedades: DataView: dvEmp Name: Detalhe Os ícones à esquerda de cada banda mudarão. como mostra a figura. . Traga um componente BitMap da palheta Standard e coloque sobre a banda de cabeçalho.gondraf@hotmail.

Altere as propriedades: -da palheta Text: RELATÓRIO GERAL DE FUNCIONÁRIOS FontJustify: pjCenter Font: Aumente o tamanho da fonte. Para exibir a data de impressão do relatório.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 138 de 272 Altere a sua propriedade Image. Coloque um subtítulo com o nome da sua empresa. isto fará a figura ocupar toda a área do componente. utilize o componente Text Standard. Altere também a propriedade MatchSide para msBoth. Para colocar os títulos no cabeçalho de página. Na sua propriedade DataField.. Aumente a largura e a posição do componente Text para que fique centralizado horizontalmente. .. o seu nome e estilo de acordo com a sua preferência. traga para o cabeçalho um componente DataText da palheta Report. clique nos pontinhos. selecionando uma figura do disco.gondraf@hotmail.

gondraf@hotmail. Color etc. Utilize as propriedades LineWidth. Depois escreva em Data Text. . . um título para a variável que foi inserida.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 139 de 272 Em Report Variables.. Para colocarmos uma linha separando o cabeçalho do restante da página. selecione a palheta Drawing e traga um componente HLine para configurá-la como desejado. selecione DateShort Clique no botão Insert Report Var e a variável selecionada será inserida no quadro Data Text.

. devidamente configurado para exibir o campo. um componente BitMap da palheta Standard.gondraf@hotmail. Este relatório será um relatório no formato de ficha. para a posição correspondente na banda detalhe. traga 6 componentes Text da palheta Standard e configure-os como mostra a figura. Altere seu tamanho e posição como mostra a figura. arraste cada campo da Árvore de Objetos. Altere as propriedades: DataView: dvEmp DataField: FOTO Vamos agora montar os títulos dos campos que aparecerão na banda de detalhe. Para isso. Por isso não teremos cabeçalho de colunas. Traga para a banda de detalhe. semelhante a um crachá. de Com a tecla CONTROL pressionada. Aparecerá um componente DataText.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 140 de 272 Agora vamos montar a banda de detalhe.

gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 141 de 272 Pressione a tecla F9 para ver como está o resultado do relatório. .

15. 17. 33. 27. 7. 8. 5. 30. Descrição Pintar um Bitmap diretamente no Canvas do Form Verificar se a impressora está ligada Obter a letra do drive onde está o Windows Mostrar o nome do EXE no caption do form Fazer pesquisa incremental apenas com DBGrid Obter tipo de uma propriedade Consulta SQL que usa a data do sistema Abrir uma conecção Dial-Up Pintar uma imagem JPG no form Executar comando do MS DOS Formatar CEP Permitir cancelar processo demorado Descobrir se uma data é fim do mês Programar teclas de atalho do Windows Obter o tipo de dado de um valor no Registro do Windows Obter a célula de um StringGrid que está sob o cursor do mouse Limpar todas as células de um StringGrid Programar meu aplicativo para abrir arquivos a partir do Windows Explorer Consultar por mês de um campo data Criando tabelas via SQL Obter nomes dos campos de uma tabela Nomeando um relatório no spool de impressão do Windows Obter tamanho de um arquivo Ocultar aplicação da lista de tarefas CTRL+ALT+DEL Obter path de um Alias do BDE Ativar a proteção de tela do Windows Desligar/Ligar monitor Abrir e fechar o drive de CD ROM Impedir que o form seja arrastado para fora das margens da tela Mostrar mensagem mesmo que esteja no Prompt do DOS Copiar todos os registros de uma tabela para o Clipboard Copiar um registro de uma tabela para o Clipboard Criar sub diretório no diretório do EXE Ocultar o aplicativo do CTRL+ALT+DEL Pág 145 146 146 146 147 148 148 149 149 149 150 150 151 151 152 153 154 154 154 156 157 157 158 158 158 159 159 159 159 160 160 161 161 162 .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 142 de 272 Capitulo XXIV – Dicas da internet As dicas contidas neste material foram colhidas em sites da internet. 24. 2. 16. 20. 31. 12. 34. 6. portanto. 13. 11. 4. 19. 28. 10. 29. 26. 3. 23. 25. 21.gondraf@hotmail. 22. 18. nem todas as dicas aqui contidas foram testadas no delphi 2005 Dica 1. 14. 9. 32.

40.la Construir a barra de título do form com um Panel Criar form sem título que possa ser arrastado Obter status da memória do sistema Definir data/hora de um arquivo Mostrar o diálogo About (Sobre) do Windows Ocultar/exibir o cursor do mouse Converter de Hexadecimal para Inteiro Mudar a cor de um DBEdit dentro de um DBCtrlGrid de acordo com uma condição Colocar uma ProgressBar da StatusBar Executar um programa e aguardar sua finalização antes de continuar Simular o pressionamento de uma combinação de teclas (ex: Ctrl+F2) Simular o pressionamento de uma tecla Ligar/desligar a tecla Caps Lock Verificar se uma determinada tecla está pressionada Verificar o estado de NumLock e CapsLock Configurar linhas de diferentes alturas em StringGrid Adicionar o evento OnClick do DBGrid Criar caixas de diálogo em tempo de execução Converter a primeira letra de um Edit para maiúsculo Verificar se uma string contém uma hora válida Verificar se uma string contém um valor numérico válido Mostrar uma mensagem durante um processamento Mostrar um cursor de ampulheta durante um processamento Ler e escrever dados binários no Registro do Windows Mudar a resolução do vídeo via programação Ler e escrever dados no Registro do Windows Adicionar barra de rolagem horizontal no ListBox Simular um CharCase no DBGrid Verificar se uma string é uma data válida Fazer pesquisa incremental com DBGrid e Edit Adicionar zeros à esquerda de um número Limpar um campo tipo data via programação Implementar um campo auto incremental via programação Obter o endereço IP do Dial Up 162 163 163 164 165 165 166 166 167 167 168 168 168 169 170 170 171 171 172 172 172 173 174 175 175 175 176 176 178 178 179 180 180 180 181 181 182 182 . 42.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 143 de 272 35. Personalizar a caixa de mensagem de exceções (erro) do Delphi Implementar procedure Delay do Pascal no Delphi Enviar comandos de rolagem vertical para um TMemo Criar uma DLL de Bitmaps e usa. 44. 72. 61. 67. 60. 69. 62. 49. 64. 41. 38. 56. 43. 57. 48. 50. 65. 55. 36. 46.gondraf@hotmail. 66. 71. 68. 47. 63. 70. 53. 37. 52. 54. 51. 45. 59. 39. 58.

90. 78. 84. CD ROM. sistema de arquivos. 104.1. 75. 94. 91. 92. unidade de rede. 109. 76. 110.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 144 de 272 73. inclusive a barra de tarefas Verificar. 106. 83. 87. 102. 86. 98. 88. 77. 74. 107. fixo. 99. 80. 96. etc) Obter informações de um volume/disco (label. via programação. Exibir a caixa de diálogo padrão de solicitação de senha do banco de dados Obter a versão da biblioteca ComCtl32. 108.DLL (usada na unit ComCtrls do Delphi) Implementar rotinas assembly em Pascal Exibir o diálogo About do Windows Obter a linha e coluna atual em um TMemo Exibir um arquivo de ajuda do Windows Obter o valor de uma variável de ambiente Determinar se uma janela (form) está maximizada Determinar se o cursor do mouse está em determinado controle Determinar se o aplicativo está minimizado Fechar um aplicativo com uma mensagem de erro fatal Usar o evento OnGetText de um TField Maximizar um form de forma que cubra toda a tela. 95. serial. 79. 85. 89. 100.1 Server no NT Inverter os botões do mouse Obter/definir o tempo máximo do duplo click do mouse Obter os atributos de um arquivo/diretório Obter o espaço total e livre de um disco Obter o tipo de um drive (removível. se Local Share do BDE está TRUE Criar um EXE que seja executado apenas através de outro EXE criado por mim Resolver "Internal error near: IBCheck" do Interbase 5. etc) Alterar o nome de volume (Label) de um disco Saber quais as unidades de disco (drives) estão presentes "truncar" valores reais para apenas n casas decimais Excluir todos os registros de uma tabela (como DELETE ALL do Clipper) Saber se o sistema está usando 4 dígitos para o ano Imprimir caracteres acentuados diretamente para a impressora Imprimir texto justificado com formatação na impressora Epson LX300 Formatar um disquete através de um programa Delphi Alterar (e restaurar) o tamanho da página na impressora Reproduzir um arquivo de som WAV sem o TMediaPlayer Obter o nome do usuário e da empresa informado durante a instalação do Windows Mostrar uma barra de progresso enquanto copia arquivos Copiar arquivos usando o Shell do Windows Descobrir o código ASCII de uma tecla Evitar que seu programa apareça na barra de tarefas Usar eventos de som do Windows 183 183 184 184 185 185 185 186 186 187 187 187 188 188 188 189 189 190 190 190 191 192 192 192 193 193 194 194 194 195 196 197 197 197 197 198 198 199 . 97.gondraf@hotmail. 101. 103. 105. 81. 82. 93.

etc) Excluir arquivos usando curingas (*. 138. Delphi. 139. 148. 118. 143. 122. 129. 130. 128. 117. 145. 126. 146. 121. 134. 119. 113. 136. 124. 142. 125. 115. 132. 147.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 145 de 272 111. 114. 123.ani) Enviar um arquivo para a lixeira Obter o número do registro atual Trabalhar com Filter de forma mais prática Reproduzir um arquivo WAV Executar um programa DOS e fecha. 112. Mudar a coluna ativa em um DBGrid via programação Fechar o Windows a partir do seu programa Carregar um cursor animado (.*) Gerar uma tabela no Word através do Delphi Obter a quantidade de registros total e visível de uma tabela Evitar que um programa seja executado mais de uma vez Executar um "COMMIT" no Delphi Posicionar Form's em relação ao Desktop do Windows Saber a resolução de tela atual Verificar se uma unidade de disco (disk drive) está preparada Salvar/restaurar o tamanho e posição de Form's Definir a quantidade de registros a ser impressa em uma página do QuickReport Onde encontrar tutoriais sobre construção de componentes em Delphi Para que servem OnGetEditMask. 120. 141.lo em seguida Fechar um programa a partir de um programa Delphi Colocar Hint's de várias linhas Reproduzir um vídeo AVI em um Form Separar (filtrar) caracteres de uma string Colocar zeros à esquerda de números Copiar arquivos usando curingas (*. 133.gondraf@hotmail. 127. OnGetEditText e OnSetEditText do TStringGrid Mostrar um Form de LogOn antes do Form principal Limitar a região de movimentação do mouse Descobrir o nome de classe de uma janela do Windows Ocultar/exibir a barra de tarefas do Windows Evitar a proteção de tela durante seu programa Fazer a barra de título ficar intermitente (piscante) Posicionar o cursor do mouse em um controle Criar cores personalizadas (sistema RGB) Adicionar uma nova fonte no Windows 199 199 199 200 200 200 201 201 201 201 202 202 203 203 203 204 204 204 205 206 206 207 207 208 208 209 210 210 210 211 212 212 213 213 213 214 215 215 . 140.*) Copiar arquivos Trabalhar com cores no formato string Verificar se determinado programa está em execução (Word. 137. 144. 116. 131. 135.

165.gondraf@hotmail. 161. 183. 173. 150. tabelas no Acess Como alterar o driver de acesso do access no bde automaticamente Como converter DBF para Paradox e Acess para Paradox Como importar dados de um arquivo texto para uma Tabela Evitando o erro de Key Violation Gravar imagem JPG em tabela Paradox Ler imagem JPG da tabela Paradox Listando os campos da tabela num Memo PARADOX EM REDE Alterando a fonte de determinado registro em um DBGrid Alterando cor de linha de um DBGrid 215 215 215 216 216 217 217 218 218 218 218 220 221 222 222 223 223 224 224 226 227 228 230 233 234 234 235 236 236 237 237 238 239 240 240 240 241 241 . 158. 152. 179. 151. 162. 157. Saber se a impressora atual possui determinada fonte Saber se determinada Font está instalada no Windows Acertar a data e hora do sistema através do programa ENTER em vez de TAB no formulário. 185. 159. 156. DBF) através do seu programa Verificar se um diretório existe Verificar se um arquivo existe Criar um Alias temporário através do seu programa Criar um Alias através do seu programa Icone na Barra de Tarefas Abrir arquivos com aplicativo associado Adiciona a barra invertida a um texto selecionado Apagar um subdiretório Como verificar se um arquivo existe? Compara dois arquivos textos Copiando arquivos de diretório para diretório Copiando Um Arquivo Com Um Gauge Exibindo as propriedades do arquivo Lendo e gravando arquivos de texto Procurando um arquivo em todo o HD Acessando o banco de dados Oracle a partir do Delphi Alterando o NetDir via programação Apagando todos os registros da tabela Armazenando sons.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 146 de 272 149. 177. 155. 178. 174. 184. vídeos em bancos de dados Backup & Restauração Como acessar pelo Delphi. 182. 167. 172. 186. 170. 166. 154. 181. 175. 168. 171. 169. 180. 153. 176. 164. 160. 163. no DBGrid e no StringGrid Simular a vírgula através do ponto do teclado numérico Paralizar um programa durante n segundos Criar uma tabela (DB.

. 210. 193. finally Bmp. 205. 192. 198. 202. 191. Bmp).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 147 de 272 187.0. 208. 203.Declare a variavel Bmp na seção private: private Bmp: TBitmap. 190. Canvas. try Bmp. 211.Free. 213. 196. 207. DbGrid Zebrado Procura e substituição de string num campo memo Sql relacionada com a primeira letra Consultar por mês de um campo data Colocar o mes por extenso Retornar quantidade de dias meses e anos entre duas datas Alinhar Panel ao Centro do Formulário Coloração Gradiente no Form Como Criar Forms em Tempo de Execução Como evitar efeito de maximização Como Saber se o aplicativo já foi aberto Criando janelas não retangulares Form com um furo Formulário Transparente Texto Na Diagonal e Girando Como Bloquear Mouse e Teclado Detectando o Numero Serial do HD Como desenhar um Bitmap num form Converte um arquivo JPEG em BMP Carregar um cursor animado (*.Create. 201. . 195. 194. 189.gondraf@hotmail. 200. 204.LoadFromFile('c:\teste\arquivo. 212. 209.Coloque um botão no Form e no evento OnClick digite: Bmp:= TBitMap. 197. 199. 188.bmp'). 206.ani) Como pegar a posição do mouse na tela Como Alterar o Volume do Som do Computador Com o Delphi Gravando Sons do Microfone Com o Delphi Como converter decimal para romanos Alinhar Texto do Edit À Direita Como Limpar Todos os Edit's de um Form de uma só vez? Baixando arquivos da internet Chamar um e-mail pelo Delphi 241 242 242 243 244 245 245 245 246 246 247 247 247 247 248 249 249 250 250 251 251 251 252 252 253 253 253 254 Pintar um Bitmap diretamente no Canvas do Form .Draw(0. 214.

begin Pto := Port -1. end. sem path e extensão } function Titulo(Nome: String): String. if GetWindowsDirectory(PChar(S).AH {Guarda el estado en AL} end. end. Verificar se a impressora está ligada Os possíveis parâmetros para esta função são: 1 . { Retira o path } .para LPT3 4 . Rdo : byte.gondraf@hotmail.$0200 {AH := $02 : Leer el estado de la impresora} INT $17 MOV Rdo.para LPT4 function tbTestLPT(Port: byte): boolean. Obter a letra do drive onde está o Windows Inclua na seção uses: Windows function GetWindowsDrive: Char. asm MOV DX.Pto MOV AX. Result := Rdo = 144. begin SetLength(S. Mostrar o nome do EXE no caption do form { Esta função extrai apenas o nome do arquivo passado. begin N := ExtractFileName(Nome). D: String. MAX_PATH) > 0 then Result := string(S)[1] else Result := #0. begin Caption := GetWindowsDrive.para LPT2 3 . Observações: Provavelmente esta função não funcionará em Windows NT devido ao acesso em baixo nível.Button1Click(Sender: TObject).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 148 de 272 end.para LPT1 2 . var Pto : Word. var S: string. var N. end. MAX_PATH). { Exemplo de uso: } procedure TForm1.

No evento OnCreate do form coloque: FTexto := ''.gondraf@hotmail. end.Na seção private da unit declare: private FTexto: string.2.Ajuste as propriedades do DataSource1: DataSet = Table1 . Label1.Caption := ''. . TDBGrid e TLabel. Table1. { Retira a extensão } { Coloca a primeira letra em maiúscula e o resto em minúscula } Titulo := UpperCase(Copy(D. .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 149 de 272 D := ChangeFileExt(N.'').1)) + LowerCase(Copy(D. end. { No OnCreate do form.1. .Ajuste as propriedades do Table1: DatabaseName = seu alias TableName = sua tabela Active = true . { Posiciona na coluna Nome } Table1.#255] then begin if Key = #8 then { BackSpace } FTexto := Copy(FTexto.FocusControl.FindNearest([FTexto]).No evento OnKeyPress do DBGrid1: procedure TForm1. coloque: } procedure TForm1. #32. begin Caption := Titulo(ParamStr(0)). 1.FieldByName('Nome'). . .Ajuste as propriedades do DBGrid1: DataSource = DataSource1 Options -> dgEditing = false ReadOnly = true * Pode também ajustar a propriedades Columns para escolher as colunas que serão exibidas. Fazer pesquisa incremental apenas com DBGrid .Length(D)-1)).. var Key: Char).IndexFieldNames := 'Nome'. Length(FTexto)-1) else FTexto := FTexto + Key.DBGrid1KeyPress(Sender: TObject. begin if Key in [#8.FormCreate(Sender: TObject). { Escolhe o índice e procura } Table1. TDataSource.Coloque no form: TTable.

'Caption'). Edit1.ParamByName('Hoje'). Query.Execute. Abrir uma conecção Dial-Up Inclua na seção uses: Windows { A função abaixo abre a caixa de diálogo de conecção com a rede Dial-Up. PropType(Edit1.SQL. Para esta pesquisa precisamos de um índice com este campo. var Info: PPropInfo. const PropName: string): string. Query. Consulta SQL que usa a data do sistema Query. digite 'Caption' no Edit1 e clique em Button1.Name else Result := ''. if Assigned(Info) then Result := Info^. PropName). Obter tipo de uma propriedade Inclua na seção uses: TypInfo { Esta função retorna uma string com o nome do tipo de dado de uma propriedade. .Text := 'select * from Tabela where CampoData <= :Hoje'.No OnClick do Button1 coloque o código abaixo.Button2Click(Sender: TObject).Close.gondraf@hotmail. Query.PropType^. O parâmetro "name" é o nome da conecção previamente configurada. 'Color'). Exemplos de retornos: PropType(Button1. // Retorna 'TColor'. begin ShowMessage(PropType(Button1.} procedure TForm1.} procedure DialUpConnect(const Name: string). 'Width'). end. end. begin Info := GetPropInfo(Obj. end. end. .} function PropType(const Obj: TObject. // Retorna 'Integer'. { Exemplo de uso: .Open.Coloque um TButton e um TEdit.Caption := FTexto.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 150 de 272 { Mostra o texto procurado } Label1. Observações No nosso exemplo estamos pesquisando através do campo "Nome". mas deve funcionar na maioria dos bancos de dados com pouca ou nenhuma alteração. . // Retorna 'TCaption' PropType(Edit1.AsDate := Date.Text)).ClassInfo. Observações: Este exemplo foi testado com tabelas Paradox.

O parâmetro /C é opcional e faz com que a janela do DOS seja fechada assim que o comando terminar. SW_SHOW). var Imagem: TPicture.jpg'). use SW_HIDE no lugar de SW_SHOW.Create.LoadFromFile('c:\teste\foto.999-999 } . Canvas.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 151 de 272 begin WinExec(PChar('rundll32. end. begin Imagem := TPicture.gondraf@hotmail.exe rnaui. coloque: procedure TForm1. Pintar uma imagem JPG no form Inclua na seção uses: Graphics. . Formatar CEP { Esta função forma CEP como: 99.dll. Siga os passos abaixo para pintar uma imagem JPG no form: . assim como colocar no uses a unit JPeg. Para isto chame o COMMAND. Observações Para que a janela do DOS não seja exibida. Observações Não se esqueça de trocar o nome do arquivo JPG conforme sua necessidade.FormPaint(Sender: TObject). No exemplo abaixo estou executando a seguinte linha de comando: DIR C:\*. end.StretchDraw(ClientRect.* WinExec('COMMAND. { Exemplo de uso: } procedure TForm1.Button1Click(Sender: TObject).RnaDial ' + Name).COM passando como parâmetro a linha de comando a ser executada.Graphic).FormResize(Sender: TObject). Executar comando do MS-DOS Usando WinExec você pode executar qualquer comando do DOS. JPeg Para trabalhar com arquivos JPG você precisa usar um objeto TPicture. Este exemplo foi elaborado usando Delphi4. end. begin Repaint.*'.E no evento OnResize do form.No evento OnPaint do form coloque o código abaixo: procedure TForm1. finally Imagem. SW_SHOW).Free. begin DialUpConnect('NomeDaConecção').COM /C DIR C:\*. try Imagem. end. end. Imagem.

.Text).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 152 de 272 function tbFormataCEP(const CEP: string): string.Caption := 'Processamento demorado.. . end..Cancelar := true.gondraf@hotmail. uma variável boolean. em processamentos demorados.Create('CEP inválido. na seção public do Form1. 3. Permitir cancelar processo demorado Em aplicativos para Windows é comum. Para fazer isto em um aplicativo Delphi. . Observações Para formatar outros códigos como CPF. var I: integer.Text := tbFormataCEP(Edit1. o programa mostrar uma janela de diálogo avisando que o processo pode levar um tempo extra.Na parte onde ocorre o loop do processamento demorado coloque algo como: try { Antes de começar o processamento } Form2. for I := 1 to Length(CEP) do if CEP[I] in ['0'. siga os passos abaixo: . Form2. 3) + '-' + Copy(Result. etc.') else Result := Copy(Result. { No início do loop "Cancelar" precisa ser false } Cancelar := false. 1.Coloque um botão neste novo form.Declare. 6.' + Copy(Result.Show. begin Result := ''. if Length(Result) <> 8 then raise Exception. Cancelar: boolean.'. .No evento OnClick do Button coloque a instrução abaixo: Edit1. . 2) + '. { Aqui inicia o loop do processamento demorado } .Crie um novo form (vou chamá-lo de Form2). Nesta mesma janela normalmente coloca-se também um botão "Cancelar" que dá ao usuário a opção aguardar ou desistir do processo. === Para testar === . pode-se usar a mesma idéia.. public.Coloque um Edit e um Button no form. 3).Vamos considerar em nosso exemplo que o processamento ocorre na unit do Form1.'9'] then Result := Result + CEP[I]. CGC. Programe o OnClick deste botão conforme abaixo: Form1. .

} do begin { . Retorna false caso contrário. VK_F11) then ShowMessage('Erro ao programar Ctrl+Alt+F11'). var Ano.. MOD_CONTROL or MOD_ALT. Descobrir se uma data é fim do mês Inclua na seção uses: SysUtils { Esta função retorna true se a data passada como parâmetro é fim de mês. Dia: Word.. Dialogs .No evento OnCreate do form coloque o código abaixo: procedure TForm1.. 2.FormCreate(Sender: TObject). 2). begin DecodeDate(Data +1.. . { Sai do loop } end. end. } if Cancelar then begin ShowMessage('Operação cancelada pelo usuário. Programar teclas de atalho do Windows Inclua na seção uses: Windows. begin UnRegisterHotkey(Handle.Declere a procedure abaixo na seção private: private .No evento OnDestroy do form coloque o código abaixo: procedure TForm1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 153 de 272 while {. . } { Permite que o programa processe mensagens do Windows } Application. end. Dia). 1). Ano. finally Form2. Mes.. Mes. 1. UnRegisterHotkey(Handle. end. { Se a variável "Cancelar" foi alterada para true.. Break.FormDestroy(Sender: TObject). MOD_CONTROL or MOD_ALT.gondraf@hotmail.. begin if not RegisterHotkey(Handle. end. } function tbFimDoMes(const Data: TDateTime): boolean. VK_F12) then ShowMessage('Erro ao programar Ctrl+Alt+F12'). end.').Close. Processa algo aqui.. Result := Dia = 1. if not RegisterHotkey(Handle. Observações Não se esqueça de que o Form1 precisa usar Form2 e vice-versa.ProcessMessages.

. finally Reg. try Reg. cRegValue = 'ACDriveSpinDown'. Observações Se a combinação de teclas já estiver em uso (num atalho. não será possível usá-la em nossa aplicação. if Reg. SW_SHOW). end. begin Reg := TRegistry.Coloque um botão no form.Altere o evento OnClick do botão conforme abaixo: procedure TForm1. const cRegPath = 'System\CurrentControlSet\control\FileSystem'.GetDataType(cRegValue) of rdUnknown: S := 'Tipo Desconhecido'.RootKey := HKEY_LOCAL_MACHINE.HotKey of 1: WinExec('calc. . . 2: ShowMessage('Ctrl+Alt+F12 foram pressionadas').Button1Click(Sender: TObject). ShowMessage(S). Obter a célula de um StringGrid que está sob o cursor do mouse Inclua na seção uses: Windows . Dialogs . var Reg: TRegistry. Obter o tipo de dado de um valor no Registro do Windows Inclua na seção uses: Registry. end. false) then begin case Reg.exe'.gondraf@hotmail.Execute este programa e experimente pressionar Ctrl+Alt+F11 ou Ctrl+Alt+F12.OpenKey(cRegPath. rdString: S := 'String'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 154 de 272 procedure WMHotkey(var Msg: TWMHotkey). begin case Msg. Observações A unit Dialogs foi acrescentada no uses somente para podermos usar a procedure ShowMessage.Abaixo da palavra implementation escreva a procedure: procedure TForm1. por exemplo). end else ShowMessage('Erro ao abrir chave do Registro'). mas a forma apresentada é bastante funcional. message WM_HOTKEY. Existem outras formas de implementar teclas de atalho em programas escritos em Delphi. rdBinary: S := 'Binário'.Free. rdExpandString: S := 'ExpandString'. S: string.WMHotkey(var Msg: TWMHotkey). end. end.Create. end. rdInteger: S := 'Inteiro'.

Coloque um botão no form.J] := ''. Coluna.ClientRect. var I.Y. Pt.MouseToCell(Pt. else Caption := 'O mouse não está no StringGrid'. end. . var Coluna.X. Para testar: .Button1Click(Sender: TObject).ScreenToClient(Pt).Pressione TAB até chegar ao botão e pressione ENTER. begin with StringGrid1 do for I := 0 to ColCount -1 do for J := 0 to RowCount -1 do Cells[I. begin MouseCell(StringGrid1. . var Coluna.O resultado será mostrado no Caption do form. . Observações Note que a procedure MouseCell usa um valor negativo (-1) para coluna e linha se o mouse não estiver sobre o StringGrid. if (Coluna >= 0) and (Linha >= 0) then Caption := 'Coluna: ' + IntToStr(Coluna) + ' . Pt := Grid. var Pt: TPoint. Linha). . begin GetCursorPos(Pt). Linha: integer).Button1Click(Sender: TObject). Linha) else begin Coluna := -1. end.gondraf@hotmail.Altere o evento OnClick deste botão como abaixo: procedure TForm1. . end. Coluna. Exemplo de uso: . { Limpando uma célula de cada vez: } procedure TForm1. J: integer. Linha: integer.Execute o programa. if PtInRect(Grid. Limpar todas as células de um StringGrid Existem três métodos que podemos aplicar para limpar um StringGrid.Posicione o cursor do mouse sobre alguma célula do StringGrid.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 155 de 272 Esta procedure pega a linha e coluna da célula onde estiver o mouse. Linha := -1. Pt) then Grid. Valores negativos para Linha ou Coluna indicam que o mouse está fora da área cliente do StringGrid procedure MouseCell(Grid: TStringGrid.' + 'Linha: ' + IntToStr(Linha).

Reg. O símbolo %1 indica que o arquivo a ser aberto será passado como primeiro parâmetro para o aplicativo ParamStr(1).OpenKey('ArquivoAluno\shell\open\command'. { Limpando uma coluna de cada vez: } procedure TForm1. end.RootKey := HKEY_CLASSES_ROOT.Button3Click(Sender: TObject). Define o nome interno (ArquivoAluno) e uma legenda que aparecerá no Windows Explorer (Arquivo do Aluno) Reg. try Reg.CloseKey. { NomeDoExe %1 } . begin with StringGrid1 do for I := 0 to ColCount -1 do Cols[I].LazyWrite := false.Clear.Clear.Button2Click(Sender: TObject). Para preservar linhas ou colunas fixas troque os valores iniciais de I ou J conforme a necessidade.WriteString(''.Button1Click(Sender: TObject). } Reg. var I: integer. var Reg: TRegistry. Reg. end. { Limpando uma linha de cada vez: } procedure TForm1. { Define o comando a ser executado quando abrir um arquivo pelo Windows Explorer (NomeDoExe %1). true).WriteString(''. Observações Em todos os exemplos estamos limpando o StringGrid completamente. 'Arquivo do Aluno').Coloque um TButton e no evento OnClick dele coloque o código abaixo: procedure TForm1. true). . inclusive linhas e colunas fixas.Create. ParamStr(0) + ' %1'). begin Reg := TRegistry. Programar meu aplicativo para abrir arquivos a partir do Windows Explorer Inclua na seção uses: Registry Para fazer isto será necessária a criação de algumas chaves no Registro do Windows.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 156 de 272 end. O exemplo abaixo cria todas as chaves necessárias. Reg. var I: integer.OpenKey('ArquivoAluno'. begin with StringGrid1 do for I := 0 to RowCount -1 do Rows[I]. Reg.gondraf@hotmail.

begin { Se o primeiro parâmetro for um nome de arquivo existente.OpenKey('. .dpg } Reg. Reg. este já é um bom exemplo. true). true). Observações Existem outros recursos que poderão ser configurados.Free.WriteString(''..Lines. para começar. Consultar por mês de um campo data Use uma Query como abaixo: .Clique no botão para criar as chaves no Registro do Windows. { Define o ícone a ser usado no Windows Explorer: 0 . end. 'ArquivoAluno').WriteString(''.Altere as propriedades dos componentes como abaixo: * Query1. { 0 = primeiro ícone } Reg. . .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 157 de 272 Reg.CloseKey.segundo ícone do EXE.primeiro ícone do EXE 1 . { Define as extensões de arquivos que serão abertos pelo aplicativo } { *.gondraf@hotmail.Crie alguns arquivos com as extensões .OpenKey('.alu'. Porém. Reg.0').Coloque no form os seguintes componentes: * TQuery * TDataSource * TDBGrid * TEdit * TButton .LoadFromFile(ParamStr(1)).Experimente dar um duplo-clique sobre qualquer dos arquivos com uma das extensões acima.dpg e .CloseKey. etc } Reg.WriteString(''. true).No evento OnShow do Form coloque o código abaixo: procedure TForm1.CloseKey.Feche o programa. finally Reg. Reg.OpenKey('ArquivoAlunol\DefaultIcon'. ParamStr(0) + '. . *** Para testar *** .. . } if FileExists(ParamStr(1)) then { Carrega o conteúdo do arquivo no memo } Memo1.FormShow(Sender: TObject). end.Vá ao Windows Explorer e procure pelos arquivos criados.dpg'. . { *. 'ArquivoAluno').alu. end.CloseKey. . Reg.Execute este programa.DatabaseName = (alias do BDE) .Coloque um TMemo. Reg.alu } Reg.

BDE5 e tabela Paradox7. Query1. var Q: TQuery. Add('( Codigo AutoInc.Clear. List: TStringList). var I: integer. Query1.ExecSQL. Query1.').Button1Click(Sender: TObject). end. TblName: string.AsInteger := StrToInt(Edit1.Execute. os meses de Janeiro a Dezembro. procedure tbGetFieldNames(const DBName.Close.Coloque o código abaixo no evento OnClick de Button1: Query1. Digite um número de 1 a 12 no Edit e clique no botão.Add('select * from dCli').SQL. porém deverá funcionar em vários outros bancos de dados com pouca ou nenhuma alteração. . Query1.'). .'). Q.Open. finally Q. begin Q := TQuery. try Q.').DatabaseName := 'SF'. Add(' Salario Money.SQL. Observações Os números de 1 a 12 representam. Query1. Add(' Nome Char(30). Add(' Primary Key (Codigo) )').Text). Add(' Depto SmallInt.Free.gondraf@hotmail. end.Escreve no OnClick do Button como abaixo: procedure TForm1. Este exemplo foi testado com Delphi4. end. Obter nomes dos campos de uma tabela Inclua na seção uses: dbTables. . Criando tabelas via SQL Inclua na seção uses: dbTables . Classes.DataSource = DataSource1 . Observações Este exemplo foi testado com banco de dados Paradox.DataSet = Query1 * DBGrid1.Create(Application). Forms A função abaixo obtém os nomes de todos os campos de uma tabela do banco de dados.Coloque um TButton no form.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 158 de 272 * DataSource1.SQL do begin Add('Create Table Funcionarios').ParamByName('Mes'). with Q.Add('where extract(month from DataNasc) = :Mes'). respectivamente.SQL.

Text. ou -1 se o arquivo não for encontrado } function tbFileSize(const FileName: string): integer.Create. .Text. end. faça assim: Printer. try tbGetFieldNames(Edit1.Clear. Nomeando um relatório no spool de impressão do Windows Inclua na seção uses: Printers Antes de enviar seu relatório. I: integer. faArchive.gondraf@hotmail.Create(Application) do try DatabaseName := DBName. var SR: TSearchRec. TableName := TblName. try if I = 0 then .Name). List).Button1Click(Sender: TObject).Lines. SR). estes provavelmente possuem uma propriedade equivalente.Coloque um TMemo e um TButton no Form. end. Memo1. Edit2. end. Obter tamanho de um arquivo Inclua na seção uses: SysUtils { A função abaixo retorna o tamanho do arquivo. begin List := TStringList. begin I := FindFirst(FileName.Add(Items[I]. with FieldDefs do begin Update.Free. for I := 0 to Count -1 do List. finally List. Observações Esta solução aplica-se perfeitamente aos relatórios feitos usando o objeto Printer.Title := 'Nome do relatório'. === Exemplo de uso === . var List: TStringList. Nos casos de geradores de relatórios. with TTable. end. finally Free.Assign(List). end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 159 de 272 begin List.Coloque o código abaixo no evento OnClick do Button: procedure TForm1.

1). dwType: Integer): Integer. Agora seu programa aparecerá na lista. as chamadas a DbiInit() e DbiExit() poderão ser omitidas. Obter path de um Alias do BDE Inclua na seção uses: BDE { A função abaixo retorna o path (caminho) de um Alias do BDE } function GetAliasPath(AliasName: String):String. @dbDes)= DBIERR_NONE then with dbDes do Result:=StrPas(szPhyName).// Libera o BDE end.Size else Result := -1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 160 de 272 Result := SR. Ativar a proteção de tela do Windows Inclua na seção uses: Windows { Ativa a proteção de tela do Windows. Clique no Button2 e pressione CTRL+ALT+DEL.Handle.No evento OnClick do Button1 coloque: RegisterServiceProcess(GetCurrentProcessID. WM_SYSCOMMAND. === Para testar === Clique no Button1 e pressione CTRL+ALT+DEL. se estiver configurada. Observações Se a unit em que essa rotina for colocada utilizar as units DB e DBTABLES. 0). 0). end.DLL'.gondraf@hotmail. finally FindClose(SR). begin Result:=''.Coloque dois botões no Form. DBiInit(Nil). DBiExit. SC_SCREENSAVE. } SendMessage(Application. se não inicializado If DbiGetDatabaseDesc(PChar(AliasName).CTRL+ALT+DEL . Ocultar aplicação da lista de tarefas .Declare a função abaixo antes da palavra implementation: function RegisterServiceProcess(dwProcessID.No evento OnClick do Button2 coloque: RegisterServiceProcess(GetCurrentProcessID.// invoca o BDE . stdcall. . var dbDes: DBDesc. . . end. . external 'KERNEL32. O seu programa não aparecerá na lista.

-1). SetForegroundWindow(Application. .Height.Height . .gondraf@hotmail.(Top + Height) < 0 then Top := Screen.Handle. O exemplo abaixo desliga o monitor.Width. WM_SYSCOMMAND.Height . if Top < 0 then Top := 0. SendMessage(Application.WMMove(var Msg: TWMMove).Width . { Aguarde 5 segundos } SendMessage(Application. Para testar: .(Left + Width) < 0 then Left := Screen. ShowMessage('Teste'). Abrir e fechar o drive de CD-ROM Inclua na seção uses: MMSystem { Para abrir } mciSendString('Set cdaudio door open wait'. Porém sua aplicação Delphi também pode fazer isto.Execute o programa e tente arrastar o form para fora das margens da tela e veja o que acontece.Handle.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 161 de 272 Desligar/Ligar monitor Inclua na seção uses: Windows No Win95 podemos desligar o monitor afim de economizar energia elétrica. if Screen.Na seção Private declare a procedure abaixo: private procedure WMMove(var Msg: TWMMove). 0. Mostrar mensagem mesmo que esteja no Prompt do DOS Inclua na seção uses: Windows Antes de mostrar a mensagem. SC_MONITORPOWER. Observações Este recurso pode não funcionar dependendo da configuração do sistema. WM_SYSCOMMAND. aguarde 5 segundos e religa monitor. 0). nil. { Para fechar } mciSendString('Set cdaudio door closed wait'. nil. SC_MONITORPOWER. coloque sua aplicação na frente das demais. if Screen. 0. Impedir que o form seja arrastado para fora das margens da tela .Abaixo da palavra implementation escreva a procedure abaixo: procedure TForm1. begin if Left < 0 then Left := 0. end.Width . handle). Normalmente este recurso é controlado pelo próprio Windows. handle). message WM_MOVE. Sleep(5000).Handle).

Button1Click(Sender: TObject).Button1Click(Sender: TObject). Para testar: .Vá em outro aplicativo (ex: MS-Word) e mande colar (Ctrl+V). const SeparadorCampoValor = ': '. Table1.Fields[I]. end. o tamanho da string S atingiu 20K e funcionou normalmente. begin S := ''.First. SeparadorCampo = #13#10.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 162 de 272 Copiar todos os registros de uma tabela para o Clipboard Inclua na seção uses: Clipbrd Siga os passos abaixo: . Clipboard. { Quebra de linha } SeparadorRegistro = '===========' + #13#10. .Coloque um botão e no evento OnClick deste botão coloque o código abaixo: procedure TForm1. end.Coloque um botão e no evento OnClick deste botão coloque o código abaixo: procedure TForm1.FieldCount -1 do S := S + Table1.AsText := S.EOF do begin for I := 0 to Table1. Observações CUIDADO! Não use este recurso com tabelas grandes. S := S + SeparadorRegistro.FieldName + SeparadorCampoValor + Table1. var S: string.Execute este aplicativo. . colocando DataSource. . I: integer. Table1. No teste que fiz.AsString + SeparadorCampo. for I := 0 to Table1. I: integer.gondraf@hotmail.Fields[I]. .FieldCount -1 do .Crie seu form normalmente. colocando DataSource.Clique no botão. while not Table1. const SeparadorCampoValor = ': '. SeparadorCampo = #13#10. begin S := ''.Crie seu form normalmente. Table e demais componentes. Copiar um registro de uma tabela para o Clipboard Inclua na seção uses: Clipbrd Siga os passos abaixo: . Mas isto pode variar de uma máquina para outra. { Quebra de linha } var S: string. Table e demais componentes.Next. pois poderá usar memória demasiadamente.

exe'. False em caso contrário. Se conseguir.FormCreate(Sender: TObject).FieldName + SeparadorCampoValor +Table1. end. ExtractFilePath(NomeArq) . Para testar: .'). if DirectoryExists(Caminho) then Result := true else Result := CreateDir(Caminho).Retorna true se o diretório informado existe. end. SysUtils Primeiramente vamos conhecer algumas funções do Delphi que precisaremos usá-las: ParamStr(Indice) . Exemplo de uso: . Agora que sabemos como trabalham estas funções. function CriaSubDir(const NomeSubDir: string): boolean.Execute este aplicativo.Clique no botão.Retorna o caminho (path) do nome de arquivo informado. var Caminho: string.Retorna valores passados na linha de comando quando executamos o programa.Fields[I]. end. Criar sub-diretório no diretório do EXE Inclua na seção uses: FileCtrl. Clipboard.AsString + SeparadorCampo. Caso contrário retorna false. . Ocultar o aplicativo do CTRL+ALT+DEL Inclua no implementation de seu programa a seguinte linha: . begin Caminho := ExtractFilePath(ParamStr(0)) + NomeSubDir.Tenta criar o diretório informado.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 163 de 272 S := S + Table1. CreateDir(CaminhoDir) . vamos escrever uma função que precisamos para criar um sub-diretório conforme proposto. retorna true.Chame a função no evento OnCreate do form: procedure TForm1. Exemplo: S := 'C:\NomeDir\Programa.AsText := S. ExtractFilePath(S).Fields[I]. begin if not CriaSubDir('MeuSubDir') then ShowMessage('Não foi possível criar o sub-diretório MeuSubDir. { retorna: 'C:\NomeDir\' } DirectoryExists(CaminhoDir) .gondraf@hotmail. .Vá em outro aplicativo (ex: MS-Word) e mande colar (Ctrl+V). Se o valor de Indice for 0 (zero) será retornado o caminho+nome do EXE.

gondraf@hotmail. { Isto provoca uma exception } end. === Para testar === . Personalizar a caixa de mensagem de exceções (erro) do Delphi Siga os passos abaixo: . pois se ocorrer uma exceção neste rotina.FormCreate(Sender: TObject). begin StrToInt('ABCD'). dwType: Integer): Integer. E: Exception).Declare um método (procedure) na seção private do form principal conforme abaixo: private procedure ManipulaExcecoes(Sender: TObject. basta por no OnCreate antes da linha acima a seguinte linha: Application. 0). .No evento OnCreate do Form principal escreva o código abaixo: procedure TForm1. mtError. end. . esta solução foi testada em Win95. stdcall. Observações Cuidado! Não coloque código que possa gerar exceção na rotina que manipula as exceções. . Observações Segundo o autor desta resposta.OnException := ManipulaExcecoes. begin MessageDlg(E. esta será chamada recursivamente até estourar a pilha. 1).com.Button1Click(Sender: TObject). mas também deve funcionar em Win98. Para ocultar também o form.Vá até a seção implementation e implemente este método. begin Application. [mbOK].br'. e depois no OnCreate ponha a seguinte linha: RegisterServiceProcess(GetCurrentProcessID.Coloque um Button no form. conforme o exemplo: procedure TForm1. mas seu form principal vai continuar aparecendo. Isso vai fazer o programa nao aparecer no CTRL+ALT+DEL. end.ManipulaExcecoes(Sender: TObject.ShowMainForm:=False.DLL'. E: Exception).Message + #13#13 + 'Suporte técnico:'#13 + 'tecnobyte@ulbrajp. external 'KERNEL32.No evento OnClick deste botão coloque o código abaixo: procedure TForm1. Não sabe se funciona em NT. .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 164 de 272 function RegisterServiceProcess(dwProcessID.

Crie um novo projeto no Delphi. 0). { Aguarda 5 segundos } Delay(60000). 0).rolagem vertical. Observações Além desta técnica existem API's do Windows que fazem um trabalho equivalente. Vejamos algums exemplos: SendMessage(Memo1. SB_PAGEDOWN = Comanndo de rolagem .Start) >= MSec.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 165 de 272 Implementar procedure Delay do Pascal no Delphi Inclua na seção uses: Windows. .gondraf@hotmail. === Exemplos de uso: === Delay(1000). { Aguarda 1 segundo } Delay(5000).Handle. WM_VSCROLL. SBLINEUP. Use o Image Editor do Delphi para criar este arquivo. Forms procedure Delay(MSec: Cardinal). SBPAGEDOWN.RES) contendo os Bitmaps. 0). . repeat Application. until (GetTickCount .RES na pasta onde será salvo o projeto do Delphi. SBLINEDOWN.Handle = manipulador da janela do Memo1. Onde: Memo1. SBPAGEUP. var Start: Cardinal.Crie um arquivo de recursos (. { Aguarda 60 segundos . WM_VSCROLL = Mensagem do Windows .Remova todos os forms do projeto.1 minuto } Observações Além da procedure Delay criada acima.ProcessMessages. WM_VSCROLL. { Linha para cima } SendMessage(Memo1. Enviar comandos de rolagem vertical para um TMemo Inclua na seção uses: Windows Utilizando mensagens do Windows isto é fácil. Há porém uma diferença: Delay permite que que o programa continue a processar as mensagens do Windows (mouse. . 0). WM_VSCROLL.Handle.Handle. Salve-o com o nome BMPS. { Linha para baixo } SendMessage(Memo1.página para baixo.Handle. etc). begin Start := GetTickCount. teclado. WM_VSCROLL. end. Criar uma DLL de Bitmaps e usá-la Siga os passos abaixo para criar a DLL de bitmaps: . Outros exemplos: { Página para cima } SendMessage(Memo1. o programador Delphi pode usar também a API do Windows Sleep.

Create.Digite no Edit1 o nome que foi dado ao Bitmap no arquivo de recursos (. . end.ulbrajp. .RES} library DLLBmp. finally { Libera a DLL } FreeLibrary(HandleDLL). .Salve-o na mesma pasta que salvou o anterior. no diretório do Windows ou ainda no sub-diretório System do Windows.Feche o projeto atual e crie um novo projeto. .Coloque no form um Edit e um Button. begin { Carrega a DLL } HandleDLL := LoadLibrary('DLLBmp. Além de bitmaps podemos colocar qualquer outro tipo de recurso em DLL's. if HandleDLL = 0 then ShowMessage('Não foi possível carregar DLLBmp. === Para testar === . .Handle := LoadBitmap(HandleDLL. Construir a barra de título do form com um Panel Pegue o arquivo tbtitle.gondraf@hotmail. .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 166 de 272 .Handle = 0 then ShowMessage('Não foi possível carregar o Bitmap.DLL') else try Bmp := TBitmap.DLL'). Bmp).zip na seção Download do IntereSite: www.Text)). end.dpr. try Bmp.DLL.Draw(0.Execute este projeto.com. end.No evento OnClick do Button coloque o código abaixo: procedure TForm1. HandleDLL: THandle.Salve este projeto com o nome DLLBmp. var Bmp: TBitmap.Abra o arquivo de projeto (DLLBmp. PChar(Edit1.Button1Click(Sender: TObject).Free. .Clique no botão. Será criado o arquivo DLLBmp. Observações O arquivo DLL poderá ser colocado na pasta onde estiver o EXE. 0.br/~tecnobyte Criar form sem título que possa ser arrastado Siga os passos abaixo: .RES).Compile o projeto (Ctrl+F9). O bitmap deverá ser pintado no form. if Bmp.') else { Pinta o Bitmap no form } Canvas.dpr) e altere para ficar somente com as linhas abaixo: {$R BMPS. finally Bmp. . end. mas com outro nome qualquer.

Button1Click(Sender: TObject).Top := 10. begin Width := 80.gondraf@hotmail. SysUtils .Result := HTCLIENT. Label1. message WM_NCHitTest. Uma alternativa mais elegante é colocar um menu local (PopupMenu) com um comando para fechar. .Coloque um TMemo no form .Coloque um Label. public { Public declarations } end.Vá na seção implementation e escreva a procedure abaixo: implementation {$R *.Coloque um Timer.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 167 de 272 . end. .Left := 10. . Obter status da memória do sistema Inclua na seção uses: Windows. . Observações Para fechar este aplicativo pressione Alt+F4.Coloque um TButton no form e altere seu OnClick conforme abaixo: procedure TForm1. begin if GetAsyncKeyState(VK_LBUTTON) < 0 then Msg. Height := 40. . end. .WMNCHitTest(var Msg: TMessage).Execute e experimente arrastar form com o mouse. FormStyle = fsStayOnTop. .Vá na seção private do Form1 e declare a procedure abaixo: private procedure WMNCHitTest(var Msg: TMessage).Result := HTCAPTION else Msg.Crie um novo projeto.Altere o evento OnTimer do Timer1 conforme abaixo: procedure TForm1. Label1. .FormCreate(Sender: TObject). begin Label1. .Caption := TimeToStr(Time).DFM} procedure TForm1.Mude as seguintes propriedades do Form1: BorderStyle = bsNone.Altere o evento OnCreate do Form1 conforme abaixo: procedure TForm1.Timer1Timer(Sender: TObject). end.

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 168 de 272

const cBytesPorMb = 1024 * 1024; var M: TMemoryStatus; begin M.dwLength := SizeOf(M); GlobalMemoryStatus(M); Memo1.Clear; with Memo1.Lines do begin Add(Format('Memória em uso: %d%%', [M.dwMemoryLoad])); Add(Format('Total de memória física: %f MB', [M.dwTotalPhys / cBytesPorMb])); Add(Format('Memória física disponível: %f MB', [M.dwAvailPhys / cBytesPorMb])); Add(Format('Tamanho máximo do arquivo de paginação: %f MB', [M.dwTotalPageFile / cBytesPorMb])); Add(Format('Disponível no arquivo de paginação: %f MB', [M.dwAvailPageFile / cBytesPorMb])); Add(Format('Total de memória virtual: %f MB', [M.dwTotalVirtual / cBytesPorMb])); Add(Format('Memória virtual disponível: %f MB', [M.dwAvailVirtual / cBytesPorMb])); end; end; Definir data/hora de um arquivo Inclua na seção uses: SysUtils Esta função altera a data e hora de um arquivo. Se obter sucesso retorna true, caso contrário retorna false. function DefineDataHoraArq(NomeArq: string; DataHora: TDateTime): boolean; var F: integer; begin Result := false; F := FileOpen(NomeArq, fmOpenWrite or fmShareDenyNone); try if F > 0 then Result := FileSetDate(F, DateTimeToFileDate(DataHora)) = 0; finally FileClose(F); end; end; { Exemplo de uso 1: Usa a data atual do sistema (Now) } if DefineDataHoraArq('c:\teste\logo.bmp', Now) then ShowMessage('Data/Hora do arquivo definida com sucesso.') else ShowMessage('Não foi possível definir data/hora do arquivo.'); { Exemplo de uso 2: Usa uma data fixa } var DataHora: TDateTime; begin { Define a data para 5-Fev-1999 e a hora para 10:30 }

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 169 de 272

DataHora := EncodeDate(1999, 2, 5) + EncodeTime(10, 30, 0, 0); if DefineDataHoraArq('c:\teste\logo.bmp', DataHora) then ShowMessage('Data/Hora do arquivo definida com sucesso.') else ShowMessage('Não foi possível definir data/hora do arquivo.'); end; Mostrar o diálogo About (Sobre) do Windows Inclua na seção uses: ShellApi procedure TForm1.Button1Click(Sender: TObject); begin ShellAbout(Handle, 'Sistema Financeiro', 'Marcelo Senger', Application.Icon.Handle); end; Observações Dica enviada por: Marcelo Senger Ocultar/exibir o cursor do mouse Inclua na seção uses: Windows - Escreva a função abaixo: function MouseShowCursor(const Show: boolean): boolean; var I: integer; begin I := ShowCursor(LongBool(true)); if Show then begin Result := I >= 0; while I < 0 do begin Result := ShowCursor(LongBool(true)) >= 0; Inc(I); end; end else begin Result := I < 0; while I >= 0 do begin Result := ShowCursor(LongBool(false)) < 0; Dec(I); end; end; end; - Exemplos de uso: MouseShowCursor(false); { Oculta o cursor } MouseShowCursor(true); { Exibe o cursor } Converter de Hexadecimal para Inteiro Inclua na seção uses: SysUtils var I: integer; begin

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 170 de 272

I := StrToInt('$' + Edit1.Text); {...} end; Observações No Delphi, um número na notação decimal deve iniciar com o símbolo $. Mudar a cor de um DBEdit dentro de um DBCtrlGrid de acordo com uma condição - Monte o form normalmente colocando DataSource, Table, DBCtrlGrid e os DBEdit's, DBText's, etc. - Escreva no manipulador do evento OnPaintPanel do DBCtrlGrid conforme abaixo: procedure TForm1.DBCtrlGrid1PaintPanel(DBCtrlGrid: TDBCtrlGrid; Index: Integer); begin if Table.FieldByName('NomeDoCampo').AsFloat < 0 then DBEdit1.Font.Color := clRed else DBEdit1.Font.Color := clBlue; end; Observações Neste exemplo mudamos a cor da fonte do componente DBEdit, Porém, pode-se também mudar a cor do próprio componente (DBEdit1.Color). Colocar uma ProgressBar da StatusBar - Coloque uma StatusBar no form. - Adicione dois paineis na StatusBar (propriedade Panels). - Ajuste as propriedades do primeiro painel conforme abaixo: Style = psOwnerDraw Width = 150 - Coloque uma ProgressBar no form e mude sua propriedade Visible para false. - No evento OnDrawPanel da StatusBar digite o código abaixo: procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); begin { Se for o primeiro painel... } if Panel.Index = 0 then begin { Ajusta a tamanho da ProgressBar de acordo com o tamanho do painel } ProgressBar1.Width := Rect.Right - Rect.Left +1; ProgressBar1.Height := Rect.Bottom - Rect.Top +1; { Pinta a ProgressBar no DC (device-context) da StatusBar } ProgressBar1.PaintTo(StatusBar.Canvas.Handle, Rect.Left, Rect.Top); end; end; - Coloque um Button no form - Digite no evento OnClick do Button o código abaixo: procedure TForm1.Button1Click(Sender: TObject); var I: integer; begin for I := ProgressBar1.Min to ProgressBar1.Max do begin { Atualiza a posição da ProgressBar }

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 171 de 272

ProgressBar1.Position := I; { Repinta a StatusBar para forçar a atualização visual } StatusBar1.Repaint; { Aguarda 50 milisegundos } Sleep(50); end; { Aguarde 500 milisegundos } Sleep(500); { Reseta (zera) a ProgressBar } ProgressBar1.Position := ProgressBar1.Min; { Repinta a StatusBar para forçar a atualização visual } StatusBar1.Repaint; end; - Execute e clique no botão para ver o resultado. Observações Com um pouco de criatividade podemos fazer outras coisas interessantes usando o evento OnDrawPanel da StatusBar. Executar um programa e aguardar sua finalização antes de continuar Inclua na seção uses: Windows function ExecAndWait(const FileName, Params: string; const WindowState: Word): boolean; var SUInfo: TStartupInfo; ProcInfo: TProcessInformation; CmdLine: string; begin { Coloca o nome do arquivo entre aspas. Isto é necessário devido aos espaços contidos em nomes longos } CmdLine := '"' + Filename + '"' + Params; FillChar(SUInfo, SizeOf(SUInfo), #0); with SUInfo do begin cb := SizeOf(SUInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := WindowState; end; Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo); { Aguarda até ser finalizado } if Result then begin WaitForSingleObject(ProcInfo.hProcess, INFINITE); { Libera os Handles } CloseHandle(ProcInfo.hProcess); CloseHandle(ProcInfo.hThread); end; end; - Exemplo de uso: ExecAndWait('c:\windows\notepad.exe', '', SW_SHOW); Observações Não se esqueça de informar o caminho (path) do arquivo completo. Esta função foi desenvolvida para Delphi 32 bits (2, 3, 4,...).

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 172 de 272

Simular o pressionamento de uma combinação de teclas (ex: Ctrl+F2) Inclua na seção uses: Windows { Mantém pressionada CTRL } keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY or 0, 0); { Pressiona F2 } keybd_event(VK_F2, 0, 0, 0); { Libera (solta) CTRL } keybd_event(VK_CONTROL, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); Observações Neste exemplo pressionamos Ctrl+F2. Não se esqueça das teclas que precisam manter pressionadas: Ctrl, Alt, Shift. Simular o pressionamento de uma tecla Inclua na seção uses: Windows A API keybd_event do Windows serve para fazer isto. No exemplo abaixo estamos simulando o pressionamento da tecla F2: keybd_event(VK_F2, 0, 0, 0); Para testar faça o exemplo a seguir: - Mude a propriedade KeyPreview do form para true. - Escreva no evento OnKeyDown do form como abaixo: procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_F2 then ShowMessage('F2 pressionada'); end; - Coloque um botão e escreva no OnClick (do botão) como abaixo: procedure TForm1.Button1Click(Sender: TObject); begin keybd_event(VK_F2, 0, 0, 0); end; Observações Consulte as constantes para os códigos das teclas (ex: VK_RETURN, VK_DOWN, etc). Ligar/desligar a tecla Caps Lock Inclua na seção uses: Windows { Esta função liga/desliga Caps Lock, conforme o parãmetro State } procedure tbSetCapsLock(State: boolean); begin if (State and ((GetKeyState(VK_CAPITAL) and 1) = 0)) or ((not State) and ((GetKeyState(VK_CAPITAL) and 1) = 1)) then begin

gondraf@hotmail. $45. E tem mais: isto está na documentação do (R)Windows. { Liga Caps Lock } or tbSetCapsLock(false). } function tbKeyIsDown(const Key: integer): boolean. podemos usar esta mesma técnica para ligar/desligar Num Lock. begin Result := GetKeyState(Key) and 1 > 0. end. Verificar o estado de NumLock e CapsLock Inclua na seção uses: Windows { Esta função retorna true se a tecla informada estiver ligada. { Desliga Caps Lock } Observações Aparentemente. { Exemplos de uso: } if tbKeyIsDown(VK_CONTROL) then { Tecla Ctrl pressionada } if tbKeyIsDown(VK_MENU) then { Tecla Alt pressionada } if tbKeyIsDown(VK_SHIFT) then { Tecla Shift pressionada } if tbKeyIsDown(VK_F2) then { Tecla F2 pressionada } Observações Qualquer tecla pode ser verificada. NumLock está ligada } . end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 173 de 272 keybd_event(VK_CAPITAL. 0).. begin Result := GetKeyState(Key) and 128 > 0.. Para isto basta saber o código virtual (Virtual Key Code) da tecla. keybd_event(VK_CAPITAL. KEYEVENTF_EXTENDEDKEY or 0. Neste caso trocaríamos VK_CAPITAL por VK_NUMLOCK.$45. KEYEVENTF_EXTENDEDKEY KEYEVENTF_KEYUP. end. Verificar se uma determinada tecla está pressionada Inclua na seção uses: Windows { Esta função retorna true se a tecla informada estiver pressionada. False em caso contrário } function tbKeyIsOn(const Key: integer): boolean. 0). False em caso contrário. end. { Exemplo de uso: } if tbKeyIsOn(VK_NUMLOCK) then { . { Exemplos de uso: } tbSetCapsLock(true). Por incrível que pareça não funcionou (pelo menos no teste que fiz).

escreva a procedure: implementation {$R *. . StringGrid1.. Observações Cuidado para não especificar uma linha inexistente. StringGrid1.RowHeights[1] := 20.DFM} procedure TForm1. A primeira instrução ativa o evento OnClick. end.'). StdCtrls. Configurar linhas de diferentes alturas em StringGrid . . begin ShowMessage('Clicou no DBGrid. Basta.No evento OnCreate do form coloque o código abaixo: procedure TForm1. saber seu código.FormCreate(Sender: TObject). end. StringGrid1. NumLock está desligada } Observações Qualquer tecla que possua os estados On/Off pode ser verificada.RowHeights[0] := 15.ControlStyle + [csClickEvents].DBGridClick(Sender: TObject). pois o evento OnClick está declarado como protegido (protected) na classe TDBGrid. Buttons .OnClick := DBGridClick. Para isto precisamos tratar o DBGrid como se fosse Form.Coloque as instruções abaixo no evento OnCreate do Form: procedure TForm1. O código de CapsLock é VK_CAPITAL.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 174 de 272 else { .RowHeights[2] := 50.Monte seu form normalmente. colocando o DBGrid e demais componentes. Adicionar o evento OnClick do DBGrid .gondraf@hotmail. begin StringGrid1.Logo após a palavra "implementation".Vá na seção "private" da unit e declare a procedure abaixo: private procedure DBGridClick(Sender: TObject). A segunda instrução acessa o manipulador do evento OnClick.FormCreate(Sender: TObject). Observações O segredo principal desta dica está OnCreate do Form. end.RowHeights[3] := 35. .ControlStyle := DBGrid1.. TForm(DBGrid1). begin DBGrid1. Criar caixas de diálogo em tempo de execução Inclua na seção uses: Forms. para isto. .Coloque o StringGrid no form.

Top := 80. Form. { Coloca o botão OK } with TBitBtn. { Exibe o form e aguarda a ação do usuário. end. Se for OK. { Por padrão retorna false } { Cria o form } Form := TForm. Top := 80. . { Ajusta o comprimento do Edit de acordo com a largura do form } Width := Form.20. Form.ClientWidth . { Coloca um Label } with TLabel. Top := 25.Width .20. Left := 10. with Edt do begin Parent := Form. } if Form. Caption := 'Digite seu nome:'.Position := poScreenCenter.. Left := Form. { Posiciona de acordo com a largura do form } Left := Form. { Variável para o Edit } begin Result := false. Form. o texto digitado pelo usuário será copiado para a variável Nome } function ObterNome(var Nome: string): boolean.Height := 150. Kind := bkCancel.Width := 200. Left := 10. { Coloca o Edit } Edt := TEdit.10. { Variável para o Form } Edt: TEdit.Create(Form) do begin Parent := Form. { Botão Cancel } end.(Width * 2) . { Coloca o botão Cancel } with TBitBtn.Create(Application).Create(Form).Free. finally Form.Caption := 'Atenção'.gondraf@hotmail. Se for OK.. end.Create(Form) do begin Parent := Form.ClientWidth .ShowModal = mrOK then begin Nome := Edt. Form. { Botão Ok } end. try { Altera algumas propriedades do Form } Form. Result := true.Create(Form) do begin Parent := Form. end.Text.ClientWidth . Top := 10.BorderStyle := bsDialog.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 175 de 272 A função abaixo demonstra a criação de uma caixa de diálogo que pode ser usada para permitir ao usuário digitar o seu nome: { Esta função retorna true se for pressionado OK e false em caso contrário. Kind := bkOK. var Form: TForm.

Para chamar esta função siga o exemplo abaixo: procedure TForm1. end. except Result := false. Isto não é necessário. por exemplo. var S: string. begin try StrToTime(S). pois ao criá-los informei como proprietário o Form (ex: TLabel. Verificar se uma string contém um valor numérico válido . Result := true. end. Você pode também converter durante a digitação. . Verificar se uma string contém uma hora válida . Edit (var Edt) e BitBtn's (botões) não são destruídos explicitamente (Componente. Para isto coloque o código abaixo no evento OnKeyPress do Edit: if Edit1. except Result := false. end. estes componentes são destruídos automaticamente ao destruir o Form (Form.Button1Click(Sender: TObject). Result := true. begin try StrToInt(S). end.Text := S. Converter a primeira letra de um Edit para maiúsculo with Edit2 do if Text <> '' then Text := AnsiUpperCase(Text[1]) + Copy(Text. Length(Text)).Free).Use a função abaixo: function StrIsTime(const S: string): boolean. Isto pode ser colocado.Create(Form)). Neste caso.SelStart = 0 then Key := AnsiUpperCase(Key)[1] else Key := AnsiLowerCase(Key)[1].gondraf@hotmail.Use uma das funções abaixo. begin if ObterNome(S) then Edit1. Observações Os componentes Label.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 176 de 272 end. conforme o tipo de dado que se quer testar: function StrIsInteger(const S: string): boolean. no OnExit do Edit.Free). 2.

Cursor := crHourGlass.Button1Click(Sender: TObject).'. { Aguarda um segundo } end. try Screen. var PrevCur: TCursor. . end. Result := true. end. try Form. { Coloque aqui as instruções do processamento } finally Screen.Cursor.Restaure o cursor. begin try StrToFloat(S).Salve o cursor atual . Este tempo é em milisegundos. for I := 1 to 5 do begin Form. Form. Observações A função Sleep é uma API do Windows e serve para paralisar a aplicação por um determinado dempo. except Result := false.Defina o novo cursor (crHourGlass é ampulheta) . begin Form := TFormMsg. usando a API Sleep: procedure TForm1. end. end.Abaixo vou simular um processamento demorado.Free. end.Caption := 'Processamento demorado.Vá em Project|Options e passe o FormMsg de "Auto-create forms" para "Available forms". end. function StrIsFloat(const S: string): boolean.Show.Cursor := PrevCur. .gondraf@hotmail.. Mostrar uma mensagem durante um processamento . I: integer. Um pequeno form com um Label já é suficiente.. var Form: TFormMsg. finally Form. Mostrar um cursor de ampulheta durante um processamento .Faça o processamento . Aqui vou chamá-lo de FormMsg. .UpDate.Crie um form com a mensagem. begin PrevCur := Screen.Label1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 177 de 272 end.Create(Self). Sleep(1000). end.

{ Abre uma chave (path). SizeOf(Ficha)). DataCadastro: TDateTime.Button1Click(Sender: TObject). . Ler e escrever dados binários no Registro do Windows Inclua na seção uses: Registry Coloque no Form: .Button2Click(Sender: TObject). . Se não existir cria e abre. begin Reg := TRegistry. .RootKey := HKEY_CURRENT_USER. Dê uma olhada na propriedade Cursor de um componente visual para ver uma lista de todos eles.Text). var Reg: TRegistry. try { Define a chave-raiz do registro } Reg.Escreva o evento OnClick do Button2 conforme abaixo: procedure TForm1.Free. end. Você poderá também criar o seu próprio cursor.dois botões. end. Nome: string[40]. Reg := TRegistry.Text. begin { Coloca alguns dados na variável Ficha } Ficha.Text).DataCadastro := StrToDate(Edit3.OpenKey('Cadastro\Pessoas\'. var Reg: TRegistry. finally Reg.três edits. { Grava os dados (o registro) } Reg. true). Ficha. Logo abaixo da palavra implementation declare: type { Declara um tipo registro } TFicha = record Codigo: integer.Create. Ficha. } Reg. Ficha: TFicha.gondraf@hotmail. Ficha: TFicha.Escreva o evento OnClick do Button1 conforme abaixo: procedure TForm1.Create. . end. Ficha.Codigo := StrToInt(Edit1.WriteBinaryData('Dados'.Nome := Edit2.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 178 de 272 Observações Existem diversos outros cursores pré-definidos no Delphi.

dmPelsHeight. finally Reg.Listbox1. while EnumDisplaySettings(nil.FormCreate(Sender: TObject).Nome. Para dados de tamanho fixo.') end else ShowMessage('Chave (path) não existe no registro. end else ShowMessage('Valor não existe no registro.ItemIndex. end. end. Ficha.Codigo). } if Reg.Add(Format('%dx%d %d Colors'. Para isto você precisa saber o tamanho do dado.Text := IntToStr(Ficha.RootKey := HKEY_CURRENT_USER. begin EnumDisplaySettings(nil. Edit3.Coloque um botão no form . Edit1. SizeOf(Ficha)). Lembrete: não grave dados muito extensos no Registro do Windows (ex: imagens).. end.Text := Ficha. var DevMode : TDevMode. pois isto prejudicará o desempenho do sistema. begin i := 0.ValueExists('Dados') then begin { Lê os dados } Reg. Mudar a resolução do vídeo via programação .Free. [dmPelsWidth. var i : Integer.Altere o evento OnClick do botão conforme abaixo: procedure TForm1.KeyExists('Cadastro\Pessoas') then begin { Abre a chave (path) } Reg. { Se existir o valor. { Se existir a chave (path).Devmode).. 1 shl dmBitsperPel])). false). Edit2.OpenKey('Cadastro\Pessoas'.Modifique o OnCreate do form assim: procedure TForm1. Observações Qualquer tipo de dado pode ser gravado e lido de forma binária no registro do Windows..ReadBinaryData('Dados'.. end.gondraf@hotmail. DevMode : TDevMode.Coloque um ListBox no form . Inc(i). } if Reg.'). . use SizeOf().Text := DateToStr(Ficha.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 179 de 272 try { Define a chave-raiz do registro } Reg.Devmode) do begin with Devmode do ListBox1.Button1Click(Sender: TObject).i.DataCadastro). .Items.

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 180 de 272

ChangeDisplaySettings(DevMode,0); end; Ler e escrever dados no Registro do Windows Inclua na seção uses: Registry - Coloque no form dois edits e dois botões. - No evento OnClick do Button1 escreva o código abaixo: procedure TForm1.Button1Click(Sender: TObject); var Reg: TRegistry; begin Reg := TRegistry.Create; try { Define a chave-raiz do registro } Reg.RootKey := HKEY_CURRENT_USER; { Abre a chave (path). Se não existir, cria e abre. } Reg.OpenKey('MeuPrograma\Configuração', true); { Escreve um inteiro } Reg.WriteInteger('Numero', StrToInt(Edit1.Text)); { Escreve uma string } Reg.WriteString('Nome', Edit2.Text); finally Reg.Free; end; end; - No evento OnClick do Button2, escreva: procedure TForm1.Button2Click(Sender: TObject); var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.KeyExists('MeuPrograma\Configuração') then begin Reg.OpenKey('MeuPrograma\Configuração', false); if Reg.ValueExists('Numero') then Edit1.Text := IntToStr(Reg.ReadInteger('Numero')) else ShowMessage('Não existe valor com o nome "Numero"'); if Reg.ValueExists('Nome') then Edit2.Text := Reg.ReadString('Nome') else ShowMessage('Não existe valor com o nome "Nome"'); end else ShowMessage('Não existe a chave no registro'); finally Reg.Free; end; end;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 181 de 272

Observações Use o aplicativo RegEdit.exe do windows para ver o registro. Cuidado para não alterar as configurações do Windows! Adicionar barra de rolagem horizontal no ListBox { - Coloque um ListBox no form; - Altere o OnCreate do Form conforme abaixo:} procedure TForm1.FormCreate(Sender: TObject); var I, Temp, MaxTextWidth: integer; begin { Adiciona algumas linhas no ListBox } Listbox1.Items.Add('Linha 1'); Listbox1.Items.Add('Linha 2, longa para que seja necessária a barra de rolagem horizontal'); Listbox1.Items.Add('Linha 3'); if Listbox1.Items.Count > 1 then begin { Obtém o comprimento, em pixels, da linha mais longa } MaxTextWidth := 0; for I := 0 to Listbox1.Items.Count - 1 do begin Temp := ListBox1.Canvas.TextWidth(ListBox1.Items[I]); if Temp > MaxTextWidth then MaxTextWidth := Temp; end; { Acrescenta a largura de um "W" } MaxTextWidth := MaxTextWidth + Listbox1.Canvas.TextWidth('W'); { Envia uma mensagem ao ListBox } SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxTextWidth, 0); end; end; { Para ocultar use a instrução abaixo: } SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, 0, 0); Simular um CharCase no DBGrid Para converter a digitação para maiúsculo, coloque isto no evento OnKeyPress do DBGrid: Key := AnsiUpperCase(Key)[1]; Para converter para minúsculo, troque por: Key := AnsiLowerCase(Key)[1]; Verificar se uma string é uma data válida Escreva a função abaixo: function tbStrIsDate(const S: string): boolean; begin try StrToDate(S); Result := true;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 182 de 272

except Result := false; end; end; Para testar: - Coloque um Edit no form; - Coloque um Button; - No evento OnClick do botão coloque o código abaixo: if tbStrIsDate(Edit1.Text) then ShowMessage(Edit1.Text + ' é data válida.') else ShowMessage(Edit1.Text + ' NÃO é data válida.'); Fazer pesquisa incremental com DBGrid e Edit - Crie um índice na tabela com campo a ser usado na pesquisa. Coloque no Form: - Um DataSource - Um Table - Um DBGrid - Um Edit Altere as seguintes propriedades: - DataSource1.DataSet = Table1 - Table1.DatabaseName = 'NomeDoAlias' - Table1.TableName = 'NomeDaTabela' - Table1.IndexFieldNames = 'NomeDoCampo' - Table1.Active = true - DBGrid1.DataSource = DataSource1 Escreva a instrução abaixo no evento OnChange do Edit: Table1.FindNearest([Edit1.Text]); Observações Este exemplo considera que o campo seja tipo string. Para outros tipos de campos pode ocorrer erro dependendo dos valores digitados no Edit1. Adicionar zeros à esquerda de um número Existem várias formas. Vejamos uma: function tbStrZero(const I: integer; const Casas: byte): string; var Ch: Char; begin Result := IntToStr(I); if Length(Result) > Casas then begin Ch := '*'; Result := ''; end else Ch := '0'; while Length(Result) < Casas do Result := Ch + Result; end;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 183 de 272

{ Exemplo de como usá-la: } var S: string; Numero: integer; {...} begin {...} S := tbStrZero(Numero, 6); {...} end; Observações Se o comprimento desejado (Casas) não for suficiente para conter o número, serão colocados asteriscos. Limpar um campo tipo data via programação Table1.FieldByName('Data').Clear; { ou } Table1.FieldByName('Data').AsString := ''; Observações Podemos usar este recurso para limpar também campos numéricos, string, etc. Implementar um campo auto-incremental via programação Inclua na seção uses: dbTables procedure tbAutoInc(Table: TTable; const FieldName: string); var Q: TQuery; begin if not Table.FieldByName(FieldName).IsNull then Exit; Q := TQuery.Create(nil); try Q.DatabaseName := Table.DatabaseName; Q.SQL.Add('select max(' + FieldName + ') from ' + Table.TableName); Q.Open; try Table.FieldByName(FieldName).AsInteger := Q.Fields[0].AsInteger +1; finally Q.Close; end; finally Q.Free; end; end; { Chame esta procedure no evento BeforePost de um Table: } procedure TForm1.Table1BeforePost(DataSet: TDataSet); begin tbAutoInc(Table1, 'Codigo'); end;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 184 de 272

Observações A função acima incrementa o campo somente se estiver vazio. Assim podemos dar ao usuário a opção de digitar neste campo ou deixá-lo vazio para que seja auto-incrementado. Existem várias outras formas de implementar este recurso. Obter o endereço IP do Dial-Up Inclua na seção uses: WinSock { Esta função retorna o endereço IP do Dial-Up. } function GetLocalIP : string; type TaPInAddr = array [0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe : PHostEnt; pptr : PaPInAddr; Buffer : array [0..63] of char; I : Integer; GInitData : TWSADATA; begin WSAStartup($101, GInitData); Result := ''; GetHostName(Buffer, SizeOf(Buffer)); phe :=GetHostByName(buffer); if phe = nil then Exit; pptr := PaPInAddr(Phe^.h_addr_list); I := 0; while pptr^[I] <> nil do begin result:=StrPas(inet_ntoa(pptr^[I]^)); result := StrPas(inet_ntoa(pptr^[I]^)); Inc(I); end; WSACleanup; end; Observações Se o endereço IP for designado pelo servidor, a cada conecção teremos um endereço IP diferente e, obviamente, se não estivermos conectados, não conseguiremos obtê-lo. Exibir a caixa de diálogo padrão de solicitação de senha do banco de dados Inclua na seção uses: DbPwDlg { Coloque um botão no form e escreve seu evento OnClick como abaixo } procedure TForm1.Button1Click(Sender: TObject); var pw: TPasswordDialog; begin pw := TPasswordDialog.Create(Self); try pw.Caption := 'Banco de Dados'; pw.GroupBox1.Caption := 'Senha'; pw.AddButton.Caption := '&Adicionar'; pw.RemoveButton.Caption := '&Remover'; pw.RemoveAllButton.Caption := 'Remover &Tudo'; pw.OKButton.Caption := '&OK'; pw.CancelButton.Caption := '&Cancelar';

Não entrarei em detalhes minuciosos. tais como ToolBar e CoolBar. Obter a versão da biblioteca ComCtl32. Edit1.' + IntToStr(MenorVer). Y: byte): byte. MaiorVer. asm mov ax.ShowModal.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 185 de 272 pw.DLL (usada na unit ComCtrls do Delphi) Inclua na seção uses: ComCtrls { A versão desta biblioteca determina a aparência de alguns controles do Delphi.72 está presente quando o Internet Explorer 4 está instalado.gondraf@hotmail. Observações As senhas adicionadas nesta caixa de diálogo são adicionadas na sessão (TSession) atual. finally pw. Para este exemplo. &X add ax. MenorVer: Word. asm mov al. mas darei alguns exemplos básicos de como implementar rotinas simples que retornam números inteiros. end. coloque um TEdit e um TButton no Form. Observações Normalmente. esta caixa de diálogo será mostrada quando o programa tentar abrir uma tabela com senha. O exemplo abaixo obtém a versão desta biblioteca. Y: DWord): DWord.Button1Click(Sender: TObject). Isto é útil quando colocamos senha em tabelas Paradox. &X add al. asm mov eax. ou mesmo quando trabalhamos com banco de dados Client Servidor. end.Text := IntToStr(MaiorVer) + '. Y: Word): Word. { Soma dois inteiros de 32 bits } function Soma32(X.Free. { Soma dois inteiros de 16 bits } function Soma16(X. begin Ver := GetComCtlVersion. end. &Y end. MenorVer := LoWord(Ver). var Ver: Cardinal. &Y end. &X .} { Soma dois inteiros de 8 bits } function Soma8(X. A grande vantagem aqui é que podemos traduzir os Caption's dos componentes. e queremos que o usuário digite a senha de acesso. O evento OnClick do botão escreva o código abaixo: } procedure TForm1. MaiorVer := HiWord(Ver). nem adicionarmos via programação as senhas necessárias. a versão 4. Implementar rotinas assembly em Pascal { O Delphi permite a implementação de rotinas assembly mescladas ao código Pascal. Se não fizermos desta forma.

Lin. Col: integer. 0).x. 'NomePrograma'. Obter a linha e coluna atual em um TMemo { === SOLUÇÃO 1 === } { Esta procedure obtém a linha e coluna atual de um TMemo } procedure tbGetMemoLinCol(Memo: TMemo.. begin Lin := Memo1. begin with Memo do begin Lin := Perform(EM_LINEFROMCHAR.Perform(EM_LINEINDEX. { === SOLUÇÃO 2 === } var Lin. ''. Exemplo: } var A: byte.. Lin. } end. Col: Cardinal. var Lin. Col := Memo1. Exibir um arquivo de ajuda do Windows Inclua na seção uses: Windows . { . SelStart. begin tbGetMemoLinCol(Memo1.Handle).CaretPos. {Achamada a estas funções são feitas da mesma forma que chamamos uma função Pascal. { A = 55 } end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 186 de 272 add eax.. Col). end. Application. {.y. { Personalizada } ShellAbout(Handle. 25). 'Direitos autorais reservados a'#13'Fulano de Tal'.} end.CaretPos.. 0). begin A := Soma8(30. Exibir o diálogo About do Windows Inclua na seção uses: Windows { About padrão do Windows } ShellAbout(Handle.Icon. 'Windows'. Col: Cardinal). &Y end. end. { Use-a como abaixo: } var Lin. 0).gondraf@hotmail. Col := SelStart .

. end. No exemplo abaixo abre o arquivo de ajuda da Calculadora do Windows e vai para o tópico n. 100).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 187 de 272 { Você precisa saber: .hlp'. PChar(Result). begin Result := ''. var I: integer.Handle) then { Form1 está maximizado } else { Form2 NÃO está maximizado } Determinar se o cursor do mouse está em determinado controle Inclua na seção uses: Windows { Os exemplos abaixo verificam se o cursor do mouse está em Button1: } { Solução 1: } var Pt: TPoint. } function tbGetEnvVar(const VarName: string): string. ou uma string vazia se a variável não existir.Caminho e nome do arquivo. { Obtém o comprimento da variável } I := GetEnvironmentVariable('PATH'. I). end. Rct: TRect. { Para usá-la. Observações Para utilizar um arquivo de ajuda em seu programa desenvolvido em Delphi.Text := tbGetEnvVar('PATH'). 'c:\Win95\Help\Calc.A estrutura do arquivo de Help.gondraf@hotmail.Button1Click(Sender: TObject). I). 0). . if I > 0 then begin SetLength(Result. Determinar se uma janela (form) está maximizada Inclua na seção uses: Windows if IsZoomed(Form1. GetEnvironmentVariable('PATH'. Obter o valor de uma variável de ambiente Inclua na seção uses: Windows { Esta função recebe o nome da variável de ambiente que queremos acessar e retorna uma string com seu valor. begin WinHelp(0. faça como neste exemplo: } Edit1. 100} procedure TForm1. end. O exemplo acima é somente para mostrar o uso de uma API para este fim. nil. basta usar os recursos do próprio Delphi. HELP_CONTEXT.

if WindowFromPoint(Pt) = Button1. Se usarmos a propriedade BoundsRect.Handle) then { Minimizado } else { Não minimizado } Observações Pode-se verificar qualquer janela (form). ou mesmo informar qualquer outro retângulo da tela. Observações A API GetWindowRect obtém o retângulo (TRect) ocupado por uma janela. Um lembrete: a solução 2 só poderá ser aplicada a controles ajanelados. Quando a caixa de diálogo é fechada a aplicação é finalizada. na verdade ele é oculto e o Application é que é minizado. Pt) then { Está no botão } else { NÃO está no botão } end.'). begin FatalAppExit(0. Observações A função FatalAppExit é uma API do Windows. end.Handle then { Está no botão } else { Não está no botão } end. Podemos também usar a propriedade BoundsRect que existe na maioria dos componentes visuais.Clique no campo "Tipo". Fechar um aplicativo com uma mensagem de erro fatal Inclua na seção uses: Windows procedure TForm1. precisaremos converter as coordenadas clientes para coordenadas de tela (com a função ClientToScreen). . Rct). 'Erro fatal na aplicação.Button1Click(Sender: TObject). Determinar se o aplicativo está minimizado Inclua na seção uses: Windows if IsIconic(Application.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 188 de 272 begin GetCursorPos(Pt).Adicione todos os campos no Field Editor. . Só um lembrete: quando clicamos no botão de minimizar do form principal.gondraf@hotmail. O evento OnCloseQuery dos forms não são chamados quando usamos esta função. if PtInRect(Rct. Usar o evento OnGetText de um TField . { Solução 2: } var Pt: TPoint. GetWindowRect(Button1. begin GetCursorPos(Pt).Vá ao Object Inspector e dê um duplo-click . Esta mostra uma caixa de diálogo (normalmente branca) com a mensagem passada no segundo parâmetro. Podemos usar GetClientRect para obter o somente da parte cliente da janela.Handle.

} function tbBDELocalShare: boolean. if Reg. 3: Text := 'Boleto'. 2: Text := 'Duplicata'. Height := Screen. digite o código abaixo: procedure TForm1.. try Reg. end. .AsInteger of 1: Text := 'Promissória'.Neste evento. Caso contrário. inclusive a barra de tarefas { É um "maximizar" com jeitinho brasileiro. end.Width. etc.OpenKey(BdeKey.Create.. retorna false. end else Text := Table1Tipo. Observações Ao exibir será exibido os nomes. begin if DisplayText then begin case Table1Tipo. Verificar. Ident = 'LOCAL SHARE'. Reg := TRegistry.Table1TipoGetText(Sender: TField. const BdeKey = 'SOFTWARE\Borland\Database Engine\Settings\SYSTEM\INIT'. Para usar este recurso em relatórios.AsString. else Text := 'Desconhecido'. via programação. { Use-a como abaixo: } if tbBDELocalShare then { Local Share está TRUE } else . Width := Screen. se Local Share do BDE está TRUE Inclua na seção uses: Registry. begin Result := false. False) then if Reg. end.ValueExists(Ident) then Result := UpperCase(Reg. DisplayText: Boolean).Height.RootKey := HKEY_LOCAL_MACHINE. SysUtils. Maximizar um form de forma que cubra toda a tela. var Text: String. Windows { Esta função retorna true se Local Share estiver "TRUE". 2. 3. end.ReadString(Ident)) = 'TRUE'. acesse a propriedade DisplayText em vez de AsString para obter o valor do campo.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 189 de 272 no evento OnGetText. Mas ao digitar continue com os 1. No evento OnShow do form coloque o código abaixo: } Top := 0. mas funciona.gondraf@hotmail. finally Reg. var Reg: TRegistry.Free. Left := 0.

x). begin Erro := WinExec('Pro2. da chave: HKEY_CURRENT_USER\Environment Inverter os botões do mouse Inclua na seção uses: Windows { Para inverter: } SwapMouseButton(true). SW_SHOW). Neste caso sua "trava" estará violada. será possível chamar este programa passando-a como parâmetro. end. Caso alguém saiba. } ShowMessage('Erro ao executar o programa. O ideal seria usar uma API do BDE.Initialize..1. Você deverá trocar 'MinhaSenha' por algo que apenas você saiba (uma senha). var Erro: Word.Button1Click(Sender: TObject).dpr (programa a ser chamado). Resolver "Internal error near: IBCheck" do Interbase 5. é criada uma chave com valor errado.exe MinhaSenha'. { Para voltar ao normal: } SwapMouseButton(false).gondraf@hotmail. coloque o código abaixo:} if ParamStr(1) <> 'MinhaSenha' then begin { Para usar ShowMessage. coloque Dialogs no uses } ShowMessage('Execute este programa através de Prog2.. Caso uma pessoa conheça esta senha. Entre no registry do Windows e altere a opção. { Finaliza } end. Na hora da instalação. queira por gentileza nos informar." de Prog1. PATH de binário para string. Halt.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 190 de 272 { Local Share está FALSE } Observações A função acima faz a verificação no registro do Windows. mas até o momento não conheço uma que retorne esta informação. Criar um EXE que seja executado apenas através de outro EXE criado por mim Inclua na seção uses: Windows Antes da linha "Application. Por isto está sujeita a falha caso o BDE coloque as configurações em outro local (é o caso do BDE salvar as configurações no formato do Windows 3. if Erro <= 31 then { Se ocorreu erro. Observações Aqui o parâmetro passado foi 'MinhaSenha'.EXE'). { No Form1 de Prog2 (programa chamador) coloque um botão e escreva o OnClick deste botão como abaixo:} procedure TForm1. .').1 Server no NT Esse erro: 'Internal error near: IBCheck' acontece apenas em algumas máquinas NT 4.

Porém estes dois cliques podem ser interpretados de duas formas: dois cliques isolados ou um duplo-click. begin { Obtém } Tempo := GetDoubleClickTime. if (Attr and FILE_ATTRIBUTE_OFFLINE) > 0 then Add('OffLine'). . if (Attr and FILE_ATTRIBUTE_SYSTEM) > 0 then Add('System'). if (Attr and FILE_ATTRIBUTE_COMPRESSED) > 0 then Add('Compressed').Coloque um botão e escreva seu OnClick como abaixo: } procedure TForm1. Obter os atributos de um arquivo/diretório Inclua na seção uses: Windows { No form: . if Attr > 0 then with Memo1.Coloque um edit. ShowMessage(IntToStr(Tempo) + ' milisegundos'). if (Attr and FILE_ATTRIBUTE_HIDDEN) > 0 then Add('Hidden'). { Define } SetDoubleClickTime(300).Button6Click(Sender: TObject). faz com que o duplo-click tenha que ser muito rápido (quase impossível).Lines do begin if (Attr and FILE_ATTRIBUTE_ARCHIVE) > 0 then Add('Archive'). begin Memo1. var Tempo: Cardinal.Coloque um botão no form e escreva seu OnClick como abaixo: } procedure TForm1.Clear.gondraf@hotmail.Text)).Button1Click(Sender: TObject). O padrão do Windows é 500 milisegundos. if (Attr and FILE_ATTRIBUTE_READONLY) > 0 then Add('ReadOnly'). E você pode alterar este tempo. Observações Um duplo-click nada mais é que dois cliques consecutivos (óbvio). if (Attr and FILE_ATTRIBUTE_NORMAL) > 0 then Add('Normal'). Attr := GetFileAttributes(PChar(Edit1. enquanto muito longo (ex: 2000) faz com que o Windows interprete dois clicks isolados como duplo-click. Um tempo muito curto (ex: 100). . Se o intervalo entre o primeiro e o segundo click for menor ou igual a esse tempo. end. . então houve duplo-click. ele usa o que chamo de "tempo máximo do duplo-click".Coloque um memo. Para o Windows resolver esta situação.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 191 de 272 Obter/definir o tempo máximo do duplo-click do mouse Inclua na seção uses: Windows { . if (Attr and FILE_ATTRIBUTE_DIRECTORY) > 0 then Add('Directory'). var Attr: DWord.

Resumo -----').Clear.Add('Total de bytes: ' + IntToStr(DiskSize(3))). fixo.. Add('Total de bytes: ' + IntToStr(TotalAgrup * SetoresPorAgrup * BytesPorSetor)). begin Memo1. begin Tipo := GetDriveType(PChar(Edit1.Coloque um memo (TMemo) no form. end. end. AgrupLivres. Add('Agrupamentos livres: ' + IntToStr(AgrupLivres)). Dialogs { . var S: string. . { Onde o parâmetro (3) é o número da unidade.Lines. if GetDiskFreeSpace('C:\'. Veja: } Memo1. CD-ROM. Se preferir algo mais simples. use funções do Delphi. .Button1Click(Sender: TObject). end. Add('Bytes livres: ' + IntToStr(AgrupLivres * SetoresPorAgrup * BytesPorSetor)).Text[1] + ':\')).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 192 de 272 if (Attr and FILE_ATTRIBUTE_TEMPORARY) > 0 then Add('Temporary').Lines.. end. Tipo: byte. TotalAgrup: DWord. Add('Bytes por setor: ' + IntToStr(BytesPorSetor)). BytesPorSetor. { O exemplo acima retorna as medidas em Bytes. BytesPorSetor.gondraf@hotmail. 3=C. case Tipo of . sendo 1=A. unidade de rede.Button1Click(Sender: TObject).Lines do begin Add('Setores por agrupamento: ' + IntToStr(SetoresPorAgrup)). Obter o espaço total e livre de um disco Inclua na seção uses: Windows { . Memo1. etc) Inclua na seção uses: Windows. Setores e Agrupamentos. Add('----. 2=B.Altere o OnClick do botão conforme abaixo: } procedure TForm1.Coloque um edit (Edit1) e um botão no form. Obter o tipo de um drive (removível.Coloque um botão e altere seu OnClick como abaixo: } procedure TForm1. var SetoresPorAgrup. SetoresPorAgrup. AgrupLivres. .Add('Bytes livres: ' + IntToStr(DiskFree(3))). Add('Total de agrupamentos: ' + IntToStr(TotalAgrup)). } Observações Para usar as funções DiskSize e DiskFree coloque SysUtils em uses. TotalAgrup) then with Memo1.

Coloque um memo (TMemo) no form.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 193 de 272 0: S := 'Tipo indeterminado'. end. etc) Inclua na seção uses: Windows. 255). Alterar o nome de volume (Label) de um disco Inclua na seção uses: Windows { Da unidade C: } SetVolumeLabel('c:\'.Lines do begin Add('Nome do volume (Label): ' + string(SLabel)). finally FreeMem(SLAbel. 255. end. X. FileNameLen. DRIVE_FIXED: S := 'Disco Fixo'. 255).gondraf@hotmail. FileNameLen.} Tipo := GetDriveType(PChar(Edit1. SSysName: PChar.Button1Click(Sender: TObject). X: DWord. Add('Número Serial: ' + IntToHex(Serial. ShowMessage(S). DRIVE_REMOTE: S := 'Unidade de rede'.. try GetVolumeInformation('C:\'. with Memo1. Obter informações de um volume/disco (label. A unit Dialogs foi colocada no uses apenas por causa da procedure ShowMessage. GetMem(SLabel. 255). @Serial. Observações Para testar digite a letra do drive no Edit1 e clique no botão. serial. GetMem(SSysName. System { .. Para exibir todas as unidades existentes e seus respectivos tipos. SSysName. { por } Tipo := GetDriveType(nil). end. . Add('Sistema de Arquivos: ' + string(SSysName)). SLabel. end. else S := 'Erro'. { Para pegar o tipo da unidade atual troque.Text[1] + ':\')). 1: S := 'Drive não existe'.Coloque um botão e escreve seu evento OnClick como abaixo: } procedure TForm1. use a função tbGetDrives (da pergunta 64) em conjunto com este exemplo. Serial. DRIVE_RAMDISK: S := 'RAM Disk'. end.Clear. begin Memo1. sistema de arquivos. DRIVE_CDROM: S := 'CD-ROM'. 'NovoLabel'). . Add('Tamanho máximo p/ nome arquivo: ' + IntToStr(FileNameLen)). 8)). DRIVE_REMOVABLE: S := 'Disco removível'. var SLabel. FreeMem(SSysName. 255). 255).

{ Somente a parte inteira . Se usarmos funções como Round que vem com o Delphi.54) com duas casas decimais. Lembre-se: os tipos reais aceitam valores muuuiiiito altos.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 194 de 272 { Da unidade atual: } SetVolumeLabel(nil. tbGetDrives) > 0 then ShowMessage('Unidade A: presente. .') else ShowMessage('Unidade A: ausente.(I . end. mas o Delphi não oferece algo pronto para isto.nenhuma casa decimal } X := Trunc(ValorReal). Isto por causa da multiplicação que poderá estourar a capacidade do tipo em uso. "truncar" valores reais para apenas n casas decimais { Às vezes você precisa considerar apenas duas casas de valores reais. Saber quais as unidades de disco (drives) estão presentes Inclua na seção uses: Windows { A função abaixo retorna uma string contendo as letras de unidades de discos presentes.55 (e não 135. Com Round() o valor abaixo será 135. // X será 135. I: byte.5465 Observações Isto pode não funcionar se ValorReal for muito alto. { Para saber se uma determinada unidade está presente. var Drives: DWord. begin with DataSet do while RecordCount > 0 do Delete. basta fazer algo como: } if Pos('A'.65))) shr 31) = 1 then Result := Result + Char(I). begin Result := ''.gondraf@hotmail.} ValorReal := 135. o valor será arredondado (e não truncado).54 { Três casas } X := Trunc(ValorReal * 1000) / 1000. // X será 135. Observações A string retornada pela função tbGetDrives está sempre em letras maiúsculas. } function tbGetDrives: string. 'NovoLabel').'). if Drives <> 0 then for I := 65 to 90 do if ((Drives shl (31 . // X será 135 { Duas casas } X := Trunc(ValorReal * 100) / 100.54658. Drives := GetLogicalDrives. Excluir todos os registros de uma tabela (como DELETE ALL do Clipper) procedure tbDBDeleteAll(const DataSet: TDataSet).

a' + #8 + '~o. a cabeça de impressão retrocede uma posição. Então podemos imprimir a letra sem acento e. A função abaixo retorna true se estiver ajustado para 4 dígitos. Imprimir texto justificado com formatação na impressora Epson LX-300 . ou tbDBDeleteAll(Query1). WriteLn(F.'). Vejamos um exemplo: . end. mas melhora bastante. WriteLn(F. var F: TextFile.EmptyTable. somente os registros filtrados serão excluídos. WriteLn(F.Coloque um botão no form. Observações Usando este recurso.ShortDateFormat)>0). begin result:=(Pos('yyyy'. 'Vovo' + #8 + '^'). try { Regra: caractere sem acento + chr(8) + acento } WriteLn(F.'). Imprimir caracteres acentuados diretamente para a impressora { Usando comandos da impressora podemos fazer isto de uma forma bastante simples. 'Este e' + #8 + '''' + ' um teste. #12). Portanto é diferente de Table1.gondraf@hotmail. a acentuação não fica excelente. pois este caractere é o BackSpace. end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 195 de 272 end.'). sem seguida. Saber se o sistema está usando 4 dígitos para o ano { Para não correr o risco de surpresas desagradáveis. . Quando enviamos o caractere ASCII número 8 (oito) para a impressora. 'U' + #8 + '''' + 'ltimo. Esta função poderá ser chamada no evento BeforeDelete do Table (ou Query) principal em um formulário mestre-detalhe para excluir os itens (da parte detalhe). { Chame-a como nos exemplos abaixo: } tbDBDeleteAll(Table1). begin AssignFile(F.Altere o evento OnClick deste botão conforme abaixo:} procedure TForm1. // Eject finally CloseFile(F). Rewrite(F).} function Is4DigitYear: Boolean. 'LPT1'). 'Acentuac' + #8 + '. voltar e imprimir o acento desejado. WriteLn(F. end. Observações Se houver um filtro ou range ativo. é melhor que seu programa em Delphi verifique se o Windows está ajustado para trabalhar com 4 dígitos para o ano.Button2Click(Sender: TObject). Assim seu programa pode alertar o usuário quando o ano estiver sendo representado com apenas 2 dígitos.

. cEject = #12. cEject). { Copia sistema } . ' + c10cpi + c12cpi + '12 cpi. mas voce podera adapta-lo ' + 'a sua realidade conforme a necessidade. Formatar um disquete através de um programa Delphi { Coloque o código abaixo imediatamente abaixo da palavra implementation: } const SHFMT_ID_DEFAULT = $FFFF. const cJustif = #27#97#51. ' + cFItalico + c17cpi + 'Condensado (17cpi). { Opções de formatação } SHFMT_OPT_QUICKFORMAT = $0000. { Formatação da fonte } cINegrito = #27#71. WriteLn(F.'. Texto).Button1Click(Sender: TObject). cIItalico = #27#52. AssignFile(F. Rewrite(F). end. pois com ele podemos continuar a enviar os comandos de formatação de caracteres como condensado. cIExpandido = #14. expandido. italico. { Tamanho da fonte } c10cpi = #18. etc. cFNegrito = #27#72. Este recurso é interessante.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 196 de 272 { A impressora Epson LX-300 dispõe de um comando que justifica o texto. finally CloseFile(F). ' + cFNegrito + cIItalico + 'Italico. 'LPT1'). c17cpi = #15. cFExpandido = #20. begin Texto := c10cpi + 'Este e um teste para impressora Epson LX 300.' + cFExpandido + ' Este e apenas um exemplo.Coloque um botão no form.gondraf@hotmail. { Formatação rápida } SHFMT_OPT_FULL = $0001. { Formatação completa } SHFMT_OPT_SYSONLY = $0002. tais como: ' + cINegrito + 'Negrito. var Texto: string. c12cpi = #27#77. cFItalico = #27#53.Altere o evento OnClick deste botão como abaixo: } procedure TForm1. Para o exemplo abaixo: . try WriteLn(F. negrito. end. ' + c10cpi + cIExpandido + 'Expandido. F: TextFile. cJustif. Observações Este recurso de justificação da Epson LX-300 pode ser usado em qualquer linguagem de programação. ' + 'O objetivo e imprimir texto justificado sem deixar ' + 'de usar formatacao.

external 'shell32.pas em seu projeto. begin Papel.EndDoc. . .Adicione a unit tbPrn. Ele contém função tbPrnSetPaperSize usada no exemplo abaixo. finally a unit tbPrn.'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 197 de 272 { Códigos de errros } SHFMT_ERROR = $FFFFFFFF.Peque em nosso Download o arquivo tbPrn. var Erro: DWord. else Msg := 'Disco formatado com sucesso.} procedure TForm1. onde está a .BeginDoc. { Ocorreu erro } SHFMT_CANCEL = $FFFFFFFE.dll' name 'SHFormatDrive' { Coloque um botão no form e altere o evento OnClick dele conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject). end. { Não formatou } function SHFormatDrive(Handle: HWND.gondraf@hotmail. end. SHFMT_NOFORMAT: Msg := 'Não foi possível formatar. end.Button3Click(Sender: TObject). B é 1. ShowMessage(Msg). Observações Para formatação completa troque SHFMT_OPT_QUICKFORMAT por SHFMT_OPT_FULL. // 256 é o tam. var Papel: TtbPrnPaper. 0.Siga o exemplo abaixo para criar seus relatórios usando o TPrinter. try Printer.'. case Erro of SHFMT_ERROR: Msg := 'Ocorreu um erro.Size := 256. ID.Width := 2100. try { coloque aqui os comandos para impressão } finally Printer.'. { Foi cancelado } SHFMT_NOFORMAT = $FFFFFFFD. SHFMT_OPT_QUICKFORMAT). SHFMT_ID_DEFAULT. Msg: string. personalizado Papel. begin Erro := SHFormatDrive(Handle. Options: Word): LongInt.'.zip. stdcall.pas. SHFMT_CANCEL: Msg := 'A formatação foi cancelada. Alterar (e restaurar) o tamanho da página na impressora Inclua na seção uses: tbPrn { . sendo que A é 0 (zero). O segundo parâmetro (zero no exemplo) indica a unidade. Drive.Height := 1000. // 21 cm Papel. etc. // 10 cm Papel := tbPrnSetPaperSize(Papel).

Reproduzir um arquivo de som WAV sem o TMediaPlayer Inclua na seção uses: MMSystem { Síncrona: aguarda terminar a reprodução para continuar: } SndPlaySound('C:\Win95\Media\Office97\Lembrete.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 198 de 272 tbPrnSetPaperSize(Papel).Height e Papel.Size for 256.wav'. end. try S := Reg. o arquivo não será reproduzido. { Papel. begin Reg := TRegIniFile.A5 256 .Button1Click(Sender: TObject). Observações A reprodução contínua pode ser usada.'DefCompany'.Custom (personalizado) } Observações Só será necessário informar Papel. // Restaura o tamanho end. para altertar o usuário em uma situação extremamente crítica. { Interrompe uma reprodução contínua: } SndPlaySound(nil. finally Reg. SND_SYNC). S: string. Veja alguns: 0 .gondraf@hotmail.Width quando Papel. var Reg: TRegIniFile. end.Size refere-se ao tamanho do papel.'DefName'.ReadString('USER INFO'.''). Obter o nome do usuário e da empresa informado durante a instalação do Windows Inclua na seção uses: Registry { Coloque um botão no form e altere seu evento OnCkick como abaixo: } procedure TForm1. end. por exemplo.Create('SOFTWARE\MICROSOFT\MS SETUP (ACME)\'). S := S + Reg. SND_ASYNC). 0).wav'.'').Legal 8 .free.A3 9 . Mostrar uma barra de progresso enquanto copia arquivos . Se o equipamento não possuir placa de som.A4 11 . S := S + #13. ShowMessage(S). Este tipo de reprodução precisa ser assíncrona: } SndPlaySound('C:\Win95\Media\Office97\Lembrete. { Assíncrona: a execução continua normalmente enquanto ocorre a reprodução: } SndPlaySound('C:\Win95\Media\Office97\Lembrete. SND_ASYNC or SND_LOOP).Default 1 .ReadString('USER INFO'.wav'. { Contínua: a reprodução é repetida num efeito de loop.Letter 5 .

.Mude a propriedade KeyPreview do form para true.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 199 de 272 Veja a próxima Copiar arquivos usando o Shell do Windows Inclua na seção uses: ShellApi { .Coloque um Label no form (Label1). [Key]). .gondraf@hotmail. Shift: TShiftState). Observações Para testar execute e observe o Label enquanto pressiona as teclas desejadas. pFrom := PChar('c:\teste\*.SizeOf(Dados).Button1Click(Sender: TObject). var Dados: TSHFileOpStruct.Coloque um botão no form e altere o evento OnClick deste botão conforme abaixo: } procedure TForm1. Observações Esta forma de copiar arquivos oferecem várias vantagens. var Key: Word. Descobrir o código ASCII de uma tecla { .FormKeyDown(Sender: TObject. Windows. enquanto os demais aplicativos funcionam como AppWindow. with Dados do begin wFunc := FO_COPY. .txt').Altere o evento OnKeyDown do form como abaixo: } procedure TForm1. end. uses Forms. não aparece na lista do Alt+Tab e tampouco na barra de tarefas? Isto ocorre porque ela funciona como uma ToolWindow. crie um novo projeto e altere o Project1. begin FillChar(Dados. end. SHFileOperation(Dados). Porém podemos mudar o comportamento de nossos programas feito em Delphi para que se comportem como uma ToolWindow também. Mostra a barra de progresso. begin Label1. O Shell avisa para pôr um próximo disco quando o atual estiver cheio.Caption := Format('O código da tecla pressionada é: %d'. Pode copiar arquivos usando máscara de uma forma extremamente simples. Para experimentar. fFlags:= FOF_ALLOWUNDO. Evitar que seu programa apareça na barra de tarefas Inclua na seção uses: Windows { Você já observou a caixa "Propriedades". aquela que mostra as propriedades de um arquivo no Windows Explorer.dpr como abaixo (não esqueça do uses): } program Project1. 0). end. pTo := PChar('a:\').

{ Evento Pergunta } MessageBeep(32). Observações Ao executar observe a barra de tarefas e teste o Alt+Tab (seu programa não estará lá!). 0). { Desliga o Windows } ExitWindowsEx(EWX_SHUTDOWN.RES} var ExtendedStyle : Integer.Text). { Usando o nome do campo } DBGrid1.Initialize.FieldByName(Edit2.pas' {Form1}. { Evento Exclamação } MessageBeep(48). gwl_ExStyle). 0). { Força todos os programa a desligarem-se } ExitWindowsEx(EWX_FORCE. Mudar a coluna ativa em um DBGrid via programação { Usando número da coluna (zero é a primeira coluna): } DBGrid1. .Run. Fechar o Windows a partir do seu programa { Reinicia o Windows } ExitWindowsEx(EWX_REBOOT. {$R *.Handle.Handle. 0). begin Application. e não o campo. Application. gwl_ExStyle.CreateForm(TForm1. Form1). Application. { ou Beep. SetWindowLong(Application. Observações Aconselho usar o nome do campo quando o que importa é o campo e não a posição.gondraf@hotmail. Usar eventos de som do Windows { Evento Som Padrão } MessageBeep(0).SelectedIndex := 0. } { Evento Parada Crítica } MessageBeep(16). Use o número da coluna somente quando o que importa é a posição. ExtendedStyle := GetWindowLong(Application. { Evento Asterisco } MessageBeep(64).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 200 de 272 Unit1 in 'Unit1.SelectedField := Table1. ExtendedStyle or ws_Ex_ToolWindow and not ws_Ex_AppWindow). end.

Button1Click(Sender: TObject). fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT. Obter o número do registro atual Table1. . begin Screen. Observações Para este exemplo é necessário ter o arquivo de cursor conforme apontado e também ter. Exit. var S: string.'.Cursor := 1.ani) { Altere o evento OnCreate do Form conforme abaixo: } procedure TForm1. begin ArqParaLixeira('c:\Diretorio\Teste. um Button1. with Op do begin wFunc := FO_DELETE. Form1. Enviar um arquivo para a lixeira Inclua na seção uses: ShellApi { Coloque a procedure abaixo na seção implementation } procedure ArqParaLixeira(const NomeArq: string. Para usar este cursor em outros componentes basta atribuir à propriedade Cursor do componente em questão o valor 1 (um).'.gondraf@hotmail. if ShFileOperation(Op) <> 0 then MsgErro := 'Não foi possível enviar o arquivo para a lixeira.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 201 de 272 Carregar um cursor animado (. if not FileExists(NomeArq) then begin MsgErro := 'Arquivo não encontrado. end.') else ShowMessage(S). Exemplo: Edit1.FormCreate(Sender: TObject). var MsgErro: string). { . 0). Button1. no form. FillChar(Op. end. end. pFrom := PChar(NomeArq). end. S). if S = '' then ShowMessage('O arquivo foi enviado para a lixeira. begin MsgErro := ''. var Op: TSHFileOpStruct. etc.Cursor := 1. SizeOf(Op).Cursors[1] := LoadCursorFromFile('c:\win95\cursors\globe.Coloque um botão no Form..RecNo() Trabalhar com Filter de forma mais prática .doc'.ani').Cursor := 1.Altere o evento OnClick do botão conforme abaixo: } procedure TForm1. end.

o programa a ser fechado não oportunidade para salvá-los. Observações Este exemplo fecha o MS Word 97 se estiver aberto. end. A mensagem WM_QUIT fecha o programa da forma "ignorante". .exe param1 param2'. Executar um programa DOS e fechá-lo em seguida { Coloque isto no evento OnClick de um botão: } WinExec('command.. Fechar um programa a partir de um programa Delphi { . nil). 0. Observações A função QuitedStr() coloca apóstrofos envolvendo a string. 0). ou Table1. 1. Observações Troque o nome do arquivo (C:\ArqSom.sw_ShowNormal). Observações Se quizer que a janela do programa não apareça. WM_QUIT. Uma alternativa mais suave é trocar a mensagem WM_QUIT por WM_CLOSE. Tente usar este: Table1. Isto significa que se houver dados não salvos. { Se quizer passar parâmetros pasta adicioná-los após o nome do programa. if Janela = 0 then ShowMessage('Programa não encontrado') else PostMessage(Janela.wav'.Filter := 'Nome = '''+ Edit1. Table1. Reproduzir um arquivo WAV Inclua na seção uses: MMSystem PlaySound('C:\ArqSom.com /c programa. Exemplo: } WinExec('command. ou Table1. var Janela: HWND. para que seja corretamente interpretado.wav) pelo arquivo desejado.Coloque um TButton no Form.Text).Button1Click(Sender: TObject). begin Janela := FindWindow('OpusApp').Filter := 'Data = ' + QuotedStr(DateToStr(Date)).Text + ''''.Filter := 'Data = ''' + DateToStr(Date) + ''''.Filter := 'Nome = ' + QuotedStr(Edit1. ela o subtitui por dois apóstrofos. Se houver um apóstrofo como parte da string. Veja as perguntas 18 e 36.com /c programa. troque sw_ShowNormal por sw_Hide. SND_ASYNC).gondraf@hotmail.sw_ShowNormal).. Colocar Hint's de várias linhas { .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 202 de 272 Se você está habituado a usar este código no filter.exe'.Altere o evento OnCreate do Form como abaixo: } .Coloque um botão no form e altere seu evento OnClick conforme abaixo: } procedure TForm1.

Reproduzir um vídeo AVI em um Form { . Este já deverá ter o Form1. begin with MediaPlayer1 do begin FileName := 'c:\speedis..Altere o evento OnClick do botão como abaixo: } procedure TForm1. Separar (filtrar) caracteres de uma string { Abaixo da palavra implementation digite: } type TChars = set of Char. end.ClientHeight := Bottom .gondraf@hotmail. Display := Form2.Button1Click(Sender: TObject).ShowHint := true. Open.ClientRect. . begin Button1. .Button4Click(Sender: TObject). var I: integer. begin Result := ''.Show.FormCreate(Sender: TObject).Coloque.end. por MediaPlayer1. . for I := 1 to Length(S) do if S[I] in ValidChars then Result := Result + S[I]. { Ajusta tamanho do Form } with MediaPlayer1.Left. . Para isto troque o trecho with.Coloque um botão no Form. Form2. Form2. { Para usar a função: . const ValidChars: TChars): string.Altere o evento OnClick deste botão conforme abaixo: } procedure TForm1.DisplayRect do begin Form2. end.Adicione um novo Form (Form2). end. . function FilterChars(const S: string. no Form1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 203 de 272 procedure TForm1.avi'. Play.Top. end. Button1. end. podemos ajustar o vídeo ao Form.Hint := 'Linha 1 da dica' + #13 + 'Linha 2 da dica' + #13 + 'Linha 3 da dica'.ClientWidth := Right .Crie um novo projeto.DisplayRect := Form2. um TMediaPlayer (paleta System) e um botão. Observações Em vez de ajustar o Form ao vídeo.

I := FindNext(SR).Altere o evento OnClick deste Button conforme abaixo: } procedure TForm1.Name.txt'. Colocar zeros à esquerda de números { Isto coloca zeros à esquerda do número até completar 6 casas } S := FormatFloat('000000'. end. coloque a declaração do tipo TChars na seção interface. ['A'.'z'])). end.Button2Click(Sender: TObject). faAnyFile. . Destino: string. altere o último parâmetro de CopyFile para false.Button2Click(Sender: TObject). Para que a função possa sobreescrever o arquivo destino (caso exista).. Coloque aí também uma declaração da função FilterChars. Destino := 'c:\Destino\' + SR. SR). CUIDADO! Se um arquivo for sobreescrito. Observações "S" precisa ser uma variável string. if not CopyFile(PChar(Origem).*'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 204 de 272 begin { Pega só letras } ShowMessage(FilterChars('D63an*%i+/e68l13'. true) then ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino).Coloque um Button no Form. Origem. se o arquivo já existir no destino.Attr and faDirectory) <> faDirectory then begin Origem := 'c:\Origem\' + SR.*) { . while I = 0 do begin if (SR.. . var SR: TSearchRec. end. end. PChar(Destino).txt'.Name. I: integer. begin Origem := 'c:\Origem\NomeArq. ['0'. { Pega só números } ShowMessage(FilterChars('D63an*%i+/e68l13'. true) then . if not CopyFile(PChar(Origem).. begin I := FindFirst('c:\Origem\*.'9'])).Coloque um Button no Form. a função falha (não copia). E não se esqueça da cláusula uses. Copiar arquivos { . var Origem.'Z'. Copiar arquivos usando curingas (*.gondraf@hotmail. Observações No exemplo acima. Destino := 'c:\Destino\NomeArq. Destino: string. Observações Se quizer usar este função em outras unit's. PChar(Destino). 'a'. 5).Altere o evento OnClick deste Button conforme abaixo: } procedure TForm1.

end.Color := StringToColor('clBlue'). Trabalhar com cores no formato string procedure TForm1. var SR: TSearchRec. Você mesmo pode criar aplicativos em Delphi e.*) { . criar uma janela com um destes nomes. etc) { Coloque um Button no Form e altere o evento OnClick deste como abaixo: } procedure TForm1.Button2Click(Sender: TObject). a função falha (não copia). nil) > 0 then ShowMessage('O Delphi está aberto') else ShowMessage('O Delphi NÃO está aberto'). altere o último parâmetro de CopyFile para false.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 205 de 272 ShowMessage('Erro ao copiar ' + Origem + ' para ' + Destino).Coloque um Button no Form. Delphi. end.Button3Click(Sender: TObject). Observações Há uma margem de erro nesta verificação: pode haver outros programas que possuam uma janela com os mesmos nomes. Excluir arquivos usando curingas (*. . { Verifica o Excell } if FindWindow('XLMAIN'.Button1Click(Sender: TObject). end. Verificar se determinado programa está em execução (Word. Veja a pergunta nº 18. se o arquivo já existir no destino. Edit2. { Verifica o Word } if FindWindow('OpusApp'.Color := StringToColor('$0080FF80'). nil) > 0 then ShowMessage('O Excell está aberto') else ShowMessage('O Excell NÃO está aberto'). CUIDADO! Se um arquivo for sobreescrito. I: integer. { Altera as cores dos Edit's } Edit1.Color)). Observações No exemplo acima.gondraf@hotmail. propositadamente. begin { Exibe as cores atuais dos Edit's } ShowMessage(ColorToString(Edit1. Para que a função possa sobreescrever o arquivo destino (caso exista). estará perdido para sempre!. begin { Verifica o Delphi } if FindWindow('TAppBuilder'. ShowMessage(ColorToString(Edit2. begin .Altere o evento OnClick do Button conforme abaixo: } procedure TForm1. nil) > 0 then ShowMessage('O Word está aberto') else ShowMessage('O Word NÃO está aberto').Color)).

Word.MoveRight(12).SaveAs(FileName := 'c:\Tabela.TypeText(Text := 'Linha 1.. { Escreve na primeira célula } Word. Word.gondraf@hotmail. begin { Abre o Word } Word := CreateOleObject('Word. . Coluna 2').ActiveDocument.Selection.Selection. { Escreve } Word.MoveRight(12). Word.Cells.TypeText(Text := 'Linha 2. Word.TypeText(Text := 'Linha 2.'). end. Word. I := FindNext(SR). try { Novo documento } Word. while I = 0 do begin if (SR.ActiveDocument.PrintOut(Copies := 1). { Para salvar.doc'). try { Adiciona tabela de 2 linhas e 3 colunas } Word.MoveRight(12). Word. finally { Fecha documento } Word.. NumRows := 2.Selection. . Coluna 1'). Coluna 1').MoveRight(12). ShowMessage('Aguarde o término da impressão.MoveRight(12).Selection. Coluna 2').com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 206 de 272 I := FindFirst('c:\Teste\*.*'.Add.TypeText(Text := 'Linha 1.Selection. SR). } Word.Selection. Word.Tables.Tables. { Próxima célula } Word.Selection.Selection.Selection. Coluna 3'). faAnyFile.Selection.Range.Selection.Altere o evento OnClick do botão conforme abaixo: } procedure TForm1.TypeText(Text := 'Linha 2.Item(1). NumColumns := 3).Close(SaveChanges := 0).Application'). { Seleciona a 1º tabela } Word.Coloque um botão no Form. Observações No exemplo acima todos os arquivos do diretório c:\Teste serão excluídos.Selection.Add( Range := Word.Attr and faDirectory) <> faDirectory then if not DeleteFile('c:\Teste\' + SR.Select.Selection. CUIDADO! Arquivos excluídos desta forma não vão para a lixeira.ActiveDocument.Name)..ActiveDocument. Coluna 3'). Word. { auto-formata } { Imprime 1 cópia } Word.Button1Click(Sender: TObject). end. var Word: Variant. Gerar uma tabela no Word através do Delphi Inclua na seção uses: ComObj { .AutoFit.TypeText(Text := 'Linha 1.Selection.Name) then ShowMessage('Não consegui excluir c:\Teste\' + SR. { Auto-Formata } Word..Documents.

end.No entanto esta propriedade é dependente de filtros. begin .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 207 de 272 end. ShowMessage('Total de registros: ' + IntToStr(Total)).Filtered := true. Em aplicativos desenvolvidos em Delphi podemos ter esta característica. independentemente de filtros. Windows. se tivermos uma tabela com dez registros com campo "Codigo" de 1 a 10 e aplicarmos o filtro mostrado a seguir.Altere o código-fonte do arquivo Project1. {$R *.gondraf@hotmail. o Table1 precisa estar aberto. Table1. devemos usar uma API do BDE conforme abaixo: var Total: integer. begin Check(DbiGetRecordCount(Table1.RES} var Handle: THandle.Quit. Total)).Mude o "Name" do Form1 para DPGFormPrinc. testado por mim no delphi 2005 Word 2003 Obter a quantidade de registros total e visível de uma tabela Inclua na seção uses: DbiProcs Os componentes TTable e TQuery possuem a propriedade RecordCount que indicam a quantidade de registros da tabela.Filter := 'Codigo <= 5'.Crie um novo projeto. Evitar que um programa seja executado mais de uma vez { Muitos programas Windows permitem apenas uma cópia em execução de cada vez. Isto é interessante principalmente quando é um grande aplicativo. pois duas cópias ao mesmo tempo usuaria muito mais memória. a propriedade RecordCount retornará 5 e não 10. ou seja.pas' {DPGFormPrinc}. . . finally { Fecha o Word } Word.dpr conforme abaixo: } program Project1. end. end.Handle. Observações Para testar o exemplo acima. Se quizermos obter a quantidade total de registros. uses Forms. Vejamos: . Observações Foram usados neste exemplo o Delphi4 e MS-Word97. Unit1 in 'Unit1. Table1.

exe (projeto compilado) usando o Windows Explorer e tente executá-lo mais de uma vez e veja o que acontece. end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 208 de 272 Handle := FindWindow('TDPGFormPrinc'.Initialize.'.Handle). Application. Mas porque alterar o name do form principal para "DPGFormPrinc"? Este poderia ser qualquer outro nome. Uma forma eficaz de resolver este problema é posicionar o form considerando apenas a área livre do Desktop. .Width.R. Exit.Bottom . begin if not SystemParametersInfo(SPI_GETWORKAREA. A cópia ' + 'anterior será ativada. 2: Form. procure o Project1.Left . será bem fácil encontrar outro aplicativo feito em Delphi que possua uma janela com este nome. { Para TQuery.R.Right . 'Programa já aberto'. o que causaria problema.Handle).Top := (R. Vejamos este exemplo: . 0) then R := Rect(0.CreateForm(TDPGFormPrinc. MB_OK). mas preferi usar as iniciais do meu nome (DPG). 2: Form.Run. 2=centro.Top . Vert: byte). Posicionar Form's em relação ao Desktop do Windows { Quando usamos a propridade Position de um Form para centralizá-lo estamos sujeitos a um inconveniente: dependendo da posição/tamanho da barra de tarefas do Windows.Left := R.Height). nil).Right . 3: Form. 3=direita Vert: 1=topo. const Horz. @R. if Handle <> 0 then begin { Já está aberto } Application. end. 2=centro. Procurei deixar um nome bem pessoal para não correr o risco de colocar um nome que possa ser encontrado em outro aplicativo do Windows. with Form do case Vert of 1: Form. SetForegroundWindow(Handle). if not IsWindowVisible(Handle) then ShowWindow(Handle.Width) div 2. Depois. Application. Observações Para testar este programa você deverá compilar o projeto e fechar o Delphi.MessageBox('Este programa já está aberto. 0. SW_RESTORE). coloque nos eventos AfterPost e AfterDelete a seguinte linha: } dbiSaveChanges(Table1. DPGFormPrinc).Crie um novo projeto. a instrução é semelhante: } dbiSaveChanges(Query1.Left := (R.Height) div 2.Top := 0. o nosso Form poderá ficar parcialmente coberto por ela. Application. 0.gondraf@hotmail. Executar um "COMMIT" no Delphi Inclua na seção uses: DbiProcs { Se estiver usando TTable. end. .Width. Screen. Por exemplo: se deixar Form1. with Form do case Horz of 1: Form. { Horz: 1=esquerda.Na seção implementation digite a procedure abaixo:} procedure FormPos(Form: TForm.Left := 0. Screen. 3=em baixo } var R: TRect.

var I: byte.Text). { .Coloque um TButton e altere o evento OnClick deste conforme abaixo:} procedure TForm1.Crie um novo projeto. Saber a resolução de tela atual { Coloque um TButton no Form e altere o evento OnClick deste botão como abaixo: } procedure TForm1. etc.Bottom .Coloque no Form1 um TButton .Button1Click(Sender: TObject).. Result := DiskSize(I) >= 0. end. { . end. end. execute este exemplo e experimente digitar números de 1 a 3 em ambos os Edit's e clique no Button para ver o resultado. SysUtils { . begin FormPos(Form1. StrToInt(Edit1. end. begin ShowMessage('Largura: ' + IntToStr(Screen. . I := Ord(Drive) . O Edit1 indica a posição horizontal (esquerda. begin Drive := UpCase(Drive).Top := R. fontes instaladas no Windows.Button1Click(Sender: TObject). centro e direita) e o Edit2 indica a posição vertical (topo.Altere o evento OnClick do Button1 conforme abaixo: } procedure TForm1.Height. end.gondraf@hotmail.Text)). .Text[1]) then ShowMessage('Drive OK') else ShowMessage('Drive não preparado').64.Button1Click(Sender: TObject).Create('Unidade incorreta'). StrToInt(Edit2. centro e em baixo). .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 209 de 272 3: Form. end. Verificar se uma unidade de disco (disk-drive) está preparada Inclua na seção uses: System. begin if DriveOk(Edit1.Coloque dois TEdit's: Edit1 e Edit2.Width) + #13 + 'Altura: ' + IntToStr(Screen.Na seção implementation da Unit1 digite a função abaixo: } function DriveOk(Drive: Char): boolean.Coloque no Form1 um TEdit (Edit1) . Observações O objeto Screen contém várias informações importantes: largura e altura da tela. Observações Para testar.Height)).'Z']) then raise Exception. if not (Drive in ['A'.

begin Maximized := false. Ini. 'Left'.ReadInteger(Section. 'Top'.Perform(WM_SIZE. IniFiles. Form. SIZE_MAXIMIZED. end. try Maximized := Form. Ini.Height := Ini.WriteInteger(Section. Form. Ini.INI')). const Section: string). SysUtils.Create(ChangeFileExt( ExtractFileName(ParamStr(0)). var Ini: TIniFile. implementation procedure tbSaveFormStatus(Form: TForm. if not Maximized then begin Ini. procedure tbSaveFormStatus(Form: TForm.Free. Maximized: boolean. Form.Width). Por isto usei a mensagem WM_SIZE } finally Ini. Windows.WriteInteger(Section. Messages. 'Width'.Top). 'Maximized'. { A propriedade WindowState apresenta Bug. const Section: string).WindowState = wsMaximized.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 210 de 272 Observações Para testar você deverá executar o exemplo e digitar no Edit a letra do drive a ser testado (não precisa os dois-pontos). finally Ini.Height). end.'. Form. end. Maximized). procedure tbLoadFormStatus(Form: TForm.Left). .Left). Form. 'Height'. 'Maximized'. Form. 'Height'. 0).INI')).ReadInteger(Section. Form.Left := Ini. if Maximized then Form. 'Width'.WriteInteger(Section.WriteInteger(Section. try Maximized := Ini. Ini.ReadBool(Section.Top := Ini. interface uses Forms. clique no Button1. Form.ReadInteger(Section. 'Top'. Salvar/restaurar o tamanho e posição de Form's { Crie uma nova Unit conforme abaixo: } unit uFormFunc. Form.Create(ChangeFileExt( ExtractFileName(ParamStr(0)).WriteBool(Section. begin Ini := TIniFile. Maximized: boolean. { Evita msg do compilador } Ini := TIniFile.Top).'. Form. Form. var Ini: TIniFile.gondraf@hotmail. 'Left'. Após digitar.Width). procedure tbLoadFormStatus(Form: TForm. end. const Section: string). Form. const Section: string). Maximized).Height).Free.ReadInteger(Section. end.Width := Ini.

Neste momento podemos manipularmos o texto da célula atual (linha/coluna) e então podemos simular algo tal como uma tabela onde opções podem ser digitadas através de números. etc. // Telefone end.1. ao visualizar ou imprimir um relatório do Quick Report. O evento OnGetEditText ocorre também quando entramos no modo de edição. . Poderia ser.Name). { Em cada formulário que deseja salvar/restaurar: . Uma outra forma mais sofisticada é usar o evento AfterPrint da banda Detail.NewPage. 2. Form1. ARow: Integer. por exemplo. pedimos uma nova página: if not Table1. mesmo que o espaço permita mais de um._'. teoricamente por falta de espaço na página atual.No evento OnShow digite: tbLoadFormStatus(Self. Desta forma.Name). Neste momento podemos verificar em qual linha/coluna se encontra o cursor e então. gostaria que.} Observações O arquivo INI terá o nome do executável e extensão INI e será salvo no diretório do Windows. Deve existir outras alternativas. var Value: String).StringGrid1GetEditText(Sender: TObject. Onde aparece Self. Form2. porém para cada Form deverá ser usado um nome diferente.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 211 de 272 end. A palavra Self indica o Form relacionado com a unit em questão.Inclua na seção uses: uFormFunc . begin . Definir a quantidade de registros a ser impressa em uma página do QuickReport Ou seja. ACol. A forma mais simples consiste em alterar a altura (Height) da banda Detail do nosso relatório de modo que a altura total da página seja inferior a duas vezes a altura da banda. saia em cada página apenas um registro. caso positivo.gondraf@hotmail. Este nome será usado como SectionName no arquivo INI e deve ser idêntico no evento OnShow e OnClose de um mesmo Form.Name poderá ser colocado um nome a sua escolha.No evento OnClose digite: tbSaveFormStatus(Self. Exemplo: procedure TForm1. Exemplo: procedure TForm1. Onde encontrar tutoriais sobre construção de componentes em Delphi Pegue apostila no download. var Value: String). Self. Para que servem OnGetEditMask. ACol. ARow: Integer. Self. poderá especificar uma máscara de edição. se quiser.EOF then QuickRep1. cada registro será impresso em uma nova página. Existem pelo menos duas formas de resolver este problema: 1.StringGrid1GetEditMask(Sender: TObject. begin if (ARow = 1) and (ACol = 1) then Value := '(999) 999-9999. Nele testamos se ainda não chegou no fim da tabela e. OnGetEditText e OnSetEditText do TStringGrid O evento OnGetEditMask ocorre quando entramos no modo de edição. mas as duas anteriores funcionaram bem nos testes realizados.

Cells[ACol. {$R *. Normalmente usamos este evento em conjunto com o evento OnGetEditText.Cells[ACol.pas' {Form2}. Mostrar um Form de LogOn antes do Form principal { * Crie um novo Projeto. * Abra o arquivo Project.Create(Application). begin F := TForm2. end.dpr (menu Project/View Source). O evento evento OnSetEditText ocorre quando saímos do modo de edição. ARow] := 'Ótimo' else if Value = '2' then StringGrid1. * Altere o conteúdo deste arquivo conforme abaixo:} program Project1. ARow] = 'Ótimo' then Value := '1' else if StringGrid1. Unit2 in 'Unit2. * Adicione um novo Form (Form2).Cells[ACol. Mude os três eventos mencionados conforme os exemplos. Unit1 in 'Unit1. ACol. ARow] := 'Regular' else if Value = '3' then StringGrid1.RES} var F: TForm2. é claro!). Este certamente terá o Form1. end. * Coloque no Form2 dois botões TBitBtn. end. Exemplo: procedure TForm1.ShowModal = mrOK then begin . * Mude a propriedade Kind do BitBtn2 para bkCancel. Observações Para testar o exemplo anterior crie um novo projeto e coloque no Form1 um TStringGrid. begin if (ARow = 1) and (ACol = 2) then begin if Value = '1' then StringGrid1.Cells[ACol.Cells[ACol. Controls. ARow] := 'Ruim' end. ARow] = 'Ruim' then Value := '3'. const Value: String).StringGrid1SetEditText(Sender: TObject. Execute e experimente digitar nas céluas 1 e 2 da primeira linha (na parte não fixada.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 212 de 272 if (ARow = 1) and (ACol = 2) then begin if StringGrid1. uses Forms. Neste momento podemos manipular a entrada e trocar por um texto equivalente.gondraf@hotmail. * Mude a propriedade Kind do BitBtn1 para bkOK.Cells[ACol. ARow: Integer. * Vá no menu "Project/Options" na aba "Forms" e passe o Form2 de "Auto-create Forms" para "Available Forms".pas' {Form1}. try if F. ARow] = 'Regular' then Value := '2' else if StringGrid1.

{ Limita a região de movimentação do mouse } ClipCursor(@R). Este deverá ser preparado para que se possa escolher o usuário. R. Pegue-o no download de www. Descobrir o nome de classe de uma janela do Windows Muitas vezes precisamos saber qual o nome de classe de uma determinada janela. end.Free. Observações Cuidado! Isto pode irritar o usuário do seu programa. Observações O Form2 do exemplo é o Form de LogOn. Limitar a região de movimentação do mouse Inclua na seção uses: Windows { Coloque um botão no form e altera o evento OnClick dele conforme abaixo: } procedure TForm1. Form1). end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 213 de 272 Application. begin { Pega o retângulo da área cliente do form } R := GetClientRect.Button1Click(Sender: TObject). Mas e se não for.Initialize.BottomRight := ClientToScreen(R. digitar a senha. BotaoOcultar escreva: } procedure TForm1. Quando são janelas desenvolvidas por nós. finally F. como é o caso do Delphi? Por exemplo: Para verificar se o Delphi está sendo executado. ShowMessage('Tente mover o mouse para fora da área cliente do Form'). Application.BotaoOcultarClick(Sender: TObject). Application.gondraf@hotmail.Run.ulbrajp.TopLeft := ClientToScreen(R.com. etc. var R: TRect. Então o que fazer? Use o TBWinName.CreateForm(TForm1. { Libera a movimentação } ClipCursor(nil).TopLeft). procuramos no Windows pela janela cujo nome de classe seja TAppBuilder. você olha no código-fonte.BottomRight). end. { Converte as coordenadas do form em coordenadas da tela } R. No evento OnClick do . end. Mas como verificar então se o Internet Explorer está sendo executado? Precisaremos saber o nome de classe da janela deste programa.br/usuario/tecnobyte Ocultar/exibir a barra de tarefas do Windows Inclua na seção uses: Windows { Coloque no Form dois Botões: BotaoOcultar e BotaoExibir.

com. SW_SHOW).ulbrajp. nil).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 214 de 272 var Janela: HWND. mas isto é fácil se você usar o TBWinName. begin Janela := FindWindow('Shell_TrayWnd'. Modifique o evento OnTimer do Timer conforme abaixo: } procedure TForm1.AppMsg(var Msg: TMsg. var Handled: Boolean). Evitar a proteção de tela durante seu programa Inclua na seção uses: Windows { Na seção "private" do Form principal acrescente: } procedure AppMsg(var Msg: TMsg. end. . { Execute e teste. true). Pegue-o no link download de www. nil).br/usuario/tecnobyte O resto é usar as APIs do Windows para manipulação de Janelas. var Janela: HWND. end. Define a propriedade Interval do Timer para 1000 (1segundo).gondraf@hotmail. clicando em ambos os botões } Observações A tarefa mais difícil é descobrir o nome de classe da janela da barra de tarefa do Windows. FlashWindow(Application. SW_HIDE).wParam = sc_ScreenSave) then Handled := true. end.OnMessage := AppMsg.Message = wm_SysCommand) and (Msg. end. if Janela > 0 then ShowWindow(Janela.Timer1Timer(Sender: TObject).BotaoExibirClick(Sender: TObject). { Na seção "implementation" acrescente (troque TForm1 para o nome do seu form principal): } procedure TForm1.Handle. if Janela > 0 then ShowWindow(Janela. true). var Handled: Boolean). { No evento "OnCreate" do form principal. begin Janela := FindWindow('Shell_TrayWnd'. Veja a pergunta nº 18. begin FlashWindow(Handle. Fazer a barra de título ficar intermitente (piscante) Inclua na seção uses: Windows { Coloque um TTimer no Form desejado. { No evento OnClick do BotaoExibir escreva: } procedure TForm1. coloque: } Application. begin if (Msg.

coloque no Form um botão e troque o name dele para btnOK e modifique o evento OnShow do Form conforme abaixo: } procedure TForm1. Verde. IrPara. SetCursorPos(IrPara. MinhaCor := TColor(RGB(Vermelho. Pode ser até mesmo o próprio Form.ttf')).)). } procedure MouseParaControle(Controle: TControl).Left + (Controle. var Vermelho. FOT.FormShow(Sender: TObject).Color := MinhaCor. Observações A função "MouseParaControle" recebe um parâmetro do tipo TControl. Verde. TButton. MinhaCor: TColor. end. Azul)). end. .X := Controle. Observações A quantidade de cada cor primária é um número de 0 a 255.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 215 de 272 Posicionar o cursor do mouse em um controle Inclua na seção uses: Windows { Digite a procedure abaixo imediatamente após a palavra implementation no código do seu formulário.Y).Width div 2). begin IrPara. Observe que a cor retornada pela função RGB() está no formato do Windows (ColorRef).gondraf@hotmail. TTF. é por isto que fiz a conversão TColor(RGB(. Arquivos de fonte possuem uma das seguintes extensões: FON.ClientToScreen(IrPara). begin Vermelho := 0. tais como: TEdit. Azul := 150. Criar cores personalizadas (sistema RGB) { Coloque um TButton no form e escreva o evento OnClick deste como abaixo: } procedure TForm1. var IrPara: TPoint. FNT.. Form1.Y := Controle.Top + (Controle. if Controle. Verde := 200. Observações Troque o nome do arquivo do exemplo anterior pelo nome desejado. Veja também a pergunta nº 10. IrPara. etc.Parent. end. Azul: byte.X.Button1Click(Sender: TObject). TPanel. TSpeedButton.Height div 2). begin MouseParaControle(btnOk). Isto significa que você poderá passar para ela qualquer controle do Delphi. { Para testar. Adicionar uma nova fonte no Windows { Coloque o código abaixo no OnClick de um botão } AddFontResource(PChar('c:\MyFonts\Monospac..Parent <> nil then IrPara := Controle.

with DataHora do begin wYear := Ano. Observações Isto pode ser útil quando queremos usar fonte da impressora quando for uma matricial ou fonte do Windows quando for uma Jato de Tinta ou Laser. Dia). var DataHora: TSystemTime. S.') else ShowMessage('A impressora NÃO possui a fonte. Hora := StrToTime(Edit2. end.') else ShowMessage('A fonte não está instalada.Fonts do if IndexOf('Courier New') >= 0 then ShowMessage('A fonte está instalada. Observações Veja também a pergunta nº 11. begin Data := StrToDate(Edit1.Button1Click(Sender: TObject). no DBGrid e no StringGrid { Mude a propriedade "KeyPreview" do Form para true. DecodeDate(Data. wMonth := Mes. wDay := Dia. Mil: word. Observações No Edit1 digite a nova data e no Edit2 digite a nova hora. H. end. Hora: TDateTime. Ano. ENTER em vez de TAB no formulário.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 216 de 272 Saber se a impressora atual possui determinada fonte Inclua na seção uses: Printers { Coloque este código no OnClick de um botão } with Printer.'). Dia. Saber se determinada Font está instalada no Windows { Coloque este código no OnClick de um botão } with Screen. S.Fonts do if IndexOf('Draft 10cpi') >= 0 then ShowMessage('A impressora possui a fonte. Mil). Veja também a pergunta nº 10. wMinute := M. wMilliseconds := Mil. Mes. H. SetLocalTime(DataHora).Text). DecodeTime(Hora. } .Text). Ano. Acertar a data e hora do sistema através do programa { Coloque dois TEdit no form. Mes.'). Data. Coloque um TButton no form e altere o evento OnClick deste botão como abaixo:} procedure TForm1.gondraf@hotmail. M. wSecond := S. wHour := H. M.

escreva o evento OnKeyPress como abaixo: } procedure TForm1. DBEdit.Perform(WM_KEYDOWN. } if Key = '. var Handled: Boolean).' then Key = DecimalSeparator. end. { Na seção "implementation" acrescente (troque TForm1 para o nome do seu form principal): } procedure TForm1.Message = WM_KEYDOWN then if Msg.OnMessage := AppMsg.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 217 de 272 { No evento "OnKeyPress" do Form acrescente o código abaixo: } procedure TForm1. end. begin if Key = #13 then DBGrid1. 0).gondraf@hotmail. begin if Key = #13 then begin Key := #0. begin if Msg. begin if Key = #13 then StringGrid1. este será convertido para vírgula. escreva o evento OnKeyPress como abaixo: } procedure TForm1. coloque: } Application. 1. var Key: Char). var Key: Char). end. { Uma segunda alternativa (José Geraldo .AppMsg(var Msg: TMsg. Perform(WM_NEXTDLGCTL.FormKeyPress(Sender: TObject. Simular a vírgula através do ponto do teclado numérico { Na seção "private" do Form principal acrescente: } procedure AppMsg(var Msg: TMsg. { No evento "OnCreate" do form principal. Paralizar um programa durante n segundos Inclua na seção uses: Windows . { Em StringGrid. end. em vez de ajudá-lo. Neste caso a conversão funcionará apenas neste componente (óbvio). Observações Na primeira alternativa. VK_TAB.wParam := 188. Se não tomar cuidado poderá confundir o usuário. 0).StringGrid1KeyPress(Sender: TObject. 0). independentemente do controle que estiver em foco. Observações É bom lembrar que a tecla ENTER no Windows tem seu papel já bem definido quando se trata de caixa de diálogo: executar a ação padrão.wParam = 110 then Msg. Já na segunda. end. normalmente o botão OK. VK_TAB. var Handled: Boolean). { Em DBGrid.Perform(WM_KEYDOWN. sempre que for pressionado o ponto do teclado numérico (da direita do teclado). o ponto pode ser de qualquer lugar do teclado. etc).ES): Coloque o código abaixo no evento OnKeyPress do componente onde se quer a conversão (Edit.DBGrid1KeyPress(Sender: TObject. var Key: Char).

true). DBF) através do seu programa Inclua na seção uses: dbTables. { Pausa por 10 segundos } Sleep(10000). { etc. end. Tabela.Exists then { Se a tabela já existe.DatabaseName := 'NomeAlias'. ftBoolean. 0. Criar uma tabela (DB. Tabela. 0.Create(Application). 'Nome'. 0.DatabaseName := 'C:\'. Tabela.FieldDefs. ftString. etc. 30.CreateTable. como acontecia com InKey() do Clipper. try Tabela.TableName := 'Clientes. var Tabela: TTable. [ixCaseInsensitive]).FieldDefs.gondraf@hotmail. 0.AddIndex('INome'. 'Codigo'. } Exit.Free. { ou Tabela.Add('Ativo'. Observações Para verificar se o arquivo já existe na versão 3 ou anterior do Delphi. end. etc } finally Tabela. false). [ixPrimary. } Tabela. etc. DB procedure CriaTabelaClientes. false). etc } Tabela. ftInteger. Verificar se um diretório existe Inclua na seção uses: FileCtrl.FieldDefs.FieldDefs. begin Tabela := TTable.Add('RendaMes'..TableType := ttParadox. Observações Esta pausa não é interrompida pelo pressionamento de alguma tecla.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 218 de 272 { Pausa por 1 segundo } Sleep(1000).Add('Codigo'. { ou ttDBase } { Somente Delphi4 } if Tabela. true).Add('DataNasc'. Tabela.. true).FieldDefs.DB'. você deverá usar a função "FileExists" do Delphi. { Cria os Índices } Tabela. Tabela. { etc. ftCurrency. ixUnique]). Dialogs if DirectoryExists('C:\MEUSDOCS') then ShowMessage('O diretório existe') else . Tabela.Add('Nome'.AddIndex('ICodigo'. ftDate. {***} { Cria a tabela } Tabela.

AddStandardAlias('MeuAlias'. 'PARADOX').IsAlias('MeuAlias') then begin { Adiciona o alias } Session. end. Messages.EXE. Criar um Alias através do seu programa Inclua na seção uses: DB { se o alias não existir. interface uses Windows.AddStandardAlias('MeuAlias'. SysUtils. } if not Session. . Dialogs if FileExists('c:\carta. type TForm1 = class(TForm) PopupMenu1: TPopupMenu. close1: TMenuItem. 'C:\DirProg'.doc') then ShowMessage('O arquivo existe') else ShowMessage('O arquivo não existe').gondraf@hotmail... { Adicionar o Alias } Session. Forms. 'PARADOX').SaveConfigFile. System. procedure FormCreate(Sender: TObject). Controls.ShellAPI. procedure Lloyd1Click(Sender: TObject).ConfigMode := cmSession. Neste último caso será necessário incluir na seção uses: SysUtils. Classes. Observações Para criar um alias do dBase troque a string 'PARADOX' por 'DBASE'. Graphics. const wm_IconMessage = wm_User. { Salva o arquivo de configuração do BDE } Session. procedure FormDestroy(Sender: TObject). Dialogs .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 219 de 272 ShowMessage('O diretório não existe'). mas se você quiser poderá trocar este caminho por ExtractFilePath(ParamStr(0)) para que o alias seja direcionado para o local onde está seu . procedure close1Click(Sender: TObject). Menus. Verificar se um arquivo existe Inclua na seção uses: SysUtils. 'C:\DirProg'. Lloyd1: TMenuItem. No caso acima usei como path o caminho "C:\DirProg". Icone na Barra de Tarefas unit Unit1. Criar um Alias temporário através do seu programa Inclua na seção uses: DB { Enxergar somente configurações da sessão atual } Session.

end. var Form1: TForm1.Handle. Shell_NotifyIcon (NIM_DELETE. procedure TForm1.Popup (Pt. procedure TForm1.FormDestroy(Sender: TObject). begin Showmessage('LloydSoft é D+'). nid. 'MAINICON').x.FormCreate(Sender: TObject). end. implementation {$R *. { Private declarations } public { Public declarations } nid: TNotifyIconData.uID := 1. begin nid. begin // carrega o ícone inicial Icon. @nid).IconTray (var Msg: TMessage).Handle := LoadIcon (HInstance. end. var Pt: TPoint.szTip := 'LloydSoft'.y). {Menu Popup} end. procedure TForm1.gondraf@hotmail.close. // preenche os dados da estrutura NotifyIcon nid. PopupMenu1. Shell_NotifyIcon (NIM_ADD. // SetForegroundWindow (Handle).close1Click(Sender: TObject). nid. begin if Msg. end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 220 de 272 private procedure IconTray (var Msg: TMessage).lParam = wm_rbuttondown then begin GetCursorPos (Pt).cbSize := sizeof (nid). end. Pt. @nid). nid.wnd := Handle. nid. . // Identificador do ícone nid. message wm_IconMessage. nid. begin form1.uCallBAckMessage := wm_IconMessage. procedure TForm1. end.Lloyd1Click(Sender: TObject).DFM} procedure TForm1.hIcon := Icon.uFlags := 0.uFlags := nif_Message or nif_Icon or nif_Tip.

Lloyd1: TMenuItem.DFM} procedure TForm1. procedure FormDestroy(Sender: TObject). Shell_NotifyIcon (NIM_ADD. Menus. 'MAINICON').wnd := Handle. procedure TForm1. procedure FormCreate(Sender: TObject). nid. const wm_IconMessage = wm_User. interface uses Windows. private procedure IconTray (var Msg: TMessage). Dialogs .FormCreate(Sender: TObject).szTip := 'LloydSoft'. Graphics. var .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 221 de 272 end. end. type TForm1 = class(TForm) PopupMenu1: TPopupMenu. begin // carrega o ícone inicial Icon. end.IconTray (var Msg: TMessage). nid. close1: TMenuItem. nid. @nid). nid.Handle.cbSize := sizeof (nid).Handle := LoadIcon (HInstance.hIcon := Icon. // Identificador do ícone nid. SysUtils. procedure close1Click(Sender: TObject). var Form1: TForm1. Messages. // preenche os dados da estrutura NotifyIcon nid. nid.uFlags := nif_Message or nif_Icon or nif_Tip. { Private declarations } public { Public declarations } nid: TNotifyIconData. implementation {$R *.uCallBAckMessage := wm_IconMessage. Classes. Controls.ShellAPI. message wm_IconMessage. procedure Lloyd1Click(Sender: TObject). Icone na Barra de Tarefas unit Unit1.gondraf@hotmail. Forms.uID := 1.

ExecFile(F: String). else Exit. SE_ERR_DLLNOTFOUND: r := 'Windows 95 only: The specified dynamic-link library was not found. end.y).'. end.close1Click(Sender: TObject). nil. ShowMessage(r). ERROR_BAD_FORMAT: r := 'The . SE_ERR_NOASSOC: r := 'There is no application associated with the given filename extension. SE_ERR_ASSOCINCOMPLETE: r := 'The filename association is incomplete or invalid. nil.close. SE_ERR_DDETIMEOUT: r := 'The DDE transaction could not be completed because the request timed out. end. begin form1.'.'. . procedure TForm1. {Menu Popup} end. var r: String.'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 222 de 272 Pt: TPoint.'.'. end. ERROR_PATH_NOT_FOUND: r := 'The specified path was not found. begin Showmessage('LloydSoft é D+'). SE_ERR_OOM: r := 'Windows 95 only: There was not enough memory to complete the operation. SW_SHOWNORMAL) of ERROR_FILE_NOT_FOUND: r := 'The specified file was not found. SE_ERR_SHARE: r := 'A sharing violation occurred.'. procedure TForm1.'.Lloyd1Click(Sender: TObject). PopupMenu1. PChar(F). SE_ERR_DDEBUSY: r := 'The DDE transaction could not be completed because other DDE transactions were being processed. end. Pt. SE_ERR_ACCESSDENIED: r := 'Windows 95 only: The operating system denied access to the specified file.EXE or error in . end.'. begin nid. nil. Abrir arquivos com aplicativo associado Inclua a unit SHELLAPI na clausula uses do seu form.'.Popup (Pt. SE_ERR_DDEFAIL: r := 'The DDE transaction failed. begin case ShellExecute(Handle.EXE file is invalid (non-Win32 .FormDestroy(Sender: TObject). procedure TForm1.EXE image). Shell_NotifyIcon (NIM_DELETE. // SetForegroundWindow (Handle). end. begin if Msg.'.'.lParam = wm_rbuttondown then begin GetCursorPos (Pt).x.uFlags := 0.gondraf@hotmail. @nid). procedure TForm1.

Apagar um subdiretório Inclua a unit SHELLAPI na clausula uses do seu form. FillChar( ToBuffer. pTo:= @ToBuffer. With OpStruc Do Begin Wnd:= hHandle.Button1Click(Sender: TObject).Button1Click(Sender: TObject). end. //lpszProgressTitle:=nil. if S[Length(Temp)] <> '\' then Temp := Temp + '\'. Result := Temp.bmp')) then Showmessage('Arquivo inexistente'). Utilize a função assim: procedure TForm1.. begin ExecFile('c:\windows\ladrilhos. end. 0 ). var OpStruc: TSHFileOpStruct. FromBuffer. Sizeof(OpStruc).Handle. begin DeleteDir( Self. begin fillChar( OpStruc. procedure DeleteDir( hHandle : THandle. end. Sizeof(ToBuffer). ShFileOperation(OpStruc).bmp'). end. StrPCopy( FromBuffer.'C:\TESTE'). FillChar( FromBuffer. 0 ). ToBuffer: Array[0. pFrom:= @FromBuffer. . Const sPath : String ). fFlags:= FOF_NOCONFIRMATION. begin Temp := S. var Temp: string. fAnyOperationsAborted:=False. hNameMappings:=nil. wFunc:=FO_DELETE. Sizeof(FromBuffer).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 223 de 272 Utilize a função assim: procedure TForm1. Como verificar se um arquivo existe? If not(fileexists('c:\windows\nuvens. End. sPath). Adiciona a barra invertida a um texto selecionado function AddBarra(S: string): string. 0 ).128] of Char.gondraf@hotmail.

reset(f1). f2 : system.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 224 de 272 Compara dois arquivos textos procedure TForm1. var i : integer. 'line: '+ inttostr(l) + '-' + buf2). assignfile(diff.textfile. filename2 : string). filename2).textfile. end. closefile(f1). var f1 : system. while not eof(f1) do begin readln(f1. btemp : boolean. buf2) )then begin writeln(diff.gondraf@hotmail.txt'). buf2). filename2 : string. writeln(diff.Button1Click(Sender: TObject). buf1). if not (compstr(buf1. filename2 := Edit2. end. writeln(diff. if (length(s1) <> length(s2)) then begin btemp := false. rewrite(diff). l : integer. end. readln(f2. var filename1 : string. ' ').compstr(s1. function tform1. filename1). inc(l). assignfile(f2. begin btemp := true. begin assignfile(f1. closefile(diff). showmessage('Veja o resultado no arquivo c:Tempdiff.compfile(filename1. 'c:Tempdiff. . reset(f2). l := 1.Text. begin filename1 := Edit1. end{if} else begin for i:= 1 to length(s1) do begin if (s1[i] <> s2[i]) then begin btemp := false.textfile. 'line: '+ inttostr(l) + '-' + buf1). end. filename2). closefile(f2). buf1 : string. buf2 : string. procedure tform1.txt').Text. s2 : string) : boolean. compfile(filename1. diff : system.

end. // with ShFileOperation(OpStruc). // CopyDir Copiando Um Arquivo Com Um Gauge Muitas vezes. Sizeof(frombuf). coloque este código. fAnyOperationsAborted := False. StrPCopy(frombuf. // Agora vai montar o nome do arquivo de destino. // Nome do arquivo de destino da cópia wDia.wMes.Primeiro recupera de um AdoConnection // o nome do arquivo a ser copiado strArqOrigem := dm_spark. DecodeDate(Date.Properties[7]. wDia). begin FillChar(frombuf. StrPCopy(tobuf.gondraf@hotmail. . cFrom).ADO_Spark. FillChar(tobuf. fFlags := FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION. procedure Tfrm_Manut. hNameMappings := nil. wFunc := FO_COPY.{for} end. lpszProgressTitle := nil.{if} end.bt_backupClick(Sender: TObject).{else} result := btemp.Progress := 0.wAno: Word. mas poderia muito bem ser uma progressbar) e um botão para iniciar a cópia.128] of Char. Copiando arquivos de diretório para diretório procedure CopyDir(const cFrom. No nosso exemplo. o programa cria um diretório de back-up cujo nome do mesmo é a data da cópia no formato AAAAMMDD. ga_copia.Value. 0). Neste exemplo. end. strArqDestino := strArqDestino + FormatFloat('00'. Para tal. No código onClick do botão. // Monta os nomes de arquivo . // Nome do arquivo de origem da cópia strArqDestino: string. begin try // Aciona o indicativo de progresso da cópia ga_copia.. WAno). var OpStruc : TSHFileOpStruct. end. wMes). quando temos a necessidade de copiar um arquivo de um lugar para outro. wAno. tobuf : array[0. chamei o gauge de ga_copia. strArqDestino := 'C:\prodata\copia\' + FormatFloat('0000'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 225 de 272 exit. end. 0). with OpStruc do begin Wnd := Application.Visible := True. var strArqOrigem. pFrom := @frombuf. Sizeof(tobuf). wMes. coloque em sua aplicação um gauge (optei por um gauge. é interessante mostrar ao usuário o andamento da cópia. pTo := @tobuf. cTo : string). cTo).Handle. frombuf.

// Desconecta o banco de dados dm_spark. strArqDestino). vamos definir a procedure copyfile que é o motor da nossa cópia de arquivo.ToF: file of byte. Agora que já definimos como e quando a cópia será disparada. NewPath: string. 'Segurança'.ADO_Spark. AssignFile(ToF.Open. // Inicia a cópia CopyFile(strArqOrigem. Destination). Esta procedure é que vai fazer a cópia e incrementar o Gauge. NumRead: Integer. wDia).Visible := False.4096] of char. end. Buffer[0]. end else begin if FileExists(Destination) then begin if Application. // Copia o arquivo // Abre o arquivo de origem e cria o arquivo destino AssignFile(FromF. ReWrite(ToF). MB_YESNO + MB_ICONQUESTION) = MRNO then Exit.NumRead. Buffer: array[0. Repaint.MessageBox('O arquivo-destino da cópia de segurança já existe ' + #13#10 + 'Deseja sobrepôr o mesmo com a nova cópia ?'.Close. .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 226 de 272 strArqDestino := strArqDestino + FormatFloat('00'. while FileLength > 0 do begin BlockRead(FromF. SizeOf(Buffer). FileLength := FileSize(FromF). begin // Antes de copiar.gondraf@hotmail. if not DirectoryExists(NewPath) then begin CreateDir(NewPath).ADO_Spark. Destination: string). FileLength: LongInt. NumRead). FileLength := FileLength .CopyFile(Source. var FromF. with ga_copia do begin MinValue := 0. Reset(FromF). strArqDestino := strArqDestino + '\' + ExtractFileName(strArqOrigem). procedure Tfrm_Manut. Source). o mesmo vai ser criado NewPath := ExtractFilePath(Destination). end. end. end. verifica se já existe o diretório // Caso o diretório não exista. finally // Reconecta o banco de dados dm_spark. NumRead). BlockWrite(ToF. MaxValue := FileLength. Buffer[0]. ga_copia..

no local que você achar mais apropriado.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 227 de 272 AddProgress(NumRead). ShellExecuteEx(@S). With S do Begin cbSize := SizeOf(S). fMask := SEE_MASK_FLAG_NO_UI SEE_MASK_NOCLOSEPROCESS.O primeiro passo do procedimento é zerar todas a propriedades da Shell ( FillChar(S. Antes de se iniciar a leitura do arquivo. nome (lpFile) . lpFile := Pchar(Arq). Inicialmente para acessar um arquivo de texto.SizeOf(S). CloseFile(FromF). Var s:TShellExecuteInfo. CloseFile(ToF). Lendo e gravando arquivos de texto Existem vários métodos em Delphi para gravar arquivos texto a partir de informações gravadas em bases de dados ou para ler arquivos texto e armazená-los em bases de dados.0) ). end. da seguinte forma: var arq: TextFile. wnd := Handle. nShow := sw_ShowNormal. segundo passo é atualizar estas propriedades (With S do ) em relação ao arquivo indicado (Arq :String) e o terceiro passo é abrir a janela de propriedades com os valores atualizados (ShellExecuteEx(@S)). Vamos precisar também de uma variável tipo string para armazenar cada linha lida do arquivo: var linha: String. shell (lpVerb) e modo de apresentação da janela (nShow). Begin FillChar(S. você precisa definir uma variável tipo TextFile. atributos (fMask). Exibindo as propriedades do arquivo A dica abaixo apresenta o código de implementação para exibir na tela uma janela padrão Windows de propriedades do arquivo.As propriedades do arquivo são armazenadas numa estrutura chamada TShellExecuteInfo.gondraf@hotmail. precisamos associar a variavel TextFile com um arquivo fisicamente armazenado no disco: or SEE_MASK_INVOKEIDLIST or . end. end. End. Esta dica apresenta um destes métodos: o uso de TextFiles.SizeOf(S). Código Completo: Procedure Propriedades(Arq:String). Para implementar este procedimento é necessário acrescentar a unit ShellAPI. lpVerb := 'properties'. que corresponde a um registro com os campos: tamanho do arquivo (cbSize).0). TextFile é um tipo de dado pré-definido no Delphi e corresponde ao tipo Text do Turbo Pascal e do Object Pascal. End.

Rewrite ( arq ). end. Note nesta segunda rotina. tabela. var arq: TextFile. Write ( arq. AjustaStr ( tabela. tabela.BAT' ). Esta rotina recebe como parâmetro o nome do arquivo que será gravado e uma tabela (TTable) de onde os dados serão lidos: procedure gravaArquivoTexto ( nomeDoArquivo: String.Eof do begin Write ( arq. A rotina AssignFile faz a associação enquanto Reset abre efetivamente o arquivo para leitura. AssignFile corresponde à Assign do Turbo Pascal. linha: String. linha ). tabela: TTable ). nomeDoArquivo ). . Reset ( arq ). begin AssignFile ( arq. 30 ) ). Rewrite abre o arquivo para escrita. WriteLn ( arq ). E também uma rotina quase completa para gravação de um arquivo texto. use a função Copy. tabela. linha ).FieldByName ( 'Salario' ). Note também o uso de Write e WriteLn para gravar dados no arquivo texto. while not Eof ( arq ) do begin { Processe a linha lida aqui.First. end. ReadLn ( arq. linha: String. Reset ( arq ). 'C:\AUTOEXEC. Para verificar o fim do arquivo. linha ).AsString.00'. while not tabela. O comando acima lê apenas uma linha de cada vez. Esta rotina recebe como parâmetro o nome do arquivo que será lido: procedure percorreArquivoTexto ( nomeDoArquivo: String ). utilizaremos a função Eof: while not Eof ( arq ) do Agora uma rotina quase completa para fazer a leitura de um arquivo texto. CloseFile ( arq ).gondraf@hotmail. tam: Integer ): String. end. end. var arq: TextFile.Next. Em seguida é necessário fazer uma leitura ao arquivo. } ReadLn ( arq. a substituição de Reset por Rewrite logo após o AssignFile. destruindo tudo que houver lá anteriormente . nomeDoArquivo ).FieldByName ( 'Nome' ). } { Para particionar a linha lida em pedaços. FormatFloat ( '00000000. Finalmente note o uso de AjustaStr e FormatFloat para garantir que campos string e numericos sejam gravados com um número fixo de caracteres. begin AssignFile ( arq. FormatFloat é uma rotina do próprio Delphi enquanto AjustaStr está definida abaixo: function AjustaStr ( str: String. CloseFile ( arq ). para isto utilizaremos a procedure ReadLn: ReadLn ( arq.AsFloat ) ). assim precisamos de um loop para efetuar várias leituras até que o arquivo acabe.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 228 de 272 AssignFile ( arq.

f1)<>0) then break. fpath:string. begin result:=tstringlist. new(p1). end else if (findnext(f1)<>0) then begin repeat findclose(f1). 1. fpath:=extractfilepath(fname).prev:=nil. tmp:=p1. implememtation function TForm1.srchrec. f1:=p1. fpath:=p1. if Length ( str ) > tam then str := Copy ( str.f2:Tsearchrec. fpathname:string. fbroke2:=false.fpathname:=fpath. if (p1=nil) then break.faAnyfile. p1.fpathname.gondraf@hotmail. O uso da função AjustaStr é fundamental quando você estiver gravando arquivos texto com registros de tamanho fixo a partir de bases de dados Paradox que usualmente não preenchem campos string com espaços no final.RecurseDirectory(fname:string):tstringlist. end. tam ). fbroke1. fwc:string.create. end. fwc:=extractfilename(fname). p1. p1.tmp:PRecInfo. var f1.fbroke2:boolean. Result := str. while(p1<>nil) do begin if (fbroke1=false) then if (fbroke2=false) then begin if (findfirst(fpath+'*'. Procurando um arquivo em todo o HD interface type PRecInfo=^TRecInfo.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 229 de 272 begin while Length ( str ) < tam do str := str + ' '. srchrec:Tsearchrec.prev. . Trecinfo=record prev:PRecInfo. fbroke1:=false.

Name).time. fpath:=p1. if (p1=nil) then break.excludeattr. srchrec. srchrec.gondraf@hotmail.size.Name:=f1. while(findnext(f1)=0) do result. end. fbroke2:=true. end else begin if (findnext(f1)<>0) then begin findclose(f1). srchrec.faAnyfile.name.fpathname+f1.name+'\'. srchrec. srchrec.prev. fbroke2:=false.name<>'.findhandle.FindData:=f1.Attr:=f1. fbroke1:=false.') and (f1. while(findnext(f2)=0) do result. findclose(f2). with tmp^ do begin fpathname:=fpath.Name<>'.add(fpath+f2. until (findnext(f1)=0). end. f1:=p1.FindHandle:=f1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 230 de 272 dispose(p1).prev:=p1.srchrec.f1)=0 then begin result.add(fpath+f2.faAnyfile. p1:=tmp. if findfirst(fpath+fwc. p1:=tmp. end else begin fbroke1:=true.add(fpath+f2.FindData. srchrec. end.Name). if((f1.f2)=0 then begin result. end.Size:=f1.Time:=f1.Attr and fadirectory)=fadirectory)) then begin fbroke1:=false. srchrec. dispose(p1). fpath:=extractfilepath(fname).ExcludeAttr:=f1.attr. fbroke2:=false.Name).add(fpath+f2.Name). if findfirst(fname. tmp:=p1.') and ((f1.. p1:=tmp. . end. new(tmp). end.fpathname. fpath:=p1. tmp.

items.Selecione os protocolos desejados para comunicação com o banco.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 231 de 272 findclose(f1).Ao executar o instalador do cliente Oracle para Windows 95. 4 . resolvemos publicar em detalhes todos passos necessários para se conectar a um banco Oracle a partir do Delphi de modo nativo (usando BDE) e através do ODBC.items.1.0. Apesar de poder instalar todos.exe').Após completar 100% da instalação.0 até a 4. tendo o English como padrão.3. Portanto.assign(l1).Entre com o nome da empresa e o diretório onde serão armazenados os arquivos do cliente Oracle.Button1Click(Sender: TObject). end. Escolha a opção "Selective Products Install". Normalmente isto é feito a partir do CD de instalação do Oracle executando o programa d:\win95\install\setup.create.endUpdate. você deverá de inicio informar o idioma (o mesmo que foi informado durante a instalação do próprio banco).0. 5 . listbox1. desinstale todos os clientes Oracle e instale somente o cliente Oracle 32 bits.gondraf@hotmail.Items. end. ou poderá deixar selecionado a sugestão do instalador e prosseguir. begin l1:=tstringlist. Acessando o banco de dados Oracle a partir do Delphi Em vista de muitos hoje possuírem sistemas rodando com banco de dados Oracle. 7 . listbox1.Será solicitado o tipo da instalação.BeginUpdate. Naturalmente tais informações serão de grande ajuda para configuração em outras versões. listbox1. Passos: 1 .Caso tenha instalado em sua máquina algum cliente do Oracle 16 bits. você visualizará os componentes instalados: Oracle Installer Oracle Named Pipes Adapter (protocolo de acordo com sua rede) .Items. 3 .exe 2 .2. serão apenas necessários para a conexão com o banco Oracle a partir do Delphi os seguintes componentes: Sql *Net Client (para criação do alias no cliente Oracle) Oracle Installer (para instalar/remover componentes) 6 . e o Oracle7 Workgroup Server Release 7. //Chame a funcao deste jeito: procedure TForm1. BDE versões 4. poderá ter algum tipo de conflito com drives de 32 bits. var l1:Tstringlist. Utilizamos com bons resultados as versões do Delphi 2.5 e 5. Temos observado também que dúvidas sobre este assunto estão sempre presentes nas listas de discussão sobre Delphi e sobre Oracle.Será apresentada uma lista dos produtos ou componentes disponíveis. listbox1. l1:=recursedirectory1('C:\*.clear. freeandnil(l1). end.

Informe na sequência: Database Alias (nome na sua máquina que representará o acesso ao banco) Escolha o Protocolo (normalmente TCP/IP) TCP/IP Host Name (informe o numero IP do servidor Oracle) Database Instance (nome da instância do banco.Clique em "yes" e saia do Sql Net Easy Configuration 13 .0 TYPE SERVER DLL32 SQLORA32.DLL DRIVER FLAG (DEIXAR VAZIO) TRACE MODE 0 BATCH COUNT 200 BLOB SIZE 32 BLOBS TO CACHE 64 ENABLE BCD FALSE ENABLE INTEGERS FALSE ENABLE SCHEMA CACHE FALSE LANGDRIVER (DEIXAR VAZIO) LIST SYNONYMS NONE MAX ROWS .Selecione "Add Database Alias".gondraf@hotmail. e clique OK 11 . e clique na guia Configuration -> Drivers ->Native e selecione ORACLE. Não será necessário reiniciar a máquina por enquanto. Como sugestão use as seguintes configurações: VERSION 4.DLL VENDOR INIT ORA73.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 232 de 272 Oracle SPX Adapter (protocolo de acordo com sua rede) Oracle TCP/IP Adapter (protocolo de acordo com sua rede) Required Support Files Sql *Net Client 8 . 9 .Saia do instalador.Chame o BDE Administrator.Clique no botão iniciar -> programas -> Oracle for windows 95 -> Sql Net Easy Configuration 10 . consulte o DBA) 12 .

. cfgPersistent. Escolha a opção ORACLE. // não esqueça de incluir esta unit // ChangeNetDir procedure ChangeNetDir(Drive: Char). 16 . Config: CFGDesc. Abaixo está uma rotina para alterar o NetDir de acordo com o drive informado como parâmetro: uses BDE. if DbiOpenCfgInfoList(nil. Agora altere do lado esquerdo na guia Definition. e coloque o nome do Database Alias que você criou no Sql Net Easy Configuration.Ok. OPCIONAL) 14 . clique com o botão direito do mouse sobre o item da lista ´Databases´ e selecione a opção ´New´. que pode ser qualquer um que não exista. begin if DbiInit(nil) = DBIERR_NONE then begin hCur := nil.Clique no item de menu Object -> Apply 17 .Reinicialize seu computador. dbiREADWRITE. no item SERVER NAME. Cont: Boolean. DEFAULT: ORCL) SQLPASSTHRU MODE SHARED AUTOCOMMIT SQLQRYMODE SERVER USER NAME (NOME DE USUARIO. E com poucas linhas de código você poderá deixar para que sua própria aplicação faça isso. agora basta abrir o Delphi e utilizar este Alias como qualquer outro! Alterando o NetDir via programação: Muitas vezes precisamos alterar o NetDir do BDE para que nossas aplicações funcionem corretamente. Entre com o nome do Alias. var hCur: hDBICur.Agora precisamos apenas criar um Alias que será enxergado no Delphi.gondraf@hotmail. clique na guia Database. 18 .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 233 de 272 –1 NET PROTOCOL TNS OBJECT MODE TRUE OPEN MODE READ/WRITE ROWSET SIZE 20 SCHEMA CACHE DIR (DEIXAR VAZIO) SCHEMA CACHE SIZE 8 SCHEMA CACHE TIME –1 SERVER NAME (COLOQUE O NOME DA INSTANCIA DO BANCO.Clique no item de menu Object -> Apply 15 . Para isso.

end. Dessa forma.gondraf@hotmail. 'NET DIR') = 0 then begin StrPCopy(Config. @Config. as possibilidades vão muito além do que o simples armazenamento de imagens. filmes ou qualquer tipo de arquivo. Código Completo: Procedure ApagarTodosReg(Origem:TDataSet). No Paradox. é possível criar registros com informações mais ricas sobre um determinado assunto. usando o "obscuro" campo BLOB . Drive + ':\'). @Config.szValue. DbiModifyRecord(hCur. existe um tipo de campo destinado especialmente para esse fim. dbiWRITELOCK. Cont := False end. Através de um comando de repetição (While) é possível excluir todos os registros da tabela. O uso deste procedimento pode ser assim: procedure TForm1. Armazanando sons. Como Usar: ApagarTodosReg(Table1).Button1Click(Sender: TObject). por exemplo. DbiExit().com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 234 de 272 '\DRIVERS\PARADOX\INIT'. end. end. True). vídeos em bancos de dados Um dos recursos mais interessantes nos bancos de dados atuais é a possibilidade de armazenar recursos multimídia juntamente com outras informações. End. end. usando como flag a quantidade de registros existentes na tabela (RecordCount > 0). Begin With Origem do While RecordCount > 0 do Delete. Por exemplo. pode-se armazenar informações sobre um funcionário juntamente com a sua própria foto.szNodeName. end. hCur) = DBIERR_NONE then begin if DbiSetToBegin(hCur) = DBIERR_NONE then begin Cont := True. end. begin ChangeNetDir('H'). No entanto. É possível armazenar sons. while Cont do begin if (DbiGetNextRecord(hCur. Apagando todos os registros da tabela Para apagar os registros de uma tabela utiliza-se a função delete. ou ApagarTodosReg(Query1). nil) <> DBIERR_NONE) then Cont := False else if StrIComp(Config.

e depois manipulá-lo normalmente.SaveToFile('MyWaveCopy. o conteúdo do arquivo não é armazenado no registro em si. Fácil. apresentações. diferentemente dos campos comuns.wav que será armazenado no campo "SOM" da tabela "MyTable". basta fazer assim: TBlobField(MyTable. Backup & Restauração Para efetuar a cópia: procedure TFormCopia.FieldByName('SOM')).LoadFromFile('MeuWave. No caso de um conteúdo em formato wave. Mas tenha em mente que o armazenamento de arquivos de som ou outros tipos vai aumentar consideravelmente o tamanho do seu banco de dados. Obs: Para armazenar imagens ou texto em formato RichText (RTF). Para saber quanto um campo BLOB está ocupando num registro do seu arquivo. em bytes.BitBtn1Click(Sender: TObject).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 235 de 272 (Binary Large Object). o que a sua imaginação mandar. você usou o recurso de typecasting para manipular o campo como sendo um objeto TBlobField.gondraf@hotmail. Usando os mesmos métodos. descendente do TField.FieldByName('SOM')). Neste exemplo. você também pode armazenar e manipular filmes AVI.BlobSize.60wav'). var I: Integer. por exemplo. que disponibiliza recursos especiais para esse fim. não deve ser feita diretamente. O Delphi também possui objetos para a manipulação desses campos: TGraphicField e TMemoField.wav". ambos descendentes do TBlobField.wav. A manipulação de campos BLOB. Na verdade.Clear. use a propriedade BlobSize: TBlobField(MyTable. Para saber se o campo SOM possui algum conteúdo. mas num arquivo separado que é manipulado internamente pelo banco de dados. carregando o arquivo através do método LoadFromFile que existe nesse objeto. que são destinados a esses tipos de dados.FieldByName('SOM')). mas sim por meio do objeto TBlobField. enfim. use a propriedade IsNull: with MyTable do if not TBlobField(FieldByName('SOM')). e então reproduzí-lo através do TMediaPlayer ou pela função SndPlaySound. use os tipos GRAPHIC e FORMATED MEMO do Paradox. begin . não é? Se você quiser salvar o conteúdo do campo "SOM" no arquivo "MyWaveCopy. você também deve usar um método apropriado: TBlobField(MyTable. Para isso. basta gerar o arquivo novamente em disco e descompactá-lo. que permite que qualquer arquivo seja "embutido" no banco de dados.SaveToFile('MyWaveCopy. A maneira mais simples de utilizar o conteúdo de um campo BLOB já armazenado é primeiro gravá-lo novamente em um arquivo em disco. Trabalhar com esse tipo de campo no Delphi é muito simples.wav'). você deve sempre se referir ao campo BLOB no código como sendo um TBlobField. por isso esse recurso deve ser utilizado com cuidado. você deve primeiro graválo num arquivo . utilizando typecasting.wav'). Para carregar o conteúdo do arquivo no campo SOM. Para remover o conteúdo do campo "SOM" (limpá-lo). basta fazer assim: TBlobField(MyTable. Uma boa medida para reduzir esse problema é compactar o arquivo antes de armazená-lo. Para utilizá-lo depois.FieldByName('SOM')). documentos. mas não tão óbvio à primeira vista. usando o método SaveToFile.IsNull then TBlobField(FieldByName('SOM')). Vamos supor que você tenha um arquivo de som MyWave.

Connected:=True.gondraf@hotmail.DatabaseName:=DirectoryListBox1.'*.True. // Origem da restauração with Session1 do begin Active:=True.TableName:=Memo1.1 do begin Table1. // Tabela destino BatchMove1.*'. e digite a senha desejada. Veja bem. begin Database1.Lines[I].Lines[I]. // Tabela origem Table2. na propriedade strings. . for I:= 0 to Memo1. pode fechar salvando o novo alias. Após isso clique duas vezes no componente tdatabase. tabelas no Acess Primeiro crie um alias apontando para o diretorio onde está o arquivo mdb do access. Caso contrário verifique se o diretório está correto e se o arquivo mdb existe neste diretório. basta clicar em ok que ele se conectará e caso tenha uma password digite-a. Depois disso na propriedade database.True. se quiser uma senha para acesso ao banco. // Tabela destino BatchMove1.Directory.Lines. este apontamento deve ser testado clicando no botão connectt.Directory.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 236 de 272 Database1.Memo1. end.Lines).Lines). vá na query. // Database para controle Table2. GetTableNames(Table2.DatabaseName. após clicar.Memo1. end. coloque a instrução SELECT acessando a tabela que está dentro do arquivo MDB.*'. se não quiser senha deixe em branco. Uma vez conectado.Lines[I]. se você fez tudo correto.TableName:=Memo1. informe o nome que deseja dar ao database em name. clique na seta e escolha o alias criado anteriormente. Para efetuar a restauração: procedure TFormRestaura.Execute. // Tabela origem Table2. agora vá em propriedades do tdatabase e clique em conectt. procure a palavra PASSWORD dentro da janela que foi preenchida com comandos quando você clicou em defaults.DatabaseName:=DirectoryListBox1. Bem. o nome dele tem que estar na lista.Count . vá no delphi. Bem.Connected:=True.TableName:=Memo1.Count . depois clique em defaults.BitBtn1Click(Sender: TObject). Bom. se não colocou password. // Retorna o nome das tabelas end. agora active a query. escolha o nome que deu ao seu database. Após fazer isto.1 do begin Table1. em alias name.TableName:=Memo1. clique em OK. Após restaurar por este método.Lines. for I:= 0 to Memo1. aparecerá um formulário. após isso. end. um datasource e um dbgrid. var I: Integer. coloque um componente tdatabase. GetTableNames('AliasName'. uma query.Execute. Table2.'*. ele vai pedir um usuário e uma senha. // Retorna nomes das tabelas end.True. você deve recriar os índices.True. Se funcionar. end.Lines[I]. // Seleciona local de destino da cópia with Session1 do begin Active:=True. não é para colocar o arquivo mdb mas sim uma ou mais das tabelas que estão dentro do MDB. Como acessar pelo Delphi. abra um projeto novo.

Dll). bem no meio tem table type com duas opções: PARADOX E DBASE. clique no botão Query que está em cima há direita. if Reg. se der algum erro é porque não existe o caminho ou o arquivo mdb informado no campo database. . para testar e ver se está correto clique no botão conectt. finally Reg. veja bem é ACCESS e não microsoft access drive. Se fez tudo correto e se a tabela tiver dados. end. indique o diretorio onde se encontra o banco do access exemplo: c:\discoteca\dados\discoteca. VAMOS CONVERTER APENAS UMA. com o nome que você deu com extensão db. informe o drive desejado como ACCESS. abra uma nova qbe e procure o diretorio onde está o dbf. digite o diretório e o nome do arquivo que quer que receba a tabela do access convertida.RootKey := HKEY_LOCAL_MACHINE. quando fizer isso ela já estará convertida. BDE\Drivers\Native\MSACCESS\Dll32 var Reg : TRegistry. E QUE SE QUISESSEMOS CONVERTER OUTRAS O PROCEDIMENTO SERIA EXATAMENTE O MESMO. uma vez que digitou a instrução. você os verá no dbgrid. // Mudando a DLL de acesso ao ACCESS Como converter DBF para Paradox e Acess para Paradox A) ACCESS PARA PARADOX DIGAMOS QUE VOCÊ TENHA UM BANCO DE DADOS EM ACCESS CHAMADO DISCOTECA.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 237 de 272 Após isso vá no datasource e conecte-o á query.gondraf@hotmail. Como alterar o driver de acesso do access no bde automaticamente procedure ChangeAccessDLL32(Dll : String). depois vá onde está table name bem no meio da tela. Reg. pronto. B) DBF PARA PARADOX Abrir o database desktop.DLL').mdb. depois no campo database que se abriu bem abaixo.Free. Ou seja você tem uma tabela paradox com os dados que estavam em autores dentro do banco do access. True) then Reg.MDB E QUE NELE TENHA VÁRIAS TABELAS. na janela que se abre digite select * from autores. Abra o database desktop e crie um alias chamado DISCO. clique em new e depois em sql file. feche o alias e vá em file no menu da database desktop.WriteString('DLL32'.CloseKey. e depois vá no dbgrid e sete o datasource para o datasource criado. bom depois de clicar se abrirá uma tela. // Altera a Propriedade do -------> Use de preferência no OnCreate do Form ou DataModule da seguinte forma: ChangeACCESSDll32('IDDA3532. QUE NO NOSSO EXEMPLO SE CHAMA: AUTORES.Create. ele tem um ponto de interrogação preto. tá legal ???. Uma vez que conectou. ESCOLHA PARADOX. end.OpenKey('\Software\Borland\DataBase Engine\Settings\Drivers\MSACCESS\INIT'. try Reg. begin Reg := TRegistry.

7. [loPartialKey]) then tblCepLoc. clique nele. RzProgressBar1.txt' then begin // Arquivo de Localidades RzProgressBar1.Entrada).90.TotalParts := 0.AsString := .AsString := copy(Entrada.Open. tblCepLoc.FileName = 'C:\Download\Ceps\Cep_loc.90.txt'.AsString := copy(Entrada.1.FileName).1) = '2') then begin tblCepLoc.Locate('cep_ChvLocal'.1) = '1') then begin // Exclusao if tblCepLoc. Como importar dados de um arquivo texto para uma Tabela var sArquivo: TextFile. end else if (copy(Entrada. AssignFile(sArquivo. FileNameEdit1.1. try tblCepLoc. copy(Entrada.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 238 de 272 Uma vez escolhido.FieldByName('cep_Cidade').6). if FileNameEdit1. iLinha := 0. tecle o raizinho para rodar a query que então ele converterá para paradox. sArq2 := After('Cep_Loc. tblCepLoc.Open. Reset(sArquivo).Edit. tblCepLoc. Feito isso clique na paleta onde está escrito Query e vá em propriedades. Readln(sArquivo. copy(Entrada.Append.Delete.90.Locate('cep_ChvLocal'. tblCepLoc. end.Entrada).6).1) = '0') or (copy(Entrada. begin tblCep.FileName). Readln(sArquivo. end else if (copy(Entrada. while not Eoln(sArquivo) do begin Inc(iLinha).75.6). iLinha: integer.Cancel. tblCepLoc.FieldByName('cep_Cidade'). bCancelaImport := False.gondraf@hotmail.FieldByName('cep_UF'). tblCepLoc. Entrada.2).AsString := copy(Entrada. aparecerá um retangulo como quadrinhos ao lado de cada campo.TotalParts := NumLinhasArq(FileNameEdit1. clique no primeiro quadrado que marcará todos automaticamente.FileName).FieldByName('cep_ChvLocal'). [loPartialKey]) then begin tblCepLoc.AsString := copy(Entrada.Post. aparecerá um form onde você pode escolher entre paradox ou dbase.FileNameEdit1.90.FieldByName('cep_UF'). sArq2: string.1.60).1) = '3') then begin // Alteracao if tblCepLoc.60). // 0 = Base Total e 2 = Inclusao if (copy(Entrada.7. escolha paradox e logo embaixo digite o diretorio e o nome da tabela que voce quer criar. except tblCepLoc.

E: EDatabaseError. end. if Dialog.Message. Var ErroMens :String.var TDataAction).2). var BS:TBlobStream.Post. Evitando o erro de Key Violation A dica abaixo apresenta o código para evitar que o programa pare e envie uma mensagem padrão de erro por Key Violation (Chave Primária). Gravar imagem JPG em tabela Paradox Procedure Grava_Imagem_JPEG(Tabela:TTable. No caso de Key Violation a mensagem é exatamente esta: "Key violation. dsInsert]) Then Tabela.InitialDir := 'c:\temp'. Foto:TImage.75. Código Completo: Procedure TForm1.ProcessMessages. o código deve ser inserido no evento OnPostError do componente de banco de dados (Table ou Query). Campo:TBlobField.' then begin ShowMessage('Chave Primária Inválida !').FileName <> '' Then Begin if not (Tabela. end. MinhaImagem:TJPEGImage. Dialog:TOpenPictureDialog). end. if ErroMens = 'Key violation.Execute. except tblCepLoc. Action: . begin ErroMens := E. Para isto.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 239 de 272 copy(Entrada.PartsComplete := iLinha. Application. sendo que na variável de parâmetro "E" deste procedimento é armazenado a mensagem que será apresentada na tela. end. testa-se se a mensagem ocorrida é "Key violation.gondraf@hotmail.State in [dsEdit.Edit. end. end.'. if bCancelaImport then Break. action := daAbort. Dialog. Begin Dialog.Table1PostError(DataSet: TDataSet. CloseFile(sArquivo). Para realizar um tratamento deste erro. Toda vez que ocorrer um erro de gravação no banco de dados este evento será executado. end. RzProgressBar1.Cancel. se for verdadeiro o processo de gravação é abortado (Action := daAbort).". try tblCepLoc.

// TbClientesCli_Foto é um variavel da tabela do tipo Blob // Image1 é um componente end. Foto. MinhaImagem := TJPEGImage. begin Grava_Imagem_JPEG(TbClientes.Post.jpg'). Begin if Campo.Button1Click(Sender: TObject). Para que a função funcione é necessário que as units StdCtrls e DbTables tenham sido declaradas.Create((Campo as TBlobField).LoadFromFile(Dialog.Free.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 240 de 272 BS := TBlobStream. Foto. var BS:TBlobStream. BMWRITE). End.Assign(MinhaImagem).Handle).Picture. MinhaImagem.Free. procedure TForm1.Free.Create((Campo as TBlobField).Create. MinhaImagem. Foto:TImage). MinhaImagem.LoadFromFile('c:\temp\limpa. End. MinhaImagem. End. End Else Foto. Listando os campos da tabela num Memo A implementação da função abaixo permite inserir os campos de uma tabela num componente TMemo. Tabela.Button1Click(Sender: TObject).Create. OpenPictureDialog1). DBISaveChanges(Tabela. BS. Ler imagem JPG da tabela Paradox Procedure Le_Imagem_JPEG(Campo:TBlobField. Código Completo: .LoadFromStream(BS). Os campos que serão listados.TbClientesCli_Foto. Image1). MinhaImagem := TJPEGImage.Free. // TbClientes é o nome de alguma Tabela // TbClientesCli_Foto é um variavel da tabela do tipo Blob // Image1 é um componente // OpenPictureDialog1 é o componente para abrir a figura end. MinhaImagem. BS.gondraf@hotmail.Picture. MinhaImagem:TJPEGImage. são aqueles que foram declarados através da operação de duplo clique no componente Table e opção ADD Fields. Image1.AsString <> '' Then Begin BS := TBlobStream. procedure TForm1.FileName).Picture. BMREAD).Assign(MinhaImagem). begin Le_Imagem_JPEG(TbClientesCli_Foto.SaveToStream(BS).

End.DefaultDrawDataCell(Rect. Column: TColumn. end.DBGrid1DrawColumnCell(Sender: TObject. State: TGridDrawState). utilize a rotina abaixo no evento OnDrawDataCell: if Tabela. .Canvas. Alterando cor de linha de um DBGrid Coloque a propriedade defaultdrawdata do dbgrid em FALSE No evento onDrawColumnCell do seu grid coloque o seguinte: procedure TForm1.M:Tmemo).DefaultDrawDataCell(Rect. somente os registros com salário maior que R$ 10.columns[datacol].Lines. State). DbGrid1.Memo1). Begin ListaCampos(Table1.Style := [fsBold]. Por exemplo. begin If table1PRAZO. onde G : corresponde ao drive de rede e MEUAPLIC.Color:= clFuchsia.Value > DATE then // condição Dbgrid1.Canvas. Nota: Não é necessário mover o ponteiro da tabela para colorir os registros. Field. // coloque aqui a cor desejada Dbgrid1. end. const Rect: TRect.field. State).00 ficarão com cor vermelha e em negrito. DataCol: Integer.Font. "G:\MEUAPLIC".Canvas. Após isto o BDE controlará o compartilhamento de arquivos PARADOX em rede Alterando a fonte de determinado registro em um DBGrid Para trocar a fonte de um DBGrid.gondraf@hotmail.ListField).FieldByName ('Salario'). o diretório aonde está o aplicativo (executável) ·Depois selecionar a página SYSTEM ·Alterar o parâmetro LOCAL SHARE para TRUE. PARADOX EM REDE Arquivos Paradox podem ser compartilhados em rede. DbGrid1. No caso. Para que isto ocorra devemos : ·Adicionar o DATABASE ENGINE CONFIGURATION (BDE CONFIG) ·Selecionar a página DRIVERS ·Selecionar o driver PARADOX e alterar o parâmetro NET DIR para o local onde serão gravados os arquivos de controle para compartilhamento. end.Font.Button1Click(Sender:TObject). dbgrid1. Exemplo: Procedure TForm1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 241 de 272 Procedure ListaCampos(TB:Ttable.000. Begin M.Assign(TB.Value >= 10000 then begin DbGrid1.Color := clRed.Font.

Column. Procedure FindReplace (const Enc. Forms. type TForm1 = class(TForm) Button1: TButton. Db. DBGrid1. var Form1: TForm1. Controls. private { Private declarations } public { Public declarations } end.Font.Canvas. Procura e substituição de string num campo memo Procedure TForm1. Linha: string.Color:= clWhite.Canvas. Grids. . Messages.Field. DataSource1: TDataSource. Table1: TTable.TextOut(Rect. Classes. end else begin DBGrid1. DataCol: Integer.Canvas.Edit2.Color:= clWhite. subs: String.AsString).Color:= clGreen.Text.Left+2. Column: TColumn.Canvas. procedure DBGrid1DrawColumnCell(Sender: TObject.gondraf@hotmail.DFM} procedure TForm1. DBGrid1. Posicao: Integer. Graphics. State: TGridDrawState). end. Dialogs. SysUtils. State: TGridDrawState). const Rect: TRect. DBTables. end. Var i. O controle é feito no evento OnDrawColumnCell.DBGrid1DrawColumnCell(Sender: TObject. dando assim um efeito zebrado. DBGrid1. StdCtrls.Brush. interface uses Windows. DBGrids.Button1Click (Sender: TObject). unit Unit1. DBGrid1. Var Texto: TMemo).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 242 de 272 DbGrid Zebrado O exemplo abaixo mostra como deixar cada linha do componente DBGrid de uma cor diferente. end. Memo1). const Rect: TRect.Rect.FillRect(Rect).RecNo) then begin DBGrid1.Canvas.Font.Canvas. begin If odd(Table1. Begin FindReplace(Edit1. implementation {$R *. DBGrid1: TDBGrid.Top. DataCol: Integer. Column: TColumn.Brush.Text.Color:= clBlack.

end.Lines.ExecSQL. begin Q := TQuery. end. If Posicao > 0 then Begin Delete(Linha. Add(' Salario Money.sql. Observações Este exemplo foi testado com banco de dados Paradox. Q.Free.Create(Application).'). end.sql. Sql relacionada com a primeira letra query1. Add(' Nome Char(30).1 do begin Linha := Texto.Linha). Add('( Codigo AutoInc. Repeat Posicao:=Pos(Enc.gondraf@hotmail.Coloque um TButton no form. Lines[i].Length(Enc)).Posicao). query1. porém deverá funcionar em vários outros bancos de dados com pouca ou nenhuma alteração. .count . Insert(Subs. finally Q. end. end. with Q. PRIMEIRA LETRA "LETRA%" ULTIMA LETRA "%LETRA" QUE CONTENHA A LETRA "%LETRA%" .clear.Button1Click(Sender: TObject). Criando tabelas via SQL Inclua na seção uses: dbTables .active:= true. Texto.Escreve no OnClick do Button como abaixo: procedure TForm1.'). Add(' Depto SmallInt. Add(' Primary Key (Codigo) )'). var Q: TQuery. until Posicao = 0. try Q.').Linha. query1.SQL do begin Add('Create Table Funcionarios').com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 243 de 272 Begin For i:= 0 to Texto. end.Lines[i]:=Linha.').active := false.add('select * from estrucpr where upper(portugues)like "LETRA%" '). query1.DatabaseName := 'SF'.Posicao.

Query1.Altere as propriedades dos componentes como abaixo: * Query1. var Form1: TForm1. os meses de Janeiro a Dezembro. respectivamente. Digite um número de 1 a 12 no Edit e clique no botão. implementation .Open. Graphics. Query1. BDE5 e tabela Paradox7.SQL. Query1. Classes. Observações Os números de 1 a 12 representam. Label1: TLabel.Add('select * from dCli').SQL.gondraf@hotmail.SQL. procedure Button1Click(Sender: TObject).Add('where extract(month from DataNasc) = :Mes'). .DataSet = Query1 * DBGrid1. Forms.DatabaseName = (alias do BDE) * DataSource1.Clear.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 244 de 272 Consultar por mês de um campo data Use uma Query como abaixo: .StdCtrls.Close. Colocar o mes por extenso unit Unit1.ParamByName('Mes'). interface uses Windows. Este exemplo foi testado com Delphi4. Controls.AsInteger := StrToInt(Edit1.Execute.DataSource = DataSource1 .Coloque o código abaixo no evento OnClick de Button1: Query1. function MesExtenso( Mes:Word ) : string. Query1. Messages. private { Private declarations } public { Public declarations } end. SysUtils.Text).Coloque no form os seguintes componentes: * TQuery * TDataSource * TDBGrid * TEdit * TButton . Dialogs. type TForm1 = class(TForm) Button1: TButton. Query1.

// Retorna a diferença em Dias. const meses : array[0. Result := intCont . Meses := Calcula(1) . procedure TForm1. var intCont : Integer .. 'Agosto'.(APanel. DataFinal := IncMonth(DataFinal.Dias : Integer) . 'Junho'.ClientWidth div 2) .Caption := MesExtenso(3). end.'Outubro'. end else . var Anos.MesExtenso( Mês:Word ) : string. Inc(intCont. begin if ACentro then begin APanel. APanel.Top := (AForm. exit .DFM} function TForm1.Meses e Anos entre 2 datas Function Calcula(Periodo : Integer) : Integer .(APanel. end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 245 de 272 {$R *. begin intCont := 0 . APanel: TPanel.-1) . end.Meses. Meses := 0 . end. Como retornar quantidade de dias meses e anos entre duas datas Procedure EntreDatas(DataFinal.Height div 2). Repeat Inc(intCont) . DataFinal := IncMonth(DataFinal. begin result := meses[mes-1].ClientHeight div 2) . 'Maio'.Left := (AForm. Dias := Round(DataFinal . 'Julho'. End.DataInicial) . begin label1.Button1Click(Sender: TObject). Alinhar Panel Ao Centro do Formulário procedure AlinharPanel(AForm: TForm. Anos := Calcula(12) . 'Dezembro').DataInicial : TDate . Until DataFinal < DataInicial . Dias := 0 .Width div 2).11] of PChar = ('Janeiro'. ACentro: Boolean). 'Abril'. 'Setembro'. 'Fevereiro'. End .Periodo * -1) . begin if DataFinal <= DataInicial then begin Anos := 0 . 'Novembro'.Periodo) . 'Março'.gondraf@hotmail.

CreateForm(TForm2. end. opção Project. begin Action:= caFree. Form2).FormResize(Sender: TObject).FormPaint(Sender: TObject). você deve alterar no delphi.Update.Top := (AForm.ShowModal. No evento OnClose do Form2 coloque o seguinte código. Form2).Button1Click(Sender: TObject).Color := RGB(coluna. Na criação do Form você define se ele é MODAL ou NÃO MODAL.ClientWidth + 100). var altura.CreateForm(TForm2. begin Application.Free. begin Application.FormClose (Sender: Tobject. begin Invalidate. end. NÃO MODAL . ClientWidth. (coluna + 1) * altura)) .Button1Click(Sender: TObject). AForm.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 246 de 272 begin APanel. Mudando os forms a serem criados dinamicamente da coluna Auto-Create Forms para Avaliable Forms. begin altura := (ClientHeight + 255) div 256. coluna: Word.Mostra form em modo não exclusivo procedure TForm1.ClientHeight + 100). { Modifique para obter cores diferentes } FillRect(Rect(0.gondraf@hotmail. procedure TForm2.{Mostra form em modo exclusivo} end.{Mostra form em modo exclusivo} Form2. coluna * altura. APanel.Update. APanel. end. Como Criar Forms Em Tempo de Execução Para você economizar memória.ShowModal. 0. pode-se criar os forms de sua aplicação somente no momento da execução.Left := (AForm. Como evitar efeito de maximização . var Action : TCloseAction). Para Isso observe os seguintes códigos: MODAL . Coloração Gradiente no Form procedure TForm1. Aliado a este código.{Carrega form na memória} Form2. end. end.{Carrega form na memória} Form2. end. no menu Options. procedure TForm1. 0).Mostra form em modo exclusivo procedure TForm1. for coluna := 0 to 255 do with Canvas do begin Brush. {Libera Memória} end.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 247 de 272 Se você já desenvolveu uma aplicação MDI com um formulário MDIChild que tem que ser exibido em estado Maximizado (WindowState=wsMaximized).Title := ''. Com isto.Show. if HPrevInst = 0 then begin F_Splash := TF_Splash.100. end. você dará um efeito mais profissional às suas aplicações. Exemplo: procedure MainForm.CreateForm(TF_Form2. end.0. end.Create(self) do Show. Após a criação do formulário. F_Form2j).hR. Application. F_Splash.CreateForm(TF_Error. Application. end else messagedlg('O sistema já foi nicializado!'.HelpFile := ''.ItemArqCadFor(Sender: TObject). with TFrmCadFor.CreateForm(TF_Form1. SetWindowRgn(Handle. utilize LockWindowUpdate(0). F_Error). provavelmente você já se deparou com aquele deselegante problema em que o usuário acompanha a maximização do seu formulário.create(Application). faça o seguinte: Antes de criar o seu formulário para a exibição.Run. Form com um furo var . Como Saber se o aplicativo ja foi aberto Como saber se o aplicativo já foi aberto Insira o código abaixo dentro do arquivo . begin {cria uma Região elíptica} hR := CreateEllipticRgn(0.200).True).gondraf@hotmail. LockWindowUpdate(0). Application. Application. desta maneira: var hR : THandle. F_Menu). utilize LockWindowUpdate(Handle). Criando janelas não retangulares Para criar uma janela não retangular.[mbok].mtinformation.RES} begin Application. Para evitar isto. Application. voce deve criar uma Região do Windows e usar a função da API SetWindowRgn.CreateForm(TF_Menu.0). F_From1). Application. begin LockWindowUpdate(Handle).DPR de sua aplicação {$R *.

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 248 de 272

Region, Region2 : hrgn; begin Form1.FormStyle:= fsStayOnTop; Region := CreaterectRgn(0,0,width,height); Region2 := CreateEllipticRgn(30,30,100,100); CombineRgn(region, region, region2, RGN_DIFF); SetWindowRgn(handle, region, true); end; Formulário Transparente unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormShow(Sender: TObject); begin Brush.Style := BsClear; end; end. Texto Na Diagonal e Girando procedure TForm1.Button1Click(Sender: TObject); var lf: TLogFont; tf: TFont; i: integer; begin with Form1.Canvas do begin Font.Name := 'Verdana'; Font.Size := 16; tf := TFont.Create; tf.Assign(Font); GetObject(tf.Handle, sizeof(lf), @lf); lf.lfOrientation := 1000; end; for i := 900 downto 1 do

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 249 de 272

begin lf.lfEscapement := i; tf.Handle := CreateFontIndirect(lf); Form1.Canvas.Font.Assign(tf); Form1.Canvas.TextOut(200, Height div 2, 'Retirado da Internet'); //Sleep(10); //Este pode cria um Delay na execução end; tf.Free; end; Para testar essa dica coloque um Timer sete o interval para 5000 e um Botão e coloque o código abaixo! o código travará o mouse e teclado por 5 segundos! unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } public { Public declarations } end; procedure BlockInput(ABlockInput : boolean); stdcall; external 'USER32.DLL'; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin BlockInput(True); Timer1.Enabled:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin BlockInput(false); Timer1.Enabled:=false; end; end. Detectando o Numero Serial do HD Function SerialNum(FDrive:String) :String;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 250 de 272

Var Serial:DWord; DirLen,Flags: DWord; DLabel : Array[0..11] of Char; begin Try GetVolumeInformation(PChar(FDrive+':\'),dLabel,12,@Serial,DirLen,Flags,nil,0); Result := IntToHex(Serial,8); Except Result :=''; end; end; Como desenhar um Bitmap num form var Form1: TForm1; Bmp: TBitmap; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Bmp:=TBitmap.Create; Bmp.Loadfromfile('c:\windows\nuvens.bmp'); end; procedure TForm1.TForm1.FormPaint(Sender: TObject); begin Canvas.Draw(50,50,Bmp); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Bmp.Free; end; Converte um arquivo JPEG em BMP function JpgToBmp(cImage: String): Boolean; // Requer a Jpeg declarada na clausua uses da unit var MyJPEG : TJPEGImage; MyBMP : TBitmap; begin Result := False; if fileExists(cImage+'.Jpeg') then begin MyJPEG := TJPEGImage.Create; with MyJPEG do begin try LoadFromFile(cImage+'.Jpeg'); MyBMP := TBitmap.Create; with MyBMP do begin Width := MyJPEG.Width; Height := MyJPEG.Height; Canvas.Draw(0,0,MyJPEG); SaveToFile(cImage+'.Bmp'); Free;

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 251 de 272

Result := True; end; finally Free; end; end; end; end; Carregar um cursor animado (*.ani) const cnCursorID1 = 1; begin Screen.Cursors[ cnCursorID1 ] := LoadCursorFromFile('c:\win95\cursors\cavalo.ani' ); Cursor := cnCursorID1; end; Como pegar a posição do mouse na tela Para obter os valores das coordenadas do mouse de qualquer parte da tela, basta que se utiliza a função da API do Windows GetCursorPos. Esta função é interessante pois oferece ao programador os valores (x,y) de qualquer ponto da tela e não somente da aplicação. Para implementação, esta função pode ser utilizada da seguinte maneira: procedure TForm1.Timer1Timer(Sender: TObject); var pt: TPoint; begin GetCursorPos(pt); // Pega a posição atual do mouse; //Mostra os valores das coordenadas do mouse label1.caption := IntToStr(pt.x) + ',' + IntToStr(pt.y); end; Como Alterar o Volume do Som do Computador Com o Delphi a função usada para alterar o som é a waveOutSetVolume( hwo, dwVolume) que fica na unit MMSystem. Não é fácil alterar o volume com o Delphi. Não é só colocar uma TrackBar e associar com o MCI. Para alterar o volume no computador você envia uma integer tipo assim: 0x5555FFFF Os quatro dígitos F seriam o lado esquerdo do som o os quatro dígitos 5 seriam o lado direito, em diferentes computadores eles se invertem, mas este é só um exemplo. os valores vão de 0000 até FFFF, assim: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F considere o A como um 10, o B como 11, o C como 12 e assim em diante até o F que seria 15, o volume máximo ou seja se você colocar 0xFFFFFFFF iria ficar os dois lados no volume máximo e se colocasse 0x00000000 iria ficar tudo mudo. Então aqui vai um exemplo: Insira dois Edits e um Button na seção uses coloque MMSystem. faça o botão assim: procedure TForm1.Button1Click(Sender: TObject);

gondraf@hotmail.com

Fábio José de Gondra Ramos

Delphi 2005 for win32

Página 252 de 272

var s: string; begin s := '0x' + Edit1.Text + Edit2.Text; MMSystem.waveOutSetVolume(0, StrToInt(s)); end; Gravando Sons do Microfone Com o Delphi Primeiro você deve ter uma placa de som e microfone, ambos devidamente instalados no seu PC. Se não tiver um mic, vai lá na SantaIfigênia que você encontra um bom com 5 reais. Agora coloque um componente TMediaPlayer que se encontra na pasta System, depois coloque três botões e um edit no Form. Abra o Gravador de som do Windows e sem gravar nada salve o arquivo vazio como C:\SOM.WAV, normalmente este arquivo é temporário até salvar o arquivo pricipal. (somente arquivos WAV são salvos, alias, se alguém souber qual função de uma das DLL do Windows Media Player 8.0 que converte WAV para MP3, ME MANDA UM EMAIL!!!) Agora coloque os seguintes comandos: Na propriedade Text do Edit1 coloque o arquivo wave que você salvou - C:\SOM.WAV procedure TForm1.Button1Click(Sender: TObject); begin MediaPlayer1.Open; end; procedure TForm1.Button2Click(Sender: TObject); begin MediaPlayer1.Save; end; procedure TForm1.Button3Click(Sender: TObject); begin MediaPlayer1.FileName := Edit1.Text; end; Agora compile o programa e abra-o, clique no Button3 para associar o arquivo que você criou ao MCI, feche todos os aplicativos de midía que estiverem abertos (eles impedem de que abra o MCI) e clique no Button1 para abrir o dispositivo MCI, se algo estiver errado ele não vai abrir, depois de abrir, 4 botões vão ser liberados no TMediaPlayer1, com o microfone ligado clique na bola vermelha para começar à gravar, para pausar a gravação clique no segundo botão o amarelo, e para ouvir o som gravado clique no primeiro botão verde o Play, agora para salvar o arquivo clique no Button2, vá ver o arquivo C:\SOM.WAV, antes ele estava vazio agora está com sua gravação.

Como converter decimal para romanos function DecToRoman( Decimal: LongInt ): String; {Converte um numero decimal em algarismos romanos} const Romans: Array[1..13] of String = ( 'I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M' ); Arabics: Array[1..13] of Integer =( 1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000); var i: Integer; scratch: String;

n) + Edit1. end. Alinhar Texto do Edit À Direita //ALINHAR TEXTO DO EDIT À DIREITA procedure TForm1. var n: Integer. Edit1. begin for i := 0 to Form. var i : Integer.Text. for i := 13 downto 1 do while ( Decimal >= Arabics[i] ) do begin Decimal := Decimal .Text := stringofchar(\ ' \'.Canvas se for a mesma fonte do Edit begin c := TCanvas. ou seja.8) / c. h: HWND. end.c.ComponentCount . end.Text) .Components[i] is TCustomEdit then (Form.TextWidth(\ ' \')).Components[i] as TCustomEdit). end.TextWidth(Edit1. n := round((Edit1.Handle := GetDeviceContext(h).Width .Font := Edit1. begin Edit1.Edit1Enter(Sender: TObject).gondraf@hotmail. c. c: TCanvas. Baixando arquivos da internet Esta dica serve para quem deseja criar um sistema que atualize seus softwares via internet. c. begin for i := 0 to ComponentCount -1 do if Components[i] is TEdit then begin TEdit(Components[i]).Edit1Exit(Sender: TObject).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 253 de 272 begin scratch := ''. // pode se usar Form1. var i : Integer. Result := scratch.Text := ''. Como Limpar Todos os Edit's de um Form de uma só vez? Procedure LimpaEdit. e também para quem faz jogos online. jogos que exigem a conexão com a internet para .Clear. end.Text := Trim(Edit1.Font. end.Arabics[i]. procedure LimpaEdit (Form: TForm). end. procedure TForm1.Create. scratch := scratch + Romans[i].1 do if Form.Text).

. begin Mail := 'mailto:lloydsoft@ieg.com/arq. 0.nil. Depois basta fazer uma chamada padrão: if DownloadFile ('http://www.com. end. Dest: string): Boolean.gondraf@hotmail.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 254 de 272 serem jogados. end.onde.nil. var Mail : String.sw_ShowNormal).PChar(Dest).htm') then ShowMessage('Download Concluído.Button1Click(Sender: TObject).br'.htm'. begin try Result:= UrlDownloadToFile(nil. except Result:= False. pode precisar de um meio rápido.'c:\arq. fácil e desburocratizado para baixar arquivos de um site ou de um lugar qualquer da rede. ShellExecute(GetDesktopWindow. Chamar um e-mail pelo Delphi Uses Shellapi procedure TForm1.'open'. Para usar esta function é preciso declarar Urlmon na seção uses da unit.'). PChar(source). nil) = 0. Veja só como é simples e sem contra indicações fazer isso: function DownloadFile(Source.pchar(Mail). end.

if IOResult <> 0 then MessageDlg('Cannot find directory'. 2.Button1Click(Sender: TObject). end. begin S := Concat('ABC'. . Chr(65)). Cria um novo diretório e retorna o sucesso da operação function Date: TDateTime.TextOut(10.gondraf@hotmail. function Concat(s1 [. var S: string.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 255 de 272 Principais Procedimentos e Funções Pré definidas procedure Beep.. Retorna o caracter com o código ASCII X begin Canvas. begin Label1. function Copy(S: string.Caption := 'Today is ' + DateToStr(Date). { The letter 'A'} end. 0). begin {$I-} { Change to directory specified in Edit1 } ChDir(Edit1. function CreateDir(const Dir: string): Boolean.{ 'BCD' } end.Button1Click(Sender: TObject). sn]: string): string. 3). begin Label1. mtWarning. function DayOfWeek(Date: TDateTime): Integer. s2.Caption := DateToStr(Date).. Retorna o dia da semana especificado entre 1 e 7. Retorna a Data atual procedure TForm1. Concatena as strings var S: string. 'DEF'). Toca um beep procedure ChDir(S: string). begin S := 'ABCDEF'. onde domigo é um e Sábado é 7 procedure TForm1.&#9. Index. Converte Data para String procedure TForm1. 10. { 'ABCDE' } end. function DateToStr(Date: TDateTime): string. Retorna uma substring de S.. end. começando a partir de Index e tendo Count caracters The Copy function returns a substring of a string. S := Copy(S. end. Count: Integer): string.Text).Button1Click(Sender: TObject). function Chr(X: Byte): Char. Troca o diretório corrente para o diretório especificado em S.. [mbOk].

var Hour.Caption := 'Today is Day ' + IntToStr(Day) + ' of Month ' + IntToStr(Month) + ' of Year ' + IntToStr(Year).Text). Min. Month. Day: Word). Hour. Hour. s). Retorna o número de bytes livre no driver especificado em Drive. DecodeDate(Present. Sec. function DeleteFile(const FileName: string): Boolean.&#9. procedure TForm1. Quebra os valores especificados no parâmetro Date em Year. Remove a substring de Count caracters da string S partir da posição Index var s: string.8. Sec.TextOut(10. Se o arquivo não puder ser apagado a função retorna False. Canvas.gondraf@hotmail. begin Present:= Now. Hour. Month. Year. Sec. Quebra os valores especificados em Time nos par6ametros Hour. Delete(s. MSec: Word. Day. Month. end.Caption := 'Today is Day ' + IntToStr(Day) + ' of Month ' + IntToStr(Month) + ' of Year ' + IntToStr(Year). Apaga o arquivo FileName do disco. procedure TForm1. MSec: Word. Verifica se Name diretorio existe function DiskFree(Drive: Byte): Integer. MSec: Word). Min. begin Present:= Now.Button1Click(Sender: TObject). end. Label2. procedure Delete(var S: string. Year. Month e Day. 10. Sec. Label1. procedure DecodeDate(Date: TDateTime. Min. begin s := 'Honest Abe Lincoln'. DecodeTime(Present. var Present: TDateTime.ME'). .{ 'Honest Lincoln' } end. Day. Index. function DirectoryExists(Name: string): Boolean.4). DeleteFile('DELETE. Label1. Label2.Button1Click(Sender: TObject). Year. var Year.Caption := 'The time is Minute ' + IntToStr(Min) + ' of Hour ' + IntToStr(Hour). Min. Day). Month. MSec). DecodeDate(Present. Count:Integer). Label1. Year. Sec. procedure DecodeTime(Time: TDateTime. begin ADate := StrToDate(Edit1. Min. Hour. Sec e MSec. var Present: TDateTime. Day). Month. DecodeTime(Present.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 256 de 272 var ADate: TDateTime.Caption := 'The time is Minute ' + IntToStr(Min) + ' of Hour ' + IntToStr(Hour).Caption := 'Day ' + IntToStr(DayOfWeek(ADate)) + ' of the week'. MSec). end. Min.

end. . S).TextOut(10. Retorna a extensão do arquivo FileName function ExtractFileName(const FileName: string): string. function ExtractFileExt(const FileName: string): string.. MSec: Word): TDateTime. var MyTime: TDateTime. function DiskSize(Drive: Byte): Integer. function ExtractFilePath(const FileName: string): string. 10. Retorna o nome do arquivo Form1. Label1. Min. O resultado da função é uma string vazia se FileName não contiver um drive e um caminho. end. Retorna o Path de um arquivo ChDir(ExtractFilePath(FileName)).TextOut(10.gondraf@hotmail. end. Sec. begin MyTime := EncodeTime(0. Min. 2 = B. Retorna a Hora formada por Hour. Retorna o tamanho em bytes do driver especificado. 12. Label1.Caption := 'Editing '+ ExtractFileName(FileName). S). 2 = B.Caption := DateToStr(MyDate)..'. begin S := IntToStr(DiskSize(0) div 1024) + ' Kbytes capacity. 10.Button1Click(Sender: TObject). 1 = A. Retorna uma string contendo o drive do path de um arquivo.. 7). end..com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 257 de 272 Onde : 0 = Corrente. begin MyDate := EncodeDate(83. function EncodeDate(Year. 45. var MyDate: TDateTime. Month e Day procedure TForm1.Caption := TimeToStr(MyTime).. 45. function ExtractFileDir(const FileName: string): string. RemoveDir e SetCurrentDir. function EncodeTime(Hour. Canvas. begin S := IntToStr(DiskFree(0) div 1024) + ' Kbytes free. Retorna uma Data formada por Year. 1 = A. GetCurrentDir.Button1Click(Sender: TObject).. Day: Word): TDateTime. Sec e MSec procedure TForm1. Retorna o diretório adequado para ser passado para as funções CreateDir. Onde : 0 = Corrente. Canvas. DiskFree retorna –1 se o driver for inválido var S: string. DiskFree retorna –1 se o driver for inválido var S: string. 31). function ExtractFileDrive(const FileName: string): string. Month.'.

y. if DirectoryExists(Dir) then . S).FileName). begin if Opendialog1. y := 10.Execute then begin AssignFile(f.. Opendialog1. size : Longint. end. Retorna verdade se o arquivo existir if FileExists(FileName) then if MsgBox('Do you really want to delete ' + ExtractFileName(FileName) + '?'). SizeOf(S).TextOut(5. Count: Integer. S: string.TextOut(5. y. []) = IDYes then DeleteFile(FileName). begin Dir := 'C:\APPS\SALES\LOCAL'. Se o arquivo estiver vazio FileSize(F) retorna 0. function FileSize(var F): Integer. y := y + Canvas.TextHeight(S) + 5.. end.TextOut(5. ForceDirectories(Dir). size := FileSize(f). FileSize não pode ser usada com arquivo texto var f: file of Byte..size div 2). end. y.gondraf@hotmail. Canvas. Value pode ser um byte ou char var S: array[0. Canvas.'. para usar FileSize o arquivo deve esta aberto.Button1Click(Sender: TObject). Retorna –1 se o arquivo não existir function FileExists(const FileName: string): Boolean.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 258 de 272 function FileAge(const FileName: string): Integer. var Dir: string. CloseFile(f). Canvas. S). procedure FillChar(var X. S := 'Seeking halfway into file. begin { Set to all spaces } FillChar(S. S := 'File size in bytes: ' + IntToStr(size). F é uma variavel do tipo arquivo. Retorna a data e a hora de um arquivo num valor que pode ser convertido para TDateTime através da função FileDateToDateTime. y := y + Canvas. Reset(f). Retorna o tamanho de um arquivo. S).TextHeight(S) + 5. Preenche um vetor com determinado caracter.79] of char. y: integer. function FloatToStr(Value: Extended): string. Cria multiplos diretórios de uma só vez procedure TForm1. value: Byte). Seek(f. Converte um valor em ponto flutuante (real) para uma string procedure ForceDirectories(Dir: string). S := 'Position is now ' + IntToStr(FilePos(f)). ' ').

and the result is displayed accordingly. upper.Displays the date using the format given by the ShortDateFormat global variable. ddddd&#9. and displays 'am' for any hour before noon. ddd&#9. and displays 'a' for any hour before noon. mm&#9. yyyy&#9. n&#9. ' + '"at" hh:mm AM/PM'. and do not affect formatting. or mixed case.Displays the second without a leading zero (0-59). m&#9. S := FormatDateTime('"The meeting is on" dddd. and 'p' for any hour after noon. The a/p specifier can use lower.Uses the 12-hour clock for the preceding h or hh specifier. 'xx'/"xx"&#9. the minute rather than the month is displayed. Os especificadores de formato abaixo são válidos . Os especificadores de formato abaixo são válidos Specifier&#9. StrToDateTime('2/15/95 10:30am')).Displays the minute with a leading zero (00-59). Transforma um Float numa string usando a formatação contida em Format. function FormatDateTime(const Format: string. yyyy.Caption := Dir + ' was created' end. or mixed case.Characters enclosed in single or double quotes are displayed as-is. dddddd&#9.Displays the day as an abbreviation (Sun-Sat) using the strings given by the ShortDayNames global variable.Displays the second with a leading zero (00-59). If the string given by the Format parameter is empty. tt&#9. ampm&#9.Displays the minute without a leading zero (0-59). Formata o valor DateTime usando o formato de Format. hh&#9.Displays the hour without a leading zero (0-23).Displays the year as a two-digit number (00-99).Displays the day as a number without a leading zero (1-31). Value: Extended): string.Displays the date using the format given by the ShortDateFormat global variable.Displays the time using the format given by the LongTimeFormat global variable. and the contents of the TimePMString global variable for any hour after noon. followed by the time using the format given by the LongTimeFormat global variable. nn&#9. am/pm&#9. t&#9. dddd&#9. ss&#9. :&#9.Displays the time using the format given by the ShortTimeFormat global variable.Uses the 12-hour clock for the preceding h or hh specifier. dd&#9. yy&#9. s&#9. mmm&#9.Displays the month as an abbreviation (Jan-Dec) using the strings given by the ShortMonthNames global variable. If the mm specifier immediately follows an h or hh specifier.Displays c&#9. Format specifiers may be written in upper case as well as in lower case letters--both produce the same result. If the m specifier immediately follows an h or hh specifier. and 'pm' for any hour after noon. mmmm&#9.Uses the 12-hour clock for the preceding h or hh specifier.Displays the hour with a leading zero (00-23).Displays the day as a full name (Sunday-Saturday) using the strings given by the LongDayNames global variable. and the result is displayed accordingly. the minute rather than the month is displayed.Displays the date separator character given by the DateSeparator global variable.Displays the month as a number without a leading zero (1-12). function FormatFloat(const Format: string. a/p&#9. DateTime: TDateTime): string. upper.Displays the time separator character given by the TimeSeparator global variable. the date and time value is formatted as if a 'c' format specifier had been given. d&#9. mmmm d.Displays the year as a four-digit number (0000-9999). The am/pm specifier can use lower.Displays the date using the format given by the LongDateFormat global variable.Displays the month as a number with a leading zero (01-12).Displays the month as a full name (January-December) using the strings given by the LongMonthNames global variable. /&#9. The time is not displayed if the fractional part of the DateTime value is zero.gondraf@hotmail.Displays the day as a number with a leading zero (01-31). and displays the contents of the TimeAMString global variable for any hour before noon.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 259 de 272 Label1. h&#9.

00)&#9. the second applies to negative values.-1234&#9.&#9. 0&#9.Represents 0&#9.00&#9. the value being formatted is rounded to the nearest whole number.&#9.5. Otherwise. The first '. the output will have thousand separators inserted between each group of three digits to the left of the decimal point.1.gondraf@hotmail.##0.1.&#9.&#9. If the section for positive values is empty. except to indicate that thousand separators are wanted.&#9.234E+03&#9. or 'e-' to determine the minimum number of digits in the exponent. the format string can contain between one and three sections separated by semicolons. and the second section applies to negative values.' characters in the format string does not affect the output. and the third applies to zeros.## &#9.&#9. 'e+'. that is if there is nothing between the semicolons that delimit the section.234.00&#9.Zero 0.0. .234E+03&#9.234E3&#9.00 #.##0.&#9. General floating-point formatting is also used if the value has more than 18 digits to the left of the decimal point and the format string does not specify scientific notation.Characters enclosed in single or double quotes are output as-is. and zero numbers in the format string. 'E-'.Decimal point. The number being formatted is always rounded to as many decimal places as there are digit placeholders ('0' or '#') to the right of the decimal point. #&#9.50&#9. .&#9.&#9.234..(#.Digit place holder.00 &#9.-1. The actual character used as a the thousand separator in the output is determined by the ThousandSeparator global variable.Separates sections for positive. The locations of the leftmost '0' before the decimal point in the format string and the rightmost '0' after the decimal point in the format string determine the range of digits that are always present in the output string.##0.&#9.Digit placeholder. If the value being formatted has a digit in the position where the '0' appears in the format string.00&#9.&#9.###E-0 &#9. If any of the strings 'E+'.50&#9.&#9. 'xx'/"xx"&#9. If the format string contains no decimal point.234. nothing is stored in that position in the output string.1234. The default value of DecimalSeparator is specified in the Number Format of the International section in the Windows Control Panel.&#9. any additional '.0.0.00 #.0E0 . corresponding to a call to FloatToStrF with the ffGeneral format.&#9.0.&#9.Two sections: The first section applies to positive values and zeros.0. &#9. #.&#9.&#9.&#9.50&#9.-1234&#9. the section for positive values is used instead.00&#9. the value is formatted using general floating-point formatting with 15 significant digits.0.-1.000E-01&#9.1.00.&#9.-1.00&#9.00&#9. then that digit is copied to the output string.&#9.234.&#9.(1.##0. the extra digits are output before the first digit placeholder. The actual character used as a the decimal separator in the output string is determined by the DecimalSeparator global variable. . The default value of ThousandSeparator is specified in the Number Format of the International section in the Windows Control Panel.-1.Scientific notation.234. and zero values.00.&#9.0. One section: The format string applies to all values. and do not affect formatting.1.00)&#9.0.1234&#9.000E+00 #.&#9. The placement and number of '. or 'e-' are contained in the format string.&#9.0 0.00&#9.50&#9.5&#9.1234&#9. 'E-'. negative. a '0' is stored in that position in the output string.00 #. If the section for negative values or the section for zero values is empty.&#9. &#9. Otherwise. The 'E-' and 'e-' formats output a sign character only for negative exponents.' character in the format string. the number is formatted using scientific notation.' characters are ignored.' character in the format string determines the location of the decimal separator in the formatted value. 'e+'.&#9.&#9.' characters. To allow different formats for positive.Thousand separator.&#9.234E3&#9.&#9.234.. If the value being formatted has a digit in the position where the '#' appears in the format string.1&#9.5E-1&#9.00&#9. or if the entire format string is empty.1. A group of up to four '0' characters can immediately follow the 'E+'. If the number being formatted has more digits to the left of the decimal separator than there are digit placeholders to the left of the '.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 260 de 272 Specifier&#9. negative. E+&#9.Three sections: The first section applies to positive values. The 'E+' and 'e+' formats cause a plus sign to be output for positive exponents and a minus sign to be output for negative exponents.-1234. then that digit is copied to the output string.&#9.000E+00 &#9.Zero &#9. If the format string contains one or more '.

Retorna uma string contendo o diretório corrente procedure GetDir(D: Byte.Button1Click(Sender: TObject). sendo que retorna True se o usuário fechou a O InputBox com OK e False se fechou com Cancel ou ESC. function InputBox(const ACaption.&#9.{ LongintVar := LongintVar + 5 } end. Rerorna o diretório corrente do driver especificado.456 } end. N: Longint ] ). Exibe uma Caixa de Entrada onde o usuário pode digitar uma string.C var s : string. begin GetDir(0. O onde D pode ser : Value&#9. var NewString: string. APrompt. Retorna a parte fracional do parâmetro X var R: Real. function IncMonth(const Date: TDateTime. 0). LongintVar: Longint.Drive 0&#9. 'Prompt'.s). 'Default string').com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 261 de 272 function Frac(X: Real): Real. NumberOfMonths: Integer): TDateTime. APrompt: string. [mbOk] .B 3&#9. procedure TForm1. function InputQuery(const ACaption. begin R := Frac(123. end. begin Inc(IntVar). Retorna Date acrescido ou decrescido de NumberOfMonths meses.{ IntVar := IntVar + 1 } Inc(LongintVar. ACaption representa o título do Input Box e APrompt é o título do edit e ADefault representa o valor inicial do Edit.456).A 2&#9. 5). { -0. { 0 = Current drive } MessageDlg('Current drive and directory: ' + s. var S: string). var InputString: string. var Value: string): Boolean. procedure Inc(var X [ . mtInformation. begin InputString:= InputBox('Input Box'.456). E Value armazena a string digitada.&#9.Corrente 1&#9. Semelhante ao InputBox. ADefault: string): string. uses Dialogs.gondraf@hotmail. end. function GetCurrentDir: string.Button1Click(Sender: TObject). procedure TForm1.&#9. . { 0. Incrementa de uma ou N unidades o parâmetro X var IntVar: Integer.456 } R := Frac(-123.

var S: string.gondraf@hotmail. Indica se um identificador é válido para o Pascal function Length(S: string): Integer. Retorna o maior valor de um vetor function Mean(const Data: array of Double): Extended.Text). Insere uma string em outra a partir da posição Index var S: string. Retorna a média aritmética de um vetor function MessageDlg(const Msg: string.TextOut(10. end.Text := IntToStr(Value). function IntToStr(Value: Integer): string. if ClickedOK then { NewString contains new input string } Label1. begin S := 'The Black Knight'.Button1Click(Sender: TObject). retorna o número de caracters usados na string S var S: string.Caption := 'The new string is ''' + NewString + ''''. end.Button1Click(Sender: TObject). . Label1. function IsValidIdent(const Ident: string): Boolean. HelpCtx: Longint): Word. Retorna o maior inteiro de um vetor function MaxValue(const Data: array of Double): Double. Insert('Abe '. AButtons: TMsgDlgButtons. Canvas. Edit1. 10.Caption := NewString. procedure Insert(Source: string. Index: Integer).Text := IntToHex(StrToInt(Edit1. { 'Honest Abe Lincoln' } end. end. 'Prompt'. NewString). 6). function IntToHex(Value: Integer. AType: TMsgDlgType. Trasnforma um Inteiro numa String procedure TForm1. Digits: Integer): string. function MaxIntValue(const Data: array of Integer): Integer. Converte o inteiro Value num Hexadecimal (Base 16).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 262 de 272 ClickedOK: Boolean. var Value: Integer. begin NewString := 'Default String'. Digits indica o número mínimo de dígitos Hexa a serem retornados procedure TForm1. end. S. 8). begin Edit2. 'String Length = ' + IntToStr(Length(S))). ClickedOK := InputQuery('Input Box'. begin S := 'Honest Lincoln'. begin Value := 1234.

&#9. Retry. 200).&#9. AButtons: TMsgDlgButtons. mbNo]. Y: Integer): Word.&#9.gondraf@hotmail. end.&#9.mrRetry&#9.&#9.values mrNone&#9. The caption of the message box is the name of the application's executable file. function MessageDlgPos(const Msg: string.mrYes mrOk&#9. begin if MessageDlg('Welcome to my Object Pascal application.Meaning mbYes&#9. [mbYes.&#9.mrAbort&#9. Onde Msg : Mensagem AType : Tipo da caixa de mensagem Value&#9.A button with the text 'All' on its face mbYesNoCancel&#9.A button with the text 'No' on its face mbOK&#9.A message box containing a red stop sign.Puts t OK and Cancel buttons in the message box mbAbortRetryIgnore&#9. Close.&#9. mtError&#9.&#9.&#9.A message box containing a blue "i". mtInformation.mrAll procedure TForm1.&#9.&#9. No.A message box containing a green question mark.&#9.&#9.A button with the text 'Abort' on its face mbRetry&#9. Cria um novo diretório uses Dialogs. begin MessageDlgPos('Are you there?'. Retorna o menor valor de um vetor procedure MkDir(S: string).Meaning mtWarning&#9.mrIgnore&#9.'. mtCustom&#9. Semelhante a MessageDlg exceto por permitir indicar a posição na qual a janela será exibida procedure TForm1.A button with the text 'OK' on its face mbCancel&#9. AButtons : Quais botões aparecerão na caixa de mensagem Value&#9. mtInformation&#9. begin .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 263 de 272 Exibe uma Caixa de Mensagem e obtem uma resposta do usuário. Retorna o menor inteiro do vetor function MinValue(const Data: array of Double): Double.mtConfirmation.Puts Abort. mbYesNoCancel. X. 0) = mrYes then begin MessageDlg('Exiting the Object Pascal application.mrNo mrCancel&#9. AType: TMsgDlgType. [mbOk]. These are the possible return values: Return &#9. and Ignore buttons in the message box MessageDlg returns the value of the button the user selected. end.&#9.&#9.&#9.A button with the text 'Retry' on its face mbIgnore&#9.&#9. and Cancel buttons in the message box mbOkCancel&#9.&#9. mtConfirmation&#9.&#9.&#9. HelpCtx: Longint.A button with the text 'Help' on its face mbAbort&#9.&#9.A button with the text 'Cancel' on its face mbHelp&#9. end. 200. mtConfirmation.A message box containing a yellow exclamation point symbol.A message box with no bitmap.Button1Click(Sender: TObject).A button with the text 'Yes' on its face mbNo&#9. 0.A button with the text 'Ignore' on its face mbAll&#9.Button1Click(Sender: TObject).&#9. Exit now?'.&#9.Puts Yes. 0).&#9.&#9. function MinIntValue(const Data: array of Integer): Integer.

function Pi: Extended. begin S := 'BLUE has an ordinal value of ' + IntToStr(Ord(BLUE)) + #13#10. [mbOk]. if IOResult <> 0 then MessageDlg('Cannot create directory'. . Retorna o valor de PI 3. function Pos(Substr: string.GREEN). mtInformation. end.'. 0). Retorna o predecessor de um ordinal uses Dialogs. RED is the predecessor of BLUE. Retorna a data e a hora corrente procedure TForm1. type Colors = (RED. end.Text).1415926535897932385. [mbOk]. S := 'The ASCII code for "c" is ' + IntToStr(Ord('c')) + ' decimal'. var S: string. mtWarning. type Colors = (RED. function Now: TDateTime. function Ord(X): Longint.BLUE.GREEN).5'.Caption := 'The date and time is ' + Str(Now). begin S := ' 123. S)] := '0'. Retorna a ordem de um valor ordinal uses Dialogs.gondraf@hotmail. [mbOk]. Procura por uma sub-string numa string e retorna a posição da primeira ocorrência ou zero se não encontrou var S: string. 0). Potência function Pred(X). S: string): Integer.BLUE. { Convert spaces to zeroes } while Pos(' '. S := S + 'The successor of 10 is ' + IntToStr(Succ(10)) + #13#10.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 264 de 272 {$I-} { Get directory name from TEdit control } MkDir(Edit1. 0) else MessageDlg('New directory created'. mtInformation. end. MessageDlg(S. S) > 0 do S[Pos(' '. end. var S: string. function Power(Base. if Succ(RED) = BLUE then S := S + 'In the type Colors. Exponent: Extended): Extended. begin S := 'The predecessor of 5 is ' + IntToStr(Pred(5)) + #13#10.Button1Click(Sender: TObject). begin Label1.

for I := 1 to 50 do begin { Write to window at random locations } Canvas.gondraf@hotmail.. end.TextOut(5. Opendialog1. begin Randomize. 0). Inicializa o modo Randomico var I: Integer. .TXT') then ErrorMsg('Error renaming file!'). mtInformation. begin Randomize.'NEWNAME. end. end.Execute then begin SaveDialog1. Canvas. Random(Height). Newname). Newname is a string-type expression or an expression of type PChar uses Dialogs.. for I := 1 to 50 do begin { Write to window at random locations } Canvas. Remove um diretório uses Dialogs. var I: Integer. [mbOk].'. if SaveDialog1.FileName + ' to ' + SaveDialog1. Renomeia arquivos e retorna o sucesso ou insucesso The following code renames a file: if not RenameFile('OLDNAME. var f : file. 'Boo!'). function RemoveDir(const Dir: string): Boolean. 'Boo!'). end.TXT'.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 265 de 272 MessageDlg(S.. 'Renaming ' + Opendialog1. if Opendialog1. end. Rename(f.TextOut(Random(Width). NewName: string): Boolean.Title := 'Choose a file.FileName). SaveDialog1. procedure RmDir(S: string).FileName). Retorna um valor Randômico 0 <= X < Range. Remove um diretório retornando True caso tenha conseguido e False caso contrário procedure Rename(var F.Title := 'Rename to. function RenameFile(const OldName. end. '. Random(Height).TextOut(Random(Width). end.FileName). begin Opendialog1. procedure Randomize.. function Random [ ( Range: Integer) ]. F is a variable of any file type.Execute then begin AssignFile(f. 10. end.

if SelectDirectory(Dir. The current directory displayed in the dialog box is C:\MYDIR. 0). the directory is not created: the application should create it when SelectDirectory returns. If the user chooses Yes.Button1Click(Sender: TObject). function SetCurrentDir(const Dir: string): Boolean. if IOResult <> 0 then MessageDlg('Cannot remove directory'. Arredonda um número real function SelectDirectory(var Directory: string. The function returns True if the user selected a directory and chose OK.&#9. mtWarning. a Select Directory dialog box appears. but the application can access the Directory parameter to create the directory selected if desired. the directory is created.Used only when Options contains sdAllowCreate. sdPrompt]) then Label1.Meaning sdAllowCreate&#9. The user can select a directory from the directory list. Displays a message box that informs the user when the entered directory does not exist and asks if the directory should be created. a message box asks the user if the directory should be created. If the user chooses No. O Diretório passado para a função aparece como diretório corrente e o diretório escolhido é retonado no mesmo Diretório (Directory). If Options does not contain sdPerformCreate. end. HelpCtx: Longint):Boolean.Used when Options contains sdAllowCreate. begin . This option does not create a directory. sdPerformCreate. Coloca um novo tamanho para uma string S[0] := NewLength. If the user chooses OK.An edit box appears to allow the user to type in the name of a directory that does not exist. begin Dir := 'C:\MYDIR'. Torna o Dir o diretório corrente e retorna o sucesso da operação procedure SetLength(var S: string. 0) else MessageDlg('Directory removed'. If the user enters a new directory. This example uses a button on a form. procedure ShowMessage(const Msg: string). Options: TSelectDirOpts. var Dir: string. NewLength: Integer). sdPrompt&#9.Caption := Dir. O valor do diretório corrente não é alterado These are the possible values that can be added to the Options set: Value&#9. SelectDirectory creates it.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 266 de 272 begin {$I-} { Get directory name from TEdit control } RmDir(Edit1. Exibe uma mensagem ao usuário procedure TForm1. end. Exibe um Caixa de Dialogo para seleção de Diretório. the directory is created if Options contains sdPerformCreate. [sdAllowCreate. function Round(X: Extended): Longint. The name of the directory the user selects appears as the caption of the label: uses FileCtrl. procedure TForm1. If the user enters a directory name that does not exist.Text). or enter a new directory in the edit box. sdPerformCreate&#9. [mbOk].Button1Click(Sender: TObject). and False if the user chose Cancel or closed the dialog box without selecting a directory. mtInformation. When the user clicks the button.gondraf@hotmail. the message box goes away without creatubg the directory. [mbOk].

Caption := DateTimeToStr(ADateAndTime). Converte uma string para o formato DateTime procedure TForm1. Retorna uma string contendo Count caracters Ch S := StringOfChar('A'. begin ADate := StrToDate(Edit1.Text). begin ADateAndTime := StrToDateTime(Edit1. 10). Retorna o quadrado de X function Sqrt(X: Extended): Extended. Compara duas strings em case sensitivity Return value&#9. {sets S to the string 'AAAAAAAAAA'} function StrToDate(const S: string): TDateTime. Retorna a raiz quadrada de X function StrComp(Str1.Button1Click(Sender: TObject). Converte uma string num Float function StrToInt(const S: string): Integer. I := StrToInt(S).Button1Click(Sender: TObject). I: Integer. Edit1. end. var ADate: TDateTime. Inc(I).Condition <0&#9.Text := IntToStr(I). end. function StrToDateTime(const S: string): TDateTime. function Sqr(X: Extended): Extended.if Str1 > Str2 function StringOfChar(Ch: Char. begin S := '22467'. var ADateAndTime: TDateTime.if Str1= Str2 >0&#9. end.if Str1< Str2 =0&#9. Count: Integer): string. Converte uma string num inteiro procedure TForm1. Label1. var S: string.Caption := DateToStr(ADate).Button1Click(Sender: TObject). Str2 : PChar): Integer. Converte uma string em hora .gondraf@hotmail. Label1.Text). function StrToFloat(const S: string): Extended. Converte uma string em data procedure TForm1. end.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 267 de 272 ShowMessage('Push this button'). function StrToTime(const S: string): TDateTime.

begin Label1. function Succ(X). var ATime: TDateTime. Retorna a hora corrente procedure TForm1.com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 268 de 272 procedure TForm1. begin ATime := StrToTime(Edit1. function TimeToStr(Time: TDateTime): string.'. end. end. [mbOk]. end. var S: string. 0).Button1Click(Sender: TObject). Retorna o sucessor de um ordinal uses Dialogs. begin Label1. mtInformation. var . Retira os espaços em brancos a esquerda da string S function TrimRight(const S: string): string. Calcula a soma de dos elementos de um vetor function SumInt(const Data: array of Integer): Integer register. function Trim(const S: string): string. RED is the predecessor of BLUE. Converte hora para string procedure TForm1. Calcula a soma dos elementos de um vetor de inteiros function Time: TDateTime. end. MessageDlg(S.BLUE.Button1Click(Sender: TObject).Caption := 'The time is ' + TimeToStr(Time).Caption := TimeToStr(Time).GREEN). Label1.Text). function Sum(const Data: array of Double): Extended register. S := S + 'The successor of 10 is ' + IntToStr(Succ(10)) + #13#10.gondraf@hotmail. Converte o caracter Ch em maiúscula uses Dialogs. type Colors = (RED. Retira os espaços em brancos a direita da string S function Trunc(X: Extended): Longint. if Succ(RED) = BLUE then S := S + 'In the type Colors.Caption := TimeToStr(ATime). Retira os espaços em brancos a esquerda e a direita da string S function TrimLeft(const S: string): string. Retorna a parte inteira de um número function UpCase(Ch: Char): Char.Button1Click(Sender: TObject). begin S := 'The predecessor of 5 is ' + IntToStr(Pred(5)) + #13#10.

i : Integer. end. var I: Integer. begin for I := 0 to ListBox1.Button1Click(Sender: TObject).Text.Items[I] := UpperCase(ListBox1. [mbOk]. end. .Items[I]). for i := 1 to Length(s) do s[i] := UpCase(s[i]). Converte a string S em maiúsculas procedure TForm1. function UpperCase(const S: string): string. 0).com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 269 de 272 s : string.Items.gondraf@hotmail. begin { Get string from TEdit control } s := Edit1.Count -1 do ListBox1. mtInformation. MessageDlg('Here it is in all uppercase: ' + s. Consulte outras dicas no CD ou pesquise na internet.

..Exercício 01 Capitulo V – Estruturas Estrutura de bloco Prática 04 Pratica 05 – Exercício 02 Estruturas de decisão Pratica 06: Acendendo uma lâmpada Prática 07 Pratica 08 – Exercício 03 Pratica 09: Controlando o trânsito Projeto 10: Promovendo descontos Pratica 11 – Exercício 04 Estruturas de loop ou laço Pratica 12: Demonstração do Repeat . Until Pratica 13 – Exercício 05 Estruturas consecutivas Pág.gondraf@hotmail. 1 1 1 1 1 1 1 2 3 3 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 6 6 6 7 8 8 8 9 10 10 11 12 12 13 13 14 14 15 16 17 18 19 20 21 22 24 24 25 26 27 .com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 270 de 272 ÍNDICE Assunto Capitulo I – Definições Sistema Operacional Linguagem Linguagem estruturada Linguagem orientada a objeto Constantes Variáveis Operadores Dados Banco de Dados Rotina Procedimento Comandos Estruturas Capitulo II – Componentes básicos da orientação a objetos Classe Objeto Instância Propriedade Método Mensagem Interface Evento Procedimento Tempo de Projeto Tempo de Execução Capitulo III – Apresentação do Delphi 2005 Tela de Abertura VCL Form Application for WIN 32 Object Inspector Caixa de estruturas (Structure) A Paleta de Componentes Gerente do projeto (Project Manager) O Formulário A Unit Estrutura de uma Unit Capitulo IV – Os primeiros contatos Prática 01: O primeiro projeto Prática 02: Alterando algumas propriedades do formulário Prática 03 .

vendas. FindNearest) Prática 23 – Localizando registros (métodos Recnº) Prática 24 – Localizando registros (métodos Locate) Prática 25 – Localizando registros (métodos Filter) Exercício 10 – Crie consultas para o seu projeto Capitulo XVII – Relacionando tabelas Prática 26 – Relacionamento I Prática 27 – Relacionamento II Capitulo XVIII – O SQL Criando uma query pelo DataBase Desktop Criando uma relação entre duas tabelas através do query de modo interativo Criando uma relação entre três tabelas através do query de modo interativo Prática 28 – Criando o relacionamento entre as tabelas clientes. itens e materias em tempo de execução Prática 29 – Selecionando todas as compras de um cliente Operadores WHERE Exemplos de consultas Capitulo XIX – Trabalhando com mídias Prática 30 – Lendo mídias com uso de objetos Prática 31 – Tocando sons wave via função Capitulo XX – Trabalhando com diálogos 27 28 28 29 32 32 34 37 37 37 38 38 38 39 39 39 40 40 41 44 45 46 46 48 50 52 62 62 63 64 65 65 65 69 70 73 75 78 79 80 82 84 86 86 87 89 90 91 92 93 95 95 97 98 . localizando e excluindo dados de uma tabela em tempo de execução Prática 18 – Cadastro de clientes Exercício 08 – Crie um cadastro de produtos e um cadastro de fornecedores Capitulo XIV – Respondendo a mensagens Prática 19 – Utilizando o comando messagedlg Prática 20 – Utilizando o comando messagedlg Prática 21 – Utilizando o comando messagedlgpos Exercício 09 Capitulo XV – Rotinas especiais (Procedures e Funções) Capitulo XVI – Localizando dados em uma tabela Prática 22 – Localizando registros (métodos GotoKey. FindKey..do Estruturas de exceção Capitulo VI – Bancos de dados O BDEAdministrator O MSSQL Server Capitulo VII – O DataBase Desktop (DBD) Capitulo VIII – Trabalhando com o DataBase Desktop Exercício 06 Incrementando registros de uma tabela Navegando pelos registros de uma tabela Excluindo registros de uma tabela Organizando os registros de uma tabela Criando índices secundários Exercício 07 Capitulo IX – Incluindo tabelas em um formulário O Data-Module Pratica 15: Incluindo uma senha Criando um alias paradox Criando o data module Capitulo X – Incluindo menus em um formulário Prática 16 – Montando um formulário de controle Capitulo XI – Trabalhando com mais de um formulário Prática 17 – Anexando formulários Capitulo XII – Estruturando um projeto Capitulo XIII – Incluindo. GotoNearest.gondraf@hotmail..com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 271 de 272 Pratica 14: Demonstração do With.

com Fábio José de Gondra Ramos Delphi 2005 for win32 Página 272 de 272 Prática 32 – Trabalhando com diálogos Capitulo XXI – Trabalhando unidades. pastas e arquivos Prática 33 – Localizando e executando arquivos via objetos Prática 34 – Um gerenciador de arquivos Prática 35 – Outro gerenciador de arquivos Capitulo XXII – Trabalhando com gráficos Prática 36 – Criando gráficos Prática 37 – Criando gráficos com tabelas Capitulo XXIII – Literatura complementar Literatura 01 – Criando o arquivo de ajuda Literatura 02 – O Rave Report Capitulo XXIV – Dicas da internet 98 101 101 104 105 112 115 121 124 124 130 140 .gondraf@hotmail.

You're Reading a Free Preview

Descarregar
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->