Escolar Documentos
Profissional Documentos
Cultura Documentos
1491 - Delphi 2005 - Básico PDF
1491 - Delphi 2005 - Básico PDF
gondraf@hotmail.com
Delphi 2005 for win32 Página 1 de 272
Capitulo I – Definições
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.
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.
Constantes: São informações que possuem um valor predefinido, que não se altera durante um
processo.
Variáveis: São posições definidas na memória e reservadas para guardar dados ou resultados de
cálculos.
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:
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 de atribuição:
Operador Exemplo
: Variável:Integer
Operadores aritméticos:
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;
Operadores lógicos:
Operadores set:
Operadores relacionais:
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.
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:
Exemplo:
Rotina Procedimentos
1. Verificar se editora já foi cadastrada
2. Se não foi cadastrada, então pegar uma nova ficha
Cadastro de editoras 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.
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.
2) 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.
3) Estruturas de loop ou laço: Provocam a repetição de um ou vários procedimentos de acordo
com uma condição previamente descrita.
4) Estruturas consecutivas: Executa uma sucessão de declarações constituintes.
5) 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.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 5 de 272
Exemplo:
type
TFprincipal = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Exemplo:
Exemplo:
Mensagem: Representa uma ação do objeto ou uma mudança de estado. Define a comunicação
entre objetos.
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.
Tela de Abertura
Módulos carregados
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 7 de 272
Gerente do projeto
Caixa de
Estrutura
Object
Inspector
Object Inspector: É a conexão entre o a parte visual (Form) e a parte codificada (Unit) de sua
aplicação.
Botão minimizar
Botão fechar
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. Além das abas encontra-se uma outra região indicativa do
nome e da classe do objeto selecionado.
Botão minimizar
Botão Fechar
Excluir objeto
Incluir objeto
Objetos
A Paleta de Componentes: É a principal barra de ferramenta, pois contem barras que classificam
e guardam os componentes (objetos) que serão utilizados durante o desenvolvimento de projetos
em Delphi.
Os componentes contidos nas abas da paleta de componentes são alvos de nosso estudo, portanto,
serão apresentados conforme sua necessidade nos capítulos a seguir.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 9 de 272
Botão minimizar
Botão fechar
Botão filtrar
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,
procedimentos e funções contidas no projeto.
Botão minimizar
Botão minimizar
Seleciona projeto
Remove unit/form do
projeto
Unit/form do projeto
Modelo do projeto
Explorador de base de
dados
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 10 de 272
O Formulário:
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
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 11 de 272
Unit <identificador>;
Interface
{Especifica o que será exportado pela UNIT a fim de ser utilizados
por outros módulos}
<seções de declaração>
Implementation
{Declaração de Variáveis, Constante e tipos locais a UNIT e
Implementação dos métodos.
<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.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 12 de 272
- 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.
Resumindo temos:
Objeto Evento Procedimento
Botão Verde Clicar Cor do semáforo = Verde
Botão Amarelo Clicar Cor do semáforo = Amarelo
Botão Vermelho Clicar Cor do semáforo = Vermelho
Para alterar a cor, “propriedade color”, usaremos os botões 1, 2 e 3, conforme descrito a seguir:
Para alterar a largura, “propriedade height”, usaremos os botões 4 e 5, conforme descrito a seguir:
Para alterar a altura, “propriedade top”, usaremos os botões 8 e 9, conforme descrito a seguir:
Prática 03 - Exercício 01: O objetivo dessa prática é alterar algumas propriedades do objeto
TPanel, clicando sobre os botões.
Formulário:
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, provocam tomadas de decisões,
controlam repetições, deviam o fluxo do projeto e controlam as possíveis exceções.
6) 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.
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.
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.
9) Estruturas consecutivas: Executa uma sucessão de declarações constituintes.
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.
a) Estrutura de bloco:
Esta estrutura é sempre composta pelos comandos Begin ... End, onde o primeiro determina o
início da estrutura e o segundo o seu fim.
Um ponto e vírgula após um comando indicam que ainda existem comandos ou declarações
pertencentes a estrutura, porém quando o comando End é sucedido do ponto e vírgula indica o fim
da estrutura.
O uso do ponto ao final após o End, indica o fechamento do projeto.
Fábio José de Gondra Ramos
gondraf@hotmail.com
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, pegar o
carro e ir até o trabalho.
Inicio
Rotina despertar;
Inicio
Acordar;
Forrar a cama;
Sair do quarto;
Estruturas
Fim;
Rotina asseio;
Estrutura Princpal
Inicio
Escovar os dentes;
Tomar banho;
Fim;
Rotina alimentação;
Secundárias
Inicio;
Preparar a comida;
Sentar a mesa;
Comer;
Fim;
Rotina trabalhar;
Inicio;
Pegar o carro;
Ir ao trabalho;
Desligar o carro;
Trabalhar;
Fim;
Fim.
Exemplo 02:
Prática 04:Baseado no exemplo 02, montaremos um projeto para somar dois números inteiros.
Formulário:
Procedimentos:
A função inttostr(integer):string;
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.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 17 de 272
b) Estruturas de decisão:
Muitas vezes em um projeto o processador precisa decidir entre dois ou mais valores, 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.
As estruturas de decisão utilizam operadores relacionais, podendo também fazer uso de operadores
lógicos.
Na estrutura If ... Then ... Else a decisão é única e quando for verdadeira os comandos que
estiverem após o Then serão executados, enquanto os comandos que estiverem após o else serão
desprezados. 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.
Quando o interruptor é fechado permite a passagem da corrente elétrica, acendendo a lâmpada e
quando ele é aberto, interrompe-se a passagem da corrente elétrica e a lâmpada não acende.
Assim:
Início
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 18 de 272
Formulário:
Procedimentos:
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
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, calcular sua raiz
quadrada, definir se é exata ou inexata e separar a parte inteira da parte decimal.
Formulário:
Procedimentos:
Comentários:
Pratica 08 – Exercício 03: Monte um projeto onde o usuário informe o nome do aluno e 04 notas,
obtendo como saída, a média aritmética das notas fornecidas e situação em que o aluno se
encontra, baseando-se na condição abaixo.
Condições propostas: O aluno será aprovado se obter uma média >= 6.
Na estrutura Case ... of... Else ... End a decisão é baseada em múltipla escolha sendo executados
apenas os comandos que satisfaçam a condição.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 21 de 272
Atenção: A estrutura Case...of... Else... End, só aceita condições com valores inteiros.
Para entender melhor o funcionamento desta estrutura imagine um semáforo controlando o fluxo
de veículos, a cada cor acessa uma mensagem é enviada ao motorista e como apenas uma cor
acende por vez, o motorista nunca receberá mais que uma mensagem ao mesmo tempo.
Formulário:
Variáveis:
Clausula Variável Tipo
Private Carro Integer
Procedimentos:
0:begin
image1.Picture.LoadFromFile('c:\delphi 2005\pratica 09\carro1.bmp');
carro:=1;
end;
1:begin
image1.Picture.LoadFromFile('c:\delphi 2005\pratica 09\carro2.bmp');
carro:=0;
end;
end;
end;
Comentários:
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:
Formulário:
Procedimentos:
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:
Formulário:
Procedimentos:
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 26 de 272
- While... do: Executa sua sucessão de declarações constituintes continuamente e testa a expressão
antes de cada repetição. Quando o resultado da expressão é não é mais satisfeita, o while termina.
Comentários:
- For... to... do // For... downto... do: Executa sua sucessão de declarações constituintes
continuamente até que o valor inicial atinja o valor final, através de uma incrementação, (clausula
to), ou decrementação, (clausula downto), quando o valor final é alcançado, o for termina.
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.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 27 de 272
d) Estruturas consecutivas:
Para entender melhor o funcionamento desta estrutura monte o projeto descrito a seguir.
Formulário:
Procedimentos:
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.
Estruturas:
- Try… Except – Tenta executar um bloco de comandos caso não consiga, o fluxo geraria uma
interrupção que tenderia a interromper a execução do projeto, com o uso do except um
segundo bloco tentará ser executado.
Exemplo:
try
X := Y/Z;
except
on EZeroDivide do HandleZeroDivide;
end;
- Esta declaração tenta dividir Y por Z, mas se uma exceção é encontrada é chamada uma
rotina nomeada HandleZeroDivide de EZeroDivide, (erro:divisão por zero).
- Try… finally – Tenta executar um bloco, se uma interrupção provocar uma
parada no fluxo de execução do projeto, o uso do finally o interpretará como fim do
processo executando um segundo bloco de comandos.
Exemplo:
Reset(F);
try
... // process file F
finally
CloseFile(F);
end;
Os bancos de dados são estruturas capazes de armazenar informações fornecidas por usuários para
utilizações futuras, 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.
Para que uma linguagem consiga abrir, ler ou armazenar dados em uma tabela é necessário a
presença de uma ferramenta conhecida como gerenciador de bancos de dados.
O BDEAdministrator:
O BDE é uma ferramenta utilizada para fazer a conectividade entre o Delphi, C++Builder®,
IntraBuilder®, Paradox® for Windows, e Visual dBASE® for Windows.
Aba de definições (DataBases): Nesta aba são definidos os alias que indicarão onde serão
definidos os tipos, os drives, o local, a forma de acesso e comportamento das bases de dados que
poderão se acessadas mediante o chamamento do alias.
Aba de configurações (Configuration): Nesta aba são definidos as configurações dos drives e
comportamento do sistema.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 30 de 272
Os drives carregados pelo BDE são divididos em dois grupos: Native e ODBC, descritos a seguir:
Type: Tipo do servidor para o qual este drive conecta. Pode ser SERVER (servidor de SQL) ou
FILE (standard, arquivo baseado em servidor).
Block Size: Determina o tamanho do bloco resevado para aramazenamento das tabelas Paradox,
Os blocos ocupam múltiplos de 1024 bytes dispostos nos seguintes níveis:
Fill Factor: Porcentagem de bloco de disco atual que deve ser enchido antes do Paradox alocar
outro bloco de disco para arquivos de índice. Pode ser qualquer inteiro que varia de 1 a 100.
Default: 95
Nota: valores Menores oferecem desempenho melhor mas aumentam o tamanho de índices.
Valores maiores dão arquivos de índice menores mas aumentam o tempo para criação de um
índice.
Para usar campos Blob, índices secundários, e integridade referente, especifique Paradox nível 4
ou nível 5. Você pode usar o nível mais baixo possível para forçar a compatibilidade para um nivel
anterior. Só escolha Nível 7 se você precisa das características de posicionamento avançadas
aplicadas para aquele formato de tabela.
Para acessarmos as tabelas que utilizam este gerenciador utilizaremos os componentes da paleta
BDE.
Fábio José de Gondra Ramos
gondraf@hotmail.com
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.
OBS: Para utilizar qualquer uma destas estruturas os gerenciadores devem estar instalados no
equipamento de desenvolvimento.
O DataBase Desktop é um utilitário que nos permite cria, ver, ordenar, modificar “Tables”
(Tabelas de dados) e “Query” (Tabelas de consultas) nos formatos Paradox, dBASE, e SQL.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 33 de 272
Menu
Barra de
ferramentas
Área de
trabalho
Barra de
status
Comando Descrição
File Menu de controle de arquivos
Edit Menu de edição de arquivos e preferências
Tools Menu de ferramentas
Window Menu de exibição de janelas
Help Menu de ajuda do DBD
Subcomando Descrição
New Cria uma nova tabela, query ou SQL
Open Abre uma tabela, query ou SQL
Close Fecha uma tabela, query ou SQL
Save Salva uma tabela, query ou SQL
Save As... Salva uma tabela, query ou SQL em outra
Working Directory... Define um diretório como de trabalho
Private Directory... Define um diretório como privado
Caso a opção open seja selecionada os comandos do menu serão alteradas como veremos a seguir.
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, porém se a opção open estiver ativa os
comandos do menu serão alterados.
Subcomando Descrição
Alias manager.. Ativa o gerenciador de Alias, isto é, abrirá o
Borland DataBase Engine (BDE), gerenciador de
bases de dados da Borland
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 34 de 272
O comando window estará inabilitado até que a opção open seja ativada e apresentará a seguinte
lista de subcomandos:
Subcomando Descrição
Cascade Exibirá as janelas das tabelas na forma de cascata
Tile top and bottom Exibirá as janelas das tabelas uma abaixo da outra
Side by side Exibirá as janelas das tabelas uma ao lado da outra
Arrange icons Organizará as janelas em icones
Close all Fecha todas as janelas
A forma de armazenamento dos dados juntamente com a grande quantidade de aplicativos capazes
de criar tabelas, associadas as diversas linguagens de programação existentes, fizeram com que
surgissem várias estruturas ou tipos de tabelas, cada uma com sua características próprias. Por essa
razão o desenvolvedor terá que identificar e ajustar o delphi àquela que melhor lhe convir.
Para iniciarmos o trabalho com o DBD, criaremos uma nova pasta na unidade c: e a chamaremos
de “Delphi 2005”, 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.
Nome do campo (Field Name): Determina o nome que será usado para identificação do campo.
Tipo (Type): Determina o tipo do dado que será aceito pelo campo.
Os tipos dos dados disponíveis variarão de acordo com a estrutura escolhida, no nosso caso,
iniciaremos com a estrutura Paradox em sua versão 7.0.
* * * Opcional
Obs: Se todos seus memos são menores que um determinado tamanho (por exemplo, 200 caráter),
você pode economizar espaço e tempo fixando o tamanho de campo de memo igual ou maior que
este tamanho. O Banco de dados guarda na tabela o memo inteiro se ele é menor que o tamanho
determinado.
A partir deste conhecimento criaremos uma tabela simples conforme a descrição abaixo:
Crie a pasta: “C:\Delphi 2005\Tabelas”, agora abra o DBD e escolha as opções: “File”; “New” e
“Table”:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 37 de 272
Aponte o tipo da tabela para Paradox 7, conforme a figura acima e click sobre OK;
Aparecerá a janela de edição de tabelas em Paradox, preencha conforme a tabela descrita
anteriormente.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 38 de 272
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:
Para se incluir registros a uma tabela sem conduto ter que fazer um projeto para isso, proceda da
seguinte maneira:
Comando Descrição
File Menu de controle de arquivos
Edit Menu de edição de arquivos e preferências
Tools Menu de ferramentas
View Menu de visualização de registros
Table Menu de controle sobre a tabela
Record Menu de controle sobre registros da tabela
Window Menu de exibição de janelas
Help 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.
Para se navegar sobre os registros de uma tabela sem conduto ter que fazer um projeto para isso,
proceda da seguinte maneira:
Para se excluir os registros de uma tabela sem conduto ter que fazer um projeto para isso, proceda
da seguinte maneira:
Um índice é um arquivo que determina a ordem em uma tabela. O paradox, o dBASE, e o SQL
usam índices para organizar os registros em uma tabela, mas os índices deles/delas trabalham
diferentemente. Os índices podem ser primários ou secundários. No paradox, o índice primário é
chamado também a chave (KEY).
Os índices secundários geralmente são criados durante a confecção da tabela, portanto se a tabela
já existir teremos que reestruturá-la.
No processo de reestruturação se alterarmos a forma dos campos ou excluirmos algum campo, os
dados contidos nestes deverão ser ajustados para a nova forma do campo ou serão perdidos se o
campo for excluído, no entanto, a criação de índices secundários não afetaram, “a princípio”, os
dados armazenados.
Para se criar índices secundários em uma tabela sem conduto ter que fazer um projeto para isso,
proceda da seguinte maneira:
Para melhor entendimento criaremos dois índices secundários: o primeiro Unique (sem repetições
válidas), para o campo CPF e o segundo Maintained, (com repetições válidas), para o campo
Nome da tabela “Pessoal.db”.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 40 de 272
Uma vez aberta a tabela selecione a opção Secundary Indexes, na caixa de rolagem Table
Properties;
Em seguida click sobre o botão Define. Surgirá então a janela de definições descrita a seguir:
Agora proceda de maneira semelhante para o campo Nome, alterando, porém, a opção do índice
para Maintained na caixa Index options e salvando com o nome: NOMIDX
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, e a segunda consiste em utilizar-se de
um tipo especial de formulário denominado Data-Module. Geralmente usam-se os data-module’s
quando a tabelas são compartilhadas entre vários formulários.
Por exemplo: Pode-se se escrever um procedimento que autorize o fechamento de tabelas, neste
evento, e sempre que o data-module for destruído, ele fechará as tabelas antes de se destruir.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 42 de 272
OldCreateOrder – Está propriedade do tipo boolean, 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.
Após a criação da tabela “Acessos”, precisaremos criar o data module, e neste inserir objetos
capazes de acessar a tabela, porem, definiremos um “ALIAS”, (atalho para a pasta onde estão as
tabelas), e o chamaremos de dados.
1- Selecione a opção Object no menu opções e nesta selecione New ou pressione Ctr+N:
ENABLE BCD: Specifica se BDE traduz campos numéricos e decimais em valores de ponto
flutuantes ou valores em decimal codificado binário (BCD). Valores de BCD eliminam os erros de
arredondamento associados com matemática de ponto flutuante (exemplo: 3 * (2/3) resultando em
2.00000000001). Quando ENABLE BCD é fixado para TRUE, decimais e campos numéricos são
convertidos para BCD. Default é FALSE.
Parâmetro Valor
TYPE STANDARD
DEFAULT DRIVER PARADOX
ENABLE BCD FALSE
PATH C:\Delphi 2005\Tabelas
6- Agora resta-nos apenas salvar o nosso alias: Opções: Object e Save As.
Agora que já temos um alias criado partiremos para a criação o data module.
Data-module Name DM
Data-module OnCreate DatamoduleCreate
Data-module OnDestroy DatamoduleDestroy
Table1 Name TAcessos
Table1 DatabaseName Dados
Table1 TableName Acessos.DB
DataSource1 Name DSAcessos
DataSource1 DataSet TAcessos
Alteradas as propriedades deve-se indicar quais campos da tabela estarão disponíveis ao projeto.
Procedimentos:
Agora que o data module está pronto montaremos um formulário para entrada do usuário e sua
senha.
Formulário:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 45 de 272
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls,udm;
private
tentativas:integer;
Procedimentos:
Comentários:
A montagem de menus é algo bastante comum em aplicativos que seguem os padrões Windows,
isto é, aplicativos que se executam em janelas.
Tanto no MainMenu como no PopupMenu, 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.
Fábio José de Gondra Ramos
gondraf@hotmail.com
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.
Formulário:
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 48 de 272
É comum na maioria dos projetos a presença de vários formulários, tanto pelo fato da quantidade
de objetos utilizados, como por uma questão de lógica e organização.
Os formulários precisam ser abertos e após seu uso novamente fechados para evitar seu acúmulo
na memória do computador.
a)Abertura de formulário:
Comandos: Show;
ShowModal.
O comando Show abre um formulário em uma janela, mantendo disponível as janelas abertas
anteriores a atual
O comando ShowModal abre um formulário em uma janela, não permitindo acesso às janelas
abertas anteriores a atual.
Observe as práticas 16 e 17, verifique que de certo modo eles se completam. O que vamos fazer
agora é anexar estas duas práticas em um único projeto, dando assim uma visão maior sobre
projetos em delphi.
Pronto as duas práticas agora pertencem ao mesmo projeto, no entanto, precisamos criar uma
interface entre seus códigos e seu formulários.
Para criar tal interface utilizamos ao final da clausula USES da unit do projeto de senhas,
incluímos Upratica16, que corresponde ao nome da unit da pratica 16:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls,udm,Upratica16;
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 49 de 272
No menu principal click sobre File e escolha a opção: Save projet as..., dando-lhe o nome de
pratica17.
Comentários:
Fpratica16.Show
Execute o projeto e mova a janela do menu principal de forma a enxergar o formulário de senha,
em seguida clique sobre ele.
Comentários:
Fpratica16.ShowModal
Execute o projeto e mova a janela do menu principal de forma a enxergar o formulário de senha,
em seguida clique sobre ele.
Comentários:
b) Fechamento de formulário:
Comandos: Close;
Halt.
Inclua ao projeto o evento click no objeto Sair1, este objeto foi criado pelo delphi quando
incluímos o item Sair no mainmenu1.
begin
Close;
end;
Comentários:
Comentários:
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, para leitura de registros de uma tabela
armazenada em um banco de dados, incrementar registros e atualizar a tabela.
Observe a presença de rotinas em cada processo. 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.
A seguir está demonstrado um algoritmo simples, para leitura de registros de uma tabela
armazenada em um banco de dados, incrementar registros e atualizar a tabela.
1-Início
2-Localiza base de dados
3-Identifica a tabela
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 51 de 272
6.1-Mostrar valores
6.2-Exclui dados?
6.2.1-Se sim:
6.2.1.1-Excluir dados
6.2.1.2-Dados excluídos com sucesso?
6.2.1.2.1-Se sim:
6.2.1.2.1.1-Informar ao usuário
6.2.1.2.1.2-Excluir outros registros?
6.2.1.2.1.2.1-Se sim:
6.2.1.2.1.2.1.1-Retornar para ação - 2
6.2.1.2.1.2.2-Se não:
6.2.1.2.1.2.2.1-Voltar p/ definição de ação 5
6.2.1.2.2-Se não:
6.2.1.2.2.1-Informar ao usuário
6.2.1.2.2.2-Voltar para äefinição de ação 5
6.2.2-Se não:
6.2.2.1-Voltar para definição de ação 5
7-Se não:
7.1-Informar ao usuário
7.2-Excluir outro?
7.2.1-Se sim:
7.2.1.1-Retornar para ação - 2
7.2.2-Se não:
7.2.2.1-Voltar para definição de ação 5
8-Fim dos casos
9-Finalizar?
9.1-Se sim:
9.1.1-Fechar tabela
9.1.2-Fechar formulário
9.2- Se não:
9.2.1- Voltar para definição de ação 5
Fim
Observações: O algoritmo descrito acima poderá ser escrito de maneiras diferentes, dependendo
apenas da linha de raciocínio do desenvolvedor.
Capitulo XIII – Incluindo, localizando e excluindo dados de uma tabela em tempo de execução:
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:
Name elogradouro
LabeledEdit4 EditLabel.Caption Logradouro
LabelPosition lpleft
Name ecomplemento
LabeledEdit5 EditLabel.Caption Complemento
LabelPosition lpleft
LabeledEdit6 Name enumero
EditLabel.Caption Número
LabelPosition lpleft
Name ecidade
Sorted True
Aracaju
ComboBox2 Estância
Items.Strings Itabaiana
Nossa Senhora da
Glória
Name eestado
Sorted True
AL
ComboBox3 AM
Items.Strings BA
PE
SE
Name ecep
EditMask 99999-999
MaskEdit3
MaxLength 9
Text Vazio (null)
Name etelefone
EditMask (99)9999-9999
MaskEdit4
MaxLength 13
Text Vazio (null)
Name mensagens
Panel2 Align alBottom
Caption Defina uma ação
ImageList1
Procedimentos:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Mask, Grids, DBGrids, StdCtrls, ExtCtrls, ToolWin, ImgList,
Buttons, udm, db;
private
acao:integer;
erg_insestadual.Text:='';
elogradouro.Text:='';
ecomplemento.Text:='';
enumero.Text:='';
ecidade.Text:='';
eestado.Text:='';
ecep.Text:='';
etelefone.Text:='';
//inicialização da acao
acao:=0;
//abertura da tabela
dm.TClientes.Open;
end;
ecodigo.Text:=dm.TClientesCodigo.Text;
etipo.ItemIndex:=dm.TClientesTipo.Value;
ebairro.Text:=dm.TClientesBairro.Text;
ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text;
ecliente.Text:=dm.TClientesCliente.Text;
erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text;
elogradouro.Text:=dm.TClientesLogradouro.Text;
ecomplemento.Text:=dm.TClientesComplemento.Text;
enumero.Text:=dm.TClientesNumero.Text;
ecidade.Text:=dm.TClientesCidade.Text;
eestado.Text:=dm.TClientesEstado.Text;
ecep.Text:=dm.TClientesCep.Text;
etelefone.Text:=dm.TClientesTelefone.Text;
//informando ao usuário
mensagens.Caption:='Rotina de navegação de registros';
end;
ecomplemento.Text:='';
enumero.Text:='';
ecidade.Text:='';
eestado.Text:='';
ecep.Text:='';
etelefone.Text:='';
//inicialização da acao
acao:=0;
end;
etipo.ItemIndex:=dm.TClientesTipo.Value;
ebairro.Text:=dm.TClientesBairro.Text;
ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text;
ecliente.Text:=dm.TClientesCliente.Text;
erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text;
elogradouro.Text:=dm.TClientesLogradouro.Text;
ecomplemento.Text:=dm.TClientesComplemento.Text;
enumero.Text:=dm.TClientesNumero.Text;
ecidade.Text:=dm.TClientesCidade.Text;
eestado.Text:=dm.TClientesEstado.Text;
ecep.Text:=dm.TClientesCep.Text;
etelefone.Text:=dm.TClientesTelefone.Text;
//redefinindo acao
acao:=2;
mensagens.Caption:='Ação redefinda para navegação';
//redefinição dos botões
salvar.Enabled:=false;
excluir.Enabled:=true;
end
else
begin
//redefinição dos botões
salvar.Enabled:=true;
excluir.Enabled:=false;
end;
end;
2:begin
//verificando se o registro já existe
dm.TClientes.Locate('codigo',ecodigo.Text,[locaseinsensitive]);
if ecodigo.Text=dm.TClientesCodigo.Text then
begin
// mostrando os dados
ecodigo.Text:=dm.TClientesCodigo.Text;
etipo.ItemIndex:=dm.TClientesTipo.Value;
ebairro.Text:=dm.TClientesBairro.Text;
ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text;
ecliente.Text:=dm.TClientesCliente.Text;
erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text;
elogradouro.Text:=dm.TClientesLogradouro.Text;
ecomplemento.Text:=dm.TClientesComplemento.Text;
enumero.Text:=dm.TClientesNumero.Text;
ecidade.Text:=dm.TClientesCidade.Text;
eestado.Text:=dm.TClientesEstado.Text;
ecep.Text:=dm.TClientesCep.Text;
etelefone.Text:=dm.TClientesTelefone.Text;
//redefinição dos botões
salvar.Enabled:=true;
excluir.Enabled:=true;
end
else
begin
// informando ao usuario
showmessage('Registro não existe');
//redefinição dos botões
salvar.Enabled:=false;
excluir.Enabled:=false;
end;
end;
end;
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 62 de 272
end;
if ecodigo.Text='' then
begin
// redefinindo acao
acao:=0;
mensagens.Caption:='Defina uma ação';
//redefinição dos botões
salvar.Enabled:=false;
excluir.Enabled:=false;
end;
end;
erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text;
elogradouro.Text:=dm.TClientesLogradouro.Text;
ecomplemento.Text:=dm.TClientesComplemento.Text;
enumero.Text:=dm.TClientesNumero.Text;
ecidade.Text:=dm.TClientesCidade.Text;
eestado.Text:=dm.TClientesEstado.Text;
ecep.Text:=dm.TClientesCep.Text;
etelefone.Text:=dm.TClientesTelefone.Text;
//redefinição dos botões
salvar.Enabled:=true;
excluir.Enabled:=true;
//redefinindo a ação
acao:=2;
end;
Comentários:
Observe os comportamentos dos botões salvar e excluir na prática 18, uma vez pressionados o
usuário perde o controle sobre a ação, isto é, não existe um pedido de confirmação, o registro será
salvo ou excluído.
As mensagens são funções especiais definidas pelo delphi onde o desenvolvedor passa
informações de advertência, erro ou instruções ao usuário.
Mensagens de diálogo:
Comandos: MessageDlg; e
MessageDlgPos.
MessageDlg: Exibe uma caixa de diálogo no centro de tela. Utilize MessageDlg para expor uma
caixa de mensagem e obter a resposta do usuário.
Sintaxe:
Descrição:
MessageDlg: Devolve o valor do botão que o usuário selecionou. A tabela seguinte lista os valores
de TMsgDlgBtn por cada tipo de botão que pode aparecer na caixa de mensagem, e o valor
correspondente que é devolvido se o usuário seleciona aquele botão:
Formulário:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 66 de 272
Procedimentos:
Comentários:
Formulário:
Procedimentos:
Comentários:
Formulário:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 67 de 272
Procedimentos:
Comentários:
Exercício 09 – Na prática 18, inclua na rotina de exclusão uma mensagem de confirmação para
decisão do usuário.
Observe a prática 18, note que existem rotinas que se repetem várias vezes durante a confecção da
página de código:
Observe agora o procedimento elocalizarclick, 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,
mudando-se apenas o seu valor.
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, a cláusula implementation para
sua descrição.
Abra a pratica 18 e nela o formulário FClientes, para criar o procedimento limparcampos proceda a
seguinte descrição.
var
Fclientes: TFclientes;
procedure Limparcampos();
procedure limparcampos();
begin
with fclientes do
begin
ecodigo.Text:='';
etipo.ItemIndex:=-1;
ebairro.Text:='';
ecpf_cnpj.Text:='';
ecliente.Text:='';
erg_insestadual.Text:='';
elogradouro.Text:='';
ecomplemento.Text:='';
enumero.Text:='';
ecidade.Text:='';
eestado.Text:='';
ecep.Text:='';
etelefone.Text:='';
end;
end;
Agora que a procedure já foi criada é só chamá-la, para isso localize o comentário \\ limpeza dos
campos, nos procedimentos da unit de fclientes, substitua as linhas que executam a limpeza por
limparcampos();, conforme descrição.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 69 de 272
As rotinas // transferencia dos dados da tabela para o formulário e // mostrando os dados, fazem a
mesma coisa, portanto podem ser substituídas por uma procedure que denominaremos de
procedure mostrardados(),
var
Fclientes: TFclientes;
procedure Limparcampos();
procedure Mostrardados();
procedure Mostrardados();
begin
with fclientes do
begin
ecodigo.Text:=dm.TClientesCodigo.Text;
etipo.ItemIndex:=dm.TClientesTipo.Value;
ebairro.Text:=dm.TClientesBairro.Text;
ecpf_cnpj.Text:=dm.TClientesCpf_cnpj.Text;
ecliente.Text:=dm.TClientesCliente.Text;
erg_insestadual.Text:=dm.TClientesRg_insestaudal.Text;
elogradouro.Text:=dm.TClientesLogradouro.Text;
ecomplemento.Text:=dm.TClientesComplemento.Text;
enumero.Text:=dm.TClientesNumero.Text;
ecidade.Text:=dm.TClientesCidade.Text;
eestado.Text:=dm.TClientesEstado.Text;
ecep.Text:=dm.TClientesCep.Text;
etelefone.Text:=dm.TClientesTelefone.Text;
end;
end;
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 70 de 272
Agora substitua as linhas que mostram os dados por mostrardados();, conforme descrição.
Depois que montamos algumas procedures e substituímos no nosso projeto observamos que um
grande número de linhas foram suprimidos, porém ainda há mais por fazer.
Observe o evento elocalizaClick, note que para cada valor do item.index os objetos que sofrem
alterações são os mesmos, apenas os valores atribuídos se alteram, este tipo de comportamento
sugere que de acordo com o item escolhido devemos informar seu valor.
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.
function ajustabusca(tabela:TTable;editmascara:TMaskedit;indice,mascara,texto:string;campo:tlabelededit):boolean;
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:
Obs: Os nomes atribuídos as variáveis de uma função não são convencionados, cabe ao
programador usar a nomeclatura que melhor lhe convir.
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.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, Mask, Grids, DBGrids, StdCtrls, ExtCtrls, ToolWin, ImgList,
Buttons, udm, db, DBTables;
var
Fclientes: TFclientes;
procedure Limparcampos();
procedure Mostrardados();
function ajustabusca(tabela:TTable;editmascara:TMaskedit;indice,mascara,texto:string;campo:tlabelededit):boolean;
function ajustabusca(tabela:TTable;editmascara:TMaskedit;indice,mascara,texto:string;campo:tlabelededit):boolean;
begin
tabela.IndexName:=indice;
tabela.SetKey;
tabela.First;
editmascara.EditMask:=mascara;
editmascara.Text:='';
editmascara.Width:=campo.Width;
result:=true;
end;
Comentários:
De nada adianta incluir dados em uma tabela se não tiver um meio de localizar o que foi incluído.
Para isso alguns métodos foram incorporados ao delphi:
Uso de coringa
Uso de parâmetro
Uso de Chave
Método Características
Abra a pratica 18 e inclua 10 registros no cadastro de clientes, em seguida feche a pratica e inicie
uma nova aplicação.
Formulário:
Name TClientes
Table1 DataBaseName Dados
TableName Clientes.DB
DataSource1 DataSet TClientes
Label1 Caption Código
Label2 Caption Cliente
Label3 Caption Cpf / cnpj
Label4 Caption Rg /I.Estaudal
Label5 Caption Logradouro
Label6 Caption Número
Label7 Caption Complemento
Label8 Caption Bairro
Label9 Caption Cidade
Label10 Caption Estado
Label11 Caption Cep
Label12 Caption Telefone
DbGrid1 DataSource DataSource1
DataSource DataSource1
DBEdit1
DataField Código
DataSource DataSource1
DBEdit2
DataField Cliente
DataSource DataSource1
DBEdit3
DataField Cpf_cnpj
DataSource DataSource1
DBEdit4
DataField Rg_inestadual
DataSource DataSource1
DBEdit5
DataField Logradouro
DataSource DataSource1
DBEdit6
DataField Numero
DataSource DataSource1
DBEdit7
DataField Complemento
DataSource DataSource1
DBEdit8
DataField Bairro
DataSource DataSource1
DBEdit9
DataField Cidade
DataSource DataSource1
DBEdit10
DataField Estado
DataSource DataSource1
DBEdit11
DataField Cep
DataSource DataSource1
DBEdit12
DataField Telefone
Procedimentos:
function vergroupbox(bg1,bg2:TGroupBox;ver1,ver2:boolean):boolean;
begin
bg1.Visible:=ver1;
bg2.Visible:=ver2;
result:=true;
end;
tclientes.Open;
radiogroup1.ItemIndex:=-1;
end;
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 75 de 272
Formulário:
DataSource DataSource1
DBEdit1
DataField Código
DataSource DataSource1
DBEdit2
DataField Cliente
DataSource DataSource1
DBEdit3
DataField Cpf_cnpj
DataSource DataSource1
DBEdit4
DataField Rg_inestadual
DataSource DataSource1
DBEdit5
DataField Logradouro
DataSource DataSource1
DBEdit6
DataField Numero
DataSource DataSource1
DBEdit7
DataField Complemento
DataSource DataSource1
DBEdit8
DataField Bairro
DataSource DataSource1
DBEdit9
DataField Cidade
DataSource DataSource1
DBEdit10
DataField Estado
DataSource DataSource1
DBEdit11
DataField Cep
DataSource DataSource1
DBEdit12
DataField Telefone
Procedimentos:
tclientes.Next;
registros.Caption:='Registro n°:'+inttostr(tclientes.RecNo);
end;
Comentários:
Formulário:
Procedimentos:
begin
tclientes.Open;
radiogroup1.ItemIndex:=-1;
radiogroup2.ItemIndex:=-1;
end;
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 80 de 272
Formulário:
DataSource DataSource1
DBEdit3
DataField Cpf_cnpj
DataSource DataSource1
DBEdit4
DataField Rg_inestadual
DataSource DataSource1
DBEdit5
DataField Logradouro
DataSource DataSource1
DBEdit6
DataField Numero
DataSource DataSource1
DBEdit7
DataField Complemento
DataSource DataSource1
DBEdit8
DataField Bairro
DataSource DataSource1
DBEdit9
DataField Cidade
DataSource DataSource1
DBEdit10
DataField Estado
DataSource DataSource1
DBEdit11
DataField Cep
DataSource DataSource1
DBEdit12
DataField Telefone
Procedimentos:
Comentários:
Agora que vimos algumas práticas de consultar dados de uma tabela, inclua no menu de consultas
do projeto Pratica 18.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 82 de 272
A relação entre tabelas consiste basicamente na interligação entre os campos das tabelas a se
relacionar, pode ser sincrônica, quando os campos relacionais das duas tabelas sofrem alterações
simultaneamente, ou não sincrônica quando apenas o campo de uma das tabelas sofre alteração.
Existem objetos capazes de criar relações entre tabelas, porém estes objetos exigem que os campos
sejam do mesmo tipo.
Existe também uma Linguagem EStruturada de Questões (Consultas), definida e conhecida como
SQL, baseada nas estruturas das tabelas e capazes de gerar relacionamentos entre elas.
Além dos objetos e do SQL, as relações também podem ser feitas através de métodos,
procedimentos ou funções capazes de associarem campos de tabelas diferentes.
Para entendermos os relacionamentos entre tabelas vamos criar 03 tabelas e salva-las no alias
dados.
Tabela de materiais:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 83 de 272
Tabela de Vendas:
Tabela de itens
Prática 26 – Relacionamento I
Formulário:
Caption Cupons
Align AlTop
Alignment AlCenter
StaticText2
Color clBlue
Font.size 12
Font.color clWhite
Caption Itens do cupom
Align AlTop
Alignment AlCenter
StaticText3
Color clBlue
Font.size 12
Font.color clWhite
Caption Materiais
Align AlTop
Alignment AlCenter
StaticText4
Color clBlue
Font.size 12
Font.color clWhite
Label1 Caption Código
Label2 Caption Classe
Label3 Caption Produto
Label4 Caption Preço de custo
Label5 Caption Preço de venda
Label6 Caption Saldo
DataSource DSMateriais
DBEdit1
DataField Código
DataSource DSMateriais
DBEdit2
DataField Classe
DataSource DSMateriais
DBEdit3
DataField Produto
DataSource DSMateriais
DBEdit4
DataField Preço de custo
DataSource DSMateriais
DBEdit5
DataField Preço de venda
DataSource DSMateriais
DBEdit6
DataField Saldo
DBGrid1 DataSource DSClientes
DBGrid2 DataSource DSVendas
DBGrid2 DataSource DSItens
Procedimentos:
begin
filtro1:='Cupom='+dm.TVendasCupom.Text;
dm.TItens.Close;
dm.TItens.Filtered:=false;
dm.TItens.Filter:=filtro1;
dm.TItens.Filtered:=true;
dm.TItens.Open;
end;
Comentários:
Prática 27 – Relacionamento II
Formulário:
Procedimentos:
dm.TItensMaterial.Text:=lb1.Items.Strings[i];
dm.TItensQuantidade.Text:=lb2.Items.Strings[i];
dm.TItens.Post;
end;
dm.TVendas.Append;
dm.TVendas.Edit;
dm.TVendasCupom.Text:=cupom.Text;
dm.TVendasCliente.Text:=dm.TClientesCodigo.Text;
dm.TVendasData.AsDateTime:=date;
dm.TVendasValor.Text:=totalcupom.Text;
dm.TVendasVencimento.AsDateTime:=date+30;
dm.TVendas.Post;
end;
Comentários:
As vezes temos a necessidade de criar tabelas auxiliares para fins de consultas ou impressão,
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.
A relação entre as query’s e o SQL é única, isto é, ao se gerar uma query de maneira manual,
através do DataBase Desktop, automaticamente a esta query será adicionada um script SQL, o que
nos possibilita afirmar que podemos alterar em tempo de execução toda a forma de uma query,
bastando somente para isto alterar os parâmetros da SQL.
A clausula DISTINCT é opcional e indica que o nome dos campos não se repetem para a tabela
indicada pela clausula FROM.
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.
Fábio José de Gondra Ramos
gondraf@hotmail.com
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.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 logo em seguida no campo Cliente de Vendas.db:
Veremos agora como está a arrumação do nosso SQL, click em Show SQL.
Observe a presença das letras D e d1 que aparecem antes dos nomes dos campos nas clausulas
SELECT, WHERE e ORDER BY e depois dos nomes das tabelas na clausula FROM. Estas
letras representam os ALIAS criados pelo SQL para este exemplo.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 91 de 272
Observe também que ao criarmos um JOIN no campo Cliente da tabela Vendas.DB e no campo
Codigo da tabela Clientes.DB, criamos uma relação entre elas, esta relação se apresenta no SQL
através da clausula WHERE.
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 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 e selecione
todos os seus campos:
Em seguida click no botão Add Table e escolha a tabela 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 logo em seguida no campo Cliente de Vendas.db,
novamente pressione o botão Join Tables e selecione os campos Cupom de Vendas.DB e Cupom
em Itens.DB:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 92 de 272
Observe a presença do operador AND na clausula WHERE, pois os joins criados durante a
confecção do query estão representados por esta clausula.
Formulário:
Query1.SQL Strings...
SELECT *
FROM Clientes A, Vendas B, Itens C, Materiais D
WHERE (A.Codigo=B.Cliente) and (B.Cupom=C.Cupom) and (C.Material=D.Codigo)
Procedimentos:
Comentários:
Formulário:
Procedimentos:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 94 de 272
Comentários:
Operadores WHERE
Exemplos de consultas
02 – Consulta materiais com saldo maior que 100 e menor que 500
Exemplos de consultas
01 – Maiúsculas
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
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 97 de 272
O delphi através de suas bibliotecas consegue criar interfaces com diversos softwares, dentre estes
softwares de interpretação de arquivos AVI, BMP,WMW e MID.
Formulário:
Procedimentos:
Function ativaplay(som:TMediaPlayer;arquivo:String):boolean;
begin
som.Close;
som.FileName:=arquivo;
som.Open;
som.Play;
result:=true;
end;
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 99 de 272
Neste projeto utilizaremos a biblioteca MMSystem, que será a responsável pelas funções:
SndPlaySound e PlaySound que farão o papel do mediaplayer, no entanto estas funções só
conseguem abrir os arquivos WAV.
Formulário:
Procedimentos:
procedure TForm1.RGSNDClick(Sender: TObject);
var arquivo:Pchar;
begin
arquivo:=PChar('\Delphi 2005\midias\Wav\'+rgsnd.Items.Strings[rgsnd.itemindex]+'.WAV');
SndPlaySound(arquivo,SND_ASYNC);
end;
procedure TForm1.RGPlayClick(Sender: TObject);
var arquivo:Pchar;
begin
arquivo:=PChar('\Delphi 2005\midias\Wav\'+rgplay.Items.Strings[rgplay.itemindex]+'.WAV');
PlaySound(arquivo,2,SND_ASYNC);
end;
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 100 de 272
Os Diálogos são objetos que criam vínculos com funções internas do windows, os diálogos
disponíveis controlam as fontes, cores, arquivos e impressoras que por ventura estajam
incorporados ao sistema computacional.
Formulário:
Procedimentos:
SetFocus;
SelStart := FoundAt;
SelLength := Length(FindDialog1.FindText);
end;
end;
end;
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
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:
Formulário:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 104 de 272
Procedimentos:
Formulário:
Procedimentos:
begin
ShellListView1.ViewStyle:=vsReport; // Ajusta para detalhes
end;
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 107 de 272
Formulário:
Procedimentos:
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, FileCtrl,
Grids, Outline, DirOutln, Tabs, ExtCtrls, Menus, Consts, ShellAPI, RtlConsts, Buttons;
private
// Procedimentos e funções criadas
procedure ConfirmChange(const ACaption, FromFile, ToFile: string);
procedure CopyFile(const FileName, DestName: string);
procedure MoveFile(const FileName, DestName: string);
function GetFileSize(const FileName: string): LongInt;
function FileDateTime(const FileName: string): TDateTime;
function HasAttr(const FileName: string; Attr: Word): Boolean;
function ExecuteFile(const FileName, Params, DefaultDir: string; ShowCmd: Integer): THandle;
implementation
begin
Draw(R.Left, R.Top + 4, Bitmap);
TextOut(R.Left + 2 + Bitmap.Width, R.Top + 2, TabSet1.Tabs[Index]);
end;
end;
begin
// Este procedimento define as ações de copia, movimento ou renomeação
ScrollBox3.Visible:=true;
if Sender = Mover1 then StaticText2.Caption := 'Mover'
else if Sender = Copiar1 then StaticText2.Caption := 'Copiar'
else if Sender = Renomear1 then StaticText2.Caption := 'Renomear'
else Exit;
Diretorio.Caption := DirectoryOutline1.Directory;
Origem.Text := FileList1.FileName;
Destino.Text := '';
end;
// Procedimentos externos
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;
Comentários:
• TChart – Contido na paleta Additional, gera gráficos dinâmicos com valores randômicos ou
informados.
• 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.
Para a criação do TChart ou TDBChart, existem muitos passos comuns. Descreveremos a seguir
tais passos.
Formulário:
Informar
OnClick Informarvalores1Click
valores
Configurar Animar OnClick Animar1Click
Zoom OnClick Zoom1Click
3D e
OnClick 3Deposicoes1Click
posicoes
Gráfico
de OnClick Grficodebarras1Click
MainMenu1 Items
Barras
Visualizar
Gráfico
OnClick Grficodereas1Click
de Áreas
Gráfico
OnClick Grficopizza1Click
de Pizza
Gráfi
co de OnClick Grficodelinhas1Click
Linhas
Criação de função:
Para determinar qual série deverá ser ativa, criamos uma função capaz ativar e desativar uma série:
Var
Form1: TForm1;
Function ativachart(grafico:TChart;numero:integer):Boolean;
implementation
Function ativachart(grafico:TChart;numero:integer):Boolean;
var i:integer;
begin
for i:=0 to 3 do grafico.Series[i].Active:=false; // desativa todas as séries
grafico.Series[numero].Active:=true; // ativa a série indicada por número
grafico.Visible:=true; // mostra o gráfico
result:=true;
end;
Procedimentos:
begin
ativachart(chart1,0); // indica que a série 0 deverá ser ativa
end;
end;
chart1.View3D:=dimensao.Checked;
Label3.Enabled:=dimensao.Checked;
Label4.Enabled:=dimensao.Checked;
Label5.Enabled:=dimensao.Checked;
Label6.Enabled:=dimensao.Checked;
Percentual3d.Enabled:=dimensao.Checked;
UpDPercentual.Enabled:=dimensao.Checked;
Rotacao.Enabled:=dimensao.Checked;
UpDRotacao.Enabled:=dimensao.Checked;
Perspectiva.Enabled:=dimensao.Checked;
UpDPerspectiva.Enabled:=dimensao.Checked;
Inclinacao.Enabled:=dimensao.Checked;
UpDInclinacao.Enabled:=dimensao.Checked;
end;
Comentários:
Este projeto tem como finalidade gerar um gráfico utilizando o objeto dbchart com dados obtidos
através de uma tabela ou query, portanto crie uma base de dados contendo os campos descritos a
seguir.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 123 de 272
Uma vez criada a tabela, salve na pasta C:/Delphi 2005/tabelas e carregue dados conforme tabela
abaixo:
Descricao Valor
João 16
Ana 9
Paula 6
Pedro 14
Carlos 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, sempre que um valor armazenado em um campo
sofrer uma alteração, esta variação será transferida para o dbchart.
Montagem do Formulário:
Propriedades:
Em DBChart1, na aba Series, selecione Data Source e ajuste as opções conforme a figura abaixo:
Procedimentos:
series1.marks.Visible:=Checkbox2.Checked;
end;
Comentários:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 126 de 272
Você organiza o texto por tópicos, colocando cada tópico em uma página separada. Dentro de cada
tópico, você usa notas de rodapé com caracteres customizados para denotar o título de um tópico,
seu número, sua seqüência de navegação, e suas entradas no índice. Você usa atributos especiais de
texto para denotar links de um tópico para outro.
Símbolo/Atributo 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
K Define uma entrada no índice ou um conjunto de entradas (palavras chave)
+ Define a ordem deste tópico na seqüência de navegação
Duplo sublinhado Define um salto para outro tópico
Texto escondido Identifica o tópico para onde saltar
Utilizando o Microsoft Word criaremos quatro tópicos sendo: três tópicos simples, e um tópico de
conteúdo, e em seguida criaremos links entre eles e definiremos entradas no índice para cada um
deles.
Tópico 1
Este é o texto de ajuda do tópico 1. Logo a seguir você verá outros tópicos.
Posicione o cursor exatamente antes da palavra Tópico e insira uma nota de rodapé com o
caractere #. Isto irá denotar o identificador do tópico ou a string de contexto. Digite Tópico1 no
texto da nota de rodapé. Os outros tópicos que estabelecerem links com este irão usar este
identificador para criar o link.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 127 de 272
Reposicione o cursor antes da palavra Tópico e insira uma nota de rodapé com o caractere $.
Digite Tópico 1 no texto da nota de rodapé. O Word permite pesquisar tópicos usando seus títulos,
então é uma boa idéia colocar títulos nos tópicos. O título que você especificar para um tópico é
exibido na lista de histórico do WinHelp, na caixa de diálogo Pesquisa, e no menu Bookmark.
Usualmente, o título que você especificar deverá ser o mesmo que o texto da primeira linha do
tópico.
Você pode formatar a primeira linha do tópico como qualquer título. Você pode usar um tamanho
de fonte maior e negrito para destacá-lo.
Insira uma nota de rodapé com o caractere K antes da palavra Tópico e digite Tópico1;Tópico
1;Primeiro. Estas entradas irão aparecer no índice do arquivo de ajuda, e ajudarão os usuários a
encontrar mais facilmente os tópicos de interesse.
Insira uma quebra de página após o texto do tópico. Todas as definições de tópicos terminam com
uma quebra de página.
Agora que o Tópico1 está definido, 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 e palavras chaves destes dois tópicos. 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. 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 Tópico 1 Tópico 2 Tópico 3
# Tópico1 Tópico2 Tópico3
$ Tópico 1 Tópico 2 Tópico 3
K Tópico1; Tópico 1; Primeiro Tópico2; Tópico 2; Segundo Tópico3; Tópico
3; Terceiro;
Último
Depois que os tópicos foram criados, você pode linkar o segundo com o primeiro. Posicione o
cursor logo após a palavra primeiro no segundo tópico (sem espaços). Digite Tópico1, e então
selecione a palavra Tópico1 e esconda-a com o comando Formatar/Fonte/Oculto. A seguir
selecione a palavra primeiro e formate-a com duplo sublinhado usando o comando
Formatar/Fonte/Sublinhado/Duplo. Isto irá transformar a palavra primeiro em um link para o
Tópico 1. Quando o usuário clicar nela, o Tópico 1 será exibido.
Agora crie dois links como foi feito anteriormente, porém no Tópico 3 e usando as palavras
primeiro e segundo, e use sublinhado simples ao invés de usar sublinhado duplo. O link na palavra
primeiro deverá chamar o Tópico 1 e o link na palavra segundo deverá chamar o Tópico 2. A
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 128 de 272
diferença deste tipo de link para o anterior, é que este não salta diretamente para o tópico, mas sim
exibe-o em uma janela pop-up.
Até agora já criamos os tópicos do arquivo de ajuda e os links entre eles, agora você precisa criar
um tópico chamado Conteúdo no seu arquivo de ajuda. Este tópico consiste em nada mais do que o
título e links para os outros tópicos.
O compilador de help assume que o tópico de conteúdo é o primeiro no arquivo contendo o texto
de ajuda, então insira uma quebra de página no começo do seu arquivo. E digite o seguinte texto:
Tópico 1
Tópico 2
Tópico 3
Depois disto, crie as notas de rodapé como você já fez anteriormente e nas três use apenas o texto
Conteúdo.
Depois das notas de rodapé, basta linkar cada um dos tópicos usando o sublinhado duplo.
Agora, só falta mais uma coisa a fazer antes de passarmos para os arquivos de projeto e conteúdo.
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. 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. 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. Você poderia
informar um número de seqüência fixo para cada tópico, 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.
Depois que você terminar de especificar a seqüência de navegação, você terminou o arquivo com o
texto de ajuda. Salve o arquivo no formato rich-text (RTF) com o nome de teste.rtf.
Help Author
A primeira coisa que você precisa fazer é habilitar a opção Help Author no menu File. Habilitar
esta opção libera vários benefícios. Primeiro, faz com que diversas informações adicionais sobre
seu sistema de ajuda seja exibida enquanto você o está construindo, como o número dos tópicos de
ajuda como se você navegasse através deles. Segundo, 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. Você pode mover-se para o começo ou o fim do seu
arquivo de ajuda usando Ctrl+Shif+Home e Ctrl+Shift+End.
A seguir, clique na opção New no menu File e selecione Help Contents. A Figura 1 lhe mostra a
tela resultante.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 129 de 272
Digite ./teste.hlp na caixa Default filename. Digite Arquivo de ajuda de exemplo na caixa Default
title. A seguir, 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, e Conteúdo na caixa Topic ID. Clique OK para salvar.
A seguir, clique o botão Add Below e repita o processo para os três tópicos que você criou.
Depois de ter adicionado o último tópico à lista, você está pronto para salvar seu arquivo de
conteúdo. Salve-o juntamente com o arquivo RTF com o nome de teste.cnt.
Selecione New no menu File e selecione Help Project. A primeira coisa que o Help Workshop
faz é lhe pedir o nome do arquivo do projeto. Posicione no diretório onde você colocou os outros
arquivos e digite teste para o nome do arquivo, então clique no botão Save. O Help Workshop
adicionará a extensão HPJ para este arquivo. A Figura 2 lhe mostra a tela resultante.
Clique o botão Options e especifique Conteúdo para Default topic e Arquivo de ajuda de exemplo
para Help title, então clique em Compression e especifique Maximum. A seguir, clique em Files
e especifique seu teste.rtf na caixa Rich Text Format files (.RTF), e seu teste.cnt na caixa
Contents file (.CNT). Depois disto, salve suas configurações clicando em OK para sair do
diálogo.
Clique o botão Windows, e então digite main no diálogo Create a Window. Clique OK para
salvar seu novo tipo de janela. Uma vez de volta para o diálogo Window Properties, clique o
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 130 de 272
botão Buttons e marque o checkbox Browse. 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. Clique OK para salvar suas alterações.
Antes de retornar à tela principal do Help Workshop, clique o botão Map. A seguir, clique Add, e
digite Conteúdo na caixa Topic ID e 0 (zero) na caixa Mapped numeric-value. 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 OK para salvar seu
mapeamento.
Agora repita o procedimento para os demais tópicos, usando os seguintes valores para Tópic ID e
Mapped numeric-values respectivamente: Tópico1 e 100, Tópico2 e 200 e Tópico3 e 300. É 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. Estes número serão usados em sua aplicação para linkar
elementos do programa com o sistema de ajuda.
Quando você terminar o mapeamento dos tópicos, você está pronto para salvar o projeto e
compilá-lo. Clique o botão Save and Compile que está na parte inferior da tela. A Figura 3 mostra
os resultados da compilação.
Você pode facilmente testar seu arquivo de ajuda sem sair do Help Workshop. Selecione Run
WinHelp no menu File, e você verá o diálogo View Help File. O drop-down Mapped Topic ID
permite a você simular uma aplicação passando um identificador de ajuda de contexto para o
WinHelp.
Clique o botão View Help para abrir o seu arquivo de ajuda recentemente criado. Você deverá ver
o tópico Conteúdo.
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.
Preparando a Aplicação
Tomando como base a nossa aplicação final, 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.
Agora execute um duplo clique sobre o componente RvProject para abrir o Rave Visual Designer.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 133 de 272
Configurações Gerais
File - New
File Save: Empregados.rav
Palhetas de
Barra de componentes
ferramentas
Painel da
Árvore de
objetos
Painel de
Propriedades
A Página
Na Árvore de Objetos, selecione Report Library, e dentro dele selecione Report1. No Painel de
Propriedades, altere as propriedades:
Desenhando o Relatório
Nas palhetas de componentes, selecione a palheta Report e traga para a Página um componente
Redimensione o componente Region de modo que ocupe quase toda a área da folha. Deixe uma
área livre no final da página, lá criaremos nosso rodapé de página.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 136 de 272
componente Region
redimensionado
rodapé de página
Nas palhetas de componentes, selecione a palheta Report e traga para Region1 um objeto Band -
BandStyle:
Selecione:
ControllerBand: DataBand1
Name: PageHeader
Selecione o objeto Band2 e altere as propriedades:
DataView: dvEmp
Name: Detalhe
Altere a sua propriedade Image, selecionando uma figura do disco. Altere também a propriedade
MatchSide para msBoth, isto fará a figura ocupar toda a área do componente.
Para colocar os títulos no cabeçalho de página, utilize o componente Text - -da palheta
Standard. Altere as propriedades:
Depois escreva em Data Text, um título para a variável que foi inserida.
Para colocarmos uma linha separando o cabeçalho do restante da página, selecione a palheta
Agora vamos montar a banda de detalhe. Este relatório será um relatório no formato de ficha,
semelhante a um crachá. Por isso não teremos cabeçalho de colunas.
Traga para a banda de detalhe, um componente BitMap da palheta Standard. Altere seu tamanho e
posição como mostra a figura.
Altere as propriedades:
DataView: dvEmp
DataField: FOTO
Vamos agora montar os títulos dos campos que aparecerão na banda de detalhe. Para isso, traga 6
componentes Text da palheta Standard e configure-os como mostra a figura.
As dicas contidas neste material foram colhidas em sites da internet, portanto, nem todas as dicas
aqui contidas foram testadas no delphi 2005
73. Exibir a caixa de diálogo padrão de solicitação de senha do banco de dados 183
74. Obter a versão da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi) 183
75. Implementar rotinas assembly em Pascal 184
76. Exibir o diálogo About do Windows 184
77. Obter a linha e coluna atual em um TMemo 185
78. Exibir um arquivo de ajuda do Windows 185
79. Obter o valor de uma variável de ambiente 185
80. Determinar se uma janela (form) está maximizada 186
81. Determinar se o cursor do mouse está em determinado controle 186
82. Determinar se o aplicativo está minimizado 187
83. Fechar um aplicativo com uma mensagem de erro fatal 187
84. Usar o evento OnGetText de um TField 187
85. Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas 188
86. Verificar, via programação, se Local Share do BDE está TRUE 188
87. Criar um EXE que seja executado apenas através de outro EXE criado por mim 188
88. Resolver "Internal error near: IBCheck" do Interbase 5.1.1 Server no NT 189
89. Inverter os botões do mouse 189
90. Obter/definir o tempo máximo do duplo click do mouse 190
91. Obter os atributos de um arquivo/diretório 190
92. Obter o espaço total e livre de um disco 190
93. Obter o tipo de um drive (removível, fixo, CD ROM, unidade de rede, etc) 191
94. Obter informações de um volume/disco (label, serial, sistema de arquivos, etc) 192
95. Alterar o nome de volume (Label) de um disco 192
96. Saber quais as unidades de disco (drives) estão presentes 192
97. "truncar" valores reais para apenas n casas decimais 193
98. Excluir todos os registros de uma tabela (como DELETE ALL do Clipper) 193
99. Saber se o sistema está usando 4 dígitos para o ano 194
100. Imprimir caracteres acentuados diretamente para a impressora 194
101. Imprimir texto justificado com formatação na impressora Epson LX300 194
102. Formatar um disquete através de um programa Delphi 195
103. Alterar (e restaurar) o tamanho da página na impressora 196
104. Reproduzir um arquivo de som WAV sem o TMediaPlayer 197
105. Obter o nome do usuário e da empresa informado durante a instalação do Windows 197
106. Mostrar uma barra de progresso enquanto copia arquivos 197
107. Copiar arquivos usando o Shell do Windows 197
108. Descobrir o código ASCII de uma tecla 198
109. Evitar que seu programa apareça na barra de tarefas 198
110. Usar eventos de som do Windows 199
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 145 de 272
private
Bmp: TBitmap;
Bmp:= TBitMap.Create;
try
Bmp.LoadFromFile('c:\teste\arquivo.bmp');
Canvas.Draw(0,0, Bmp);
finally
Bmp.Free;
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 148 de 272
end;
Observações:
Provavelmente esta função não funcionará em Windows NT devido ao acesso em baixo nível.
{ Exemplo de uso: }
{ Esta função extrai apenas o nome do arquivo passado, sem path e extensão }
Titulo := UpperCase(Copy(D,1,1)) +
LowerCase(Copy(D,2,Length(D)-1));
end;
Observações
No nosso exemplo estamos pesquisando através do campo "Nome". Para esta pesquisa precisamos
de um índice com este campo.
{ Esta função retorna uma string com o nome do tipo de dado de uma propriedade. Exemplos de
retornos:
{ Exemplo de uso:
- Coloque um TButton e um TEdit;
- No OnClick do Button1 coloque o código abaixo;
- Execute, digite 'Caption' no Edit1 e clique em Button1.}
Query.Close;
Query.SQL.Text := 'select * from Tabela where CampoData <= :Hoje';
Query.ParamByName('Hoje').AsDate := Date;
Query.Open;
Observações:
Este exemplo foi testado com tabelas Paradox, mas deve funcionar na maioria dos bancos de dados
com pouca ou nenhuma alteração.
{ A função abaixo abre a caixa de diálogo de conecção com a rede Dial-Up. O parâmetro "name"
é o nome da conecção previamente configurada.}
begin
WinExec(PChar('rundll32.exe rnaui.dll,RnaDial ' + Name), SW_SHOW);
end;
{ Exemplo de uso: }
Para trabalhar com arquivos JPG você precisa usar um objeto TPicture, assim como colocar no
uses a unit JPeg. Siga os passos abaixo para pintar uma imagem JPG no form:
Formatar CEP
Edit1.Text := tbFormataCEP(Edit1.Text);
Observações
Para formatar outros códigos como CPF, CGC, etc., pode-se usar a mesma idéia.
public;
Cancelar: boolean;
Form1.Cancelar := true;
try
{ Antes de começar o processamento }
Form2.Caption := 'Processamento demorado...';
Form2.Show;
private
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 154 de 272
Esta procedure pega a linha e coluna da célula onde estiver o mouse. Valores negativos para
Linha ou Coluna indicam que o mouse está fora da área cliente do StringGrid
Exemplo de uso:
- Coloque um botão no form;
- Altere o evento OnClick deste botão como abaixo:
Para testar:
- Execute o programa;
- Posicione o cursor do mouse sobre alguma célula do
StringGrid;
- Pressione TAB até chegar ao botão e pressione ENTER;
- 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.
end;
Para fazer isto será necessária a criação de algumas chaves no Registro do Windows. O exemplo
abaixo cria todas as chaves necessárias.
Define o nome interno (ArquivoAluno) e uma legenda que aparecerá no Windows Explorer
(Arquivo do Aluno)
Reg.OpenKey('ArquivoAluno', true);
Reg.WriteString('', 'Arquivo do Aluno');
Reg.CloseKey;
{ Define o comando a ser executado quando abrir um arquivo pelo Windows Explorer
(NomeDoExe %1). O símbolo
%1 indica que o arquivo a ser aberto será passado como primeiro parâmetro para o aplicativo -
ParamStr(1). }
Reg.OpenKey('ArquivoAluno\shell\open\command', true);
Reg.WriteString('', ParamStr(0) + ' %1'); { NomeDoExe %1 }
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 157 de 272
Reg.CloseKey;
{ *.dpg }
Reg.OpenKey('.dpg', true);
Reg.WriteString('', 'ArquivoAluno');
Reg.CloseKey;
{ *.alu }
Reg.OpenKey('.alu', true);
Reg.WriteString('', 'ArquivoAluno');
Reg.CloseKey;
finally
Reg.Free;
end;
end;
- Coloque um TMemo;
- No evento OnShow do Form coloque o código abaixo:
* DataSource1.DataSet = Query1
* DBGrid1.DataSource = DataSource1
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from dCli');
Query1.SQL.Add('where extract(month from DataNasc) = :Mes');
Query1.ParamByName('Mes').AsInteger := StrToInt(Edit1.Text);
Query1.Open;
A função abaixo obtém os nomes de todos os campos de uma tabela do banco de dados.
begin
List.Clear;
with TTable.Create(Application) do
try
DatabaseName := DBName;
TableName := TblName;
with FieldDefs do begin
Update;
for I := 0 to Count -1 do
List.Add(Items[I].Name);
end;
finally
Free;
end;
end;
Result := SR.Size
else
Result := -1;
finally
FindClose(SR);
end;
end;
RegisterServiceProcess(GetCurrentProcessID, 1);
RegisterServiceProcess(GetCurrentProcessID, 0);
Observações
Se a unit em que essa rotina for colocada utilizar as units DB e DBTABLES, as chamadas a
DbiInit() e DbiExit() poderão ser omitidas.
Desligar/Ligar monitor
No Win95 podemos desligar o monitor afim de economizar energia elétrica. Normalmente este
recurso é controlado pelo próprio Windows. Porém sua aplicação Delphi também pode fazer isto.
O exemplo abaixo desliga o monitor, aguarde 5 segundos e religa monitor.
Observações
Este recurso pode não funcionar dependendo da configuração do sistema.
{ Para abrir }
mciSendString('Set cdaudio door open wait', nil, 0, handle);
{ Para fechar }
mciSendString('Set cdaudio door closed wait', nil, 0, handle);
Impedir que o form seja arrastado para fora das margens da tela
private
procedure WMMove(var Msg: TWMMove); message WM_MOVE;
Para testar:
- Execute o programa e tente arrastar o form para fora das margens da tela e veja o que acontece.
SetForegroundWindow(Application.Handle);
ShowMessage('Teste');
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 162 de 272
Para testar:
- Execute este aplicativo;
- Clique no botão;
- Vá em outro aplicativo (ex: MS-Word) e mande colar (Ctrl+V).
Observações
CUIDADO! Não use este recurso com tabelas grandes, pois poderá usar memória
demasiadamente. No teste que fiz, o tamanho da string S atingiu 20K e funcionou normalmente.
Mas isto pode variar de uma máquina para outra.
Clipboard.AsText := S;
end;
Para testar:
- Execute este aplicativo;
- Clique no botão;
- Vá em outro aplicativo (ex: MS-Word) e mande colar (Ctrl+V).
Exemplo:
S := 'C:\NomeDir\Programa.exe';
ExtractFilePath(S); { retorna: 'C:\NomeDir\' }
Agora que sabemos como trabalham estas funções, vamos escrever uma função que precisamos
para criar um sub-diretório conforme proposto.
Exemplo de uso:
RegisterServiceProcess(GetCurrentProcessID, 1);
Isso vai fazer o programa nao aparecer no CTRL+ALT+DEL, mas seu form principal vai continuar
aparecendo. Para ocultar também o form, basta por no OnCreate antes da linha acima a seguinte
linha:
Application.ShowMainForm:=False;
Observações
Segundo o autor desta resposta, esta solução foi testada em Win95, mas também deve funcionar
em Win98. Não sabe se funciona em NT.
private
procedure ManipulaExcecoes(Sender: TObject; E: Exception);
Onde:
Memo1.Handle = manipulador da janela do Memo1.
WM_VSCROLL = Mensagem do Windows - rolagem vertical.
SB_PAGEDOWN = Comanndo de rolagem - página para baixo.
Outros exemplos:
{$R BMPS.RES}
library DLLBmp;
end.
private
procedure WMNCHitTest(var Msg: TMessage);
message WM_NCHitTest;
public
{ Public declarations }
end;
implementation
{$R *.DFM}
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;
Esta função altera a data e hora de um arquivo. Se obter sucesso retorna true, caso contrário
retorna false.
- Exemplos de uso:
var
I: integer;
begin
Fábio José de Gondra Ramos
gondraf@hotmail.com
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 $.
- Coloque uma ProgressBar no form e mude sua propriedade Visible para false.
ProgressBar1.Position := I;
{ Repinta a StatusBar para forçar a atualização visual }
StatusBar1.Repaint;
{ Aguarda 50 milisegundos }
Sleep(50);
end;
- Exemplo de uso:
{ Pressiona F2 }
keybd_event(VK_F2, 0, 0, 0);
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);
{ Exemplos de uso: }
{ Esta função retorna true se a tecla informada estiver pressionada. False em caso contrário. }
{ 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. Para isto basta saber o código virtual (Virtual Key Code) da
tecla.
{ Esta função retorna true se a tecla informada estiver ligada. False em caso contrário }
{ Exemplo de uso: }
if tbKeyIsOn(VK_NUMLOCK) then
{ ... NumLock está ligada }
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 174 de 272
else
{ ... NumLock está desligada }
Observações
Qualquer tecla que possua os estados On/Off pode ser verificada. Basta, para isto, saber seu
código. O código de CapsLock é VK_CAPITAL.
private
procedure DBGridClick(Sender: TObject);
implementation
{$R *.DFM}
Observações
O segredo principal desta dica está OnCreate do Form. A primeira instrução ativa o evento
OnClick. A segunda instrução acessa o manipulador do evento OnClick. Para isto precisamos tratar
o DBGrid como se fosse Form, pois o evento OnClick está declarado como protegido (protected)
na classe TDBGrid.
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. Se for OK, o texto
digitado pelo usuário será copiado para a variável Nome }
end;
end;
with Edit2 do
if Text <> '' then
Text := AnsiUpperCase(Text[1]) + Copy(Text, 2, Length(Text));
if Edit1.SelStart = 0 then
Key := AnsiUpperCase(Key)[1]
else
Key := AnsiLowerCase(Key)[1];
- Use uma das funções abaixo, conforme o tipo de dado que se quer testar:
end;
end;
- Crie um form com a mensagem. Um pequeno form com um Label já é suficiente. Aqui vou
chamá-lo de FormMsg.
- Vá em Project|Options e passe o FormMsg de "Auto-create forms" para "Available forms".
- Abaixo vou simular um processamento demorado, usando a API Sleep:
var
PrevCur: TCursor;
begin
PrevCur := Screen.Cursor;
try
Screen.Cursor := crHourGlass;
{ Coloque aqui as instruções do processamento }
finally
Screen.Cursor := PrevCur;
end;
end;
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 178 de 272
Observações
Existem diversos outros cursores pré-definidos no Delphi. Dê uma olhada na propriedade Cursor
de um componente visual para ver uma lista de todos eles. Você poderá também criar o seu próprio
cursor.
Coloque no Form:
- três edits;
- dois botões.
type
Reg := TRegistry.Create;
try
{ Define a chave-raiz do registro }
Reg.RootKey := HKEY_CURRENT_USER;
try
{ Define a chave-raiz do registro }
Reg.RootKey := HKEY_CURRENT_USER;
{ Se existir o valor... }
if Reg.ValueExists('Dados') then
begin
{ Lê os dados }
Reg.ReadBinaryData('Dados', Ficha, SizeOf(Ficha));
Edit1.Text := IntToStr(Ficha.Codigo);
Edit2.Text := Ficha.Nome;
Edit3.Text := DateToStr(Ficha.DataCadastro);
end else
ShowMessage('Valor não existe no registro.')
end else
ShowMessage('Chave (path) não existe no registro.');
finally
Reg.Free;
end;
end;
Observações
Qualquer tipo de dado pode ser gravado e lido de forma binária no registro do Windows. Para isto
você precisa saber o tamanho do dado. Para dados de tamanho fixo, use SizeOf(). Lembrete: não
grave dados muito extensos no Registro do Windows (ex: imagens), pois isto prejudicará o
desempenho do sistema.
ChangeDisplaySettings(DevMode,0);
end;
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;
Fábio José de Gondra Ramos
gondraf@hotmail.com
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!
Para converter a digitação para maiúsculo, coloque isto no evento OnKeyPress do DBGrid:
Key := AnsiUpperCase(Key)[1];
Key := AnsiLowerCase(Key)[1];
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.');
Coloque no Form:
- Um DataSource
- Um Table
- Um DBGrid
- Um Edit
- DataSource1.DataSet = Table1
- Table1.DatabaseName = 'NomeDoAlias'
- Table1.TableName = 'NomeDaTabela'
- Table1.IndexFieldNames = 'NomeDoCampo'
- Table1.Active = true
- DBGrid1.DataSource = DataSource1
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.
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.
Table1.FieldByName('Data').Clear;
{ ou }
Table1.FieldByName('Data').AsString := '';
Observações
Podemos usar este recurso para limpar também campos numéricos, string, etc.
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.
pw.ShowModal;
finally
pw.Free;
end;
end;
Observações
As senhas adicionadas nesta caixa de diálogo são adicionadas na sessão (TSession) atual. Isto é útil
quando colocamos senha em tabelas Paradox, ou mesmo quando trabalhamos com banco de dados
Client Servidor, e queremos que o usuário digite a senha de acesso. Se não fizermos desta forma,
nem adicionarmos via programação as senhas necessárias, esta caixa de diálogo será mostrada
quando o programa tentar abrir uma tabela com senha. A grande vantagem aqui é que podemos
traduzir os Caption's dos componentes.
{ A versão desta biblioteca determina a aparência de alguns controles do Delphi, tais como
ToolBar e CoolBar. O exemplo abaixo obtém a versão desta biblioteca.
Para este exemplo, coloque um TEdit e um TButton no Form.
O evento OnClick do botão escreva o código abaixo: }
{Achamada a estas funções são feitas da mesma forma que chamamos uma função Pascal.
Exemplo: }
var
A: byte;
begin
A := Soma8(30, 25); { A = 55 }
end;
{ Personalizada }
ShellAbout(Handle, 'NomePrograma',
'Direitos autorais reservados a'#13'Fulano de Tal',
Application.Icon.Handle);
var
Lin, Col: Cardinal;
begin
tbGetMemoLinCol(Memo1, Lin, Col);
{ ... }
end;
var
Lin, Col: integer;
begin
Lin := Memo1.CaretPos.y;
Col := Memo1.CaretPos.x;
{...}
end;
{ Esta função recebe o nome da variável de ambiente que queremos acessar e retorna uma string
com seu valor, ou uma string vazia se a variável não existir. }
if IsZoomed(Form1.Handle) then
{ Form1 está maximizado }
else
{ Form2 NÃO está maximizado }
{ Solução 1: }
var
Pt: TPoint;
Rct: TRect;
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 188 de 272
begin
GetCursorPos(Pt);
GetWindowRect(Button1.Handle, Rct);
if PtInRect(Rct, Pt) then
{ Está no botão }
else
{ NÃO está no botão }
end;
{ Solução 2: }
var
Pt: TPoint;
begin
GetCursorPos(Pt);
if WindowFromPoint(Pt) = Button1.Handle then
{ Está no botão }
else
{ Não está no botão }
end;
Observações
A API GetWindowRect obtém o retângulo (TRect) ocupado por uma janela. Podemos usar
GetClientRect para obter o somente da parte cliente da janela. Podemos também usar a propriedade
BoundsRect que existe na maioria dos componentes visuais, ou mesmo informar qualquer outro
retângulo da tela. Se usarmos a propriedade BoundsRect, precisaremos converter as coordenadas
clientes para coordenadas de tela (com a função ClientToScreen). Um lembrete: a solução 2 só
poderá ser aplicada a controles ajanelados.
if IsIconic(Application.Handle) then
{ Minimizado }
else
{ Não minimizado }
Observações
Pode-se verificar qualquer janela (form). Só um lembrete: quando clicamos no botão de minimizar
do form principal, na verdade ele é oculto e o Application é que é minizado.
no evento OnGetText;
- Neste evento, digite o código abaixo:
Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas
{ É um "maximizar" com jeitinho brasileiro... mas funciona. No evento OnShow do form coloque
o código abaixo: }
Top := 0;
Left := 0;
Width := Screen.Width;
Height := Screen.Height;
{ Esta função retorna true se Local Share estiver "TRUE". Caso contrário, retorna false. }
Criar um EXE que seja executado apenas através de outro EXE criado por mim
{ No Form1 de Prog2 (programa chamador) coloque um botão e escreva o OnClick deste botão
como abaixo:}
HKEY_CURRENT_USER\Environment
{ Para inverter: }
SwapMouseButton(true);
{ Define }
SetDoubleClickTime(300);
end;
Observações
Um duplo-click nada mais é que dois cliques consecutivos (óbvio). Porém estes dois cliques
podem ser interpretados de duas formas: dois cliques isolados ou um duplo-click. Para o Windows
resolver esta situação, ele usa o que chamo de "tempo máximo do duplo-click". Se o intervalo entre
o primeiro e o segundo click for menor ou igual a esse tempo, então houve duplo-click. E você
pode alterar este tempo. O padrão do Windows é 500 milisegundos. Um tempo muito curto (ex:
100), faz com que o duplo-click tenha que ser muito rápido (quase impossível), enquanto muito
longo (ex: 2000) faz com que o Windows interprete dois clicks isolados como duplo-click.
{ No form:
- Coloque um memo;
- Coloque um edit;
- Coloque um botão e escreva seu OnClick como abaixo: }
0: S := 'Tipo indeterminado';
1: S := 'Drive não existe';
DRIVE_REMOVABLE: S := 'Disco removível';
DRIVE_FIXED: S := 'Disco Fixo';
DRIVE_REMOTE: S := 'Unidade de rede';
DRIVE_CDROM: S := 'CD-ROM';
DRIVE_RAMDISK: S := 'RAM Disk';
else
S := 'Erro';
end;
ShowMessage(S);
end;
{ Da unidade C: }
SetVolumeLabel('c:\', 'NovoLabel');
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 194 de 272
{ Da unidade atual: }
SetVolumeLabel(nil, 'NovoLabel');
{ A função abaixo retorna uma string contendo as letras de unidades de discos presentes. }
{ Para saber se uma determinada unidade está presente, basta fazer algo como: }
if Pos('A', tbGetDrives) > 0 then
ShowMessage('Unidade A: presente.')
else
ShowMessage('Unidade A: ausente.');
Observações
A string retornada pela função tbGetDrives está sempre em letras maiúsculas.
{ Às vezes você precisa considerar apenas duas casas de valores reais, mas o Delphi não oferece
algo pronto para isto. Se usarmos funções como Round que vem com o Delphi, o valor será
arredondado (e não truncado). Com Round() o valor abaixo será 135.55 (e não 135.54) com duas
casas decimais.}
ValorReal := 135.54658;
{ Duas casas }
X := Trunc(ValorReal * 100) / 100; // X será 135.54
{ Três casas }
X := Trunc(ValorReal * 1000) / 1000; // X será 135.5465
Observações
Isto pode não funcionar se ValorReal for muito alto. Isto por causa da multiplicação que poderá
estourar a capacidade do tipo em uso. Lembre-se: os tipos reais aceitam valores muuuiiiito altos.
end;
{ Para não correr o risco de surpresas desagradáveis, é melhor que seu programa em Delphi
verifique se o Windows está ajustado para trabalhar com 4 dígitos para o ano. Assim seu
programa pode alertar o usuário quando o ano estiver sendo representado com apenas 2 dígitos.
A função abaixo retorna true se estiver ajustado para 4 dígitos.}
{ Usando comandos da impressora podemos fazer isto de uma forma bastante simples. Quando
enviamos o caractere ASCII número 8 (oito) para a impressora, a cabeça de impressão retrocede
uma posição, pois este caractere é o BackSpace.
Então podemos imprimir a letra sem acento e, sem seguida, voltar e imprimir o acento desejado.
Vejamos um exemplo:
{ A impressora Epson LX-300 dispõe de um comando que justifica o texto. Este recurso é
interessante, pois com ele podemos continuar a enviar os comandos de formatação de caracteres
como condensado, negrito, italico, expandido, etc.
{ Tamanho da fonte }
c10cpi = #18;
c12cpi = #27#77;
c17cpi = #15;
cIExpandido = #14;
cFExpandido = #20;
{ Formatação da fonte }
cINegrito = #27#71;
cFNegrito = #27#72;
cIItalico = #27#52;
cFItalico = #27#53;
var
Texto: string;
F: TextFile;
begin
Texto := c10cpi +
'Este e um teste para impressora Epson LX 300. ' + 'O objetivo e imprimir texto justificado
sem deixar ' + 'de usar formatacao, tais como: ' + cINegrito + 'Negrito, ' + cFNegrito +
cIItalico + 'Italico, ' + cFItalico + c17cpi + 'Condensado (17cpi), ' + c10cpi + c12cpi + '12 cpi, '
+ c10cpi + cIExpandido + 'Expandido.' + cFExpandido + ' Este e apenas um exemplo, mas
voce podera adapta-lo ' + 'a sua realidade conforme a necessidade.';
AssignFile(F, 'LPT1');
Rewrite(F);
try
WriteLn(F, cJustif, Texto);
WriteLn(F, cEject);
finally
CloseFile(F);
end;
end;
Observações
Este recurso de justificação da Epson LX-300 pode ser usado em qualquer linguagem de
programação.
const
SHFMT_ID_DEFAULT = $FFFF;
{ Opções de formatação }
SHFMT_OPT_QUICKFORMAT = $0000; { Formatação rápida }
SHFMT_OPT_FULL = $0001; { Formatação completa }
SHFMT_OPT_SYSONLY = $0002; { Copia sistema }
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 197 de 272
{ Códigos de errros }
SHFMT_ERROR = $FFFFFFFF; { Ocorreu erro }
SHFMT_CANCEL = $FFFFFFFE; { Foi cancelado }
SHFMT_NOFORMAT = $FFFFFFFD; { Não formatou }
{ - Peque em nosso Download o arquivo tbPrn.zip. Ele contém a unit tbPrn.pas, onde está a
função tbPrnSetPaperSize
usada no exemplo abaixo;
Veja a próxima
{ - Coloque um botão no form e altere o evento OnClick deste botão conforme abaixo: }
Isto ocorre porque ela funciona como uma ToolWindow, enquanto os demais aplicativos
funcionam como AppWindow. Porém podemos mudar o comportamento de nossos programas
feito em Delphi
para que se comportem como uma ToolWindow também. Para experimentar, crie um novo
projeto e altere o Project1.dpr como abaixo (não esqueça do uses): }
program Project1;
uses
Forms, Windows,
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 200 de 272
{$R *.RES}
var
ExtendedStyle : Integer;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Observações
Ao executar observe a barra de tarefas e teste o Alt+Tab (seu programa não estará lá!).
{ Evento Pergunta }
MessageBeep(32);
{ Evento Exclamação }
MessageBeep(48);
{ Evento Asterisco }
MessageBeep(64);
{ Reinicia o Windows }
ExitWindowsEx(EWX_REBOOT, 0);
{ Desliga o Windows }
ExitWindowsEx(EWX_SHUTDOWN, 0);
Table1.RecNo()
PlaySound('C:\ArqSom.wav', 1, SND_ASYNC);
Observações
Troque o nome do arquivo (C:\ArqSom.wav) pelo arquivo desejado.
WinExec('command.com /c programa.exe',sw_ShowNormal);
Display := Form2;
Form2.Show;
Play;
end;
end;
Observações
Em vez de ajustar o Form ao vídeo, podemos ajustar o vídeo ao Form. Para isto troque o trecho
with..end; por MediaPlayer1.DisplayRect := Form2.ClientRect;
type
TChars = set of Char;
begin
{ Pega só letras }
ShowMessage(FilterChars('D63an*%i+/e68l13',
['A'..'Z', 'a'..'z']));
{ Pega só números }
ShowMessage(FilterChars('D63an*%i+/e68l13', ['0'..'9']));
end;
Observações
Se quizer usar este função em outras unit's, coloque a declaração do tipo TChars na seção interface.
Coloque aí também uma declaração da função FilterChars. E não se esqueça da cláusula uses.
Observações
"S" precisa ser uma variável string.
Copiar arquivos
{ Verifica o Word }
if FindWindow('OpusApp', nil) > 0 then
ShowMessage('O Word está aberto')
else
ShowMessage('O Word NÃO está aberto');
{ Verifica o Excell }
if FindWindow('XLMAIN', nil) > 0 then
ShowMessage('O Excell está aberto')
else
ShowMessage('O Excell NÃO está aberto');
end;
Observações
Há uma margem de erro nesta verificação: pode haver outros programas que possuam uma janela
com os mesmos nomes. Você mesmo pode criar aplicativos em Delphi e, propositadamente, criar
uma janela com um destes nomes. Veja a pergunta nº 18.
end;
finally
{ Fecha o Word }
Word.Quit;
end;
end;
Observações
Foram usados neste exemplo o Delphi4 e MS-Word97, testado por mim no delphi 2005 Word
2003
var
Total: integer;
begin
Check(DbiGetRecordCount(Table1.Handle, Total));
ShowMessage('Total de registros: ' + IntToStr(Total));
end;
Observações
Para testar o exemplo acima, o Table1 precisa estar aberto.
{ 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. Em aplicativos desenvolvidos em Delphi podemos ter esta
característica.
Vejamos:
program Project1;
uses
Forms, Windows,
Unit1 in 'Unit1.pas' {DPGFormPrinc};
{$R *.RES}
var
Handle: THandle;
begin
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 208 de 272
{ Se estiver usando TTable, coloque nos eventos AfterPost e AfterDelete a seguinte linha: }
dbiSaveChanges(Table1.Handle);
{ Para TQuery, a instrução é semelhante: }
dbiSaveChanges(Query1.Handle);
{ Coloque um TButton no Form e altere o evento OnClick deste botão como abaixo: }
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). Após digitar, clique no Button1.
interface
uses Forms, IniFiles, SysUtils, Messages, Windows;
implementation
end.
Ou seja, gostaria que, ao visualizar ou imprimir um relatório do Quick Report, saia em cada página
apenas um registro, mesmo que o espaço permita mais de um.
1. 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. Desta forma, cada
registro será impresso em uma nova página, teoricamente por falta de espaço na página atual.
2. Uma outra forma mais sofisticada é usar o evento AfterPrint da banda Detail. Nele testamos se
ainda não chegou no fim da tabela e, caso positivo, pedimos uma nova página:
Deve existir outras alternativas, mas as duas anteriores funcionaram bem nos testes realizados.
O evento OnGetEditMask ocorre quando entramos no modo de edição. Neste momento podemos
verificar em qual linha/coluna se encontra o cursor e então, se quiser, poderá especificar uma
máscara de edição. Exemplo:
O evento OnGetEditText ocorre também quando entramos no modo de edição. 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. Exemplo:
O evento evento OnSetEditText ocorre quando saímos do modo de edição. Neste momento
podemos manipular a entrada e trocar por um texto equivalente. Normalmente usamos este evento
em conjunto com o evento OnGetEditText. Exemplo:
program Project1;
uses
Forms, Controls,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
var
F: TForm2;
begin
F := TForm2.Create(Application);
try
if F.ShowModal = mrOK then begin
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 213 de 272
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
finally
F.Free;
end;
end.
Observações
O Form2 do exemplo é o Form de LogOn. Este deverá ser preparado para que se possa escolher o
usuário, digitar a senha, etc.
Muitas vezes precisamos saber qual o nome de classe de uma determinada janela. Quando são
janelas desenvolvidas por nós, você olha no código-fonte. Mas e se não for, como é o caso do
Delphi?
Por exemplo:
Para verificar se o Delphi está sendo executado, procuramos no Windows pela janela cujo nome de
classe seja TAppBuilder. Mas como verificar então se o Internet Explorer está sendo executado?
Precisaremos saber o nome de classe da janela deste programa. Então o que fazer?
var
Janela: HWND;
begin
Janela := FindWindow('Shell_TrayWnd', nil);
if Janela > 0 then
ShowWindow(Janela, SW_HIDE);
end;
{ Coloque um TTimer no Form desejado. Define a propriedade Interval do Timer para 1000
(1segundo). Modifique o evento OnTimer do Timer conforme abaixo: }
{ Para testar, coloque no Form um botão e troque o name dele para btnOK e modifique o evento
OnShow do Form conforme abaixo: }
{ Na seção "implementation" acrescente (troque TForm1 para o nome do seu form principal): }
procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.Message = WM_KEYDOWN then
if Msg.wParam = 110 then
Msg.wParam := 188;
end;
procedure CriaTabelaClientes;
var
Tabela: TTable;
begin
Tabela := TTable.Create(Application);
try
Tabela.DatabaseName := 'C:\';
{ ou Tabela.DatabaseName := 'NomeAlias'; }
Tabela.TableName := 'Clientes.DB';
Tabela.TableType := ttParadox; { ou ttDBase }
{ Somente Delphi4 }
if Tabela.Exists then { Se a tabela já existe... }
Exit;
{***}
{ Cria a tabela }
Tabela.FieldDefs.Add('Codigo', ftInteger, 0, true);
Tabela.FieldDefs.Add('Nome', ftString, 30, true);
Tabela.FieldDefs.Add('DataNasc', ftDate, 0, false);
Tabela.FieldDefs.Add('RendaMes', ftCurrency, 0, false);
Tabela.FieldDefs.Add('Ativo', ftBoolean, 0, true);
{ etc, etc, etc }
Tabela.CreateTable;
{ Cria os Índices }
Tabela.AddIndex('ICodigo', 'Codigo', [ixPrimary, ixUnique]);
Tabela.AddIndex('INome', 'Nome', [ixCaseInsensitive]);
{ etc, etc, etc }
finally
Tabela.Free;
end;
end;
Observações
Para verificar se o arquivo já existe na versão 3 ou anterior do Delphi, você deverá usar a função
"FileExists" do Delphi.
if DirectoryExists('C:\MEUSDOCS') then
ShowMessage('O diretório existe')
else
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 219 de 272
if FileExists('c:\carta.doc') then
ShowMessage('O arquivo existe')
else
ShowMessage('O arquivo não existe');
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,ShellAPI, Menus;
const
wm_IconMessage = wm_User;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Lloyd1: TMenuItem;
close1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure close1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Lloyd1Click(Sender: TObject);
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 220 de 272
private
procedure IconTray (var Msg: TMessage);
message wm_IconMessage;
{ Private declarations }
public
{ Public declarations }
nid: TNotifyIconData;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs ,ShellAPI, Menus;
const
wm_IconMessage = wm_User;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Lloyd1: TMenuItem;
close1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure close1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Lloyd1Click(Sender: TObject);
private
procedure IconTray (var Msg: TMessage);
message wm_IconMessage;
{ Private declarations }
public
{ Public declarations }
nid: TNotifyIconData;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Pt: TPoint;
begin
if Msg.lParam = wm_rbuttondown then
begin
GetCursorPos (Pt);
// SetForegroundWindow (Handle);
PopupMenu1.Popup (Pt.x, Pt.y);
end;
end;
Apagar um subdiretório
exit;
end;{if}
end;{for}
end;{else}
result := btemp;
end;
Muitas vezes, quando temos a necessidade de copiar um arquivo de um lugar para outro, é
interessante mostrar ao usuário o andamento da cópia.
Para tal, coloque em sua aplicação um gauge (optei por um gauge, mas poderia muito bem ser uma
progressbar) e um botão para iniciar a cópia. No código onClick do botão, coloque este código.
Neste exemplo, o programa cria um diretório de back-up cujo nome do mesmo é a data da cópia no
formato AAAAMMDD. No nosso exemplo, chamei o gauge de ga_copia.
Agora que já definimos como e quando a cópia será disparada, vamos definir a procedure copyfile
que é o motor da nossa cópia de arquivo. Esta procedure é que vai fazer a cópia e incrementar o
Gauge.
AddProgress(NumRead);
end;
CloseFile(FromF);
CloseFile(ToF);
end;
end;
A dica abaixo apresenta o código de implementação para exibir na tela uma janela padrão
Windows de propriedades do arquivo.
Código Completo:
Procedure Propriedades(Arq:String);
Var
s:TShellExecuteInfo;
Begin
FillChar(S,SizeOf(S),0);
With S do Begin
cbSize := SizeOf(S);
fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_INVOKEIDLIST or
SEE_MASK_NOCLOSEPROCESS;
wnd := Handle;
lpVerb := 'properties';
lpFile := Pchar(Arq);
nShow := sw_ShowNormal;
End;
ShellExecuteEx(@S);
End;
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. Esta dica apresenta
um destes métodos: o uso de TextFiles.
TextFile é um tipo de dado pré-definido no Delphi e corresponde ao tipo Text do Turbo Pascal e
do Object Pascal.
Inicialmente para acessar um arquivo de texto, você precisa definir uma variável tipo TextFile, no
local que você achar mais apropriado, da seguinte forma:
Note também o uso de Write e WriteLn para gravar dados no arquivo texto.
Finalmente note o uso de AjustaStr e FormatFloat para garantir que campos string e numericos
sejam gravados com um número fixo de caracteres. FormatFloat é uma rotina do próprio Delphi
enquanto AjustaStr está definida abaixo:
begin
while Length ( str ) < tam do
str := str + ' ';
if Length ( str ) > tam then
str := Copy ( str, 1, tam );
Result := str;
end;
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.
interface
type
PRecInfo=^TRecInfo;
Trecinfo=record
prev:PRecInfo;
fpathname:string;
srchrec:Tsearchrec;
end;
implememtation
function TForm1.RecurseDirectory(fname:string):tstringlist;
var
f1,f2:Tsearchrec;
p1,tmp:PRecInfo;
fwc:string;
fpath:string;
fbroke1,fbroke2:boolean;
begin
result:=tstringlist.create;
fpath:=extractfilepath(fname);
fwc:=extractfilename(fname);
new(p1);
p1.fpathname:=fpath;
p1.prev:=nil;
fbroke1:=false;
fbroke2:=false;
while(p1<>nil) do
begin
if (fbroke1=false) then
if (fbroke2=false) then
begin
if (findfirst(fpath+'*',faAnyfile,f1)<>0) then
break;
end
else if (findnext(f1)<>0) then
begin
repeat
findclose(f1);
if (p1=nil) then
break;
fpath:=p1.fpathname;
f1:=p1.srchrec;
tmp:=p1.prev;
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 230 de 272
dispose(p1);
p1:=tmp;
until (findnext(f1)=0);
if (p1=nil) then
break;
end;
if((f1.Name<>'.') and (f1.name<>'..') and ((f1.Attr and fadirectory)=fadirectory)) then
begin
fbroke1:=false;
new(tmp);
with tmp^ do
begin
fpathname:=fpath;
srchrec.Time:=f1.time;
srchrec.Size:=f1.size;
srchrec.Attr:=f1.attr;
srchrec.Name:=f1.name;
srchrec.ExcludeAttr:=f1.excludeattr;
srchrec.FindHandle:=f1.findhandle;
srchrec.FindData:=f1.FindData;
end;
tmp.prev:=p1;
p1:=tmp;
fpath:=p1.fpathname+f1.name+'\';
if findfirst(fpath+fwc,faAnyfile,f2)=0 then
begin
result.add(fpath+f2.Name);
while(findnext(f2)=0) do
result.add(fpath+f2.Name);
findclose(f2);
end;
fbroke2:=false;
end
else
begin
if (findnext(f1)<>0) then
begin
findclose(f1);
fpath:=p1.fpathname;
f1:=p1.srchrec;
fbroke1:=false;
fbroke2:=true;
tmp:=p1.prev;
dispose(p1);
p1:=tmp;
end
else
begin
fbroke1:=true;
fbroke2:=false;
end;
end;
end;
fpath:=extractfilepath(fname);
if findfirst(fname,faAnyfile,f1)=0 then
begin
result.add(fpath+f2.Name);
while(findnext(f1)=0) do
result.add(fpath+f2.Name);
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 231 de 272
findclose(f1);
end;
end;
Utilizamos com bons resultados as versões do Delphi 2.0 até a 4.0, BDE versões 4.5 e 5.0, e o
Oracle7 Workgroup Server Release 7.3.2.1. Naturalmente tais informações serão de grande ajuda
para configuração em outras versões.
Passos:
1 - Caso tenha instalado em sua máquina algum cliente do Oracle 16 bits, poderá ter algum tipo de
conflito com drives de 32 bits. Portanto, desinstale todos os clientes Oracle e instale somente o
cliente Oracle 32 bits. Normalmente isto é feito a partir do CD de instalação do Oracle executando
o programa d:\win95\install\setup.exe
2 - Ao executar o instalador do cliente Oracle para Windows 95, você deverá de inicio informar o
idioma (o mesmo que foi informado durante a instalação do próprio banco), tendo o English como
padrão.
3 - Entre com o nome da empresa e o diretório onde serão armazenados os arquivos do cliente
Oracle.
5 - Será apresentada uma lista dos produtos ou componentes disponíveis. Apesar de poder instalar
todos, serão apenas necessários para a conexão com o banco Oracle a partir do Delphi os seguintes
componentes:
Oracle Installer
Oracle Named Pipes Adapter (protocolo de acordo com sua rede)
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 232 de 272
9 - Clique no botão iniciar -> programas -> Oracle for windows 95 -> Sql Net Easy Configuration
11 - Informe na sequência:
13 - Chame o BDE Administrator, e clique na guia Configuration -> Drivers ->Native e selecione
ORACLE. Como sugestão use as seguintes configurações:
VERSION
4.0
TYPE
SERVER
DLL32
SQLORA32.DLL
VENDOR INIT
ORA73.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
Fábio José de Gondra Ramos
gondraf@hotmail.com
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, DEFAULT: ORCL)
SQLPASSTHRU MODE SHARED
AUTOCOMMIT
SQLQRYMODE
SERVER
USER NAME
(NOME DE USUARIO, OPCIONAL)
15 - Agora precisamos apenas criar um Alias que será enxergado no Delphi. Para isso, clique na
guia Database, clique com o botão direito do mouse sobre o item da lista ´Databases´ e selecione a
opção ´New´. Escolha a opção ORACLE. Entre com o nome do Alias, que pode ser qualquer um
que não exista. Agora altere do lado esquerdo na guia Definition, no item SERVER NAME, e
coloque o nome do Database Alias que você criou no Sql Net Easy Configuration.
18 - Ok, agora basta abrir o Delphi e utilizar este Alias como qualquer outro!
Abaixo está uma rotina para alterar o NetDir de acordo com o drive informado como parâmetro:
// ChangeNetDir
procedure ChangeNetDir(Drive: Char);
var
hCur: hDBICur;
Config: CFGDesc;
Cont: Boolean;
begin
if DbiInit(nil) = DBIERR_NONE then
begin
hCur := nil;
if DbiOpenCfgInfoList(nil, dbiREADWRITE, cfgPersistent,
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 234 de 272
Código Completo:
Procedure ApagarTodosReg(Origem:TDataSet);
Begin
With Origem do
While RecordCount > 0 do
Delete;
End;
Como Usar:
ApagarTodosReg(Table1);
ou ApagarTodosReg(Query1);
Um dos recursos mais interessantes nos bancos de dados atuais é a possibilidade de armazenar
recursos multimídia juntamente com outras informações. Dessa forma, é possível criar registros
com informações mais ricas sobre um determinado assunto. Por exemplo, pode-se armazenar
informações sobre um funcionário juntamente com a sua própria foto. No Paradox, por exemplo,
existe um tipo de campo destinado especialmente para esse fim.
(Binary Large Object), que permite que qualquer arquivo seja "embutido" no banco de dados. Na
verdade, o conteúdo do arquivo não é armazenado no registro em si, mas num arquivo separado
que é manipulado internamente pelo banco de dados.
Trabalhar com esse tipo de campo no Delphi é muito simples, mas não tão óbvio à primeira vista.
A manipulação de campos BLOB, diferentemente dos campos comuns, não deve ser feita
diretamente, mas sim por meio do objeto TBlobField, descendente do TField, que disponibiliza
recursos especiais para esse fim. Para isso, você deve sempre se referir ao campo BLOB no código
como sendo um TBlobField, utilizando typecasting.
Vamos supor que você tenha um arquivo de som MyWave.wav que será armazenado no campo
"SOM" da tabela "MyTable". Para carregar o conteúdo do arquivo no campo SOM, basta fazer
assim:
TBlobField(MyTable.FieldByName('SOM')).LoadFromFile('MeuWave.wav');
Neste exemplo, você usou o recurso de typecasting para manipular o campo como sendo um
objeto TBlobField, carregando o arquivo através do método LoadFromFile que existe nesse objeto.
Fácil, não é?
Se você quiser salvar o conteúdo do campo "SOM" no arquivo "MyWaveCopy.wav", basta fazer
assim:
TBlobField(MyTable.FieldByName('SOM')).SaveToFile('MyWaveCopy.60wav');
Para remover o conteúdo do campo "SOM" (limpá-lo), você também deve usar um método
apropriado:
TBlobField(MyTable.FieldByName('SOM')).Clear;
Para saber se o campo SOM possui algum conteúdo, use a propriedade IsNull:
with MyTable do
if not TBlobField(FieldByName('SOM')).IsNull then
TBlobField(FieldByName('SOM')).SaveToFile('MyWaveCopy.wav');
A maneira mais simples de utilizar o conteúdo de um campo BLOB já armazenado é primeiro
gravá-lo novamente em um arquivo em disco, usando o método SaveToFile, e depois manipulá-lo
normalmente. No caso de um conteúdo em formato wave, por exemplo, você deve primeiro gravá-
lo num arquivo .wav, e então reproduzí-lo através do TMediaPlayer ou pela função SndPlaySound.
Usando os mesmos métodos, você também pode armazenar e manipular filmes AVI,
apresentações, documentos, enfim, o que a sua imaginação mandar. Mas tenha em mente que o
armazenamento de arquivos de som ou outros tipos vai aumentar consideravelmente o tamanho do
seu banco de dados, por isso esse recurso deve ser utilizado com cuidado. Uma boa medida para
reduzir esse problema é compactar o arquivo antes de armazená-lo. Para utilizá-lo depois, basta
gerar o arquivo novamente em disco e descompactá-lo. Para saber quanto um campo BLOB está
ocupando num registro do seu arquivo, em bytes, use a propriedade BlobSize:
TBlobField(MyTable.FieldByName('SOM')).BlobSize;
Obs: Para armazenar imagens ou texto em formato RichText (RTF), use os tipos GRAPHIC e
FORMATED MEMO do Paradox, que são destinados a esses tipos de dados. O Delphi também
possui objetos para a manipulação desses campos: TGraphicField e TMemoField, ambos
descendentes do TBlobField.
Primeiro crie um alias apontando para o diretorio onde está o arquivo mdb do access, este
apontamento deve ser testado clicando no botão connectt. Se funcionar, pode fechar salvando o
novo alias. Caso contrário verifique se o diretório está correto e se o arquivo mdb existe neste
diretório.
Bem, após isso, vá no delphi, abra um projeto novo, coloque um componente tdatabase, uma
query, um datasource e um dbgrid. Após isso clique duas vezes no componente tdatabase, após
clicar, aparecerá um formulário, informe o nome que deseja dar ao database em name, em alias
name, clique na seta e escolha o alias criado anteriormente, depois clique em defaults, se quiser
uma senha para acesso ao banco, procure a palavra PASSWORD dentro da janela que foi
preenchida com comandos quando você clicou em defaults, e digite a senha desejada, se não quiser
senha deixe em branco. Após fazer isto, clique em OK. Bem, agora vá em propriedades do
tdatabase e clique em conectt, ele vai pedir um usuário e uma senha, se não colocou password,
basta clicar em ok que ele se conectará e caso tenha uma password digite-a. Uma vez conectado, vá
na query, na propriedade strings, coloque a instrução SELECT acessando a tabela que está dentro
do arquivo MDB. Veja bem, não é para colocar o arquivo mdb mas sim uma ou mais das tabelas
que estão dentro do MDB. Depois disso na propriedade database, escolha o nome que deu ao seu
database, se você fez tudo correto, o nome dele tem que estar na lista. Bom, agora active a query.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 237 de 272
Após isso vá no datasource e conecte-o á query, e depois vá no dbgrid e sete o datasource para o
datasource criado. Se fez tudo correto e se a tabela tiver dados, você os verá no dbgrid.
forma:
Abra o database desktop e crie um alias chamado DISCO, informe o drive desejado como
ACCESS, veja bem é ACCESS e não microsoft access drive, tá legal ???, depois no campo
database que se abriu bem abaixo, indique o diretorio onde se encontra o banco do access exemplo:
c:\discoteca\dados\discoteca.mdb, para testar e ver se está correto clique no botão conectt, se der
algum erro é porque não existe o caminho ou o arquivo mdb informado no campo database.
Uma vez que conectou, feche o alias e vá em file no menu da database desktop, clique em new e
depois em sql file, na janela que se abre digite select * from autores, uma vez que digitou a
instrução, clique no botão Query que está em cima há direita, ele tem um ponto de interrogação
preto, bom depois de clicar se abrirá uma tela, bem no meio tem table type com duas opções:
PARADOX E DBASE, ESCOLHA PARADOX, depois vá onde está table name bem no meio da
tela, digite o diretório e o nome do arquivo que quer que receba a tabela do access convertida,
pronto, quando fizer isso ela já estará convertida, com o nome que você deu com extensão db. Ou
seja você tem uma tabela paradox com os dados que estavam em autores dentro do banco do
access.
Abrir o database desktop, abra uma nova qbe e procure o diretorio onde está o dbf.
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 238 de 272
Uma vez escolhido, clique nele, aparecerá um retangulo como quadrinhos ao lado de cada campo,
clique no primeiro quadrado que marcará todos automaticamente. Feito isso clique na paleta onde
está escrito Query e vá em propriedades, aparecerá um form onde você pode escolher entre
paradox ou dbase, escolha paradox e logo embaixo digite o diretorio e o nome da tabela que voce
quer criar, tecle o raizinho para rodar a query que então ele converterá para paradox.
var
sArquivo: TextFile;
Entrada, sArq2: string;
iLinha: integer;
begin
tblCep.Open;
tblCepLoc.Open;
bCancelaImport := False;
AssignFile(sArquivo, FileNameEdit1.FileName);
sArq2 := After('Cep_Loc.txt',FileNameEdit1.FileName);
iLinha := 0;
if FileNameEdit1.FileName = 'C:\Download\Ceps\Cep_loc.txt' then begin
// Arquivo de Localidades
RzProgressBar1.TotalParts := 0;
RzProgressBar1.TotalParts := NumLinhasArq(FileNameEdit1.FileName);
Reset(sArquivo);
Readln(sArquivo,Entrada);
while not Eoln(sArquivo) do begin
Inc(iLinha);
Readln(sArquivo,Entrada);
copy(Entrada,75,2);
end;
try
tblCepLoc.Post;
except
tblCepLoc.Cancel;
end;
end;
RzProgressBar1.PartsComplete := iLinha;
Application.ProcessMessages;
if bCancelaImport then
Break;
end;
CloseFile(sArquivo);
end;
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).
Para isto, o código deve ser inserido no evento OnPostError do componente de banco de dados
(Table ou Query).
Toda vez que ocorrer um erro de gravação no banco de dados este evento será executado, sendo
que na variável de parâmetro "E" deste procedimento é armazenado a mensagem que será
apresentada na tela.
Para realizar um tratamento deste erro, testa-se se a mensagem ocorrida é "Key violation.', se for
verdadeiro o processo de gravação é abortado (Action := daAbort).
Código Completo:
A implementação da função abaixo permite inserir os campos de uma tabela num componente
TMemo.
Para que a função funcione é necessário que as units StdCtrls e DbTables tenham sido declaradas.
Os campos que serão listados, são aqueles que foram declarados através da operação de duplo
clique no componente Table e opção ADD Fields.
Código Completo:
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 241 de 272
Procedure ListaCampos(TB:Ttable;M:Tmemo);
Begin
M.Lines.Assign(TB.ListField);
End;
Exemplo:
Procedure TForm1.Button1Click(Sender:TObject);
Begin
ListaCampos(Table1,Memo1);
end;
PARADOX EM REDE
Arquivos Paradox podem ser compartilhados em rede. Para que isto ocorra devemos :
·Selecionar o driver PARADOX e alterar o parâmetro NET DIR para o local onde serão gravados
os arquivos de controle para compartilhamento. Por exemplo, "G:\MEUAPLIC", onde G :
corresponde ao drive de rede e MEUAPLIC, o diretório aonde está o aplicativo (executável)
·Alterar o parâmetro LOCAL SHARE para TRUE. Após isto o BDE controlará o
compartilhamento de arquivos PARADOX em rede
DbGrid Zebrado
O exemplo abaixo mostra como deixar cada linha do componente DBGrid de uma cor diferente,
dando assim um efeito zebrado. O controle é feito no evento OnDrawColumnCell.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, Grids,
DBGrids, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
Table1: TTable;
DataSource1: TDataSource;
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer;
Column: TColumn; State: TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Begin
For i:= 0 to Texto.Lines.count - 1 do
begin
Linha := Texto. Lines[i];
Repeat
Posicao:=Pos(Enc,Linha);
If Posicao > 0 then
Begin
Delete(Linha,Posicao,Length(Enc));
Insert(Subs,Linha,Posicao);
Texto.Lines[i]:=Linha;
end;
until Posicao = 0;
end;
end;
query1.active := false;
query1.sql.clear;
query1.sql.add('select * from estrucpr where upper(portugues)like "LETRA%" ');
query1.active:= true;
PRIMEIRA LETRA "LETRA%"
* TQuery
* TDataSource
* TDBGrid
* TEdit
* TButton
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select * from dCli');
Query1.SQL.Add('where extract(month from DataNasc) = :Mes');
Query1.ParamByName('Mes').AsInteger := StrToInt(Edit1.Text);
Query1.Open;
- Execute. Digite um número de 1 a 12 no Edit e clique no botão.
Observações
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
function MesExtenso( Mes:Word ) : string;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 245 de 272
{$R *.DFM}
end.
begin
APanel.Left := (AForm.ClientWidth + 100);
APanel.Top := (AForm.ClientHeight + 100);
end;
APanel.Update;
AForm.Update;
end;
Para você economizar memória, pode-se criar os forms de sua aplicação somente no momento da
execução. Na criação do Form você define se ele é MODAL ou NÃO MODAL. Para Isso observe
os seguintes códigos:
Se você já desenvolveu uma aplicação MDI com um formulário MDIChild que tem que ser exibido
em estado Maximizado (WindowState=wsMaximized), provavelmente você já se deparou com
aquele deselegante problema em que o usuário acompanha a maximização do seu formulário. Para
evitar isto, faça o seguinte:
Exemplo:
{$R *.RES}
begin
Application.Title := '';
Application.HelpFile := '';
if HPrevInst = 0 then
begin
F_Splash := TF_Splash.create(Application);
F_Splash.Show;
Application.CreateForm(TF_Menu, F_Menu);
Application.CreateForm(TF_Error, F_Error);
Application.CreateForm(TF_Form1, F_From1);
Application.CreateForm(TF_Form2, F_Form2j);
Application.Run;
end
else
messagedlg('O sistema já foi nicializado!',mtinformation,[mbok],0);
end.
Para criar uma janela não retangular, voce deve criar uma Região do Windows e usar a função da
API SetWindowRgn, desta maneira:
var
hR : THandle;
begin
{cria uma Região elíptica}
hR := CreateEllipticRgn(0,0,100,200);
SetWindowRgn(Handle,hR,True);
end;
var
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 248 de 272
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}
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}
end.
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;
var
Form1: TForm1;
Bmp: TBitmap;
implementation
{$R *.DFM}
Result := True;
end;
finally
Free;
end;
end;
end;
end;
const
cnCursorID1 = 1;
begin
Screen.Cursors[ cnCursorID1 ] :=
LoadCursorFromFile('c:\win95\cursors\cavalo.ani' );
Cursor := cnCursorID1;
end;
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.
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.
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.
var
s: string;
begin
s := '0x' + Edit1.Text + Edit2.Text;
MMSystem.waveOutSetVolume(0, StrToInt(s));
end;
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!!!)
Na propriedade Text do Edit1 coloque o arquivo wave que você salvou - C:\SOM.WAV
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.
begin
scratch := '';
for i := 13 downto 1 do
while ( Decimal >= Arabics[i] ) do
begin
Decimal := Decimal - Arabics[i];
scratch := scratch + Romans[i];
end;
Result := scratch;
end;
Procedure LimpaEdit;
var
i : Integer;
begin
for i := 0 to ComponentCount -1 do
if Components[i] is TEdit then
begin
TEdit(Components[i]).Text := '';
end;
end;
Esta dica serve para quem deseja criar um sistema que atualize seus softwares via internet, e
também para quem faz jogos online, ou seja, jogos que exigem a conexão com a internet para
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 254 de 272
serem jogados, pode precisar de um meio rápido, fácil e desburocratizado para baixar arquivos de
um site ou de um lugar qualquer da rede. Veja só como é simples e sem contra indicações fazer
isso:
Uses Shellapi
procedure Beep;
Toca um beep
var
ADate: TDateTime;
begin
ADate := StrToDate(Edit1.Text);
Label1.Caption := 'Day ' + IntToStr(DayOfWeek(ADate)) + ' of the week';
end;
Specifier	Represents
0	Digit place holder. If the value being formatted has a digit in the position where the '0'
appears in the format string, then that digit is copied to the output string. Otherwise, a '0' is stored
in that position in the output string.
#	Digit placeholder. If the value being formatted has a digit in the position where the '#'
appears in the format string, then that digit is copied to the output string. Otherwise, nothing is
stored in that position in the output string.
.	Decimal point. The first '.' character in the format string determines the location of the
decimal separator in the formatted value; any additional '.' characters are ignored. The actual
character used as a the decimal separator in the output string is determined by the
DecimalSeparator global variable. The default value of DecimalSeparator is specified in the
Number Format of the International section in the Windows Control Panel.
,	Thousand separator. If the format string contains one or more ',' characters, the output will
have thousand separators inserted between each group of three digits to the left of the decimal
point. The placement and number of ',' characters in the format string does not affect the output,
except to indicate that thousand separators are wanted. The actual character used as a the thousand
separator in the output is determined by the ThousandSeparator global variable. The default value
of ThousandSeparator is specified in the Number Format of the International section in the
Windows Control Panel.
E+	Scientific notation. If any of the strings 'E+', 'E-', 'e+', or 'e-' are contained in the format
string, the number is formatted using scientific notation. A group of up to four '0' characters can
immediately follow the 'E+', 'E-', 'e+', or 'e-' to determine the minimum number of digits in the
exponent. 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. The 'E-' and 'e-' formats output a sign character
only for negative exponents.
'xx'/"xx"	Characters enclosed in single or double quotes are output as-is, and do not affect
formatting.
;	Separates sections for positive, negative, and zero numbers in the format string.
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.
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. If the format string contains no decimal
point, the value being formatted is rounded to the nearest whole number.
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 '.' character in the format string, the extra digits are output
before the first digit placeholder.
To allow different formats for positive, negative, and zero values, the format string can contain
between one and three sections separated by semicolons.
One section: The format string applies to all values.
	Two sections: The first section applies to positive values and zeros, and the second section
applies to negative values.
	Three sections: The first section applies to positive values, the second applies to negative
values, and the third applies to zeros.
If the section for negative values or the section for zero values is empty, that is if there is nothing
between the semicolons that delimit the section, the section for positive values is used instead.
If the section for positive values is empty, or if the entire format string is empty, the value is
formatted using general floating-point formatting with 15 significant digits, corresponding to a call
to FloatToStrF with the ffGeneral format. 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.
0			1234		-1234		1		0
0.00 			1234.00		-1234.00		0.50		0.00
#.## 			1234		-1234		.5	
#,##0.00			1,234.00		-1,234.00	0.50		0.00
#,##0.00;(#,##0.00)	1,234.00		(1,234.00)	0.50		0.00
#,##0.00;;Zero 		1,234.00		-1,234.00	0.50		Zero
0.000E+00 		1.234E+03	-1.234E+03	5.000E-01	0.000E+00
#.###E-0 		1.234E3		-1.234E3	5E-1		0E0
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 261 de 272
ClickedOK: Boolean;
begin
NewString := 'Default String';
Label1.Caption := NewString;
ClickedOK := InputQuery('Input Box', 'Prompt', NewString);
if ClickedOK then { NewString contains new input string }
Label1.Caption := 'The new string is ''' + NewString + '''';
end;
{$I-}
{ Get directory name from TEdit control }
MkDir(Edit1.Text);
if IOResult <> 0 then
MessageDlg('Cannot create directory', mtWarning, [mbOk], 0)
else
MessageDlg('New directory created', mtInformation, [mbOk], 0);
end;
function Pred(X);
Retorna o predecessor de um ordinal
uses Dialogs;
type
Colors = (RED,BLUE,GREEN);
var
S: string;
begin
S := 'The predecessor of 5 is ' + IntToStr(Pred(5)) + #13#10;
S := S + 'The successor of 10 is ' + IntToStr(Succ(10)) + #13#10;
if Succ(RED) = BLUE then
S := S + 'In the type Colors, RED is the predecessor of BLUE.';
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 265 de 272
procedure Randomize;
Inicializa o modo Randomico
var
I: Integer;
begin
Randomize;
for I := 1 to 50 do begin
{ Write to window at random locations }
Canvas.TextOut(Random(Width), Random(Height), 'Boo!');
end;
end;
begin
{$I-}
{ Get directory name from TEdit control }
RmDir(Edit1.Text);
if IOResult <> 0 then
MessageDlg('Cannot remove directory', mtWarning, [mbOk], 0)
else
MessageDlg('Directory removed', mtInformation, [mbOk], 0);
end;
function Succ(X);
Retorna o sucessor de um ordinal
uses Dialogs;
type
Colors = (RED,BLUE,GREEN);
var
S: string;
begin
S := 'The predecessor of 5 is ' + IntToStr(Pred(5)) + #13#10;
S := S + 'The successor of 10 is ' + IntToStr(Succ(10)) + #13#10;
if Succ(RED) = BLUE then
S := S + 'In the type Colors, RED is the predecessor of BLUE.';
MessageDlg(S, mtInformation, [mbOk], 0);
end;
s : string;
i : Integer;
begin
{ Get string from TEdit control }
s := Edit1.Text;
for i := 1 to Length(s) do
s[i] := UpCase(s[i]);
MessageDlg('Here it is in all uppercase: ' + s, mtInformation, [mbOk], 0);
end;
ÍNDICE
Assunto Pág.
Capitulo I – Definições 1
Sistema Operacional 1
Linguagem 1
Linguagem estruturada 1
Linguagem orientada a objeto 1
Constantes 1
Variáveis 1
Operadores 2
Dados 3
Banco de Dados 3
Rotina 4
Procedimento 4
Comandos 4
Estruturas 4
Capitulo II – Componentes básicos da orientação a objetos 5
Classe 5
Objeto 5
Instância 5
Propriedade 5
Método 5
Mensagem 6
Interface 6
Evento 6
Procedimento 6
Tempo de Projeto 6
Tempo de Execução 6
Capitulo III – Apresentação do Delphi 2005 6
Tela de Abertura 6
VCL Form Application for WIN 32 7
Object Inspector 8
Caixa de estruturas (Structure) 8
A Paleta de Componentes 8
Gerente do projeto (Project Manager) 9
O Formulário 10
A Unit 10
Estrutura de uma Unit 11
Capitulo IV – Os primeiros contatos 12
Prática 01: O primeiro projeto 12
Prática 02: Alterando algumas propriedades do formulário 13
Prática 03 - Exercício 01 13
Capitulo V – Estruturas 14
Estrutura de bloco 14
Prática 04 15
Pratica 05 – Exercício 02 16
Estruturas de decisão 17
Pratica 06: Acendendo uma lâmpada 18
Prática 07 19
Pratica 08 – Exercício 03 20
Pratica 09: Controlando o trânsito 21
Projeto 10: Promovendo descontos 22
Pratica 11 – Exercício 04 24
Estruturas de loop ou laço 24
Pratica 12: Demonstração do Repeat ... Until 25
Pratica 13 – Exercício 05 26
Estruturas consecutivas 27
Fábio José de Gondra Ramos
gondraf@hotmail.com
Delphi 2005 for win32 Página 271 de 272