900 Dicas Delphi Perdoenos mas o site aida esta em contrução 160 dicas delphi
1- Mostrar e esconder o Botão Iniciar
2- Mostrar e esconder a Barra de Tarefas
3- Pegando o nome do usuário e a empresa do Windows
4- Arrastar um Form sem clicar no caption
5- Bloquear a tecla CTRL+DEL do DBGrid
6- Escondendo a aplicação da Barra de Tarefas
7- Verificando atributo do arquivo
8- Fazer um BEEP no Computador
9- Fazer uma pausa por um período determinado
10- Desabilitando o Splash Screen do Report Smith
11- Lendo o volume do HD
12- Descobrindo o número serial do HD
13- Para saber somente o Path da aplicação
14- Interceptar as teclas de função (F1, F2, F3...)
15- Traduzindo a mensagem: “DELETE RECORD?”
16- Incluir um Preview personalizado no Quick Report
17- Executando programas externos
18- Utilizando a tecla enter para saltar de campo
19- Tocando um som wav sem o media player
20- Obter o diretório onde seu programa está instalado
21- Bloqueando um arquivo em ambiente de rede
22- Usando Enter para mudar de campo de um DBGrid
23- Função para obter o número do registro atual
24- Enviando um arquivo para a lixeira
25- Carregar um cursor animado (*.ANI)
26- Transferir o conteúdo de um Memo para o MemoField
27- Capturar o conteúdo do Desktop
28- Escrevendo um texto diagonal usando o canvas
29- Extrair um ícone de um determinado aplicativo
30- Alinhando itens do menu à direita
31- Abrir automaticamente seu navegador padrão e carregar a pagina determinada pelo link
32- Copiar registros de uma tabela para outra incluindo valores Null
33- Deletar arquivos de um diretório com o caractere curinga „*‟
34- Capturar a lista de aliases disponíveis
35- Abrir e fechar a bandeja do drive de CD-ROM
36- Código usados pelas impressoaras HP
37- Copiando arquivos via Delphi
38- Abrir um TComboBox sem clicá-lo
39- Mudar a cor da célula ativa do DBGrid
40- Como incrementar 1 mês numa data
41- Verificar se existe disquete do drive
42- Acessar o ambiente DOS
43- Executar um Programa DOS e fechar sua janela em seguida
44- Instanciar uma única vez um executável correspondente a uma determinada aplicação
45- Modificar varias propriedades de um objeto ao mesmo tempo
46- Para emitir um som quando o enter for pressionado
47- Margem para RichText
48- Criar alias via programação
49- Desabilitar as teclas t eclas de acesso (CTRL+ALT+DEL), (ALT+TAB), (CTRL+ESC) (CTRL+ESC)
50- Fazer um Splash Screen
51- Função para encriptar uma string
52- Função reverter uma string
53- Função para converter um numero inteiro para binário
54- Função para converter um numero binário para inteiro
55- Função para Encriptar e Descriptar uma String
56- Rotina para verificar erros em toda a aplicação
57- Enviando informações direto para a impressora
58- Enviando caracteres diretamente ao buffer da impressora
59- Imprimir diretamente para a impressora sem passar pelo gerenciado de impressão
60- Criar barra de status com suporte „as caixas de edição do Windows 95
61- Capturando uma tela do Windows
62- Compactação de uma tabela Paradox
63- Configurações internacionais
64- Listando todas as janelas abertas
65- Primeira letra de um EditBox maiúscula
66- Desligar e ligar o monitor (OFF/ON)
67- Invertendo os botões do mouse
68- Mudar o papel de parede do Windows
69- Acessando arquivos paradox em rede
70- Pesquisa incremental numa tabela
71- incluir mais de uma linha no Hint
72- Como saber se o aplicativo já foi aberto
73- Mostrar e alterar resolução de vídeo
74- Verificar sistema operacional
75- Nome do usuário logado na rede
76- Capturar o nome das tabelas de um banco de dados
77- Tabela dos caracteres especiais utilizados como mascara.
78- Traduzir captions e botões da MESSAGEDLG
79- Ultimo acesso de um arquivo
80- Obtendo as informações de versão dos arquivos
81- Acertar padrão de data
82- Colocar um Bitmap num ComboBox
83- Adicionando um BookMarks
84- Inserindo um ComboBox num DBGrid
85- Como conectar uma unidade de rede
86- Configurar uma rede Novell
87- Configuração de rede Windows 95/98 com Delphi
88- Criar um arquivo (Bando de dados) em tempo de execução
89- Controle sobre a digitação
90- Criar arquivo DBF com índices compostos
91- Sistemas em Delphi para Linux
92- Desenhar um Bitmap no Formulário
93- Evitando a saída de formulário
94- Desabilitando simultaneamente as teclas ( ALT + F4 )
95- Filtrando registros
96- Como saber se um form já esta criado
97- Não redimensionar o formulário
98- Criando forms dinamicamente (SDI)
99- Criando forms dinamicamente (MDI)
100- Definindo o tamanho mínimo e máximo de um form
101- Para fazer protetor de tela com o Delphi
102- Linkar um OBJ ao executável
103- Alterar LOCAL SHARE via programação
104- Verificando se o Delphi está aberto
105- Criando formulários
106- Desabilitar acesso a windows
107- Impressão com o TPrinter ( Via gerenciador de impressão)
108- Definir o tamanho do papel em TPrinter
109- Como criar Forms em tempo de execução
110- Adaptando para resoluções de video diferentes?
111- Como posso rolar um form usando pgUP and pgDn.
112- Colocar Funções em uma DLL
113- Verifica validade de CGC e CPF
114- Gera número por extenso
115- Preenche com quantidade determinada de zeros o lado esquerdo de uma string
116- Ponto Decimal
117- FindNearest numa Query
118- Relatórios em HTML
119- Desligando Windows via programação
120- Como saber se o CD está no drive
121- Tradução de Mensagens Delphi 3
122- Função que devolve tempo decorrido em uma string
123- Criando uma rotina para pegar todos os erros do programa.
124- Saindo do Windows
125- Modificando a posição do cursor em um Memo
126- Fundo do texto transparente
127- Formatação de Casas Decimais
128- Como Limpar Todos os Edit's de um Form de uma só vez?
129- Alterando cor de linha de um DBGrid
130- Diretório de instalação do windows
131- Exclusividade para o programa
132- Substituindo TAB pelo ENTER
133- Inserir um item em um TreeView em Run Time
134- Copiando arquivos
135- Armazendo BMP‟s em arquivos RES
136- QR armazenado num Blop
137- Deletando um arquivo
138- Diretório Windows e System
139- Como fazer um 'Hot Link'
140- Formatar disquete.
141- Como detectar as teclas de “seta”.
142- Caps Lock e Num Lock
143- BDE em 1 disqiete
144- Cor de fundo do hint
145- Mostrando progresso de uma SQL
146- Transforma uma string em um valor
147- Checa CEP
148- Valida PIS
149- Testa CGC
150- Desconecta da Rede uma unidade mapeada.
151- Sugestão para tratamento de erros no Delphi / Cliente-Servidor
152- Gerenciando mais de uma linha selecionada num DBGrid (Multiselect)
153- Procura e substituição de string num campo memo
154- Trunca um numero definido de casas decimais em um valor float
155- Pequisa incremental em um listbox
156 - Escreve um texto e converte-o em Imagem
157- Converte um valor Hexadecimal em Integer
158- Criando e apagando TFields em Run-Time
159- Utilizar o MessageBox com parâmetros
160- Como mudar a resolução do vídeo via programação
161- Como rodar vídeos em um panel
162- Validar datas
163- Como gerar senhas aleatórias
164- Mostrar a largura das colunas de um dbgrid igual ao seu tamanho (campo) na tabela
165- Como colocar seus programas no Painel de Controle
166- Criando um efeito degradê de cores
167- Utilizando a Função DayOfWeek
168- Coloca uma máscara númerica em uma String com números
169- Imprime um texto em outro angulo diferente de 90º
170- Chama arquivos BMP de uma Dll
171- Rotina de resgate das variáveis de ambiente DOS
172- Executa uma url com o Browser padrão
173- Retorna os programas que estão abertos na memória
174- Promove um estado de espera no aplicativo
175 - Retorna a impressora Padrão do windows
176- Obtendo a velocidade do processador
177- Testa se a hora é antes de Meio dia
178- Quantos fins de semana já se passaram no corrente ano
179- Obtendo o último dia útil caso a data informada caia em um fim de semana
180- Obtendo o próximo dia útil caso a data informada caia em um fim de semana
181- Remove um diretorio
182- Localizando um nó do treeview pelo nome
183- Remove ponto ou virgula de um valor numérico
184- Converte uma String em Real
185- Trunca um numero definido de casas decimais em um valor float
186- Troca a virgula pelo ponto em um valor Float
187- Insere a barra invertida de diretório após o nome especificado.
188- Converte String em Pchar
189- Converte String em Booleano
190- Filtra todos os números de uma string
191- Função para impressão de linhas em um relatório
192- Remove os zeros a frente de um valor
193- Remove um caractere especificado de uma string
194- Remove acentos de uma string
195- Imprime um campo memo
196- Compara dois valores e retorna o menor
197- Compara dois valores e retorna o maior
198- Recebe String de data e converte do formato ORIGEM para formato DESTINO
199- Inverte uma String
200- Converte um número decimal em algarismos romanos
201- Idade de uma pessoa
202- Tipo de variável
203- Porcentagem de um valor
204- Formata valor numérico inserindo mascaras de ponto
205- Converte um numero decimal em binário
206- Le um valor String no registro
207- Le um valor Integer no registro
208- Oculta e Mostra o cursor do mouse
209- Verifica a existência de uma placa de som
210- Número de cópias para a impressão
211- Informações do Ambiente
212- Alternando entre a declaração de procedure na seção interface e implementation
213- Abreviando Nomes
214- Adicionando à hora atual, um número determinado de horas.
215- Funcão que retorna o IP
216- Verificando se o ano é bisexto
217- Verificando se uma unidade de disco está preparada.
218- Contador de Letras
219- Verificando se você está conectado a Internet ou não
220- Reparar e Compactar um banco de dados MS-Access
221- Enviando email com Delphi pelo componente NMSMTP
222- Número de cores aceitas pelo monitor
223- Convertendo a 1ª letra de um edit para maiúsculas
224- Obtendo o 'nome do computador' do windows
225- Localizando Valores por Proximidade em uma Tabela.
226- Função para adquirir Data e Hora de um Arquivo
227- Criando Forms não retangulares
228- Trocando cor de uma linha no DBGrid por uma condição
229- Incrementando e Decrementando com INC( ) e DEC( )
230- Como Inverter os Botões do Mouse
231- Minimizando uma janela de maneira diferente
232- Como configurar o acesso à BD Paradox em uma rede?
233- Como desligar, reiniciar, resetar ou dar logout no sistema ?
234- Verificar a impressora, antes de uma impressão
235- Como fazer um TMemo receber um arquivo texto ?
236- Como se movimentar/manipular banco de dados?
237- Criação de índices em tempo de execução.
238- Converter arquivo texto para um Banco de Dados
239- Usando Banco de Dados Access
240- Validando CEP por Estado
241- Rebootar o Micro
242- Para converter uma pchar em string
243- Descobrir quais são as pastas do Windows
244- Criar uma fonte de dados no ODBC do windows pelo Delphi
245- Retorna a quantidade de dias úteis entre duas datas
246- Executar uma música pelo Winamp
247- Descobrir o drive da aplicação
248- Registrar DLL´s
249- Preencher uma Combo com o resultado de uma Query
250- Ir para determinado registro numa tabela
251- Ativar / Exibir a Ajuda do Sistema
252- Excluir arquivos de uma lista
253- Tratamento de Erros
254- Usuário e senha do DBA do MySql
255- Acessar tabelas DBF/NTX no Delphi sem usar o BDE
256- Impressão de código de barras com o QuickReport
257- Como fechar todas as tabelas do DataModule de uma vez
258- Desabilita o botão Fechar do Formulário
259- Inicializar vários Edits em um formulário
260- Executar Pack em Tabelas Paradox
261- Como deletar uma pasta com arquivos e subpastas dentro
262- Obter/Definir tempo máximo de Double-Click do mouse
263- Fazer que seu Programa só abra através de outro seu
264- Usar Assembly com Delphi
265- Verificar se a String é uma Data válida
266- Colocar linhas de diferentes alturas em um DBGrid
267- Ligar/Desligar Caps-Lock
268- Verificar se o Delphi está aberto
269- Configurar Século
270- Desabilitar Botão fechar do Form
271- Desabilitar um item do TRradioGroup
272- Envia direto para Impressora em Rede
273- Extrair palavra que está sob a posição corrente do cursor
274- Executar Bat
275- Verificar se há Placa de Som
276- Converter Path e nome de Arquivos longos para curtos
277- Impedir que o usuário mude de página no TabbedNotebook
278- Criar janela redonda
279- Detectar finalização do Windows
280- Exibir ano com 4 Dígitos
281- Alterar Fonte do Hint
282- Mostrar Hint independente para cada célula da Stringgrid
283- Alterando Fonte de determinado registro no DBGrid
284- Extrair primeiro nome de uma pessoa
285- Descobrir qual Ícone foi selecionado no ListView
286- Criar atalho no Desktop
287- Criar atalho no menu Iniciar
288- Mudando texto do TEdit no OnChange
289- Posicionando cursor na linha de um Memo ou Richedit
290- Escondendo janelas filhas minimizadas
291- Executando operações padrão de um Ole Container
292- Usando JPG no Delphi 3
293- Calculando feriado da Páscoa
294- Extrair ícones de uma DLL ou de um EXE
295- Colocar monitor em estado de redução de energia
296- Compartilhar Pastas
297- Visualizar imagem em um DBGrid
298- Imprimir com precisão Milimétrica
299- Alterar caption da janela de Preview do QuickReport
300- Mostrar uma mensagem durante um processamento
301- Mostrar um cursor de ampulheta durante um processamento
302- Ler e escrever dados binários no Registro do Windows
303- Mudar a resolução do vídeo via programação
304- Ler e escrever dados no Registro do Windows
305- Adicionar barra de rolagem horizontal no ListBox
306- Simular um CharCase no DBGrid
307- Verificar se uma string é uma data válida
308- Fazer pesquisa incremental com DBGrid e Edit
309- Adicionar zeros à esquerda de um número
310- Limpar um campo tipo data via programação
311- Implementar um campo auto-incremental via programação
312- Obter o endereço IP do Dial-Up
313- Exibir a caixa de diálogo padrão de solicitação de senha do banco de dados
314- Obter a versão da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi)
315- Implementar rotinas assembly em Pascal
316- Exibir o diálogo About do Windows
317- Obter a linha e coluna atual em um TMemo
318- Exibir um arquivo de ajuda do Windows
319- Obter o valor de uma variável de ambiente
320- Determinar se uma janela (form) está maximizada
321- Determinar se o cursor do mouse está em determinado controle
322- Determinar se o aplicativo está minimizado
323- Fechar um aplicativo com uma mensagem de erro fatal
324- Usar o evento OnGetText de um TField
325- Maximizar um form de forma que cubra toda a tela, inclusive a barra de tarefas
326- Verificar, via programação, se Local Share do BDE está TRUE
327- Criar um EXE que seja executado apenas através de outro EXE criado por mim
328- Resolver "Internal error near: IBCheck" do Interbase 5.1.1 Server no NT
329- Inverter os botões do mouse
330- Obter/definir o tempo máximo do duplo-click do mouse
331- Obter os atributos de um arquivo/diretório
332- Obter o espaço total e livre de um disco
333- Obter o tipo de um drive (removível, fixo, CD-ROM, unidade de rede, etc)
334- Obter informações de um volume/disco (label, serial, sistema de arquivos, etc)
335- Alterar o nome de volume (Label) de um disco
336- Saber quais as unidades de disco (drives) estão presentes
337- "truncar" valores reais para apenas n casas decimais
338- Excluir todos os registros de uma tabela (como DELETE ALL do Clipper)
339- Saber se o sistema está usando 4 dígitos para o ano
340- Imprimir caracteres acentuados diretamente para a impressora
341- Imprimir texto justificado com formatação na impressora Epson LX-300
342- Formatar um disquete através de um programa Delphi
343- Alterar (e restaurar) o tamanho da página na impressora
344- Reproduzir um arquivo de som WAV sem o TMediaPlayer
345- Obter o nome do usuário e da empresa informado durante a instalação do Windows
346- Mostrar uma barra de progresso enquanto copia arquivos
347- Copiar arquivos usando o Shell do Windows
348- Descobrir o código ASCII de uma tecla
349- Evitar que seu programa apareça na barra de tarefas
350- Usar eventos de som do Windows
351- Mudar a coluna ativa em um DBGrid via programação
352- Fechar o Windows a partir do seu programa
353- Carregar um cursor animado (.ani)
354- Enviar um arquivo para a lixeira
355- Obter o número do registro atual
356- Trabalhar com Filter de forma mais prática
357- Reproduzir um arquivo WAV
358- Executar um programa DOS e fechá-lo em seguida
359- Fechar um programa a partir de um programa Delphi
360- Colocar Hint's de várias linhas
361- Reproduzir um vídeo AVI em um Form
362- Separar (filtrar) caracteres de uma string
363- Colocar zeros à esquerda de números
364- Copiar arquivos usando curingas (*.*)
365- Copiar arquivos
366- Trabalhar com cores no formato string
367- Verificar se determinado programa está em execução (Word, Delphi, etc)
368- Excluir arquivos usando curingas (*.*)
369- Gerar uma tabela no Word através do Delphi
370- Obter a quantidade de registros total e visível de uma tabela
371- Evitar que um programa seja executado mais de uma vez
372- Executar um "COMMIT" no Delphi
373- Posicionar Form's em relação ao Desktop do Windows
374- Saber a resolução de tela atual
375- Verificar se uma unidade de disco (disk-drive) está preparada
376- Salvar/restaurar o tamanho e posição de Form's
377- Definir a quantidade de registros a ser impressa em uma página do QuickReport
378- Onde encontrar tutoriais sobre construção de componentes em Delphi
379- Para que servem OnGetEditMask, OnGetEditText e OnSetEditText do TStringGrid
380- Mostrar um Form de LogOn antes do Form principal
381- Limitar a região de movimentação do mouse
382- Descobrir o nome de classe de uma janela do Windows
383- Ocultar/exibir a barra de tarefas do Windows
386- Evitar a proteção de tela durante seu programa
385- Fazer a barra de título ficar intermitente (piscante)
386- Posicionar o cursor do mouse em um controle
387- Criar cores personalizadas (sistema RGB)
388- Adicionar uma nova fonte no Windows
389- Saber se a impressora atual possui determinada fonte
390- Saber se determinada Font está instalada no Windows
391- Acertar a data e hora do sistema através do programa
392- ENTER em vez de TAB no formulário, no DBGrid e no StringGrid
393- Simular a vírgula através do ponto do teclado numérico
394- Paralizar um programa durante n segundos
395- Criar uma tabela (DB, DBF) através do seu programa
396- Verificar se um diretório existe
397- Verificar se um arquivo existe
398- Criar um Alias temporário através do seu programa
399- Criar um Alias através do seu programa
400- Detectando a saída do mouse de um Componente
401- Adicionar Bitmap a um Menu
402- Colocar um menu PopUp dentro de outro em Run Time
403- Colocar imagem lado a lado em um Form MDI
404- Alterar cor do item selecionado do RadioGroup
405- Retornar último dia do mês
406- Verificar se o número é par ou ímpar
407- Criar um nova Tabela a partir de uma estrutura de outra Tabela
408- Como chamar a caixa de dialogo localizar
409- Gravar imagem JPG em Tabela Paradox
410- Colocar o mês por extenso
411- Como cancelar um Loop (While, For ou Repeat)
412- Inserir Tabelas no Word
413- Deixando o Form principal Invisivel
414- Enviando Textos para outros Aplicativos
415- Associando um tipo de Aplicação a uma extensão
416- Evitando os Acentos
417- Lendo e Gravando Arquivos Texto
418- Transforma a imagem em negativo de fotografia
419- Copia ou move arquivos usando a API do Windows
420- Validando Cartão de Crédito
421- Validando Título de Eleitor
422- Exportando dados para um arquivo XML
423- Gravando e Lendo Datas no Registro do Windows
424- Menus Popup No PageControl
425- Programa que se auto-deleta
426- Download de arquivos na WEB
427- Drag-and-Drop
428- Efeito HotTrack em componentes Label e CheckBox
429- Títulos com mais de uma linha no DBGrid
430- Alterando a cor de fundo do Edit
431- Salvar imagens em uma tabela Paradox
432- Excluir todas as ocorrências de um caractere em uma string
433- Aprendendo a usar o TSplitter
434- Implementando a Função SubString
435- Criando ToolTips no Estilo Balão
436- Movendo Itens Em Uma ListBox
437- Utilizando Captions em Componentes DBNavigator
438- Criando slides no Delphi
439- Descobrindo URL'S visitadas
440- Formatando CNPJ
441- Formatando CPF
442- Criar um arquivo texto
443- Gravando e Lendo Imagens em Dll's
444- Modificando os ícones do DbNavigator
445- OnGetEditMask, OnGetEditText e OnSetEditText do TStringGrid
446- Gerar uma tabela no Word através do Delphi.
447- Como verificar se um campo inteiro é par ou ímpar.
448- Resolvendo "Internal error near: IBCheck" do Interbase 5.1.1 Server no NT.
449- Obtendo os atributos de um arquivo/diretório.
450- Obtendo o tipo de um drive (removível, fixo, CD-ROM, unidade de rede, etc)
451- Excluindo todos os registros de uma tabela (como DELETE ALL do Clipper).
452- Verificando se o sistema está usando 4 dígitos para o ano.
453- Alterando/Restaurando o tamanho da página na impressora.
454- Copiando arquivos usando o Shell do Windows.
455. Descobrindo o código ASCII de uma tecla.
456- Mudando a coluna ativa em um DBGrid via programação.
457- Como trabalhar com Filter de forma mais prática?
458- Cores no formato string.
459- Como executar um "COMMIT" no Delphi?
460- Posicionando Form's em relação ao Desktop do Windows.
461- Descobrindo o nome de classe de uma janela do Windows.
462- Adicionando uma nova fonte no Windows.
463- Acertando a data e hora do sistema através do programa.
464- Registrando o .NET FrameWork para o IIS
465- Verificando se usuário logado é um administrador.
466- Abrir um arquivo XLS protegido por senha
467- Substituindo um arquivo INI por um documento XML.
468- Instalando o Pacote RxLib
469- Como não parar a aplicação durante um processo longo?
470- Desativando o menu de contexto padrão (em TCustomEdits)
471- Verificar se o computador está em rede
472- Criando um Objeto TString
473- Como mudar a cor de fundo em linhas diferentes de texto em um TListBox
474- Zerar Campo AutoIncremento
475- Descobrindo o volume do som Wave.
476- Versão do .EXE
477- Verificar qual o código de erro do ORACLE
478- Verificar o estado de uma tabela
479- Valores das teclas em HEXA
480- Remove caracteres acentuados de uma string
481- Abrir arquivos com aplicativo associado
482- Utilizar o form "Sobre..." padrão do Windows
483- Utilizando TList e Record como Array
484- Uso do TAG
485- Uso de um vetor dinâmico (Pascal)
486- Utilizando Arquivo Help em um sistema
487- Usando um InputQuery
488- Usando Locate em campo não indexado
489- Trocar linha de um bitmap
490- Colocando um Icone ao lado do relogio
491- Tratamento de erro no Delphi com Oracle
492- Tratamento de erro no Delphi Cliente/Servidor
493- Traduzir o PreView do QReport
494- Converter texto para imagem
495- Testar a impressora
496- Testa se a tabelas esta bloqueada ou não
497- Testa se a sigla do estado é válido
498- Tempo do Hint
499- Tarja lateral (parecido com o Menu iniciar do Windows)
500- Usando SQL para totalizações
501- Serial em rede
502- Senha universal p/ tabelas PARADOX
503- Testa se a String é uma url ou não.
504- Salvar os dados de um StringGrid em um arquivo.
505- Converter RTF para BMP
506- Rolar um form usando pgUP and pgDn
507- Retornar digito verificador p/ algoritmo de cheque (modulo11)
508- Retorna unidades mapeadas com Path
509- Retorna o Host onde seu TCP/IP está conectado
510- Retirando a extensão de um arquivo
511- Usando um For Select dentro da StoredProcedure no FireBird/Interbase
512- Remove senha de tabela paradox
513- Registrar OCX
514- Reconhecimento de voz em Delphi
515- Raiz quadrada no Delphi
516- Proteger e compactar um .EXE
517- Definido o tamanho Mín e Máx de um formulário
518- Potência
519- Portas Seriais
520- Pesquiza incremental em um Table
521- Pesquisa incremental em um TComboBox
522- Pesquisa exata em TListBox
523- Pegar texto de um comando DOS
524- Pegando o parâmetro que foi executado com a aplicação.
525- OnClick do DbGrid
526- Número para telefone
527- Limpar um campo tipo data via programação
528- Menu com Bitmap
529- Mensagem no DeskTop
530- Memo com SQL
531- Criar uma figura do tipo marca d' água.
532- Colocando um JPG dentro de um .exe
533- Criando um campo lookup em tempo de execução
534- Arquivos armazenado num blop
535- Imprimir um TMemo
536- Exibir a caixa de diálogo de solicitação de senha
537- Ícones do ListView
538- Hints do DbNavigator
539- Habilitar o "Autorun" para CD-Rom
540- Gerar SQL
541- Gerar letras aleatórias
542- Gera um clone do aplicativo
543- Form furado
544- Form com senha
545- Figura em um Memo
546- Fechar bandeja de CDs
547- Faz ajuste preciso em impressoras lazer
548- Extrair palavra sob posição do mouse
549- Extrair ano, mês ou dia via SQL
550- Exemplo de utilização ADO
551- Exemplo de como manipular a Porta Serial
552- Executar um módulo CPL (Painel de Controle)
553- Executar sem o form principal
554- Executar LogOFF
555- Criar um EXE que seja executado apenas através de outro EXE criado por mim
556- Executando um .LNK
557- EXE menor
558- Drag & Drop com o Windows Explorer
559- Download de arquivos via Delphi
560- Desenhar no desktop
561- Delphi com Access
562- Executar algo antes de minimizar
563- Criando e usando DLLs com o Delphi
564- Capturar a tela ou parte dela e salva-a em um Bitmap
565- Convertendo um arquivo .dfm para texto e vice-vers
566- Converter um arquivo JPEG em BMP
567- Converter um arquivo BMP em JPEG
568- Converte String em BASE 10
569- Consulta entre datas utilizando SQL
570- Configurando rede Novell Netware com Delphi
571- Configurando o Paradox em Rede Peer-to-Peer
572- Configuração de Rede Windows 95/98 com Delphi
573- Compilar projeto corretamente
574- Como usar a cláusula UNION em um Query
575- Como colocar % em um ComboBox
576- Como fazer um Cookies
577- Colocar senha no Access
578- Carrega os dados, salvos em um arquivo, em StrigGr
579- Manda o form para frente
580- Converter um arquivo BMP em TIF
581- Bloqueia tabelas Paradox
582- Barra de progresso para o batchmove
583- Barra de progresso na inicialização do sistema
584- Array de componentes
585- Apagar a imagem de um componente Timage
586- Abre um arquivo já existente e insere texto nele
587- Copiando tabelas paradox para texto ou Dbase e vice-versa
588- Exportando relatório do quickreport p/ html, doc, txt ou xls
589- Verificando se o protocolo tcp/ip está instalado
590- Como pegar a url corrente do IE
591- Corrigindo um pequeno bug em TLabel.AutoSize
592- Como criar a funcionalidade PING da ICMP.DLL
593- Usando colunas em um richedit
594- Procurando e modificando texto em richedit sem perder a formatação
595- Como tocar sons no auto-falante interno do PC
596- Informações sobre uma impressora
597- Autoocultar a barra de tarefas
598- Ativar a proteção de tela do windows
599- Alterar o Ícone do botão iniciar do windows
600- Simular um CharCase no dbgrid
601- Simular o pressionamento de uma combinação de teclas
602- Bloqueio de palavras
603- Usando funções externas (de dlls)
604- Exclusividade para o programa
605- Modificando configurações da impressora entre as páginas
606- Evitando o erro key violation
607- Conferindo se o processador da máquina é 386, 486 ou Pentium
608- Desligar/ligar monitor, 486 ou pentium
609- Colocar uma progressbar numa statusbar
610- Código usados pelas impressoaras HP
611- Como criar um contador de página para um relatório
612- Marcando um pedaço do código
613- Pegando nome de arquivos do clipboard
614- Arrastando e soltando de dentro de um treeview
615- Arrastando de um listbox para um edit
616- Obtendo uma lista de drivers de idioma disponÍveis para o BDE
617- Detectando mudanças de hardware PlugnPlay
618- Usando o adobe acrobat de dentro de sua aplicação
619- Verificar o dígito do código ean13
620- Como saber se existe um componente no seu form
621- Function trim(j:string):string; export;
622- Calcular quantos controles estão no form
623- Implementar rotinas assembly em pascal
624- Funções Aritméticas suportadas pelo pascal
625- Desenhando com tipos diferentes de linhas
626- Criando um aplicativo full-screen
627- Substituir uma dll em uso
628- Como obter o nome de um arquivo no formato do DOS
629- Abre uma janela DOS num folder qualquer, via explorer
630- Exemplo de arraste
631- Capturar ecrã
632- Fazer um campo memo ocupar 2 páginas
633- Data por extenso no quickreport
634- Indexando um vetor
635- Como evitar efeito de maximização
636- Ordenando um DBGrid clicando no título da coluna (usando Query)
637- Retorna uma String em número definido (Replicate)
638- Cancelando a exibição do Form
639- Apagar arquivos via MS-DOS
640- Apagar um subdiretório
641- Impedir que o form seja arrastado para fora das margens da tela.
642- Como extrair o tamanho de um arquivo
643- Como verificar se um arquivo existe?
644- Enviando para a impressora o conteúdo de um TstringList
645- Compara dois arquivos textos
646- Como implementar a utilização das teclas Ctrl-A para selecionar todo o texto de
um componente TRichEdit ou TMemo
647- Como tabular um ListBox
648- Convertendo nomes longos para nomes curtos
649- Copiando arquivos de diretório para diretório
650- Como ancorar um form
651- Como alinhar um edit à direita
652- Copiando arquivos usando o Shell do Windows
653- Copiando Um Arquivo Com Um Gauge
654- Extraindo datas no Interbase
655- Verificando se Local Share do BDE está TRUE
656- Abrindo um TComboBox na direção desejada
657- Eliminando os hints de uma treeview
658- Copiar arquivos usando curingas (*.*)
659- Retorna o dia da semana em formato string
660- Como pegar a lista de favoritos do Internet Explorer
661- Criando diretório
662- Deletando um Diretório
663- Criar sub-diretório no diretório do Aplicativo
664- Transformando ícone (*.ico) em bitmap (*.bmp)
665- Sobre arquivos de Inicialização (.ini)
666- Como fazer funções de rolagem num TForm usando comandos de teclado?
667- Encriptar/Desencriptar arquivos
668- Exibindo ou compararando data de arquivos
669- Retornar a versão do projeto que esta sendo desenvolvido
670- Como fazer para imprimir o rodapé só na última página. Usando quickreport
671- Listar Arquivos de Um Diretório
672- Localizar arquivos do Windows
673- Liga o Botão (x) do form
674- Nomes dos arquivos que estão sendo executados
675- Retorna quantos caracteres tem um Edit especificado
676- Desabilitar e habilitar o botão iniciar do Windows, em seu aplicativo Delphi
677- Pega o path de um arquivo arrastado do Explorer
678- Pegando a data de um arquivo
679- Rotina para restauração dos índices em tabelas paradox
680- Procurando um arquivo em todo o HD
681- Programar meu aplicativo para abrir arquivos a partir do Windows Explorer
682- Retorna a hora da criação de um diretório
683- Tamanho de um Diretorio
684- Largura do display do campo de um dbgrid igual ao seu próprio tamanho na tabela
685- Como centralizar o formulário na área de trabalho
686- Verificar tipo de arquivo
687- Alterando o NetDir via programação
688- Como fazer para tudo o que for digitado aparecer em maiúsculo
689- Backup & Restauração
690- Códigos de Erro do BDE
691- Digitando uma string (senha) e devolvendo essa string equivalente ao valor hexadecimal
692- Checa se o Símbolo da UF é válido
693- Como alterar a coluna Description do IBConsole
694- Como alterar o driver de acesso do access no bde automaticamente
695- Como fazer o programa autoexecutar na próxima inicialização do windows
696- Alterando a configuração de data do Windows em run-time
697- Como fazer para o sistema nao pedir o Login (Password) Banco de Dados
698- Reindexar um Banco MS-Access 2000
699- Criando Diretórios
700- Corrigir Erros de campo AutoIncremento
701- Como posicionar os dados a direita de uma campo edit
702- Incluído registros em Banco de Dados MS-Access usando ADO
703- Capturando quando um form for maximizado ou minimizado
704- Gravar registros fisicamente
705- Como abrir o Internet Explorer
706- Exibindo caixa de diálogo personalizada de solicitação de senha do banco dados
707- Exibindo corretamente o conteúdo dos campos boolean
708- Como formatar CEP
709- Retorna o tipo de conexão com a Internet
710- Foto no InterBase
711- Como criar um formulário no formato oval
712- Como desabilitar a tela de abertura do Delphi
713- Listando os campos da tabela num Memo
714- Lock de Registro
715- Rolagem automática em ListBox
716- Utilizando a função StrtoIntDef
717- Obtendo a versão da tabela
718- Obtendo a versão e outras informações do BDE
719- Como executar um avi no form
720- Como duplicar o registro atual
721- Obtendo o nome das tabelas no Access usando ADO
722- Problema com Null no Delphi 6
723- Reindexando índices
724- Rotina genérica para tratamento de erros na aplicação – BDE
725- Insere uma máscara em um valor numérico
726- Como compactar um arquivo utilizando o winzip.
727- Verificar registros deletados no BDE / Paradox
728- Verificar se o registro está travado
729- Como imprimir objetos usando o QuickReport
730- Como gravar as alterações feitas no DBGrid em tempo de execução
731- Limpar o conteudo de um LookupComboBox
732- Cria qualquer controle em tempo de execução (button, label, stringlist, memo ...)
733- Converter DBGrig em Html
734- Como desabilitar o acesso ao windows
735- Desenhar Um Ícone (bitmap) Em Células do Dbgrid
736- Mudar as imagens do DbNavigator
737- Como retornar 2(dois) valores em uma função
738- Retorna o total de memória do computador
739- Removendo a barra de rolagem vertical do DBGrid
740- Simulando Checkbox em Dbgrid
741- Executável com Parâmetros
742- Teclas de funções no Dbgrid
743- Gravar um arquivo .Avi ou .Wav dentro de um arquivo Paradox
744- Como formatar data para exibição por extenso
745- Como saber quantos dias tem no mês
746- Como imprimir um form
747- Diferença entre duas horas
748- Converte hora (formato HH:MM) para minutos
749- Como ajustar seu formulário de acordo com a resolução de vídeo
750- Converte segundos em horas digital
751- Como criar um link para envio de e-mails sem manipular API, e sempre executando o programa padrão para envio de
e-mails
752- Obtendo a menor data válida
753- Número de finais de semana no ano corrente
754- Retornando em um edit, o caminho do arquivo selecionado
755- Sobre o Dblookupcombobox
756- Como desabilitar um RadioButton em um RadioGroup
757- Verifica se uma data informada cai em um final de semana
758- Validar datas
759- Função que envia e-mail pelo Delphi, anexando mais de um arquivo
760- Capturar a tela do computador e enviar via rede
761- Deletar um diretório inteiro de uma vez
762- Colocando uma imagem ao lado de cada item do ListBox
763- Como retirar o caption de um form
764- Acrescentando e subtraindo datas
765- Como achar a representação binária de um Character
766- Retornando a linha e a coluna atual de um Tmemo
767- Como identificar se o Interbase está ativo ou não
768- Como retornar a versão do Word
769- Selecionando os cadastros do mês digitado- SQL
770- Mudando as cores das linhas de um ListBox
771- Ocultando janelas MDI filhas minimizadas
772- Eliminando a movimentação de janels MDI maximizadas
773- Exibindo ProgressBar enquanto copia um arquivo
774- Imprimindo um bitmap da área de tranferência
775- Usando OnGetText e OnSetText
776- Mude o separador de casas decimais ('.' e ',')
777- Como fazer para não repetir dados numa listbox
778- Enviando comando de rolagem vertical para um TMemo
779- Parâmetros em tempo de execução para a Query
780- Transformando horas em minutos
781- Como extrair o mês de um campo data usando comando SQL
782- Mostrando um formulário Modal usando Show
783- Como retornar o nome das Units de um projeto em Run-Time (RTTI)
784- Descobrindo o número de linhas de um arquivo TXT
785- Como filtrar registros com o QR
786- Convertendo String para Integer, tratando excessões quando a string não for válida
787- Definindo uma borda para Memos
788- Criptografando tabelas Paradox
789- Colocando uma figura de fundo em um Memo ou DbMemo
790- Executando procedure/método genéricamente
791- Pedindo confirmação para fechar um form
792- Sorteando números com a função Random
793- Permite que seu DBF ignore o índice MDX e recrie-o
794- Remove caracteres de uma string deixando apenas números
795- Usando o Word de dentro do Delphi
796- Acertar data e hora com o Servidor
797- Utilizando Recortar, Colar, Copiar em um TRichEdit
798- Acessando as propriedade do Hint
799- Capturando teclas genéricamente
800- Como simular a vírgula através do ponto do teclado numérico?
801- Como saber se determinada Font está instalada no Windows?
803- Lendo Arquivo CAB
804- Acessando dados de um objeto Ancestral/Descendente
805- Fazendo a aplicação Delphi falar
806- Definindo coluna do StringGrid como somente leitura
807- Acessando propriedades protegidas de um objeto
808- Procurando por um modem
809- Alinhar Titulo da barra de titulo do form (esqueda / direita )
810- Listar as tabelas e views do banco de dados (Firebird)
811- Controlando o PowerPoint em Delphi
812- Listar as tabelas do banco de dados (Firebird)
813- Listar as views do banco de dados (Firebird)
814- Backup e restore com gbak
815- Obter o valor de um generator
816- Boot remoto via Internet ou Rede Local
817- Reiniciar a contagem de um generator
818- Excluir generator (Interbase)
819- Excluir generator (Firebird)
820- Trocar o tipo de um campo (FireBird)
821- Excluir código-fonte de stored procedure (Interbase/FireBird)
822- Obter a data do servidor (Interbase)
823- Alterar parcialmente o conteúdo de uma Query
824- Arredondamento financeiro
825- Lendo os campos da chave-primária (Interbase/FireBird)
826- Obter a célula de um StringGrid que está sob o cursor do mouse
827- Definir forced writes usando o gfix (Interbase)
828- Escrever no Bloco de Notas
829- Definir sweep interval com gfix (Interbase)
830- Alterar o tamanho de um campo
831- Copiar o texto do Edit para o Clipboard
832- Atualizado dados em tempo de execução no Interbase
833- Mostrar bitmap progressivamente
834- Limpar todas as células de um StringGrid
835- Mostrar mensagem mesmo que esteja no Prompt do DOS
836- Fazendo um efeito Gradiente no Form
837- Mostrar um cursor de ampulheta durante um processamento
838- Adicionar barra de rolagem horizontal no ListBox
839- Criando tabelas via SQL
840- Colocar o cursor no final do TEdit ao receber o foco
841- Mostrar aviso em forma de hint
842- Validar C3 do Cheque
843- Validar CMC7 do Cheque
844- Fazer o formulário vibrar (como ocorre no MSN Messenger)
845- Pack em DBF
846- Comandos para Threads
847- Colocar os bitmaps na dll
848- Apagar senha da BIOS
849- Mostrando conteúdo de um campo memo
850- Formulário na barra de tarefas
851- Imprimindo em matricial usando o RAVE
852- Compilando aplicacao pelo Ms-Dos
853- Pesquisando uma String em um Documento do Word
854- Imprimir na posição certa do formulário (milímetro)
855- Selecionando todos os registros do DBGrid
856- Relação de Funções do MySQL
857- Imprimir Na Vertical No Quickreport
858- Convertendo um tipo Enum do Delphi em uma String
859- Como inserir uma barra de progresso dentro de uma caixa de diálogo
860- Executando Sons Através de Chamadas Mci
861- Imprimindo Forms
862- Colocando banners no Menu
863- Chamar um HTMLHelp (.chm)
864- Gravando Sons do Microfone Com o Delphi
865- Como adicionar um botão à barra de ferramentas do IE
866- Como fazer um DateTimePicker com o display vazio
867- Hints para Itens de Menu
868- Mudando o endereço IP em runtime
869- Mudando o Tamanho de Arquivos JPEG x Qualidade
870- Como exibir linhas longas em um ListBox sem a utilização da barra de rolamento
871- Acessando contas GMail com o Indy via POP3 SSL
872- InputBox com Password
873- Como Alterar o Volume do Som do Computador Com o Delphi
874- Imprime o conteúdo de um TRichEdit
875- Mostrando arquivos GIF
876- Criptografando Imagens com o Delphi
877- Formatando tags HTML com o Delphi
878- Busca Rápida em um ListBox
879- Função DirectoryExists
880- Criando Labels em 3D
881- Função IIf do VB em Delphi
882- Como imprimir com codigo fonte
883- Como Imprimir Escolhendo Uma Faixa de Paginas No Qr
884- Retorna o idioma padrão do Windows
885- Como insere uma máscara de valores $ em um valor integer
886- Ocultando uma coluna em um DBGrid
887- Fazendo pesquisa incremental apenas com DBGrid
888- Como apresentar o número da linha e coluna em um DBGrid
889- Testa se o arquivo possui caracteres inválidos em seu nome
890- Como usar os arquivos QRP criados com QuickReport
891- Retornando o Path da aplicação no Intraweb
892- Verificando a existência de uma tabela em um banco de dados MS-Access
893- Como converter um texto acentuado no DOS para Windows
894- Implementando método UpdatesPending em objetos ADODataSet
895- Pegando servidor smtp do Outlook
896- Como apagar vários ítens de uma só vez em um ListBox
897- Criando tabela a partir de consulta SQL
898- Recortando e colando usando a API
899- Como abrir um relatório criado no MS Access pelo Delphi
900- Exportando TImage no formato WMF
Inicio da pagina
Dica numero : 1 procedure Mostrar_Esconder_BtIniciar(Estado:Boolean); var taskbarhandle, buttonhandle : HWND; begin taskbarhandle := FindWindow('Shell_TrayWnd', nil); buttonhandle := GetWindow(taskbarhandle, GW_CHILD); if Estado = True then ShowWindow(buttonhandle, SW_RESTORE) {mostra o botão} else ShowWindow(buttonhandle, SW_HIDE); {esconde o botão} end; Inicio da pagina
Dica numero : 2
procedure Esconde_Barra_Tarefa(EstadoBarra: Boolean); var wndHandle : THandle; wndClass : array[0..50] of Char; begin StrPCopy(@wndClass[0],'Shell_TrayWnd'); wndHandle := FindWindow(@wndClass[0], nil); If EstadoBarra=True Then ShowWindow(wndHandle, SW_RESTORE) {Mostra a barra de tarefas} Else ShowWindow(wndHandle, SW_HIDE); {Esconde a barra de tarefas} end; Inicio da pagina
Dica numero : 3 uses Registry; procedure TForm1.Button1Click(Sender: TObject); var reg: TRegIniFile; begin reg := TRegIniFile.create('SOFTWARE\MICROSOFT\MS SETUP (ACME)\'); EdtUsuario.Text := reg.ReadString('USER INFO','DefName',''); EdtEmpresa.Text := reg.ReadString('USER INFO','DefCompany',''); reg.free; end; Inicio da pagina
Dica numero : 4 Adicione a seguinte declaração na seção private do Form: procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { ativa a herança da mensagem } if M.Result = htClient then { o clique foi na área cliente? } M.Result := htCaption; { se sim, faz o Windows pensar que foi no Caption. } end; Este exemplo tratou o clique na área cliente. Você pode alterar este código para suas necessidades. Eis os possíveis valores para o Result: HTBORDER - Borda da janela que não tem a borda de tamanho HTBOTTOM - Borda horizontal inferior da janela HTBOTTOMLEFT - Canto inferior esquerdo da janela
HTBOTTOMRIGHT - Canto inferior direito da janela HTCAPTION - Barra de Título(Caption) HTCLIENT - Área cliente HTERROR - igual ao HTNOWHERE, a diferença é que produz um beep indicando erro HTGROWBOX - Caixa de tamanho (igual ao HTSIZE) HTHSCROLL - Barra de rolagem horizontal HTLEFT - Borda esquerda da janela HTMENU - Em um menu HTNOWHERE - Plano de fundo da janela ou linha de divisão entre janelas HTREDUCE - Botão minimizar HTRIGHT - Borda direita da janela HTSIZE - Caixa de tamanho (igual ao HTGROWBOX) HTSYSMENU - Botão de Sistema/Fechar da janela MDIChild HTTOP - Borda horizontal superior da janela HTTOPLEFT - Canto superior esquerdo da janela HTTOPRIGHT - Canto direito superior da janela HTTRANSPARENT - Janela em segundo plano HTVSCROLL - Barra de rolagem vertical HTZOOM - Botão maximizar Inicio da pagina
Dica numero : 5 procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if ((Shift = [ssCtrl]) and (key = vk_delete)) THEN Abort; end; Inicio da pagina
Dica numero : 6 var H : HWnd; begin H := FindWindow(Nil,'Project1'); if H <> 0 then ShowWindow(H,SW_HIDE); end; Inicio da pagina
Dica numero : 7
Crie uma var do tipo word, por ex., Attributes. Depois, atribua a esta var o valor retornado por FileGetAttr. Ex.: var Attributes: Word; begin Attributes := FileGetAttr( 'nomedoarquivo' ); // Supondo 4 CheckBoxe's, 1 para cada atributo, Ok? CheckBox1.Checked := (Attributes and faReadOnly) = faReadOnly; CheckBox2.Checked := (Attributes and faArchive) = faArchive; CheckBox3.Checked := (Attributes and faSysFile) = faSysFile; CheckBox4.Checked := (Attributes and faHidden) = faHidden; end; Inicio da pagina
Dica numero : 8 messageBeep(0); Inicio da pagina
Dica numero : 9 NumSec é o tempo em segundos de espera var NumSec SmallInt; StartTime: TDateTime; begin StartTime := now; NumSec:=10; repeat Application.ProcessMessages; until Now > StartTime + NumSec * (1/24/60/60); end; Inicio da pagina
Dica numero : 10 // Localize o arquivo RS_RUN.INI (no diretório do Windows); // Na seção [ReportSmith] inclua a linha seguinte: ShowAboutBox=0
// Na seção [RS_RunTime] inclua a linha seguinte: ShowAboutBox=0 // Não se esqueça de distribuir com o seu aplicativo o referido arquivo INI. Inicio da pagina
Dica numero : 11 Function ExtractDiskSerial(Drive:String):String; Var Serial:DWord; DirLen,Flags: DWord; DLabel : Array[0..11] of Char; begin GetVolumeInformation(PChar(Drive+':\'),dLabel,12,@Serial,DirLen,Flags,nil,0); Result := IntToHex(Serial,8); end; Inicio da pagina
Dica numero : 12 procedure TForm1.Button1Click(Sender: TObject); var SerialNum : pdword; a, b : dword; Buffer : array [0..255] of char; begin if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), SerialNum, a, b, nil, 0) then Label1.Caption := IntToStr(SerialNum^); end; Inicio da pagina
Dica numero : 13 ExtractFilePath( Application.ExeName ) Inicio da pagina
Dica numero : 14 14- Interceptar as teclas de função (F1, F2, F3...) Primeiro, coloque a propriedade KeyPreview do formulário como TRUE. Depois, insira este código no evento OnKeyDown do formulário: procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_F5 then showMessage('I pressed the F5 key'); end; Você também pode usar as variáveis VK_F1 até VK_F12 referentes as outras teclas de função. Inicio da pagina
Dica numero : 15 Quando clicamos sobre o botão de deleção no DBNavigator (o do sinal de menos) surge uma box com a mensagem "Delete Record?" com botões Ok e Cancel. Para fazer aparecer a mensagem em português deverá selecionar o componente Table e mudar a propriedade ConfirmDelete para False e no evento da tabela BeforeDelete colocar o seguinte: procedure TForm1.Table1BeforeDelete(DataSet:TDataSet); begin if MessageDlg('Eliminar o Registro?',mtConfirmation,[mbYes,mbNo],0)<>mrYes then Abort; end; Inicio da pagina
Dica numero : 16 No relatório, criar a procedure SHOWPREVIEW contendo: Procedure Showpreview;
begin preview.showmodal; end; Onde preview é o nome do form criado para preview. Não esquecer de incluir o nome da procedure na cláusula uses. Após isso, deve-se incluir no evento CREATE do formulario principal ou do relatório o direcionamento do objeto Qprinter, com a seguir: qprinter.onpreview:=showpreview; Isto faz com que toda vez que se desejar exibir um preview, o programa abra a rotina 'showpreview', que abre o formulário criado, chamado 'preview'. Inicio da pagina
Dica numero : 17 Se você precisa abrir programas externos no seu aplicativo DELPHI, como a calculadora do Windows, por exemplo, inclua a seguinte linha no seu programa: WinExec('calc.exe', sw_show); 'calc.exe' é o nome do programa. Caso queira abrir um outro programa, altere este nome. Inicio da pagina
Dica numero : 18 Insira este código em um evento OnKeyPress de um controle de edição: procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin If Key = #13 Then Begin SelectNext(Sender as tWinControl, True, True ); Key := #0; end; end; Inicio da pagina
Dica numero : 19 Uses MMSystem; Utilize a API SndPlaySound(); Para interromper o som sem ele acabar de tocar utilize a API PlaySound(nil,0,0); Ex: SndPlaySound('c:\teste.wav', snd_ASync); PS: snd_Loop serve para repetir continuamente o som. Inicio da pagina
Dica numero : 20 Crie uma váriavel do tipo String e insira a seguinte linha no evento ou função desejada do formulário: ExtractFilePath(Application.Exename); Retorna-rá o path atual do arquivo .EXE do seu programa. Inicio da pagina
Dica numero : 21 Quando você programar visando uma rede e quiser bloquear um arquivo é só chamar o metodo "edit" da Tabela que estiver usando. EX: Table1.edit; PS: Se o registro já estiver bloqueado ocorrerá um erro, então você deve fazer o seguinte : try { para verificar o erro } Table1.edit; exception on TDBEngineError do { o erro..} MessageDlg('Registro ja esta sendo usado...!', mtInformation, [ mbOk ], 0 ); end; Inicio da pagina
Dica numero : 22 If ( Chr(Key) <> #13) Then Exit; If ( DBGrid1.SelectedIndex + 1 <> DBGrid1.FieldCount ) Then DBGRid1.SelectedIndex := DBGRid1.SelectedIndex + 1; Inicio da pagina
Dica numero : 23 Function Recno(Dataset: TDataset): Longint; var CursorProps: CurProps; RecordProps: RECProps; begin { Return 0 if dataset is not Paradox or dBASE } Result := 0; with Dataset do begin if State = dsInactive then DBError(SDataSetClosed); Check(DbiGetCursorProps(Handle, CursorProps)); UpdateCursorPos; try Check(DbiGetRecord(Handle, dbiNOLOCK, nil, @RecordProps)); case CursorProps.iSeqNums of 0: Result := RecordProps.iPhyRecNum; { dBASE } 1: Result := RecordProps.iSeqNum; { Paradox } end; except on EDBEngineError do Result := 0; end; end; end; Inicio da pagina
Dica numero : 24 uses ShellAPI; Function DeleteFileWithUndo(sFileName : string ) : boolean;
var fos : TSHFileOpStruct; begin FillChar( fos, SizeOf( fos ), 0 ); With fos do begin wFunc := FO_DELETE; pFrom := PChar( sFileName ); fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT; end; Result := ( 0 = ShFileOperation( fos ) ); end; Inicio da pagina
Dica numero : 25 const cnCursorID1 = 1; begin Screen.Cursors[ cnCursorID1 ] := LoadCursorFromFile('c:\win95\cursors\lapis.ani' ); Cursor := cnCursorID1; end; PS: O arquivo LAPIS.ANI deverá existir no diretório apontado. Inicio da pagina
Dica numero : 26 var t: TTable; begin t := TTable.create(self); with t do begin DatabaseName := 'MyAlias'; {Nome do Alias} TableName := 'MyTbl.db'; open; edit;
insert; FieldByName('TheField').assign(Memo1.lines); post; { Requerido!!!} close; end; end; Inicio da pagina
Dica numero : 27 procedure TForm1.FormResize(Sender: TObject); var R : TRect; DC : HDc; Canv : TCanvas; begin R := Rect( 0, 0, Screen.Width, Screen.Height ); DC := GetWindowDC( GetDeskTopWindow ); Canv := TCanvas.Create; Canv.Handle := DC; Canvas.CopyRect( R, Canv, R ); ReleaseDC( GetDeskTopWindow, DC ); end; Inicio da pagina
Dica numero : 28 procedure TForm1.Button1Click(Sender: TObject); var begin with Form1.Canvas do begin Font.Name := 'Arial'; Font.Size := 24; tf := TFont.Create; tf.Assign(Font); GetObject(tf.Handle, sizeof(lf), @lf); lf.lfEscapement := 450; lf.lfOrientation := 450; tf.Handle := CreateFontIndirect(lf); Font.Assign(tf); tf.Free; TextOut(20, Height div 2, 'Texto Diagonal!');
end; end; Inicio da pagina
Dica numero : 29 Para extrair ícones de um executável, deve-se usar a função da API Extraction. Ela usa 3 parâmetros: Instance - Instância da aplicação FileName - Nome do executável. Deve ser um PChar NumIcon - Número do ícone a ser recuperado. Se for Word(-1), a função retorna a quantidade de ícones do executável. Coloque ShellAPI em uses no começo da unit. procedure TForm1.Button1Click(Sender: TObject); var IconIndex : word; h : hIcon; begin IconIndex := 0; h := ExtractAssociatedIcon(hInstance,'C:\WINDOWS\NOTEPAD.EXE',IconINdex); DrawIcon(Form1.Canvas.Handle,10,10,h); end; Inicio da pagina
Dica numero : 30 Para alinhar itens do menu principal à direita, deve-se utilizar o seguinte código: {Isto justifica todos itens à direita do selecionado} procedure SetJustify(Menu: TMenu; MenuItem: TMenuItem; Justify: Byte); {$IFDEF WIN32} var ItemInfo: TMenuItemInfo; Buffer: array[0..80] of Char; {$ENDIF} begin {$IFDEF VER80} MenuItem.Caption := Chr(8) + MenuItem.Caption;
{$ELSE} ItemInfo.cbSize := SizeOf(TMenuItemInfo); ItemInfo.fMask := MIIM_TYPE; ItemInfo.dwTypeData := Buffer; ItemInfo.cch := SizeOf(Buffer); GetMenuItemInfo(Menu.Handle, MenuItem.Command, False, ItemInfo); if Justify = 1 then ItemInfo.fType := ItemInfo.fType or MFT_RIGHTJUSTIFY; SetMenuItemInfo(Menu.Handle, MenuItem.Command, False, ItemInfo); {$ENDIF} end; Inicio da pagina
Dica numero : 31 1º Declare o procedure na seção PUBLIC da unit. procedure JumpTo(const aAdress: String); 2º Coloque a cláusula ShellAPI na uses no início da unit. procedure TForm1.JumpTo(const aAdress: String); var buffer: String; begin buffer := 'http://' + aAdress; ShellExecute(Application.Handle, nil, PChar(buffer), nil, nil, SW_SHOWNORMAL); end; procedure TForm1.Label1Click(Sender: TObject); begin JumpTo('www.geocities.com/SiliconValley/Way/1497'); end; Inicio da pagina
Dica numero : 32 procedure TtableCopiaRegistro(Origem, Destino: Ttable); begin with TabelaOrig do begin {Inicia um contador para os campos da TabelaOrig} for i := 0 to FieldCount -1 do {Este if verifica se o campo da TabelaOrig é NULL, se for, atribui seu valor ao
campo da TabelaDest} if not Fields[i].IsNull then TabelaDest.Fields[i].Assign(Fields[i]); end; {end with} end; Este exemplo funcionará com todos tipos de campos se você tiver acabado de criar a TabelaDest. Para criar um dado valor NULL : Fields[i].Clear Inicio da pagina
Dica numero : 33 procedure TForm1.SpeedButton1.Click(Sender: TObject); var SearchRec: TSearchRec; Result: Integer; begin Result:=FindFirst('c:\teste\*.*', faAnyFile, SearchRec); while result=0 do begin DeleteFile('c:\teste\'+SearchRec.Name); Result:=FindNext(SearchRec); end; end; Inicio da pagina
Dica numero : 34 Tudo que você precisa é de um componente TSession, um componente TListBox e uma String List. Defina a propriedade SessionName do TSession para 'Session'. Utilize o seguinte código: procedure TForm1.Button3Click(Sender: TObject); var MyStringList: TStringList; i: integer; begin MyStringList := TStringList.Create; Session.GetAliasNames(MyStringList); for I := 0 to MyStringList.Count - 1 do ListBox1.Items.Add(MyStringList[I]);
end; Utilize o Help do TSession e consulte seus métodos para ver por exemplo como capturar o diretório ou caminho de um Alias com o método 'GetAliasParams'. Inicio da pagina
Dica numero : 35 {Para Abrir:} mciSendString('Set cdaudio door open wait', nil, 0, handle); {Para Fechar:} mciSendString('Set cdaudio door closed wait', nil, 0, handle); Inicio da pagina
Dica numero : 36 Veja abaixo alguns códigos usados pelas impressoras HP: RESET = 027/069 BOLD1 = 027/040/115/051/066 BOLD0 = 027/040/115/048/066 ITALIC1 = 027/040/115/049/083 ITALIC0 = 027/040/115/048/083 UNDERLINE1 = 027/038/100/049/068 UNDERLINE0 = 027/038/100/064 LPI6 = 027/038/108/054/068 LPI8 = 027/038/108/056/068 CPI5 = 027/040/115/053/072 CPI6 = 027/040/115/054/072 CPI8 = 027/040/115/056/072 CPI10 = 027/040/115/049/048/072 CPI12 = 027/040/115/049/050/072 CPI17 = 027/040/115/049/054/046/054/055/072 CPI20 = 027/040/115/050/048/072 Inicio da pagina
Dica numero : 37
Function CopiaArquivo(scrname,destname:string):byte; var source,destination:file; buffer:array[1..1024] of byte; readcnt,writecnt:word; pname,dname,fname,ename:String; begin AssignFile(source,scrname); Try Reset(source,1); Except CopiaArquivo:=1; Exit; end; If destname[length(destname)]='\' then begin pname:=scrname; destname:=destname+separa(scrname,'\',Ocorre(scrname,'\')+1); end; AssignFile(destination,destname); Try Rewrite(destination,1); Except CopiaArquivo:=2; Exit; end; Repeat BlockRead(source,buffer,sizeof(buffer),readcnt); Try BlockWrite(destination,buffer,readcnt,writecnt); Except CopiaArquivo:=3; {Disco Cheio?} Exit; end; until (readcnt=0) or (writecnt<>readcnt); CloseFile(destination); CloseFile(source); CopiaArquivo:=0; end; Exemplo: resultado := CopiaArquivo('C:\diretorio\FILE.EXT','C:\diretorio\FILE.EXT'); Devolve 0=Ok, 1=Erro no Origem, 2=Erro no Destino, 3=Disco Cheio Inicio da pagina
Dica numero : 38 ComboBox1.DroppedDown := True; Inicio da pagina
Dica numero : 39 A rotina abaixo deverá ser colocada no evento OnDrawDataCell, do DBGrid. procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState); begin if gdFocused in State then with (Sender as TDBGrid).Canvas do begin Brush.Color:=clRed; FillRect(Rect); TextOut(Rect.Left, Rect.Top, Field.AsString); end; end; Inicio da pagina
Dica numero : 40 IncMonth(Data, 1); No exemplo, a variável Data é do tipo TDateTime. Inicio da pagina
Dica numero : 41 function TForm1.TemDiscoNoDrive(const drive : char): boolean; var DriveNumero : byte; EMode : word; begin result := false; DriveNumero := ord(Drive);
if DriveNumero >= ord('a') then dec(DriveNumero,$20); EMode := SetErrorMode(SEM_FAILCRITICALERRORS); try if DiskSize(DriveNumero-$40) = -1 then Result := true else messagebeep(0); finally SetErrorMode(EMode); end; end; procedure TForm1.Button1Click(Sender: TObject); begin if TemDiscoNoDrive('a') then ShowMessage('Tem disco No drive A:') else ShowMessage('Não tem Disco no Drive A:'); end; end. Inicio da pagina
Dica numero : 42 Para acessar as variáveis do ambiente DOS, deve-se usar a função da API GetDosEnvironment. Ela retorna um PChar que pode ser avaliado. Inicio da pagina
Dica numero : 43 Quando você executa um programa DOS no Windows95, sua janela permanece aberta até ser fechada pelo usuário. Para executar um programa DOS que fecha sua janela após a execução, deve ser especificado "command.com /c programa" na linha de comando. Usando a função da API WinExec para executar um programa chamado proddos.exe, a chamada deve ser: WinExec('c:\command.com /c progdos.exe', sw_ShowNormal);
Se o programa deve ser executado sem que seja visualizado pelo usuário, o segundo parâmetro deve ser sw_Hide. Deve ser especificada a extensão .com, senão o programa não será executado. Inicio da pagina
Dica numero : 44 No Microsoft® Windows®, existe uma tabela do sistema chamada „atom table‟. Esta
tabela armezena strings com seus correspondentes identificadores. Existem várias funções da API do windows, chamadas de „atom functions‟, que permitem que uma aplicação insira, apague, procure
por uma determinada „atom string‟, etc.. O código abaixo garante que somente uma instância do
executável de sua aplicação estará carregado em memória. O form1 seria o form principal da aplicação: procedure TForm1.FormCreate(Sender: TObject); begin {Procura na tabela para verificar se o programa já está rodando} {Substitua a string „MINHA STRING‟ por uma de sua conveniência} if GlobalFindAtom(„MINHA STRING') = 0 then
{zero significa não encontrar} atom := GlobalAddAtom(„MINHA STRING‟)
else begin {Se o programa já estiver rodando, então mostrar a mensagem e parar} MessageDlg(„A aplicação já encontra-se em execução!!', mtWarning, [mbOK], 0); Halt; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin {Remove o item da tabela, de modo que a aplicação possa ser executada novamente} GlobalDeleteAtom(atom); end; Inicio da pagina
Dica numero : 45 Utilize o comando with, desse modo: With Edit1 do begin Text := ' @Delphi'; Widht := 30; Enabled := True; end; Inicio da pagina
Dica numero : 46 No Evento OnKeyPress de um Edit: if Key = Chr(VK_RETURN) then Perform(WM_NEXTDLGCTL,0,0); Inicio da pagina
Dica numero : 47 Se for um richedit e margens laterais(direita e esquerda) tenta RichEdit1.Paragraph.FirstIndent -> Paragrafo RichEdit1.Paragraph.LeftIndent -> margem esquerda RichEdit1.Paragraph.RightIndent -> margem direita Inicio da pagina
Dica numero : 48 Paradox: Session.AddStandardAlias('SeuAlias', edtPath.text, 'Paradox'); Session.SaveConfigFile; Inicio da pagina
Dica numero : 49 var OldValue : LongBool; begin {liga a trava} SystemParametersInfo(97, Word(True), @OldValue, 0); {desliga a trava} SystemParametersInfo(97, Word(False), @OldValue, 0); end; Inicio da pagina
Dica numero : 50 Form1:=tform1.create(application); Form1.show; Form1.update; Form1.hide; Form1.free; Application.Run; Obs: apagar a primeira linha, 'Application.Initialize'. Inicio da pagina
Dica numero : 51 function encrypt( dummy: Pchar):Pchar; var x: Integer; w: Word; s: String; c: Char; begin s:=StrPas(dummy); w:=StrLen(dummy); for x:=1 to w do begin c:=s[x]; c:=char ( ord (c) xor 159); s[x]:=c; end; StrPCopy(dummy,s);
encrypt:=dummy; end; Inicio da pagina
Dica numero : 52 function TForm1.StrReverse(MyString : string) : String; var i: integer; HelpString: string; begin HelpString := ''; for i := 1 to Length(MyString) do HelpString := MyString[i]+HelpString; Result := HelpString; end; Inicio da pagina
Dica numero : 53 {Integer to Binary} function IntToBin(Value: LongInt;Size: Integer): String; var i: Integer; begin Result:=''; for i:=Size downto 0 do begin if Value and (1 shl i)<>0 then begin Result:=Result+'1'; end else begin Result:=Result+'0'; end; end; end; Inicio da pagina
Dica numero : 54 {Binary to Integer} function BinToInt(Value: String): LongInt; var i,Size: Integer; begin Result:=0; Size:=Length(Value); for i:=Size downto 0 do begin if Copy(Value,i,1)='1' then begin Result:=Result+(1 shl i); end; end; end; Inicio da pagina
Dica numero : 55 const StartKey = 981; {Start default key} MultKey = 12674; {Mult default key} AddKey = 35891; {Add default key} {Encriptar} function Encrypt(const InString: string; StartKey,MultKey,AddKey: Integer): string; var I: Byte; begin Result := ''; for I := 1 to Length(InString) do begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8)); StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey; end; end; {Descriptar} function Decrypt(const InString: string; StartKey,MultKey,AddKey: Integer): string; var I: Byte; begin Result := ''; for I := 1 to Length(InString) do begin Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey; end; end; Inicio da pagina
Dica numero : 56 Para tratar erros de forma genérica, em todo o seu programa, insira no método ON CREATE do formulário principal a linha: Application.OnException:=RotinaGeral; RotinaGeral é uma procedure na qual deverá constar o código para verificar e enviar as mensagens de erro do seu sistema. Inicio da pagina
Dica numero : 57 Muitas vezes torna-se necessário, ou até mesmo, imprescindível que você envie informações diretamente para a impressora, uma vez que a utilização da impressão típica do Windows é um pouco demorada e o uso do driver Genérico/Somente Texto não é muito confiável. Uma boa solução para enviar informações diretamente para a impressora é usar o seguinte código: Procedure TForm1.Button1Click(Sender: Object); var Imp: TextFile; begin AssignFile(Imp, 'LPT1'); Rewrite(Imp); Write(Imp, 'Isto vai sair na impressora'); CloseFile(Imp); end; Desta forma será possível, inclusive, utilizar os códigos de configuração da impressora. Para a impressora padrão Epson, por exemplo, você poderia utilizar algo assim:
Write(Imp, #27#69 + 'Teste' + #27#70); { impressão em negrito } Write(Imp, #15 + 'Teste' + #18); { impressão no modo condensado } Write(Imp, #12); { salto de página } Inicio da pagina
Dica numero : 58 Ao trabalharmos com impressão, em certos casos desejamos alterar o comportamento da impressora. Algumas opções, principalmente em impressoras matriciais, são obtidas através do envio dos chamados "códigos de escape" para a impressora (por exemplo, alterar espaçamento entre as linhas (#45), tipo de fonte (#18, #23), etc). Em versões 16-bit do Windows, isso não era complicado, mas agora, nas versões 32-bit, o acesso direto ao hardware não é mais possível. Portanto, para enviarmos caracteres diretamente a impressora, devemos utilizar o "escape" chamado "PASSTHROUGH" do Windows e enviarmos a informação desejada diretamente. Na documentação do Win32 SDK este escape é dado como obsoleto, mas enquanto utilizarmos impressoras matriciais que necessitem de "códigos escape" para certas funcionalidades, ele será necessário. Ao utilizar impressoras Postscript tenha cuidado, pois nem sempre esta técnica irá funcionar. Em impressoras matriciais, você pode enviar qualquer tipo de caracteres que achar necessário. Abaixo segue um código exemplificando o envio de uma string qualquer diretamente ao buffer da impressora: uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end;
var Form1: TForm1; implementation {$R *.DFM} uses Printers; type { Tipo requerido pelo PASSTHROUGH } TBufferImpressora = record TamanhoBuffer: Word; Buffer: array [0..255] of Char; end; procedure TForm1.Button1Click(Sender: TObject); var Buff: TBufferImpressora; TestePasstrough: Integer; strFoo: string; begin { Primeiro devemos checar se o "escape" PASSTHROUGH é suportado. Para isso, executamos a função "Escape" passando o QUERYESCSUPPORT. Caso o driver suporte, ela irá retornar um valor maior que 0 } TestePasstrough := PASSTHROUGH; if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(PASSTHROUGH), @TestePasstrough, nil) > 0 then begin { Inicializamos o driver } Printer.BeginDoc; { Informação qualquer a enviar diretamente para a impressora } strFoo := 'Passthrough string'; { Copia da string para a estrutura } StrPCopy(Buff.Buffer, strFoo); { Indicamos o tamanho da informação} Buff.TamanhoBuffer := StrLen(Buff.Buffer); { Enviamos o "escape" } Escape(Printer.Canvas.Handle, PASSTHROUGH, 0, @Buff,nil); { Descarregamos... } Printer.EndDoc; end; end; end. Inicio da pagina
Dica numero : 59 procedure TForm1.Button1Click(Sender: TObject); var F : TextFile; i : integer; begin AssignFile(F,‟LPT1');
Rewrite(F); i := 0; Writeln(F,‟Teste de impressao - Linha 0'); Writeln(F,‟Teste de impressao - Linha 1'); Writeln(F,#27#15+‟Teste de Impressão - Linha 2'); Writeln(F,‟Teste de impressao - Linha 3'); Writeln(F,#27#18+‟Teste de Impressão - Linha 4'); Writeln(F,‟Teste de impressao - Linha 5');
Writeln(F,#12); // Ejeta a página CloseFile(F); end; Inicio da pagina
Dica numero : 60 No evento OnCreate do Form: Application.OnHint := DisplayHint; Crie (e defina) uma Procedure DisplayHint (no Form Principal): StatusBar1.Panels[0].Text := Application.Hint; Inicio da pagina
Dica numero : 61 procedure TForm1.Button1Click(Sender: TObject); var DeskTopDC: HDc; DeskTopCanvas: TCanvas; DeskTopRect: TRect; begin DeskTopDC := GetWindowDC(GetDeskTopWindow); DeskTopCanvas := TCanvas.Create; DeskTopCanvas.Handle := DeskTopDC; DeskTopRect := Rect(0,0,Screen.Width,Screen.Height);
Form1.Canvas.CopyRect(DeskTopRect,DeskTopCanvas,DeskTopRect); ReleaseDC(GetDeskTopWindow,DeskTopDC); end; Inicio da pagina
Dica numero : 62 Para compactar (remover fisicamente todos registros apagados) de uma tabela Paradox deve-se utilizar o seguinte código: procedure ParadoxPack(Table : TTable); var TBDesc : CRTblDesc; hDb: hDbiDb; TablePath: array[0..dbiMaxPathLen] of char; begin FillChar(TBDesc,Sizeof(TBDesc),0); with TBDesc do begin StrPCopy(szTblName,Table.TableName); StrPCopy(szTblType,szParadox); bPack := True; end; hDb := nil; Check(DbiGetDirectory(Table.DBHandle, True, TablePath)); Table.Close; Check(DbiOpenDatabase(nil, 'STANDARD', dbiReadWrite, dbiOpenExcl,nil,0, nil, nil, hDb)); Check(DbiSetDirectory(hDb, TablePath)); Check(DBIDoRestructure(hDb,1,@TBDesc,nil,nil,nil,False)); Table.Open; end; Inicio da pagina
Dica numero : 63 Normalmente o Delphi busca os formatos de data/hora, moeda e formato numérico da Configuração
Internacional do Painel de Controle. Isto pode levar a erros quando avaliando datas, números ou listas. Para evitar estes erros, você pode mudar as constantes definidas no Delphi, como DecimalSeparator, ShortFormatDate e outros desta maneira: DecimalSeparator :='.'; ShortFormatDate :='mm/dd/yy'; Isto terá precedência sobre a configuração padrão. Para uma lista completa das variáveis, procure em Currency Formating Variables na ajuda do Delphi. Inicio da pagina
Dica numero : 64 Para listas (pegar) todas as janelas abertas, deve-se usar a função API EnumWindows, que usa uma função Callback, com dois parâmetros, um Handle para a janela e um ponteiro. Você pode usá-la como um código semelhante a este (este lista as janelas abertas, mesmo invisíveis, em uma listbox): function EnumWindowsProc(Wnd: HWnd; Form:TForm1): Boolean; Export; {$ifdef Win32} StdCall; {$endif} var Buffer: Array[0..99] of Char; begin GetWindowText(Wnd, Buffer, 100); if StrLen(Buffer)=0 then Form.ListBox1.Items.Add(StrPas(Buffer)); Result :=True; end; procedure TForm1.Button1Click(Sender: TObject); begin EnumWindows(@EnumWindowsProc, LongInt(Self)); end; Inicio da pagina
Dica numero : 65 Para converter a primeira letra de um Edit para maiúsculas este código pode ser utilizado: procedure TForm1.Edit1Change(Sender: TObject); var OldStart: Integer; begin with Edit1 do if Text <> '' then begin OnChange :=NIL; OldStart :=SelStart; Text :=UpperCase(Copy(Text,1,1))+LowerCase(Copy(Text,2,Length(Text))); OnChange :=Edit1.Change; end; end; Inicio da pagina
Dica numero : 66 Turn monitor off SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0); Turn monitor on SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1); Inicio da pagina
Dica numero : 67 Adicionar à cláusula Uses, Shellapi. Digitar os seguintes parâmetros: Swapmousebutton(true) ; Para voltar ao normal basta mudar para False. Inicio da pagina
Dica numero : 68 Primeiro deve-se adicionar à cláusula Uses, ShellApi. Em seguida deve-se digitar os seguinte comandos: procedure TForm1.FormCreate(Sender: TObject); var Arquivo: String; begin Arquivo:='c:\windows\nuvens.bmp'; SystemParametersInfo(SPI_SetDeskWallPaper, 0, PChar(Arquivo), 0); end; Inicio da pagina
Dica numero : 69 Arquivos Paradox podem ser compartilhados em rede. Para que isto ocorra devemos: Adicionar o Database Engine Configuration (BDE Config); Selecionar a página Drivers; Selecionar o driver PARADOX e alterar o parâmetro NET DIR para o local onde serão gravados os arquivos de controle para compartilhamento. Por exemplo, "G:\MEUAPLIC", onde G corresponde ao drive de rede e MEUAPLIC, o diretório onde está o aplicativo (executável); Depois selecionar a página System; Alterar o parâmetro LOCAL SHARE para TRUE. Após isto o BDE controlará o compartilhamento de arquivos Paradox em rede. Inicio da pagina
Dica numero : 70 Para fazer pesquisa incremental numa tabela usando um EDIT, deve-se colocar o seguinte código em seu evento OnChange: procedure TForm1.Edit1Change(Sender: TObject); begin
Width Edit1 do if Text <>'' then Table1.FindNearest([Text]); end; Inicio da pagina
Dica numero : 71 Para incluir mais de uma linha no Hint você deve utilizar o evento OnMouseMove de cada componente. Veja abaixo como ficará o código em um Edit por exemplo: procedure TForm1.Edit1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin Edit1.hint := „Primeira Linha‟+#13+‟Segunda Linha‟+#13+ „Terceira Linha‟+#13+‟Quarta Linha‟;
end; Obs. Não esquecer de mudar para TRUE a propriedade ShowHint. Inicio da pagina
Dica numero : 72 Esta dica só funciona em Delphi 1.0. No Projeto (.DPR): uses windows, messages, // necessarios acrescentar Forms, ........... var Hwnd: THandle; // variavel necessaria begin Hwnd:=FindWindow('O seu TForm', 'O caption do seu form principal'); if Hwnd = 0 then begin Application.Initialize; end else begin if not IsWindowVisible(Hwnd) then begin // se minimizado ShowWindow(Hwnd, SW_SHOWNORMAL); //mostra PostMessage(Hwnd, WM_USER, 0, 0); //restaura
end; SetForegroundWindow(Hwnd); // visivel end; No Programa principal coloque: private { Private declarations } public procedure WMUser(var msg: TMessage); message WM_USER; //definicao { Public declarations } end; implementation {$R *.DFM} procedure TPrincipal.WMUser(var msg: TMessage); //uso de fato. begin Application.restore; end; Inicio da pagina
Dica numero : 73 Para mostrar as resoluções de vídeo disponíveis, deve-se usar a função da API EnumDisplaySettings: ela pega todos os modos de vídeo disponíveis. Para alterar os modos, deve-se usar a função ChangeDisplaySettings, que muda a resolução de vídeo e quantidade de cores. Inicio da pagina
Dica numero : 74 unit sobreManager; interface uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ExtCtrls;
type TfrmSobreManager = class(TForm) btnOK: TButton; ProductName: TLabel; Version: TLabel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Copyright: TLabel; Panel1: TPanel; Image2: TImage; GroupBox1: TGroupBox; Bevel1: TBevel; stOSVersao: TStaticText; stOSBuilder: TStaticText; stOS: TStaticText; stOSService: TStaticText; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmSobreManager: TfrmSobreManager; implementation {$R *.DFM} // VERIFICA E APRESENTA APRESENTA AS INFORMAÇÕES do SISTEMA OPERACIONAL (FaC) procedure TfrmSobreManager.FormCreate(Sender: TObject); var verInfo : TOsVersionInfo; str : String; I : Word; begin verInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(verInfo) then begin stOSVersao.Caption := 'Versão : '+ IntToStr(verInfo.dwMajorVersion) + IntToStr(verInfo.dwMinorVersion); stOSBuilder.Caption := 'Compilação : '+IntToStr(verInfo.dwBuildNumber); str := 'Sistema Operacional : '; case verInfo.dwPlatformId of VER_PLATFORM_WIN32s : stOS.Caption := str +'Windows 95'; VER_PLATFORM_WIN32_WINDOWS : stOS.Caption := str +'Windows 95 Osr2 / 98';
VER_PLATFORM_WIN32_NT : stOS.Caption := str +'Windows NT'; end; str := ''; for I := 0 to 127 do str := str + verInfo.szCSDVersion[I]; stOSService.Caption := 'Informações Adicionais : '+ str; end end; end. Inicio da pagina
Dica numero : 75 Existe na API do BDE uma funcao chamada DbiGetNetUserName, que retorna o nome do usuário logado. Tente o seguinte: function GetUserName:string; var Nome: array[0..64] of char; begin if DbiGetNetUserName(Nome) <> DBIERR_NONE then Nome:=''; Result:=StrPas(Nome); end; Inicio da pagina
Dica numero : 76 Crie um Alias para o seu banco da dados(Fizemos com um banco do Interbase). Adicione o seguinte código ao seu programa(Neste caso o código foi feito no evento OnActivate do Form1): procedure TForm1.FormActivate(Sender: TObject); Var MyStringList: TStringList; i: Integer; begin try MyStringList:= TStringList.Create; Session.GetTableNames('SeuAlias','*.*',False, False, MyStringList);
For i:= 1 To MyStringList.Count-1 do ListBox1.Items.Add(MyStringList.Strings[i]); finally MyStringList.Free; end; end; O método GetTableNames trabalha com cinco parâmetros: 1-Item do tipo String=Nome do Alias do banco desejado. 2-Item do tipo String=Especifique um filtro para retornar somente as tabelas desejadas. Podem incluir símbolos(Wildcards) como por exemplo '*'. 3-Item do tipo Boolean=Para pesquisas em Paradox e dBASE, defina True para incluir a extensão do arquivo como parte do nome da tabela. Para tabelas SQL, defina False. 4-Item do tipo Boolean=Defina True para tabelas SQL para receber também o nome das tabelas de sistema as quais contém a estrutura dos dados. Defina False para tabelas Paradox e dBASE. 5-Item do tipo TStringList=Nome do StringList onde serão guardados os nomes das tabelas. Inicio da pagina
Dica numero : 77 Caracter Definições ! Faz com que a digitação da máscara fique parada no primeiro caracter, fazendo com que os caracteres digitados que se movam. Ex: !;0;_ > Todos os caracteres digitados serão convertidos para maiúsculas. Ex: >aaa;0;_ < Todos os caracteres digitados serão convertidos para minúsculas. Ex: <> Anula o uso dos caractes > e <, ou seja, utilizado para cancelar a opção de máscara para os caracteres a direita. Ex: >aaa<>aaa;0;_ \ Utilizado para marcar determinado caracter não especial como fixo. Ex: !\(999\)0000000;0;_ L Exige caracteres alfabéticos obrigatórios para a posição, do tipo A-Z, a-z. Ex: LLL;1;_ l Somente caracteres alfabéticos para a posição, mas não-obrigatórios, do tipo A-Z, a-z. Ex: lll;1;_ A Exige caracteres alfanuméricos obrigatórios para a posição, do tipo A-Z, a-z, 0-9. Ex: AAA;1;_ a Somente caracteres alfanuméricos para a posição, mas não-obrigatórios, do tipo A-Z, a-z, 0-9. Ex: aaa;1;_
C Requer um caracter obrigatório para a posição. Ex: CCC;1;_ c Permite o uso de qualquer caracter para a posição, limitando apenas o número de caracteres. Ex: ccc;1;_ 0 Exige caracteres numéricos obrigatórios para a posição, do tipo 0-9. Ex: 000;1;_ 9 Somente caracteres numéricos para a posição, não-obrigatórios, do tipo 0-9. Ex: 999;1;_ # Somente caracteres numéricos para a posição e o uso dos sinais de - ou +, nãoobrigatórios. Ex: ###;1;_ : Utilizado como separador de horas, minutos e segundos. / Utilizado como separador de dia, mês e ano. Inicio da pagina
Dica numero : 78 Para traduzir algumas as mensagens do Delphi que aparecem nos botões e nas caixas de avisos da função MessageDlg, você necessita dos arquivos de recursos do Delphi (*.RC). Possuo o Delphi 2 - Developers, que vem acompanhado de alguns destes arquivos de recursos. No meu caso, eles estão gravados em C:\DELPHI2\SOURCE\VCL. Os arquivos *.RC são arquivos "só texto", e contêm diversas mensagens utilizadas nos programas compilados no Delphi. O exemplo que se segue realiza alterações nos arquivos CONSTS.RC e DBCONSTS.RC. A alteração de outros arquivos "RC" pode ser feita de modo similar. Para maiores detalhes, envie-me um e-mail (
[email protected]), ou, melhor ainda, consulte o livro "Dominando o Delphi" (edição para o Delphi 1), de Marcos Cantù, ed. Makron Books. O assunto "Usando recursos de tabelas de strings" está no capítulo 21, página 876. Não sei se a edição para o Delphi 2 cobre este assunto. a) Faça uma cópia dos arquivos CONSTS.RC e DBCONSTS.RC em um diretório seguro, para o caso de algo sair errado. b) Pelo mesmo motivo, faça uma cópia dos arquivos CONSTS.RES e DBCONSTS.RES, que estão no diretório LIB do Delphi. No meu caso, o diretório destes arquivos é C:\DELPHI2\LIB. c) Use o Bloco de Notas para abrir e alterar os arquivos CONSTS.RC e DBCONSTS.RC. (O Edit também serviria; entretanto, para acentuação correta no Windows, o Bloco de Notas é melhor).
Você só deve alterar as strings que estão entre aspas. Não altere o nome das constantes, que estão no início de cada linha. Por exemplo, localize o seguinte bloco, em CONSTS.RC: SCancelButton, "Cancel" SYesButton, "&Yes" SNoButton, "&No" Altere para: SCancelButton, "Cancelar" SYesButton, "&Sim" SNoButton, "&Não" Não é necessário alterar todas as mensagens. Se desejar, altere apenas aquelas que você utiliza em seus sistemas. Lembre-se de salvar as alterações efetuadas. d) Acione o prompt do DOS, e execute do seguinte modo o compilador de recursos do Delphi 2 (BRC32.EXE), que está no diretório BIN do Delphi (no meu caso, C:\DELPHI2\BIN): C:\DELPHI2\BIN\BRC32 -R CONSTS.RC C:\DELPHI2\BIN\BRC32 -R DBCONSTS.RC (No Delphi 1, o compilador tem o seguinte nome: BRC.EXE). e) Os dois comandos anteriores irão gerar os arquivos CONSTS.RES e DBCONSTS.RES. Copie os dois "*.RES" para o diretório LIB do DELPHI (no meu caso C:\DELPHI2\LIB) f) Crie uma aplicação no Delphi que utilize a função MessageDlg, e botões "BitBtn". Ao rodar o seu programa, as mensagens já devem aparecer traduzidas. Inicio da pagina
Dica numero : 79 procedure TForm1.BtSelecionaClick(Sender: TObject); var FileHandle : THandle; LocalFileTime : TFileTime; DosFileTime : DWORD; LastAccessdTime : TDateTime; FindData : TWin32FindData;
NomeArquivo : array[0..255] of char; begin if OdSelecionaArquivo.Execute then begin EdArquivo.Text := OdSelecionaArquivo.FileName; StrPCopy(NomeArquivo,OdSelecionaArquivo.FileName); FileHandle := FindFirstFile(NomeArquivo, FindData); if FileHandle = INVALID_HANDLE_VALUE then begin Windows.FindClose(Handle); if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then begin FileTimetoLocalFileTime(FindData.ftLastWriteTime, LocalFileTime); FileTimeToDosDateTime(LocalFileTime, LongRec(DosFileTime).Hi, LongRec(DosFileTime).Lo); LastAccessdTime := FileDateToDateTime(DosFileTime); EdUltimoAcesso.Text := DateTimeToStr(LastAccessdTime); end; end; end; end; Inicio da pagina
Dica numero : 80 Um dos recursos disponibilizados pelo Delphi é a customização das informações de versão a serem "anexadas" na linkagem. Pouco utilizado, este recurso é muito interessante, pois possibilita o cadastro de diversas informações sobre o arquivo gerado, como: número de versão, nome do produto, nome interno do arquivo, nome da empresa, etc. Podemos alterar as informações na página "Version Info", da página "Project Options": Atenção com o item "Auto-increment build number": ele só será incrementado automaticamente quando for executada a opção "Build All" para compilar o projeto. Porém, não existem rotinas "prontas" para obtermos estas informações. É necessário fazermos chamadas diretamente a API Win32, mais espeficamente, para as funções como a "GetFileVersionInfo" e a "VerQueryValue". Abaixo encontramos uma função, a "FileVerInfo", que exemplifica o processo de obtenção das informações. Ela irá retornar "True" caso o arquivo informado no parâmetro
"FileName" possuir as informações de versão, e devolverá por referência um "TStringList" contendo as informações. //Código function FileVerInfo(const FileName: string; var FileInfo: TStringList): Boolean; const Key: array[1..9] of string =('CompanyName', 'FileDescription', 'FileVersion', 'InternalName', 'LegalCopyright', 'OriginalFilename', 'ProductName', 'ProductVersion', 'Comments'); KeyBr: array [1..9] of string = ('Empresa', 'Descricao', 'Versao do Arquivo', 'Nome Interno', 'Copyright', 'Nome Original do Arquivo', 'Produto', 'Versao do Produto', 'Comentarios'); var Dummy : THandle; BufferSize, Len : Integer; Buffer : PChar; LoCharSet, HiCharSet : Word; Translate, Return : Pointer; StrFileInfo, Flags : string; TargetOS, TypeArq : string; FixedFileInfo : Pointer; i : Byte; begin Result := False; { Obtemos o tamanho em bytes do "version information" } BufferSize := GetFileVersionInfoSize(PChar(FileName), Dummy); if BufferSize <> 0 then begin GetMem(Buffer, Succ(BufferSize)); try if GetFileVersionInfo(PChar(FileName), 0, BufferSize, Buffer) then { Executamos a função "VerQueryValue" e conseguimos informações sobre o idioma /character-set } if VerQueryValue(Buffer, '\VarFileInfo\Translation', Translate, UINT(Len)) then begin LoCharSet := LoWord(Longint(Translate^)); HiCharSet := HiWord(Longint(Translate^)); for i := 1 to 9 do begin { Montamos a string de pesquisa } StrFileInfo := Format('\StringFileInfo\0%x0%x\%s', [LoCharSet, HiCharSet, Key[i]]); { Adicionamos cada key pré-definido } if VerQueryValue(Buffer,PChar(StrFileInfo), Return, UINT(Len)) then FileInfo.Add(KeyBr[i] + ': ' + PChar(Return));
end; if VerQueryValue(Buffer,'\',FixedFileInfo, UINT(Len)) then with TVSFixedFileInfo(FixedFileInfo^) do begin Flags := ''; {Efetuamos um bitmask e obtemos os "flags" do arquivo} if (dwFileFlags and VS_FF_DEBUG) = VS_FF_DEBUG then Flags := Concat(Flags,'*Debug* '); if (dwFileFlags and VS_FF_SPECIALBUILD) = VS_FF_SPECIALBUILD then Flags := Concat(Flags, '*Special Build* '); if (dwFileFlags and VS_FF_PRIVATEBUILD) = VS_FF_PRIVATEBUILD then Flags := Concat(Flags, '*Private Build* '); if (dwFileFlags and VS_FF_PRERELEASE) = VS_FF_PRERELEASE then Flags := Concat(Flags, '*Pre-Release Build* '); if (dwFileFlags and VS_FF_PATCHED) = VS_FF_PATCHED then Flags := Concat(Flags, '*Patched* '); if Flags <> '' then FileInfo.Add('Atributos: ' + Flags); TargetOS := 'Plataforma (OS): '; { Plataforma } case dwFileOS of VOS_UNKNOWN : TargetOS := Concat(TargetOS, 'Desconhecido'); VOS_DOS : TargetOS := Concat(TargetOS, 'MS-DOS'); VOS_OS216 : TargetOS := Concat(TargetOS, '16-bit OS/2'); VOS_OS232 : TargetOS := Concat(TargetOS, '32-bit OS/2'); VOS_NT : TargetOS := Concat(TargetOS, 'Windows NT'); VOS_NT_WINDOWS32, 4: TargetOS := Concat(TargetOS, 'Win32 API'); VOS_DOS_WINDOWS16: TargetOS := Concat(TargetOS, '16-bit Windows ', 'sob MS-DOS'); else TargetOS := Concat(TargetOS, 'Fora do Padrão. Código: ', IntToStr(dwFileOS)); end; FileInfo.Add(TargetOS); TypeArq := 'Tipo de Arquivo: '; { Tipo de Arquivo } case dwFileType of VFT_UNKNOWN : TypeArq := Concat(TypeArq,'Desconhecido'); VFT_APP : TypeArq := Concat(TypeArq,'Aplicacao'); VFT_DLL : TypeArq := Concat(TypeArq,'Dynamic-Link Lib.'); VFT_DRV : begin TypeArq := Concat(TypeArq,'Device driver - Driver ');
case dwFileSubtype of VFT2_UNKNOWN : TypeArq := Concat (TypeArq, 'Desconhecido'); VFT2_DRV_PRINTER : TypeArq := Concat(TypeArq,'de Impressao'); VFT2_DRV_KEYBOARD : TypeArq := Concat(TypeArq,'de Teclado'); VFT2_DRV_LANGUAGE : TypeArq := Concat(TypeArq,'de Idioma'); VFT2_DRV_DISPLAY : TypeArq := Concat(TypeArq,'de Vídeo'); VFT2_DRV_MOUSE : TypeArq := Concat(TypeArq,'de Mouse'); VFT2_DRV_NETWORK : TypeArq := Concat(TypeArq,'de Rede'); VFT2_DRV_SYSTEM : TypeArq := Concat(TypeArq,'de Sistema'); VFT2_DRV_INSTALLABLE : TypeArq := Concat(TypeArq,'Instalavel'); VFT2_DRV_SOUND : TypeArq := Concat(TypeArq,'Multimida'); end; end; VFT_FONT : begin TypeArq := Concat(TypeArq,'Fonte - Fonte '); case dwFileSubtype of VFT2_UNKNOWN : TypeArq := Concat(TypeArq, 'Desconhecida'); VFT2_FONT_RASTER : TypeArq := Concat(TypeArq,'Raster'); VFT2_FONT_VECTOR : TypeArq := Concat(TypeArq,'Vetorial'); VFT2_FONT_TRUETYPE : TypeArq := Concat(TypeArq,'TrueType'); end; end; VFT_VXD : TypeArq := Concat(TypeArq,'Virtual Device'); VFT_STATIC_LIB : TypeArq := Concat(TypeArq,'Static-Link Lib.'); end; FileInfo.Add(TypeArq); end; end; finally FreeMem(Buffer, Succ(BufferSize)); Result := FileInfo.Text <> ''; end; end; end; procedure TForm1.Button1Click(Sender: TObject); var StrLst: TStringList; begin StrLst := TStringList.Create; try FileVerInfo('C:\WINDOWS\SYSTEM\TAPI.DLL', StrLst); Memo1.Lines.Assign(StrLst); finally StrLst.Free; end; end; Inicio da pagina
Dica numero : 81 procedure AcertaPadraoData; const arrShortDayNames: array[1..7] of string[3] = ('Dom','Seg','Ter','Qua','Qui','Sex','Sab'); arrLongDayNames: array[1..7] of string[15] = ('Domingo','Segunda','Terça','Quarta','Quinta', 'Sexta', 'Sábado'); arrShortMonthNames: array[1..12] of string[3] = ('Jan','Fev','Mar','Abr','Mai','Jun','Jul','Ago', 'Set','Out','Nov','Dez'); arrLongMonthNames: array[1..12] of string[15] = ('Janeiro','Fevereiro', 'Março','Abril','Maio', 'Junho','Julho','Agosto', 'Setembro','Outubro','Novembro','Dezembro'); var ii: integer; begin ShortDateFormat := 'dd/mm/yyyy'; DecimalSeparator := '.'; ThousandSeparator := ','; for ii := 1 to 7 do begin ShortDayNames[ii] := arrShortDayNames[ii]; LongDayNames[ii] := arrLongDayNames[ii]; end; for ii := 1 to 12 do begin ShortMonthNames[ii] := arrShortMonthNames[ii]; LongMonthNames[ii] := arrLongMonthNames[ii]; end; end; Inicio da pagina
Dica numero : 82 Ajuste a propriedade Style do ComboBox para csOwnerDrawVariable. procedure TForm1.FormCreate(Sender: TObject); var
Bmp1, Bmp2, Bmp3: TBitmap; begin Bmp1:=TBitmap.Create; Bmp.Loadfromfile('c:\chip16.bmp'); Bmp2:=TBitmap.Create; Bmp.Loadfromfile('c:\zoom.bmp'); Bmp3:=TBitmap.Create; Bmp.Loadfromfile('c:\disk.bmp'); ComboBox1.Items.AddObject('Chip',Bmp1); ComboBox1.Items.AddObject('Zoom',Bmp2); ComboBox1.Items.AddObject('Disk',Bmp3); end; procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOWnerDrawState); var Bitmap: TBitmap; Offset: Integer; begin with (Control as TComboBox).Canvas do begin FillRect(Rect); Bitmap:= TBitmap(ComboBox1.Items.Objects[index]); if Bitmap nil then begin BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width, Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); Offset: Bitmap.width + 8; end; TextOut(Rect.Left + Offset, Rect.Top, ComboBox1.Items[index]); end; end; procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; var Height: Integer); begin Height:=20; end; Inicio da pagina
Dica numero : 83 Bookmarks permitem ao programador "memorizar" um determinado local da tabela para que possa retornar mais tarde, é muito simples e fácil de usar já que existem apenas três métodos que lhe
permitem utilizar este recurso. Para marcar um determinado local em uma tabela necessitamos criar uma nova instancia de TBookmark e executar o método GetBookMark de uma TTable. var bmLocalImportante : TBookmark; begin bmLocalImportante := table.GetBookMark; {Para retornar a este local em particular a qualquer momento deve-se utiliza o método GotoBookMark() , este método recebe como parâmetro o TBookmark recebido como retorno de GetBookMark.}
table1.GotoBookMark(bmLocalImportante); {Após utilizar o Bookmark para o que desejar é importante que a memória utiliza por este recurso seja novamente liberada para o sistema,para executar esta operação utilize o método FreeBookMark.} table1.FreeBookMark(bmLocalImportante); {Podem ser criados vários Bookmarks para uma mesma tabela, sendo este numero limitado apenas pela quantidade de memória livre no equipamento.} end; OBS:Mas cuidado com o uso indevido deste recurso, cada instancia de TBookMark reserva uma determinada porção de memória que só será novamente liberada para ser reutilizada após a execução de um FreeBookmark. Se vários Bookmarks forem criados e não liberados podem comprometer a execução do programa. Inicio da pagina
Dica numero : 84 1. insira um Datasource, um DBGrid e dois Table's no form 2. link o Table1 com Datasource1 e DBGrid1
3. defina um banco de dados, uma tabela e ative o Table1 4. defina também para o Table2, mas use uma tabela diferente 5. adicione todos os campos do Table1 através do Fields Editor 6. mude a propriedade Visble para False do campo do Combobox 7. dê um clique com o botão direito do mouse sobre o Fields Editor e escolha New Field... 8. especifique os parametros para o novo campo a) Name: < algum nome > b) Type: < tipo do campo > c) Size: < tamanho > d) Field type: Lookup e) Key Field: < campo que receberá o valor escolhido no combobox & > f) DataSet: Table2 g) LookUpKeys: < campo listado no combo > h) Result Field: < campo que será mostrado para o usuário no Combobox > 9. Execute a aplicação. Inicio da pagina
Dica numero : 85 procedure TForm1.Button1Click(Sender: TObject); var NRW: TNetResource; begin with NRW do begin dwType := RESOURCETYPE_ANY; lpLocalName := 'G:'; lpRemoteName := '\\servidor\c'; lpProvider := ''; end; WNetAddConnection2(NRW, 'MyPassword', 'MyUserName', CONNECT_UPDATE_PROFILE); end; Inicio da pagina
Dica numero : 86 Configurar uma rede Novell para trabalhar com Delphi é muito facíl, mais facíl que um rede ponto a ponto como Windows 95 ... Primeiro precisamos de um diretório onde será criado o NET FILE do Paradox, normalmente um diretório partindo do raiz do servidor será o suficiente, vamos usar o drive padrão da Novell para exemplificar o caso ... F: <-- drive da rede F:\NETDIR <-- o diretório do NET FILE Para o diretório onde serão armazenados os arquivos do seus sistema não é necessário nenhum cuidado especial, podemos assumir alguma configuração como a que segue ... F:\SISTEMA\DADOS <-- diretório de dados Para quem trabalha todos os dias com uma rede Novell existe uma armadilha que pode causar umas noites mal dormidas :( ... Uma das coisas que muitos tentam para economizar um pouco do HD local é colocar o executável na rede, sem grandes problemas desde que você tenha um cuidado básico. Sempre que você executa um programa que trata com base Paradox o PRIVATE DIR fica sendo o diretório onde este executável se encontra, no caso de você colocar este executável em um diretório da rede para ser acessado por muitos como fica este diretório PRIVATE ??? jé não é mais tanto PRIVATE né ... Para resolver este problema você deve "programaticamente" alterar o Private Dir para um diretório local,para isso você tem de adicionar as seguintes linhas de código ao iniciar a sua aplicação. Session.PrivateDir := 'C:\WINDOWS\TEMP'; Para ter acesso a Session voce tem de incluir a unit DB na clausula Uses do seu projeto. Este cuidado pode prevenir varias travadas sem razão aparente em redes Novell. Inicio da pagina
Dica numero : 87 Vamos exemplificar com tres maquinas, 1 servidor chamado SERV e duas maquinas clientes. Claro que isto pode ser incrementado de acordo com suas necessidades :). No servidor: diretório real D:\SISTEMA\DADOS compartilhe o subdiretorio D:\SISTEMA\DADOS como um recurso chamado Servidor_H no AUTOEXEC.BAT incluir ? Subst H: D:\SISTEMA\DADOS Nas maquinas clientes: mapear drive de rede H: como \\SERV1\Servidor_H No fim deste processo você terá o drive H: como sendo o seu Drive de rede para o Sistema, este drive estará presente em todas as maquinas e pode ser utilizado como seu NET DIR. No BDE Configuration: NET DIR: H: (Para o driver Paradox) Em seu Alias: Path: H:\DADOS\ Em System: Local Share: True Depois disto você configurar o BDE de forma igual em todas as maquinas da rede. Inicio da pagina
Dica numero : 88 Criar um arquivo em tempo de execução é relativamente simples, você tem que criar uma instancia do objeto TTable, esse objeto (de uma lida no Help TTable e suas propriedades e metodos) tem um metodo de criação e um de Criar tabela.
Depois disso é só definir as propriedades da nova tabela ... DatabaseName := 'c:\lista'; TableName := 'Produtos.dbf'; TableType := ttDbase; os campos da tabela ... Add('codigo', ftString,7, false); Add('Nome', ftString, 45, false); e os indices ... Add('prod1', 'codigo', []); Add('prod2', 'Fornecedor', []); com todos os dados devidamente setados ... CreateTable; Procedure TMainForm.Inicializa; var Table1 : TTable; begin { Criar componente TTable } Table1 := TTable.create(Application); { Definições de Campos e criação do arquivo } with Table1 do begin DatabaseName := 'c:\lista'; TableName := 'Produtos.dbf'; TableType := ttDbase; with FieldDefs do begin Clear; Add('codigo', ftString,7, false); Add('Nome', ftString, 45, false); Add('Fornecedor', ftString, 5,false ); Add('Custo', ftCurrency, 0, false ); Add('Venda', ftCurrency, 0, false ); end; with IndexDefs do begin Clear; Add('prod1', 'codigo', []); Add('prod2', 'Fornecedor', []); end; CreateTable; end;
end; Utilizando o tipo ftCurrency, formato de valores do sistema financeiro o Delphi cria um campo Dbase com N,20,4 Inicio da pagina
Dica numero : 89 Quando alguém esta digitando algum valor que posteriormente será utilizado para calculo alguns cuidados são necessários, esse procedimento ValidaKey deve ser ligado no OnChange do TDBEdit para checar qual foi a tecla digitada. procedure ValidaKey(Const Sender:TObject; var key: char); begin if not(key in ['0'..'9','.',',',#8,#13]) then key := #0; if key in [',','.'] then key := DecimalSeparator; if key = DecimalSeparator then if pos(key,TEdit(Sender).Text) <> 0 then key := #0; end; if not(key in ['0'..'9','.',',',#8,#13]) then key := #0; Se algum numero, ponto, virgula, BackSpace ou Enter for digitado então pode passar normalmente, caso contrario a tecla pressionada é ignorada. if key in [',','.'] then key := DecimalSeparator; Se ponto ou virgula, assume como separador decimal. if key = DecimalSeparator then if pos(key,TEdit(Sender).Text) <> 0 then key := #0; O separador decimal so pode ser digitado uma unica vez, na tentativa de uma segunda digitação ignora-se o símbolo. Observem que o mais importante aqui é o conceito utilizado, o fato de se interceptar os caracteres digitados pelo usuário e poder filtrar esses caracteres para evitar uma entrada de dados inconsistente. O exemplo de numero e símbolos não é conclusivo, uma vez que o
mesmo efeito poderia ter sido obtido com a aplicação de uma mascara. Inicio da pagina
Dica numero : 90 Quem trabalha com DBF's já encontrou problemas para criar índices compostos, ou seja um índice que tenha mais de um campo, em tempo de execução. Isto ocorre por dois motivos, embora exista na internet documentação sobre o assunto, dizendo ser possível, ainda não encontrei ninguém que tenha tido sucesso nesta tarefa. O outro motivo é a existência de um parâmetro não documentado necessário para arquivos DBF's ixExpression que informa o Delphi que se trata de um índice com mais de um campo. Como trabalhar com DBF's é comum para a maioria dos programadores que vem do Clipper acho interessante solucionar este problema da melhor forma possível. Assim a criação do indice fica para logo depois da criação da tabela, como mostra o segmento de codigo abaixo. uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, DBTables; procedure TForm1.Button1Click(Sender: TObject); var Table1 : TTable; begin { Criar arquivos } Table1 := TTable.create(Application); { Cria arquivo } with Table1 do begin Active := False; DatabaseName := 'C:\'; TableName := 'teste'; TableType := ttdBASE; with FieldDefs do begin Clear; Add('Name1', ftString, 20, False); Add('Name2', ftString, 20, False);
Add('Name3', ftString, 20, False); Add('Name4', ftString, 20, False); end; CreateTable; AddIndex('Indice1', 'Name1 + Name2', [ixExpression]); AddIndex('Indice2', 'Name2 + Name3', [ixExpression]); AddIndex('Indice3', 'Name3 + Name4', [ixExpression]); end; end; Na pratica criar os índices com AddIndex() logo após CreateTable não vai influenciar em nada o seu programa. Inicio da pagina
Dica numero : 91 Baixe na Internet um dos melhores compiladores de Pascal para DOS/OS2/Linux. Suporta praticamente todo o set de opções do Borland Pascal e vai além, dando suporte ao modelo de objetos do Object Pascal e otimiza pra 386/486/Pentium/Pentium Pro/MMX e Pentium II. O código é todo gerado para modo protegido e, devido a isso, não possui quaisquer limites para arrays ou ponteiros. Mas o melhor de tudo é que ele é GRATIS!!! Para pega-lo vá o endereço abaixo: http://www.brain.uni-freiburg.de/~klaus/fpc/ Inicio da pagina
Dica numero : 92 var Form1: TForm1; Bmp: TBitmap; implementation {$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin Bmp:=TBitmap.Create; Bmp.Loadfromfile('c:\windows\nuvens.bmp'); end; procedure TForm1.TForm1.FormPaint(Sender: TObject); begin Canvas.Draw(50,50,Bmp); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Bmp.Free; end; Inicio da pagina
Dica numero : 93 No evento OnCloseQuerie do form escreva o seguinte código: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; if messagebox(handle,'Deseja realmente fechar esta janela ?', 'Aviso', mb_IconInformation + mb_YesNo + mb_DefButton2 ) = idYes then CanClose := True; end; Inicio da pagina
Dica numero : 94 No evento OnCloseQuerie do form escreva o seguinte código: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; end; Inicio da pagina
Dica numero : 95 O caminho mais fácil e rápido para implementar filtros em tabelas é utilizando o evento OnFilterRecord, este evento é chamado sempre que um registro for lido do arquivo pelo componente TTable. OnFilterRecord é declarado como do tipo TFilterRecordEvent procedure(DataSet: TDataSet; var Accept: Boolean) of object; property OnFilterRecord: TFilterRecordEvent; A variável Accept deverá ser manipulada internamente em OnFilterRecord, assim para que o registro seja mostrado o valor de Accept tem de ser true que é o default. Tradicionalmente aplicar um filtro a uma tabela, qualquer que seja a tabela é um processo muito lento, assim é interessante desenvolver rotinas rápidas e fáceis de serem executadas. procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean); begin Accept := (Dataset as TTable). FieldByName('Dupr_valida').AsBoolean; end; Mas pode-se colocar varias verificações para decidir se um deter- minado registro deve ou não ser filtrado. procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean); begin with (Dataset as TTable) do if not ( (FieldByName('Dupr_Valida').AsBoolean) and (FieldByName('Dupr_DataVenc').AsString = '05/09/97') ) then accept := false; end; O filtro pode ser ligado ou desligado a qualquer momento setando a propriedade Filtered da tabela, o evento OnFilterRecord só é chamado se a propriedade Filtered estiver com o valor true. Inicio da pagina
Dica numero : 96
Bem saber se um form já esta ou não criado, melhor dizer instanciado, não é um problema muito critico, abaixo pode-se ver uma unit padrão criada com um form vazio no Delphi, esta unit alem de declarar o nova classe TForm1 cria também uma variável Form1 do tipo TForm1. Isto é muito importante que seja observado, um variável para um tipo "FORM" nada mais é que um ponteiro, ou seja ela apenas mostra em que local da memória esta a instancia do seu form, enquanto o seu form não existir este ponteiro deve apontar para lugar nenhum, ou seja, este ponteiro estará guardando o valor "NIL". unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} end. {Partindo deste principio podemos verificar se um form foi ou não instanciado verificando o valor guardado em FORM1, se este valor for diferente de "NIL" significa que o Form já foi instanciado... bem a coisa não é assim tão simples, imagine que um amigo mudou-se para São Paulo e lhe passou seu novo endereço, você recebe e anota em sua agenda... depois de dois meses ele resolve que
não quer mais morar em São Paulo e vai embora, ok o fato de seu amigo ir embora por si só não vai fazer com que o endereço dele se auto apague da sua agenda, assim sendo quando o form for destruído o ponteiro continuara guardando o endereço de memória onde o form estava e ai o nosso método de controle vai pro brejo :( A forma mais limpa e automática para se contornar este problema nos obriga a codificar o seguinte no evento OnDestroy do Form ...} procedure TForm1.FormDestroy(Sender: TObject); begin Form1 := nil; end; assim, quando o "FORM1" for destruído ele apaga o seu endereço junto, ótimo não é mesmo .... Assim quando for instanciar um form utilize a seguinte verificação ... if Form2 = nil then Form2 := TForm2.Create(Self); Form2.Show; ... interessante que o Show quando um form já esta criado tem o efeito de um BringToFront. Bem tudo isso resolve parte do problema, a outra parte tem de ser resolvida por você estruturando o seu programa de forma aos controles funcionem de acordo. 1 - Este controle não funciona para forms com múltiplas instancias, a não ser que você crie uma variável para cada instancia. Pessoalmente eu nunca usei isso, se um form pode ter múltiplas instancias em MDI então controle por ActiveMDIChild e se for SDI então não sei porque ter mais de uma instancia. 2 - Quando for criar um novo form não crie variáveis desnecessariamente, utilize a variável que já esta sendo criada na unit do Form. Ex: Dados FORM1 e FORM2 Apenas FORM1 esta no AUTO-CREATE Quando no uses de FORM1 for referenciada a unit UNIT2 a variável FORM2 estará
acessível, use-a. FORM2 := TFORM2.CREATE(SELF); 3 - Quando um Form é mostrado com ShowModal este tipo de controle não se aplica já que será impossível mostrar qualquer outro form. Inicio da pagina
Dica numero : 97 Veja abaixo um exemplo para que o seu Form não seja redimensionado. Inclua o código abaixo em um Form. type TForm1 = class(TForm) private { Private declarations } procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; procedure WMInitMenuPopup(var Msg: TWMInitMenuPopup); message WM_INITMENUPOPUP; procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); begin inherited; with Msg.MinMaxInfo^ do begin ptMinTrackSize.x:= form1.width; ptMaxTrackSize.x:= form1.width; ptMinTrackSize.y:= form1.height; ptMaxTrackSize.y:= form1.height; end; end; procedure TForm1.WMInitMenuPopup(var Msg: TWMInitMenuPopup); begin inherited; if Msg.SystemMenu then
EnableMenuItem(Msg.MenuPopup, SC_SIZE, MF_BYCOMMAND or MF_GRAYED) end; procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest); begin inherited; with Msg do if Result in [HTLEFT, HTRIGHT, HTBOTTOM, HTBOTTOMRIGHT, HTBOTTOMLEFT, HTTOP, HTTOPRIGHT, HTTOPLEFT] then Result:= HTNOWHERE end; Inicio da pagina
Dica numero : 98 Com certeza criar os forms que vc vai utilizar em tempo de execução é uma das grandes "sacadas" do Delphi, uma tarefa não tão complicada mas com varias alternativas de como ser executada. Vamos supor inicialmente que vc esta trabalhando com uma aplicação SDI (Single Document Interface) ou documento de interface simples, utilizando essa forma de desenvolvimento vc tem janelas sobre janelas, o Delphi é um exemplo disso, para criar um form em tempo de execução siga os seguintes passos: 1- Crie um projeto novo (SDI), o Delphi automaticamente cria o Form1. 2- Crie um Form Novo, ele recebera o nome de Form2. 3- Va em Options/Project, vc vai ver dois list boxes, o da esquerda contêm os forms que devem ser criados automaticamente quando sua aplicação for iniciada, os dois forms devem estar ai, pois bem mova Form2 para o List Box da direita que deve conter os forms que ficam disponiveis porém não são automaticamente criados. (importante) Nesse momento você retirou do Delphi a obrigação de criar o Form2,se vc não o criar e em algum momento fizer referencia a ele isso deve causar um erro. 4- Ok, esqueca temporariamente Form2, em Form1 crie um botao e digite o código abaixo em seu evento TForm1.Button1Click implementation {$R *.DFM}
uses Unit2; procedure TForm1.Button1Click(Sender: TObject); begin Form2 := TForm2.Create(self); Form2.Show; end; end. 5- Observe o uses criado logo após {$R *.DFM}, ele deve fazer referencia a Unit de Form2, que no caso do meu exemplo chama-se Unit2. Pronto, com esses pequenos cuidados vc ja estara criando seus forms em tempo de execução :) Agora uma dica interessante, se vc executar esse programa vc vai ver que quando Form2 for criado o usuario pode clicar em Form1 e esse recebera o foco, coisa que pode nao ser interessante. Para evitar este tipo de comportamento da sua aplicação utilize ShowModal e não Show para chamar o segundo form... Form2 := TForm2.Create(self); Form2.ShowModal; O ShowModal vai fazer com que a aplicação fique com Form2 permanentemente em primeiro plano, Form1 não poderá ser acessado até que Form2 sejá fechado. Inicio da pagina
Dica numero : 99 A coisa muda um pouquinho quando voce esta trabalhando em um projeto MDI, basicamente o controle que voce tem de executar é o mesmo, mas as caracteristicas do projeto podem lhe trair ... Primeiro que em um projeto MDI não podem existir forms não visiveis, ou sejá, assim que um determinado form é criado ele já se torna visivel,não é necessario um SHOW ou SHOWMODAL para fazer isso, portanto não existe outro caminho senão criar todos os forms de sua aplicação em RUN TIME. Todos os passos descritos no exemplo acima são validos aqui também, mas para que o seu projeto caracterize-se como MDI você tem de mudar a propriedade FormStyle dos forms do
projeto como segue : - O form principal da aplicação tem de estar como fsMDIForm. - Os outros forms que fazem parte da aplicação como fsMDIChild. Algum form especial, como o form onde o usuario configura a impressora, deve ser deixado como fsNormal. Vá até Project/Options e deixe apenas o form principal como AutoCreate. (importante) Nesse momento vc retirou do Delphi a obrigação de criar o Form2,se vc não o criar e em algum momento fizer referencia a ele isso deve causar um erro. Pois bem, como uma das caracteristicas de uma aplicação MDI é o form principal conter os outros forms não podemos ficar colocando botões para testar a criação dinamica desses forms, melhor utilizar um componente do tipo Menu e codificar a chamada aos outros forms nele ... implementation {$R *.DFM} uses Unit2; procedure TForm1.Form21Click(Sender: TObject); begin Form2 := TForm2.Create(self); end; end. Uma das primeiras coisas diferentes é que não é mais necessário usar o Show :) ... Alguns cuidados devem ser tomados quando trabalhamos com uma aplicação MDI. Primeiro não existe porque ficar discutindo como evitar que o usuário fique abrindo muitos forms ao mesmo tempo, já que está é a principal qualidade de um projeto MDI, caso voce não queira este tipo de comportamento pare de ler e volte para SDI ... Inicio da pagina
Dica numero : 100
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } procedure WMGetMinMaxInfo(var MSG: TMessage); message WM_GetMinMaxInfo; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.WMGetMinMaxInfo(var MSG: TMessage); begin inherited; with PMinMaxInfo(MSG.lparam)^ do begin ptMinTRackSize.X := 300; ptMinTRackSize.Y := 150; ptMaxTRackSize.X := 350; ptMaxTRackSize.Y := 250; end; end; end. Inicio da pagina
Dica numero : 101 A) No .Dpr ponha {$D SCRNSAVE } depois do uses B) No Form principal nao ponha borda ou icone. No metodo Activate ponha left e top como 0 e o Windowstate como wsMaximize. C) no form.Create ponha application.OnMessage para um metodo que controle a desativacao do screen saver. Ponha tb o application.OnIdle para "rodar" o dito cujo...
D) Tb no Form.Create teste a linha de comando para /c ou /s. Estes parâmetros dizem o que e' para fazer (/c configura) E) Compile e renomeie o .exe p/ .scr, move para o diretorio do windows e... Inicio da pagina
Dica numero : 102 Primeiro você deve "linkar" o OBJ ao seu executável. No Delphi , isto eh feito com a diretriz de compilação $L. Fica, na sua unit principal, assim: {$L MyOBject.OBJ} Incluindo as chaves. Logo depois, você deve declarar a função contida em MyObject.OBJ da forma usual. Você precisara conhecer os parâmetros usados pela mesma, bem como o tipo e a ordem em que sao passados. Voce deve incluir tambem a diretriz PASCAL ou CDECL. Sugiro tentar primeiro com PASCAL. Ficaria assim (na secao implementation: function (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2): TipoDoRetorno; pascal; se nao der certo, tente: function (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2): TipoDoRetorno; cdecl; caso nao seja uma funcao e sim uma procedure, tente procedure (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2); pascal; ou procedure (Parametro1 : TipoDoParametro1, Parametro2 : TipoDoParametro2); cdecl; Se voce nao sabe quais os parametros usados pela funcao/procedure, uma solucao seria linkar o seu OBJ num programa qualquer e disassembla-lo. Ai pelo menos voce sabera a quantidade e o tipo de cada parametro. De qualquer forma, para saber para que serve cada um, tera que ser na tentativa e erro...a nao ser que voce tambem tenha paciencia para analisar o codigo disassemblado. OBS: Se o seu OBJ nao estiver num formato reconhecivel pelo LINK do Delphi
(um formato similar ao COFF), voce pode tentar outros Linkers, e criar uma dll. Existem varios linkers gratuitos, que reconhecem varios formatos (exemplos, sao lcclnk, djlnk, walk2lnk e o proprio linker da microsoft...tambem gratuito). Inicio da pagina
Dica numero : 103 Você pode alterar diretamente a chave do registro que seta esta opção. Fica em HKEY_LOCAL_MACHINE > Software > ... LOCAL SHARE "TRUE" (Pesquise com o regedit). Inicio da pagina
Dica numero : 104 Function TForm1.JanelaExiste(Classe,Janela:String) :Boolean; var PClasse,PJanela : array[0..79] of char; begin if Classe = '' then PClasse[0] := #0 else StrPCopy(PClasse,Classe); if Janela = '' then PJanela[0] := #0 else StrPCopy(PJanela,Janela); if FindWindow(PClasse,PJAnela) <> 0 then result := true else Result := false; end; Function TForm1.DelphiCarregado : Boolean; begin Result := False; if JanelaExiste('TPropertyInspector','Object Inspector') then result := True end;
procedure TForm1.FormCreate(Sender: TObject);
begin if DelphiCarregado then showmessage('Delphi está ativo, bom menino!') else begin Showmessage('Vc não poderá utilizar esta aplicação! Mau garoto!'); application.terminate; end; end; Inicio da pagina
Dica numero : 105 Qual a melhor maneira de criar forms em tempo de execucao: a) Application.CreateForm(TfmClientes, fmClientes); Cria o Form; o proprietário é a aplicação. b) fmClientes := TForm.Create(self); Cria o Form; o proprietário é ele mesmo. c) fmClientes := TForm.Create(Application); Cria o Form; o proprietário é a aplicação. d) fmClientes := TForm.Create(nil); Cria o Form; teoricamente sem proprietário; na prática é a aplicação. e) fmClientes := TfmClientes.Create(self); Cria o Form; o proprietário é ele mesmo. f) fmClientes := TfmClientes.Create(Application); Cria o Form; o proprietário é a aplicação. g) fmClientes := TfmClientes.Create(nil); Cria o Form; teoricamente sem proprietário; na prática é a aplicação. Poderiam me informar a diferenca entre elas? Quando você cria um Form dinamicamente: 1. se criar através de CreateForm, que é um método de TApplication, você passa como parâmetro a instância da classe e o nome do seu objeto (TfmClientes, fmClientes); 2. se criar através de Create - método de TForm, entre outros - você passa como parâmetro o proprietário do componente criado (no caso o Form). 2.1 se o proprietário for a aplicação, o Form só será destruído quando você finalizar o
aplicativo ou se você declarar Free ou Destroy no seu programa; (casos a, c, d, f, g); 2.2 se o proprietário for ele mesmo (self), o form terá que ser destruído por você; 2.3 se você criar, por exemplo, Form2 e passar como proprietário Form1; no momento em que Form1 for destruído, Form2 também o será. Quanto à melhor maneira, depende de como você quer controlar a aplicação, mas leve em conta que enquanto um objeto não é destruído, ele está na memória. Inicio da pagina
Dica numero : 106 var OldValue : LongBool; begin {liga a trava} SystemParametersInfo(97, Word(True), @OldValue, 0); {desliga a trava} SystemParametersInfo(97, Word(False), @OldValue, 0); end; Inicio da pagina
Dica numero : 107 procedure TForm1.BitBtn1Click(Sender: TObject); var Linha:integer; Tamanho:integer; Coluna:integer; begin Printer.Orientation := poLandscape; Printer.BeginDoc; Printer.Canvas.Pen.Width := 5; Printer.Canvas.Font.Name := 'Times New Roman'; Printer.Canvas.Font.Size := 10; Linha := 20; Coluna:= 20; Tamanho := Printer.Canvas.TextWidth('a'); Table1.First; while not Table1.Eof do begin
if Linha = 20 then begin Coluna := 20; Printer.Canvas.TextOut(0,Linha,'Relação de Clientes'); Linha := Linha - Printer.Canvas.Font.Height + 5 ; Printer.Canvas.TextOut(Coluna,Linha,'Cod'); Coluna:= Coluna + (Tamanho * 5 ); Printer.Canvas.TextOut(Coluna,Linha,'Nome'); Coluna:= Coluna + (Tamanho * 30); Printer.Canvas.TextOut(Coluna,Linha,'Endereço'); Coluna:= Coluna + (Tamanho * 30); Linha := Linha - Printer.Canvas.Font.Height + 5 ; end; Coluna := 20 ; Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName(„Codigo‟).AsString); Coluna:= Coluna + (Tamanho * 5 ); Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName(„Nome‟).AsString);
Coluna:= Coluna + (Tamanho * 30); Printer.Canvas.TextOut(Coluna,Linha,Table1.FieldByName(„End‟).AsString); Coluna:= Coluna + (Tamanho * 30); Linha := Linha - Printer.Canvas.Font.Height + 5 ; Table1.Next; if Linha > Printer.PageHeight-20 then Begin Printer.NewPage; Linha := 20; end; end; Printer.EndDoc; end; Inicio da pagina
Dica numero : 108 Esta procedure configura o tamanho do papel em Run-Time para ser utilizado com o objeto TPrinter; Esta procedure deve ser chamada antes de aplicar o método Printer.BeginDoc. procedure TForm1.SetPrinterPage(Width, Height : LongInt); var Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDMode : THandle; PDMode : PDEVMODE; begin Printer.GetPrinter(Device, Driver, Port, hDMode);
If hDMode <> 0 then begin pDMode := GlobalLock( hDMode ); If pDMode <> nil then begin pDMode^.dmPaperSize := DMPAPER_USER; pDMode^.dmPaperWidth := Width; pDMode^.dmPaperLength := Height; pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE; GlobalUnlock( hDMode ); end; end; end; Inicio da pagina
Dica numero : 109 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: MODAL - Mostra form em modo exclusivo procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2);{Carrega form na memória} Form2.ShowModal;{Mostra form em modo exclusivo} Form2.Free; {Libera Memória} end; NÃO MODAL - Mostra form em modo não exclusivo procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2);{Carrega form na memória} Form2.ShowModal;{Mostra form em modo exclusivo} end; No evento OnClose do Form2 coloque o seguinte código. procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction); begin Action:= caFree; end;
Aliado a este código, deve deve alterar no delphi, no menu Options, opção Project. Mudando os forms a serem criados dinamicamente da coluna Auto-Create Forms para Avaliable Forms. Inicio da pagina
Dica numero : 110 LOYD´S TIPS: Resolução de Vídeo: Quando criamos formulários, ãs vezes é útil escrever um código para que a tela e todos os seus objetos sejam mostrados no mesmo tamanho, não importando qual a resolução da tela. Aqui esta um código que mostra como isso é feito: Implementation const ScreenWidth: LongInt = 800; {I designed my form in 800x600 mode.} ScreenHeight: LongInt = 600; {$R *.DFM} procedure TForm1.FormCreate (Sender: Tobject); begin scaled := true; if (screen.width <> ScreenWidth) then begin height := longint(height) * longint(screen.height) DIV ScreenHeight; width := longint(width) * longint(screen.width) DIV ScreenWidth; scaleyBy(screen.width, ScreenWidth); end; end; Agora, você vai querer checar, se o tamanho dos fontes(de letra) estão OK. Antes de trocar p tamanho do fonte, você precisará ter certeza de que o objeto realmente tem a propriedade fonte pela checagem da RTTI. Isso pode ser feito assim:
USES tyinfo; {Add this to your USES statement.} var i:integer; begin for i := componentCount - 1 downto 0 do with components[i] do begin if GetPropInfo(ClassInfo, ´font´) <> nil then font.size := (NewFormWidth DIV OldFormWidth) * font.size; end; end;
{Esta é a maneira longa de fazer a mesma coisa} var i:integer; p:PPropInfo; begin for i := componentCount - 1 downto 0 do with components [i] do begin p := GetPropInfo (ClassInfo, ´font´); if assigned (p) then font.size := (NewFormWidth DIV OldFormWidth) * font.size; end; end; Atenção: Nem todos os objetos tem a propriedade FONT. Isso deve ser o suficiente para você começar. Atenção: A seguir, algumas dicas para ter em mente quando representar aplicações Delphi (formulários) em diferentes resoluções de Tela: * Decida antecipadamente, na etapa de criação do formulário, se ele será escalável ou não. A vantagem de um não escalável é que nada muda em tempo de execução. A desvantagem é equivalente (seu formulário pode ser muito pequeno ou grande para
alguns sistemas se nào for usada escala). * Se você não for usar formulário escalável, configure o set scaled to False. * Ou então, configure a propriedade scaled do formulário para True. * Configure a propriedade AutoScroll para False. AutoScroll = True quer dizer "não mexa no tamanho do frame do formulário em tempo de execução", o que não parece bom quando o conteúdo do formulário muda de tamanho. * Configure a fonte do formulário para uma True Type escalável, como a Arial MS. San Serif é uma boa alternativa, mas lembre que ainda é uma fonte bitmapped. Só a Arial dará uma fonte dentro de um pixel da altura desejada.ATENÇÃO: Se a fonte usada em uma aplicação não estiver instalada no computador, o Windows selecionará uma fonte alternativa da mesma família para utilizar. O tamanho dessa fonte pode não corresponder ao da fonte original, podendo causar problemas. * Configure a propriedade position do formulário para uma opção diferente de poDesigned. poDesigneddeixa o formulário onde você o deixou ( no design Time), o que sempre termina fora da margem, à esquerda da minha tela 1280 x 1024 - e completamente fora da tela 640 x 480. * Não amontoe controles no formulário - deixe pelo menos 4 pixels entre else, para que uma mudança de um pixel nas margens (devido a apresentação em escala) não mostre controles sobrepostos. * Para labels de uma linha alinhadas ã esquerda ou à direita, configure o AutoSize para True. Para outras formas de alinhamento configure o AutoSize para False. * Tenha certeza de que há espaço em branco suficiente num componente de labels para alterações no tamanho da fonte - um espaço de 25% do comprimento da linha de caracteres mostrada é um pouco a mais do que se precisa, mas é mais seguro. (Você vai precisar de um espaço equivalente a 30% de espansão para string labels se você pretende traduzir sua aplicação para
outra linguagem). Se o Autosize estiver em False, tenha certeza de que realmente configurou o tamanho do label corretamente. Se o Autosize estiver em True, esteja certo de que há espaço suficiente para que o label se amplie. * Em labels de múltiplas linhas ou de termos ocultos, deixe pelo menos uma linha em branco na base. Isso vai ser necessário para incluir o que estiver sobrando quando o texto for oculto de maneira diferente, pela mudança do tamanho da fonte com a escala. Não assuma isso porque está usando fontes grandes. Você não tem que deixar sobra de texto as fontes (grandes) de outros usuários podem ser maiores que as suas! * Tenha cuidado quando abrir um projeto em IDEs com resoluções diferentes. Assim que o formulário for aberto, sua propriedade Pixel per Inch será moditificada, e gravada para o DFM se você salvar o projeto. É melhor testar a aplicação rodando sozinho, e editar o formulário em apenas uma resolução. Editar em várias resoluções e tamanhos de fonte provoca problemas de fluxo e tamanho dos componentes. *Falando em fluxo de componentes, não represente o formulário em escala muitas vezes, quando estiver sendo criado ou quando tiver sendo executado. Cada escala introduz erros de roundoff que se acumulam muito rapidamente, uma vez que as coordenadas são rigorosamente interias. Quando valores fracionários forem retirados das origens e tamanhos do controle com cada sucessiva representação em escala, os conttroles parecerão deslizar para noroeste e ficar menores. Se você quer deixar seus usuários representarem o formulários em escala quantas vezes quiserem, comece com um formulário recentemente criado para que erros de escala não se acumulem. * Definitivamente, não mexa na propriedade Pixel pre Inch do formulário. * Em geral, não é necessário criar formulários em uma resolução específica, mas é essencial que você os revise em 640 x 480
com fontes pequenas e/ou grandes, e em alta resolução com fontes pequenas e/ou grandes antes de liberar suas aplicações. Isso deverser parte de sua lista de conferência para testar a compatibilidade do sistema regularmente. * Preste bastante atenção em todos os componentes que são basicamamente TMemo de uma linha - com oTDBLookupCombo. O controle de edição (multi-linhas) do Windows sempre mostra apenas linhas inteiras de texto. Se o controle for muito curto para sua fonte, um TMemo não mostrará coisa alguma, e um TEdit mostrará um pedaço do texto. É melhor fazer esses componentes um pouco maiores do que deixá-los um pixel menores e não aparecer nada do texto. * Tenha em mente que toda representação em escala é proporcional à diferença da altura da fonte entre o modo de execução e o modo de desenho, NÃO à resolução ou ao tamanho do monitor. Lembre também que as origens dos seus controles serão alteradas quando o formulário for representado em escala. Você não pode aumentar componentes muito bem sem também movê-los um pouco, novamente. Obtendo e modificando a posição do cursor em um TMemo Modificando a posição: ActiveControl:=Memo1; MemoCursorTo(Memo1,2,3); Obtendo a Posição: GetMemoLineCol(Memo1,Linha,Coluna); Inicio da pagina
Dica numero : 111 procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); const PageDelta = 10;
begin With VertScrollbar do if Key = VK_NEXT then Position := Position + PageDelta else if Key = VK_PRIOR then Position := Position - PageDelta; end; Inicio da pagina
Dica numero : 112 Edite diretamente no DPR, e depois salve como Funcoes.dpr: Library Funcoes; Uses SysUtils,WinTypes,WinProcs; { Uma função que tira os espaços no início e no final de uma string } Function Trim(J:String):String; Export; Begin While J[Length(J)]=#32 do Dec(J[0]); If Length(J)>1 then While (J[1]=' ') do Begin Delete(J,1,1); If Length(J)<=1 then J:=''; end; Result:=J; end; Exports { Torna visivel para os programas } Trim; Begin End. Para usar num programa: Unit Unit1; Interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormClick(Sender: TObject); private { Private declarations }
public { Public declarations } end; Var Form1: TForm1; Implementation { Declara a funcao } Function Trim(J:String):String; External 'funcoes.dll'; {$R *.DFM} Procedure TForm1.FormClick(Sender: TObject); begin Caption:=Trim(' Visite sempre o Delphi Club '); { Note os espacos } end; As vantagens de colocar as funções em DLL são: 1. O programa exigirá menos memória 2. Você poderá reaproveitar as funções 3. Em alguns casos pode-se atualizar apenas as dll para um upgrade Inicio da pagina
Dica numero : 113 unit CPFeCGC; interface function cpf(num: string): boolean; function cgc(num: string): boolean; implementation uses SysUtils; function cpf(num: string): boolean; var n1,n2,n3,n4,n5,n6,n7,n8,n9: integer; d1,d2: integer; digitado, calculado: string; begin n1:=StrToInt(num[1]); n2:=StrToInt(num[2]); n3:=StrToInt(num[3]); n4:=StrToInt(num[4]); n5:=StrToInt(num[5]); n6:=StrToInt(num[6]); n7:=StrToInt(num[7]); n8:=StrToInt(num[8]); n9:=StrToInt(num[9]);
d1:=n9*2+n8*3+n7*4+n6*5+n5*6+n4*7+n3*8+n2*9+n1*10; d1:=11-(d1 mod 11); if d1>=10 then d1:=0; d2:=d1*2+n9*3+n8*4+n7*5+n6*6+n5*7+n4*8+n3*9+n2*10+n1*11; d2:=11-(d2 mod 11); if d2>=10 then d2:=0; calculado:=inttostr(d1)+inttostr(d2); digitado:=num[10]+num[11]; if calculado=digitado then cpf:=true else cpf:=false; end; function cgc(num: string): boolean; var n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12: integer; d1,d2: integer; digitado, calculado: string; begin n1:=StrToInt(num[1]); n2:=StrToInt(num[2]); n3:=StrToInt(num[3]); n4:=StrToInt(num[4]); n5:=StrToInt(num[5]); n6:=StrToInt(num[6]); n7:=StrToInt(num[7]); n8:=StrToInt(num[8]); n9:=StrToInt(num[9]); n10:=StrToInt(num[10]); n11:=StrToInt(num[11]); n12:=StrToInt(num[12]); d1:=n12*2+n11*3+n10*4+n9*5+n8*6+n7*7+n6*8+n5*9+n4*2+n3*3+n2*4+n1*5; d1:=11-(d1 mod 11); if d1>=10 then d1:=0; d2:=d1*2+n12*3+n11*4+n10*5+n9*6+n8*7+n7*8+n6*9+n5*2+n4*3+n3*4+n2*5+n1 *6; d2:=11-(d2 mod 11); if d2>=10 then d2:=0; calculado:=inttostr(d1)+inttostr(d2); digitado:=num[13]+num[14]; if calculado=digitado then cgc:=true else cgc:=false; end; end. Inicio da pagina
Dica numero : 114 unit Ext; interface function extenso (valor: real): string; implementation uses SysUtils, Dialogs; function extenso (valor: real): string; var Centavos, Centena, Milhar, Milhao, Texto, msg: string; const Unidades: array[1..9] of string = ('Um', 'Dois', 'Tres', 'Quatro', 'Cinco', 'Seis', 'Sete', 'Oito', 'Nove'); Dez: array[1..9] of string = ('Onze', 'Doze', 'Treze', 'Quatorze', 'Quinze', 'Dezesseis', 'Dezessete', 'Dezoito', 'Dezenove'); Dezenas: array[1..9] of string = ('Dez', 'Vinte', 'Trinta', 'Quarenta', 'Cinquenta', 'Sessenta', 'Setenta', 'Oitenta', 'Noventa'); Centenas: array[1..9] of string = ('Cento', 'Duzentos', 'Trezentos', 'Quatrocentos', 'Quinhentos', 'Seiscentos', 'Setecentos', 'Oitocentos', 'Novecentos'); function ifs(Expressao: Boolean; CasoVerdadeiro, CasoFalso: String): String; begin if Expressao then Result:=CasoVerdadeiro else Result:=CasoFalso; end; function MiniExtenso (trio: string): string; var Unidade, Dezena, Centena: string; begin Unidade:=''; Dezena:=''; Centena:=''; if (trio[2]='1') and (trio[3]<>'0') then begin Unidade:=Dez[strtoint(trio[3])]; Dezena:=''; end else
begin if trio[2]<>'0' then Dezena:=Dezenas[strtoint(trio[2])]; if trio[3]<>'0' then Unidade:=Unidades[strtoint(trio[3])]; end; if (trio[1]='1') and (Unidade='') and (Dezena='') then Centena:='cem' else if trio[1]<>'0' then Centena:=Centenas[strtoint(trio[1])] else Centena:=''; Result:= Centena + ifs((Centena<>'') and ((Dezena<>'') or (Unidade<>'')), ' e ', '') + Dezena + ifs((Dezena<>'') and (Unidade<>''),' e ', '') + Unidade; end; begin if (valor>999999.99) or (valor<0) then begin msg:='O valor está fora do intervalo permitido.'; msg:=msg+'O número deve ser maior ou igual a zero e menor que 999.999,99.'; msg:=msg+' Se não for corrigido o número não será escrito por extenso.'; showmessage(msg); Result:=''; exit; end; if valor=0 then begin Result:=''; Exit; end; Texto:=formatfloat('000000.00',valor); Milhar:=MiniExtenso(Copy(Texto,1,3)); Centena:=MiniExtenso(Copy(Texto,4,3)); Centavos:=MiniExtenso('0'+Copy(Texto,8,2)); Result:=Milhar; if Milhar<>'' then if copy(texto,4,3)='000' then Result:=Result+' Mil Reais' else Result:=Result+' Mil, '; if (((copy(texto,4,2)='00') and (Milhar<>'') and (copy(texto,6,1)<>'0')) or (centavos='')) and (Centena<>'') then Result:=Result+' e '; if (Milhar+Centena <>'') then Result:=Result+Centena; if (Milhar='') and (copy(texto,4,3)='001') then Result:=Result+' Real' else if (copy(texto,4,3)<>'000') then Result:=Result+' Reais'; if Centavos='' then begin Result:=Result+'.';
Exit; end else begin if Milhar+Centena='' then Result:=Centavos else Result:=Result+', e '+Centavos; if (copy(texto,8,2)='01') and (Centavos<>'') then Result:=Result+' Centavo.' else Result:=Result+' Centavos.'; end; end; end. Inicio da pagina
Dica numero : 115 unit Zero; interface function RetZero(ZEROS:string;QUANT:integer):String; implementation function RetZero(ZEROS:string;QUANT:integer):String; var I,Tamanho:integer; aux: string; begin aux:=zeros; Tamanho:=length(ZEROS); ZEROS:=''; for I:=1 to quant-tamanho do ZEROS:=ZEROS+'0'; aux:=zeros+aux; RetZero:=aux; end; end. Inicio da pagina
Dica numero : 116 if Key in [',','.'] then Key := DecimalSeparator; Coloque no evento OnKeyPress dos seus TEdits numéricos Inicio da pagina
Dica numero : 117 Query.Locate('campo onde ira porcurar',Texto a buscar,[loPartialKey]) Inicio da pagina
Dica numero : 118 Em vez de Quickreport1.Print faca : QuickRep1.ExportToFilter(TQRHtmlExportFilter.Create('teste.html')); Inicio da pagina
Dica numero : 119 function ExitWindowsEx(uFlags : integer; // shutdown operation dwReserved : word) : boolean; // reserved external 'user32.dll' name 'ExitWindowsEx'; procedure Tchau; const EWX_LOGOFF = 0; // Dá "logoff" no usuário atual EWX_SHUTDOWN = 1; // "Shutdown" padrão do sistema EWX_REBOOT = 2; // Dá "reboot" no equipamento EWX_FORCE = 4; // Força o término dos processos EWX_POWEROFF = 8; // Desliga o equipamento begin ExitWindowsEx(EWX_FORCE, 0); end; Inicio da pagina
Dica numero : 120 Function MidiaPresente(MediaPlayer: TMediaPlayer): Boolean; var Params: MCI_STATUS_PARMS; S: array [0.255] of char; r: Integer; begin //verifica se existe um cd inserido Params.dwItem:= MCI_STATUS_MEDIA_PRESENT; r:= MCISendCommand(MediaPlayer.DeviceID, MCI_STATUS, MCI_STATUS_ITEM, Integer(Addr(Params))); if r <> 0 then begin MCIGetErrorString(r, S, SizeOf(S)); ShowMessage('Erro: ' + StrPas(S)); end else Result:= Params.dwReturn = 1; end; Inicio da pagina
Dica numero : 121 Depois de algum tempo pesquisando uma forma de fazer aparecer as mensagens em português, consegui uma solução muito fácil de implementar no ambiente de programação do Delphi 3. CHEGA DE YES/NO !!! messagedlg('Confirma ? mtConfirmation, [mbYes, mbNo], 0); Aí vai: 1 - No diretório DELPHI3\LIB, copie o arquivo consts.dcu para consts.old; 2 - Inicie o Delphi e crie um nova Unit; 3 - Insira nesta, o arquivo consts.int do diretório DELPHI3\DOC E faça as devidas alterações nas mensagens que desejares alterar e nas partes duplicadas da Unit como "implement" e etc, também deixe o cabeçalho como Unit Consts. 4 - Salve esta nova Unit no diretório DELPHI\LIB e pronto todas as mensagens alteradas por você estarão aplicadas nos seus
próximos programas sem uma linha de programa e da forma que você quiser. Inicio da pagina
Dica numero : 122 Function NumDiasExtenso(NumDias:integer):string; var Anos, Meses, Dias : integer; sAnos, sMeses, sDias : string; begin { --- Calcula o número de anos --- } Anos := 0; while NumDias >= 365 do begin Anos := Anos + 1; NumDias := NumDias - 365; end; if Anos > 1 then sAnos := ' anos,' else sAnos := ' ano,'; { --- Calcula o número de meses --- } Meses := 0; while NumDias >= 30 do begin Meses := Meses + 1; NumDias := NumDias - 30; end; if Meses > 1 then sMeses := ' meses e ' else sAnos := ' mês e '; { --- O Número de dias é a sobra --- } Dias := NumDias; if sDias > 1 then sDias := 'dias' else sDias := 'dia'; Return := Inttostr(Anos)+sAnos+inttostr(Meses)+sMeses+inttostr(Dias)+sDias; end; Inicio da pagina
Dica numero : 123 Procedure MostraErro; Begin ShowMessage('Ocorreu algum erro!'); end; TForm1.Create; Begin Application.OnException:=MostraErro; end; Inicio da pagina
Dica numero : 124 { Reinicia o Windows } ExitWindowsEx(EWX_REBOOT, 0); { Desliga o Windows } ExitWindowsEx(EWX_SHUTDOWN, 0); { Força todos os programa a desligarem-se } ExitWindowsEx(EWX_FORCE, 0); Inicio da pagina
Dica numero : 125 Modificando a posição: ActiveControl:=Memo1; MemoCursorTo(Memo1,2,3); Obtendo a Posição: GetMemoLineCol(Memo1,Linha,Coluna); Inicio da pagina
Dica numero : 126 procedure TForm1.Button1Click(Sender: TObject); var OldBkMode : integer;
begin with Form1.Canvas do begin Brush.Color := clRed; FillRect(Rect(0, 0, 100, 100)); Brush.Color := clBlue; TextOut(10, 20, 'Não é Transparente!'); OldBkMode := SetBkMode(Handle, TRANSPARENT); TextOut(10, 50, 'É Transparente!'); SetBkMode(Handle, OldBkMode); end; end; Inicio da pagina
Dica numero : 127 procedure TForm1.Button1Click(Sender: TObject); var num : integer; begin num:=12450; Edit1.text:=formatfloat('###,###,##0.00', num) end; Inicio da pagina
Dica numero : 128 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; Inicio da pagina
Dica numero : 129 Coloque a propriedade defaultdrawdata do dbgrid em FALSE
No evento onDrawColumnCell do seu grid coloque o seguinte: procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin If table1PRAZO.Value > DATE then // condição Dbgrid1.Canvas.Font.Color:= clFuchsia; // coloque aqui a cor desejada Dbgrid1.DefaultDrawDataCell(Rect, dbgrid1.columns[datacol].field, State); end; Inicio da pagina
Dica numero : 130 function PegaSysDir: string; var MeuBuffer: Array [1..128] of Char; retorno: Integer; Begin retorno:=GetSystemDirectory(@MeuBuffer,128); if (retorno>128) OR (retorno=0) then PegaSysDir:='' else PegaSysDir:=StrPas(@MeuBuffer); End; {prc} Inicio da pagina
Dica numero : 131 No System.ini você tem uma configuração como esta : Shell=Explorer.exe Basta trocar por Shell=Myprog.exe Ou usando delphi procedure Tform1.ChangeShell(String programa); var ArquivoIni : Tinifile; begin try
ArquivoIni := Tinifile.Create('System.ini'); ArquivIni.WriteSection('Config','Shell','Myprog.exe'); fynally ArquivoIni.Destroy; end; end; Inicio da pagina
Dica numero : 132 procedure TF_Padrao.FormKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then if not (ActiveControl is TDBGrid) then begin Key := #0; Perform(WM_NEXTDLGCTL, 0, 0); end else if (ActiveControl is TDBGrid) then with TDBGrid(ActiveControl) do if selectedindex < (fieldcount -1) then selectedindex := selectedindex +1 else selectedindex := 0; end; Ou então, pode-se tentar o seguinte método: Utilize o evento onkeydown do componente e insira o seguinte comando: if Key = VK_RETURN then Perform(Wm_NextDlgCtl,0,0); este comando testa a tecla pressionada, se ela for um enter, manda o foco para o componente posterior. Inicio da pagina
Dica numero : 133 procedure TForm1.Button1Click(Sender: TObject); var MyTreeNode1, MyTreeNode2: TTreeNode; begin
with TreeView1.Items do begin Clear; { Remove qualquer node existente } MyTreeNode1 := Add(nil, 'RootTreeNode1'); { Adiciona o node raiz } { Adiciona um sub item no node adiciona anteriormente } AddChild(MyTreeNode1,'ChildNode1'); {Adiciona outro node raiz} MyTreeNode2 := Add(MyTreeNode1, 'RootTreeNode2'); AddChild(MyTreeNode2,'ChildNode2'); MyTreeNode2 := TreeView1.Items[3]; AddChild(MyTreeNode2,'ChildNode2a'); Add(MyTreeNode2,'ChildNode2b'); Add(MyTreeNode1, 'RootTreeNode3'); end; end; Inicio da pagina
Dica numero : 134 CopyFile(Pchar(Origem),Pchar(Destino),false); Onde Origem e' a variavel de que contem o nome do arquivo de origem Destiono e' a variavel que contem o nome do arquivo destino False : Instrui para sobrescrever o arquivo destino (caso encontre) Inicio da pagina
Dica numero : 135 1. Criem um arquivo texto, por exemplo: RECURSOS.RC com um conteudo igual a este: BITMAP_1 BITMAP "C:\Imagens\Grafico.bmp" para todos os bitmap's que vc deseja; 2. Compilem este arquivo usando o BRCC32.EXE que esta no diretorio BIN do Delphi sera gerado o arquivo RECURSOS.RES; e 3. Coloquem dentro do fonte do projeto: {$R RECURSOS.RES} Para usar o bitmap faca o seguinte: VarTipoTBitmap:= LoadBitmap(HInstance,'BITMAP_1');
Inicio da pagina
Dica numero : 136 Os campos do Tipo TBlobField, tem metodos que permitem que sejam armazenados dados contidos em arquivos, ou em um Stream... No primeiro caso (dos arquivos), o codigo seria algo como: TBlobField(SuaTabela.FieldByName('SeuCampo')).LoadFromFile('NomedoArquivo'); No segundo caso, poderia ser feito um exemplo com o TRichEdit: var Stream : TMemoryStream; begin Stream := TMemoryStream.Create; try RichEdit1.Lines.SaveToStream(Stream); Stream.Seek(0,soFromBeginning); TBlobField(SuaTabela.FieldByName('SeuCampo')).LoadFromStream(Stream); finally Stream.Free; end; end; Ambos os exemplos, assumem que a tabela ja' estaria em modo de Edicao ou de Insercao. Inicio da pagina
Dica numero : 137 if FileExists('C:\MEUDIR\MEUARQ.DAT') then DeleteFile('C:\MEUDIR\MEUARQ.DAT'); Inicio da pagina
Dica numero : 138 Function ExtractWindowsDir : String; Var Buffer : Array[0..144] of Char; Begin GetWindowsDirectory(Buffer,144);
Result := FormatPath(StrPas(Buffer)); End; Function ExtractSystemDir : String; Var Buffer : Array[0..144] of Char; Begin GetSystemDirectory(Buffer,144); Result := FormatPath(StrPas(Buffer)); End; Function ExtractTempDir : String; Var Buffer : Array[0..144] of Char; Begin GetTempPath(144,Buffer); Result := FormatPath(StrPas(Buffer)); End; Inicio da pagina
Dica numero : 139 Adicione um componente com o URL. Digite o seguinte código no seu evento OnClick: procedure Tform1.URLLabelClick(Sender: TObject); var TempString : array[0..79] of char; begin StrPCopy(TempString,URLLabel.Caption); OpenObject(TempString); end; Insira a seguinte procedure logo após implementation: procedure TTOKAboutBox.OpenObject(sObjectPath : PChar); begin ShellExecute(0, Nil, sObjectPath, Nil, Nil, SW_NORMAL); end; Adicione “ShellAPI” no uses.
Inicio da pagina
Dica numero : 140 {implementation section} ....
const SHFMT_ID_DEFAULT = $FFFF; // Formating options SHFMT_OPT_QUICKFORMAT = $0000; SHFMT_OPT_FULL = $0001; SHFMT_OPT_SYSONLY = $0002; // Error codes SHFMT_ERROR = $FFFFFFFF; SHFMT_CANCEL = $FFFFFFFE; SHFMT_NOFORMAT = $FFFFFFFD; function SHFormatDrive(Handle: HWND; Drive, ID, Options: Word): LongInt; stdcall; external 'shell32.dll' name 'SHFormatDrive' procedure TForm1.btnFormatDiskClick(Sender: TObject); var retCode: LongInt; begin retCode:= SHFormatDrive(Handle, 0, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT); if retCode < 0 then ShowMessage('Could not format drive'); end; Inicio da pagina
Dica numero : 141 Use os eventos KeyDown ou KeyUp e teste se Key = VK_LEFT ou VK_RIGHT, etc. Inicio da pagina
Dica numero : 142 procedure TMyForm.Button1Click(Sender: TObject); Var KeyState : TKeyboardState; begin GetKeyboardState(KeyState); if (KeyState[VK_NUMLOCK] = 0) then KeyState[VK_NUMLOCK] := 1 else KeyState[VK_NUMLOCK] := 0; SetKeyboardState(KeyState); End; Para a tecla Caps Lock basta trocar VK_NUMLOCK por VK_CAPITAL. Inicio da pagina
Dica numero : 143 Arquivos Exenciais para o BDE: EUROPE.BLL USA.BLL IDR20009.DLL IDAPI32.DLL BLW32.DLL IDAPI32.CFG <--- esse arquivo pode ter qualquer outro nome, desde que seja configurado no registro. Drivers de Banco de Dados: IDPDX32.DLL <--- Driver Paradox IDASCI32.DLL <--- Driver ASCII IDDBAS32.DLL <--- Driver DBase IDODBC32.DLL <--- Driver ODBC O BDE precisa de pelo menos um Driver de Banco de Dados para funcionar. Esses acima sao apenas alguns, existem varios outros. O BDE 4.51 + Driver Paradox compactados com o Algoritimo ZIP, ocuparam aproximadamente 650 Kb. Entradas no Registro do Win95: HKEY_LOCAL_MACHINE SOFTWARE\Borland\Database Engine DLLPATH -> localizacao do BDE (Unidade+Caminho Completo) CONFIGFILE01 -> localizacao do arquivo de configuracao (Unidade+Caminho Completo+Nome do Arquivo) SOFTWARE\Borland\BLW32 BLAPIPATH -> localizacao do BDE (Unidade+Caminho Completo) LOCALE_LIB1 -> localizacao do arquivo USA.BLL (Unidade+Caminho Completo+USA.BLL) LOCALE_LIB2 -> localizacao do arquivo EUROPE.BLL (Unidade+Caminho Completo+EUROPE.BLL) Segue um pequeno exemplo de como registrar o BDE no Registro do Win95: begin Registry.RootKey := HKEY_LOCAL_MACHINE; Registry.CreateKey('SOFTWARE\Borland\Database Engine'); Registry.OpenKey('SOFTWARE\Borland\Database Engine', False); Registry.WriteString('DLLPATH', 'C:\ARQUIVOS DE PROGRAMAS\BDE\'); Registry.WriteString('CONFIGFILE1', 'C:\ARQUIVOS DE PROGRAMAS\BDE\IDAPI32.CFG'); Registry.OpenKey('\', False); Registry.CreateKey('SOFTWARE\Borland\BLW32');
Registry.OpenKey('SOFTWARE\Borland\BLW32', False); Registry.WriteString('BLAPIPATH', 'C:\ARQUIVOS DE PROGRAMAS\BDE\'); Registry.WriteString('LOCALE_LIB1', 'C:\ARQUIVOS DE PROGRAMAS\BDE\USA.BLL'); Registry.WriteString('LOCALE_LIB2', 'C:\ARQUIVOS DE PROGRAMAS\BDE\EUROPE.BLL'); end; Para compilar esse codigo, sera necessario declarar a Unit Registry. Como eu disse, esse e um exemplo bem simples. Ele nem mesmo verifica se o BDE ja esta registrado ou não. Para criar o Alias atravez do seu instalador, voce pode usar a funcao da api do BDE chamada DbiAddAlias. Inicio da pagina
Dica numero : 144 Veja as propriedades dp TApplication... Application.HintColor := clAqua; Application.HintPause := ... Application.HintShortPause := ... Inicio da pagina
Dica numero : 145 A tecnica apresentada nao apenas serve para o proposito procurado, mas tambem serve para mostrar o progresso de diversas outras atividades que o BDE executa, como: * Criacao de tabelas * Criacao de indices para tabelas * Reestruturacao de tabelas * Execucao de queries (ja comentado) * alguma outra coisa que no momento nao me ocorre... :)) Importante: 1) No meu exemplo, estou usando o Delphi 3.02. Caso seu Delphi seja de uma versao menor, vc devera ter um trabalho extra para repor a classe TBDECallback. Acredito que seja possivel fazer uma rotina que funcione em Delphi 1, mas que com certeza dara um certo trabalhinho, ah, isso dara...
:-/ 2) Ate agora so usei esse codigo com tabelas Paradox, mas realmente acredito que ele venha a funcionar com base de dados Interbase, Oracle, etc... 3) Nao sei se com o uso do Opus, Apollo ou qualquer outro substituto do BDE a tecnica ira funcionar, uma vez que nao se estaria trabalhando com o BDE original. Talvez alguem da lista possa dar essa informacao. Teoria ===== Segundo o help do Delphi, "o TBDECallback eh um wrapper para uma funcao de callback do BDE. Com ele eh possivel instruir o BDE para que o mesmo execute algumas tarefas em resposta a eventos que ocorram durante uma chamada de uma funcao do BDE. " - Fim do plagio do arquivo de help. O tipo de callback depende de um parametro CBType que eh fornecido no momento da criacao do TBDECallback. E, entre os diversos valores que o CBType pode apresentar, existe um que muito nos interessa; o cbGENPROGRESS. :)) Assim, vc deveria criar uma funcao de callback do tipo cbGENPROGRESS chamada AtualizaGauge e indicar que a mesma eh que devera ser executada "entre cada respiracao" do BDE. Na rotina AtualizaGauge, o BDE iria te informar o percentual de progresso da tarefa . O que voce faria nessa rotina ? Simples... atualizar o Gauge / ProgressBar. Tudo muito bonito, tudo muito comovente, mas agora vamos para o lado pratico... Pratica ====== Para que o BDE possa informar o progresso da tarefa, ele precisa obter essa informacao da base de dados que esta sendo utilizada. Acontece que, por razoes diferentes, nem sempre ele eh capaz de saber o PERCENTUAL da tarefa. Numa copia de registros de uma tabela para outra, ele pode saber que ja foram copiados 270 registros, mas nao saber que esse esforco representa 36 % de todos os registros que serao copiados. Assim sendo, na funcao de callback que sera criada, receberemos um parametro do tipo pCBPROGRESSDesc, que por sua vez eh um ponteiro para uma estrutura que contem duas informacoes:
iPercentDone => percentual do servico realizado szMsg => texto descrevendo o progresso do servico. Como usar esses parametros ? Simples: sempre que o iPercentDone for negativo, voce devera considerar o texto descrito no campo szMsg. Se for igual ou maior que zero, entao vc devera considerar o valor do proprio iPercentDone. Uma boa noticia para quem se preocupa com as mensagens que aparecem em ingles, quando se quer na verdade mostra-las em portugues: a mensagem fornecida por szMsg devera sempre aparecer no formato <:> ..... Exemplo: Records copied: 170 Assim, voce pode procurar pelos dois pontos ":" e pegar o valor que vem a seguir para montar sua propria informacao em portugues. Pessoalmente, ate agora nunca obtive um iPercentDone positivo. Li no newsgroup da Borland que poucas bases de dados eram capazes de informar o real percentual para o BDE. Se nao me engano, o Sybase era um deles... NAO ESTOU CERTO DISSO. Vamos para um exemplo pratico ? Crie um projeto novo, e coloque um: TQuery, TButton, TProgressBar e TLabel. Sua query deve ser montada para abrir uma tabela razoavelmente grande, de modo que a operação de abertura demore um pouco. Agora vamos aos codigos: 1) Acrescente a unit BDE no seu USES da unit. 2) Acrescente algumas declarações na declaração do seu Form: ============================== type TForm1 = class(TForm) ... (bla bla bla) private { Private declarations } FCBPROGRESSDesc: pCBPROGRESSDesc; FProgressCallback: TBDECallback; function GetDataCallback(CBInfo: Pointer): CBRType; public { Public declarations } end;
Inicio da pagina
Dica numero : 146 Deleta o cifrão se existir e transforma a string em um valor formatando em quanta casas decimais passar como parâmetro. function STRFloat (S : String ; decimais: Integer): Double; var valor : Extended; begin Result := 0.00; if not (trim (S) = '') then begin if Pos('R',S) > 0 then delete(S,pos('R',S),1); if Pos('$',S) > 0 then delete(S,pos('$',S),1); if Pos('.',S) > 0 then delete(S,pos('.',S),1); valor := StrToFloat(S); result := strtofloat(floattostrf (valor,fffixed,8,decimais)); end; end. Inicio da pagina
Dica numero : 147 Verifica se um CEP é valido ou não, passando o Estado e o Cep como parâmetro. function ChecaCEP(cCep:String ; cEstado:String): Boolean; var cCEP1 : Integer; begin cCep := copy(cCep,1,5) + copy(cCep,7,3); cCEP1 := StrToInt(copy(cCep,1,3)); if Length(trim(cCep)) > 0 then begin if (StrToInt(cCep) <= 1000000.0) then begin MessageDlg('CEP tem que ser maior que [01000-000]',mtError,[mbOk],0); Result := False end else begin if Length(trim(copy(cCep,6,3))) < 3 then Result := False else
if (cEstado = 'SP') and (cCEP1 >= 10 ) and (cCEP1 <= 199) then Result := True else if (cEstado = 'RJ') and (cCEP1 >= 200) and (cCEP1 <= 289) then Result := True else if (cEstado = 'ES') and (cCEP1 >= 290) and (cCEP1 <= 299) then Result := True else if (cEstado = 'MG') and (cCEP1 >= 300) and (cCEP1 <= 399) then Result := True else if (cEstado = 'BA') and (cCEP1 >= 400) and (cCEP1 <= 489) then Result := True else if (cEstado = 'SE') and (cCEP1 >= 490) and (cCEP1 <= 499) then Result := True else if (cEstado = 'PE') and (cCEP1 >= 500) and (cCEP1 <= 569) then Result := True else if (cEstado = 'AL') and (cCEP1 >= 570) and (cCEP1 <= 579) then Result := True else if (cEstado = 'PB') and (cCEP1 >= 580) and (cCEP1 <= 589) then Result := True else if (cEstado = 'RN') and (cCEP1 >= 590) and (cCEP1 <= 599) then Result := True else if (cEstado = 'CE') and (cCEP1 >= 600) and (cCEP1 <= 639) then Result := True else if (cEstado = 'PI') and (cCEP1 >= 640) and (cCEP1 <= 649) then Result := True else if (cEstado = 'MA') and (cCEP1 >= 650) and (cCEP1 <= 659) then Result := True else if (cEstado = 'PA') and (cCEP1 >= 660) and (cCEP1 <= 688) then Result := True else if (cEstado = 'AM') and ((cCEP1 >= 690) and (cCEP1 <= 692) or (cCEP1 >= 694) and (cCEP1 <= 698)) then Result := True else if (cEstado = 'AP') and (cCEP1 = 689) then Result := True else if (cEstado = 'RR') and (cCEP1 = 693) then Result := True else if (cEstado = 'AC') and (cCEP1 = 699) then Result := True else if ((cEstado = 'DF') or (cEstado = 'GO')) and (cCEP1 >= 700)and(cCEP1 <= 769)then Result := True else if (cEstado = 'TO') and (cCEP1 >= 770) and (cCEP1 <= 779) then Result := True else if (cEstado = 'MT') and (cCEP1 >= 780) and (cCEP1 <= 788) then Result := True else if (cEstado = 'MS') and (cCEP1 >= 790) and (cCEP1 <= 799) then Result := True else if (cEstado = 'RO') and (cCEP1 = 789) then Result := True else if (cEstado = 'PR') and (cCEP1 >= 800) and (cCEP1 <= 879) then Result := True else if (cEstado = 'SC') and (cCEP1 >= 880) and (cCEP1 <= 899) then Result := True else if (cEstado = 'RS') and (cCEP1 >= 900) and (cCEP1 <= 999) then Result := True else Result := False end; end else begin Result := True; end end; Inicio da pagina
Dica numero : 148 function validapis(Dado : String) : boolean; {Testa se o número do pis é válido ou não} var i, wsoma, Wm11, Wdv,wdigito : Integer; begin if AllTrim(Dado) <> '' Then begin
wdv := strtoint(copy(Dado, 11, 1)); wsoma := 0; wm11 := 2; for i := 1 to 10 do begin wsoma := wsoma + (wm11 *strtoint(copy(Dado,11 - I, 1))); if wm11 < 9 then begin wm11 := wm11+1 end else begin wm11 := 2; end; end; wdigito := 11 - (wsoma MOD 11); if wdigito > 9 then begin wdigito := 0; end; if wdv = wdigito then begin validapis := true; end else begin validapis := false; end; end; end; Inicio da pagina
Dica numero : 149 function TestaCgc(xCGC: String):Boolean; {Testa se o CGC é válido ou não} Var d1,d4,xx,nCount,fator,resto,digito1,digito2 : Integer; Check : String; begin d1 := 0; d4 := 0; xx := 1; for nCount := 1 to Length( xCGC )-2 do begin if Pos( Copy( xCGC, nCount, 1 ), '/-.' ) = 0 then begin
if xx < 5 then begin fator := 6 - xx; end else begin fator := 14 - xx; end; d1 := d1 + StrToInt( Copy( xCGC, nCount, 1 ) ) * fator; if xx < 6 then begin fator := 7 - xx; end else begin fator := 15 - xx; end; d4 := d4 + StrToInt( Copy( xCGC, nCount, 1 ) ) * fator; xx := xx+1; end; end; resto := (d1 mod 11); if resto < 2 then begin digito1 := 0; end else begin digito1 := 11 - resto; end; d4 := d4 + 2 * digito1; resto := (d4 mod 11); if resto < 2 then begin digito2 := 0; end else begin digito2 := 11 - resto; end; Inicio da pagina
Dica numero : 150 Desconecta da Rede uma unidade mapeada e traduz as mensagens de erro. Function DesconectaRede(Letra:Pchar;Forcada:boolean):String;
// Letra = Letra atribuida a unidade // Forcada = Força o cancelamento do mapeamento begin WNetCancelConnection2(Letra,0,Forcada); Case GetLastError() of 1205: Result := 'Não foi possível abrir o perfil'; 1206: Result := 'Perfil do usuário não encontrado ou inválido'; 1208: Result := 'Ocorreu um Erro específico na rede'; 2138: Result := 'Rede não encontrada ou fora do ar'; 2250: Result := 'Mapeamento inválido ou não encontrado'; 2401: Result := 'Existem muitos arquivos abertos'; else Result := 'Unidade disconectada com sucesso'; end; end; Inicio da pagina
Dica numero : 151 Todas as vezes que são abertas as tabelas é colocado o comando StartTransaction antes da abertura das mesmas. Quando acontece algum erro na abertura das tabelas, o Delphi dispara uma mensagem de erro. Este erro pode ter sido provocado por diversos motivos mas é certo que o erro foi de alteração de uma ou mais tabelas no Banco de Dados. é aconselhável que se coloque uma rotina de tratamento de erro listada abaixo: - Onde estão as tabelas, coloque as suas tabelas que serão abertas; - Onde será mostrada a mensagem coloque uma mensagem qualquer avisando sobre o erro try if F_Menu.DBSistema.IsSQLBased then F_Menu.DBSistema.StartTransaction; Tabela1.Open; Tabela2.Open; Tabela3.Open; Tabela4.Open; except on EDatabaseError do if MessageDlg(, mtError, [mbOK], 0) <> mrOK Then raise; end; ShowModal; Sugestão Delphi / Oracle Criar uma função que irá verificar qual o código de erro enviado pela exceção e então
emitir uma mensagem em português. Abaixo está uma idéia desta rotina que será inserida no formulário principal da sua aplicação. procedure TF_Menu.ErrorMsg(Sender : TObject; E: exception); begin if e is EDBengineError then TrataErro(E as edbEngineError) else application.showException(E); end; procedure TF_Menu.TrataErro(E: eDBEngineError); var nSQLError : integer; cSQLMessage : string; cTable : string; x : integer; begin nSQLError := 0; cSQLMessage := ''; for x:=0 to e.ErrorCount -1 do if e.errors[x].NativeError <> 0 then begin nSQLError := e.errors[x].NativeError; cSQLMessage := e.errors[x].message; end; if nSQLError <> 0 then begin cTable := ''; x := pos('table"',cSQLMessage); if x > 0 then begin cTable := copy(cSQLMessage,x+7,20); x := pos('"',cTable); if x > 0 then cTable := copy(cTable,1,x-1); end; case nSQLError of 1 : showmessage('Este registro já está cadastrado.'); 2292 : showmessage('Este resgistro não pode ser excluído porque'+#10+ 'existem outros que dependem dele e que não foram excluídos'); 12203 : showmessage('Base de Dados está fora do ar. Favor entrar'+#10+ 'em contato com o responsável pela rede na '+#10+ 'localidade selecionada ou tente mais tarde.'); else showmessage(IntToStr(nSQLError)+' '+cSQLMessage); end; end else showmessage('Algo errado aconteceu!'); end;
procedure TF_Menu.FormCreate(Sender: TObject); begin Application.OnException := ErrorMsg; end; Inicio da pagina
Dica numero : 152 O DBGrid tem uma propriedade não documentada chamada SelectedRows (Tbookmark). Com ela você pode gerenciar Multiselect da seguinte forma: var contador: Integer; begin With Dbgrid1 do Begin for contador:= 0 to Pred(SelectedRows.Count) do Begin Datasource.Dataset.Bookmark:= SelectedRows[contador]; // posiciona nos registros selecionados do DBGrid end; end; Inicio da pagina
Dica numero : 153 Basta você passar a string a ser procurada, a string que à substituirá e campo memo. Chamando por exemplo no evento OnClick de em botão. Procedure TForm1.Button1Click (Sender: TObject); Begin FindReplace(Edit1.Text,Edit2.Text, Memo1); end; Procedure FindReplace (const Enc, subs: String; Var Texto:TMemo); Var i, Posicao: Integer; Linha: string; 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; Inicio da pagina
Dica numero : 154 function TruncVal(Value: Double; Casas: Integer): Double; var sPot: String; iPot: Integer; x: Integer; begin sPot := '1'; for x := 1 to Casas do sPot := sPot + '0'; begin iPot := StrToInt(sPot); end; Result := StrToInt(IntToStr(Trunc(Value * iPot))) / iPot; end; Inicio da pagina
Dica numero : 155 procedure TForm1.Edit1Change(Sender: TObject); begin Listbox1.Perform(LB_SELECTSTRING,0,LongInt(PChar(Edit1.Text))); end; Inicio da pagina
Dica numero : 156
procedure ConvTextOut(CV: TCanvas; const sText: String; x, y,angle:integer); var LogFont: TLogFont; SaveFont: TFont; begin SaveFont := TFont.Create; SaveFont.Assign(CV.Font); GetObject(SaveFont.Handle, sizeof(TLogFont), @LogFont); with LogFont do begin lfEscapement := angle *10; lfPitchAndFamily := FIXED_PITCH or FF_DONTCARE; end; {with} CV.Font.Handle := CreateFontIndirect(LogFont); SetBkMode(CV.Handle, TRANSPARENT); CV.TextOut(x, y, sText); CV.Font.Assign(SaveFont); SaveFont.Free; end; Inicio da pagina
Dica numero : 157 function HexToInt(const HexStr: string): longint; var iNdx: integer; cTmp: Char; begin result := 0; for iNdx := 1 to Length(HexStr) do begin cTmp := HexStr[iNdx]; case cTmp of '0'..'9': Result := 16 * Result + (Ord(cTmp) - $30); 'A'..'F': Result := 16 * Result + (Ord(cTmp) - $37); 'a'..'f': Result := 16 * Result + (Ord(cTmp) - $57); else raise EConvertError.Create('Illegal character in hex string'); end; end; end; Inicio da pagina
Dica numero : 158 procedure TForm1.btnCriaFieldClick(Sender: TObject); var T: TStringField; begin if qryCliente.Active then qryCliente.Close; T := TStringField.Create(Self); T.fieldName := 'cli_Nome'; T.FieldKind := fkData; T.DisplayLabel := 'Nome do Cliente'; T.Visible := True; T.Name := qryCliente.Name + T.FieldName; T.Index := qryCliente.FieldCount; T.DataSet := qryCliente; qryCliente.FieldDefs.UpDate; qryCliente.Open; end; procedure TForm1.btnApagaFieldClick(Sender: TObject); var TC: TComponent; begin TC := FindComponent('qryClientecli_Nome'); if not (TC = nil) then begin qryCliente.Close; TC.Free; qryCliente.Open; end; end; Inicio da pagina
Dica numero : 159 var button : Integer; msg1 : Array [0..79] of Char; msg2 : Array [0..79] of Char; begin StrPCopy(Msg1, Edit1.Text + ' ' + Edit2.Text); StrPCopy(Msg2, Edit3.Text + ' ' + Edit4.Text); Button := Application.MessageBox (Msg2,Msg1, MB_YESNOCANCEL+ mb_DefButton1+MB_ICONQUESTION); end; Inicio da pagina
Dica numero : 160 1º Coloque um listbox no form Modifique o OnCreate do form assim: procedure TForm1.FormCreate(Sender: TObject); var i : Integer; DevMode : TDevMode; begin i := 0; while EnumDisplaySettings(nil,i,Devmode) do begin with Devmode do ListBox1.Items.Add(Format('%dx%d %d Colors', [dmPelsWidth,dmPelsHeight, 1 shl dmBitsperPel])); Inc(i); end; end; - Coloque um botão no form - Altere o evento OnClick do botão conforme abaixo: procedure TForm1.Button1Click(Sender: TObject); var DevMode : TDevMode; begin EnumDisplaySettings(nil,Listbox1.ItemIndex,Devmode); ChangeDisplaySettings(DevMode,0); end; Inicio da pagina
Dica numero : 161 begin if opendialog1.execute then begin mediaplayer1.filename:= opendialog1.filename; mediaplayer1.open; mediaplayer1.Perform (wm_lbuttondown,0,$00090009); mediaplayer1.Perform (wm_lbuttonup,0,$00090009); end; end; Inicio da pagina
Dica numero : 162 try StrToDate(Edit1.Text); except on EConvertError do ShowMessage ('Data Inválida!); end; Inicio da pagina
Dica numero : 163 procedure TForm1.Button1Click(Sender: TObject); var i:integer; const str='1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'; max=6; begin Edit1.Text:=''; for i:=1 to max do begin Edit1.Text:=Edit1.Text+str[random(length(str))+1]; end; end. Inicio da pagina
Dica numero : 164 procedure TForm1.btnTestClick(Sender: TObject); var i: integer; begin for i:= 0 to Table1.FieldCount-1 do Table1.Fields[i].DisplayWidth:= Length(Table1.Fields[i].DisplayLabel); end; Inicio da pagina
Dica numero : 165 Inicio da pagina
Dica numero : 166 Inicio da pagina
Dica numero : 167 Inicio da pagina
Dica numero : 168 Inicio da pagina
Dica numero : 169 Inicio da pagina
Dica numero : 170 Inicio da pagina
Dica numero : 171 Inicio da pagina
Dica numero : 172 Inicio da pagina
Dica numero : 173 Inicio da pagina
Dica numero : 174 Inicio da pagina
Dica numero : 175 Inicio da pagina
Dica numero : 176 Inicio da pagina
Dica numero : 177 Inicio da pagina
Dica numero : 178 Inicio da pagina
Dica numero : 179 Inicio da pagina
Dica numero : 180
Inicio da pagina
Dica numero : 181 Inicio da pagina
Dica numero : 182 Inicio da pagina
Dica numero : 183 Inicio da pagina
Dica numero : 184 Inicio da pagina
Dica numero : 185 Inicio da pagina
Dica numero : 186 Inicio da pagina
Dica numero : 187 Inicio da pagina
Dica numero : 188 Inicio da pagina
Dica numero : 189 Inicio da pagina
Dica numero : 190 Inicio da pagina
Dica numero : 191 Inicio da pagina
Dica numero : 192 Inicio da pagina
Dica numero : 193 Inicio da pagina
Dica numero : 194 Inicio da pagina
Dica numero : 195 Inicio da pagina
Dica numero : 196 Inicio da pagina
Dica numero : 197 Inicio da pagina
Dica numero : 198 Inicio da pagina
Dica numero : 199 Inicio da pagina
Dica numero : 200 Inicio da pagina
Dica numero : 201 Inicio da pagina
Dica numero : 202 Inicio da pagina
Dica numero : 203
Inicio da pagina
Dica numero : 204 Inicio da pagina
Dica numero : 205 Inicio da pagina
Dica numero : 206 Inicio da pagina
Dica numero : 207 Inicio da pagina
Dica numero : 208 Inicio da pagina
Dica numero : 209 Inicio da pagina
Dica numero : 210 Inicio da pagina
Dica numero : 211 Inicio da pagina
Dica numero : 212 Inicio da pagina
Dica numero : 213 Inicio da pagina
Dica numero : 214 Inicio da pagina
Dica numero : 215 Inicio da pagina
Dica numero : 216 Inicio da pagina
Dica numero : 217 Inicio da pagina
Dica numero : 218 Inicio da pagina
Dica numero : 219 Inicio da pagina
Dica numero : 220 Inicio da pagina
Dica numero : 221 Inicio da pagina
Dica numero : 222 Inicio da pagina
Dica numero : 223 Inicio da pagina
Dica numero : 224 Inicio da pagina
Dica numero : 225 Inicio da pagina
Dica numero : 226
Inicio da pagina
Dica numero : 227 Inicio da pagina
Dica numero : 228 Inicio da pagina
Dica numero : 229 Inicio da pagina
Dica numero : 230 Inicio da pagina
Dica numero : 231 Inicio da pagina
Dica numero : 232 Inicio da pagina
Dica numero : 233 Inicio da pagina
Dica numero : 234 Inicio da pagina
Dica numero : 235 Inicio da pagina
Dica numero : 236 Inicio da pagina
Dica numero : 237 Inicio da pagina
Dica numero : 238 Inicio da pagina
Dica numero : 239 Inicio da pagina
Dica numero : 240 Inicio da pagina
Dica numero : 241 Inicio da pagina
Dica numero : 242 Inicio da pagina
Dica numero : 243 Inicio da pagina
Dica numero : 244 Inicio da pagina
Dica numero : 245 Inicio da pagina
Dica numero : 246 Inicio da pagina
Dica numero : 247 Inicio da pagina
Dica numero : 248 Inicio da pagina
Dica numero : 249
Inicio da pagina
Dica numero : 250 Inicio da pagina
Dica numero : 251 Inicio da pagina
Dica numero : 252 Inicio da pagina
Dica numero : 253 Inicio da pagina
Dica numero : 254 Inicio da pagina
Dica numero : 255 Inicio da pagina
Dica numero : 256 Inicio da pagina
Dica numero : 257 Inicio da pagina
Dica numero : 258 Inicio da pagina
Dica numero : 259 Inicio da pagina
Dica numero : 260 Inicio da pagina
Dica numero : 261 Inicio da pagina
Dica numero : 262 Inicio da pagina
Dica numero : 263 Inicio da pagina
Dica numero : 264 Inicio da pagina
Dica numero : 265 Inicio da pagina
Dica numero : 266 Inicio da pagina
Dica numero : 267 Inicio da pagina
Dica numero : 268 Inicio da pagina
Dica numero : 269 Inicio da pagina
Dica numero : 270 Inicio da pagina
Dica numero : 271 Inicio da pagina
Dica numero : 272
Inicio da pagina
Dica numero : 273 Inicio da pagina
Dica numero : 274 Inicio da pagina
Dica numero : 275 Inicio da pagina
Dica numero : 276 Inicio da pagina
Dica numero : 277 Inicio da pagina
Dica numero : 278 Inicio da pagina
Dica numero : 279 Inicio da pagina
Dica numero : 280 Inicio da pagina
Dica numero : 281 Inicio da pagina
Dica numero : 282 Inicio da pagina
Dica numero : 283 Inicio da pagina
Dica numero : 284 Inicio da pagina
Dica numero : 285 Inicio da pagina
Dica numero : 286 Inicio da pagina
Dica numero : 287 Inicio da pagina
Dica numero : 288 Inicio da pagina
Dica numero : 289 Inicio da pagina
Dica numero : 290 Inicio da pagina
Dica numero : 291 Inicio da pagina
Dica numero : 292 Inicio da pagina
Dica numero : 293 Inicio da pagina
Dica numero : 294 Inicio da pagina
Dica numero : 295
Inicio da pagina
Dica numero : 296 Inicio da pagina
Dica numero : 297 Inicio da pagina
Dica numero : 298 Inicio da pagina
Dica numero : 299 Inicio da pagina
Dica numero : 300 Inicio da pagina
Dica numero : 301 Inicio da pagina
Dica numero : 302 Inicio da pagina
Dica numero : 303 Inicio da pagina
Dica numero : 304 Inicio da pagina
Dica numero : 305 Inicio da pagina
Dica numero : 306 Inicio da pagina
Dica numero : 307 Inicio da pagina
Dica numero : 308 Inicio da pagina
Dica numero : 309 Inicio da pagina
Dica numero : 310 Inicio da pagina
Dica numero : 311 Inicio da pagina
Dica numero : 312 Inicio da pagina
Dica numero : 313 Inicio da pagina
Dica numero : 314 Inicio da pagina
Dica numero : 315 Inicio da pagina
Dica numero : 316 Inicio da pagina
Dica numero : 317 Inicio da pagina
Dica numero : 318
Inicio da pagina
Dica numero : 319 Inicio da pagina
Dica numero : 320 Inicio da pagina
Dica numero : 321 Inicio da pagina
Dica numero : 322 Inicio da pagina
Dica numero : 323 Inicio da pagina
Dica numero : 324 Inicio da pagina
Dica numero : 325 Inicio da pagina
Dica numero : 326 Inicio da pagina
Dica numero : 327 Inicio da pagina
Dica numero : 328 Inicio da pagina
Dica numero : 329 Inicio da pagina
Dica numero : 330 Inicio da pagina
Dica numero : 331 Inicio da pagina
Dica numero : 332 Inicio da pagina
Dica numero : 333 Inicio da pagina
Dica numero : 334 Inicio da pagina
Dica numero : 335 Inicio da pagina
Dica numero : 336 Inicio da pagina
Dica numero : 337 Inicio da pagina
Dica numero : 338 Inicio da pagina
Dica numero : 339 Inicio da pagina
Dica numero : 340 Inicio da pagina
Dica numero : 341
Inicio da pagina
Dica numero : 342 Inicio da pagina
Dica numero : 343 Inicio da pagina
Dica numero : 344 Inicio da pagina
Dica numero : 345 Inicio da pagina
Dica numero : 346 Inicio da pagina
Dica numero : 347 Inicio da pagina
Dica numero : 348 Inicio da pagina
Dica numero : 349 Inicio da pagina
Dica numero : 350 Inicio da pagina
Dica numero : 351 Inicio da pagina
Dica numero : 352 Inicio da pagina
Dica numero : 353 Inicio da pagina
Dica numero : 354 Inicio da pagina
Dica numero : 355 Inicio da pagina
Dica numero : 356 Inicio da pagina
Dica numero : 357 Inicio da pagina
Dica numero : 358 Inicio da pagina
Dica numero : 359 Inicio da pagina
Dica numero : 360 Inicio da pagina
Dica numero : 361 Inicio da pagina
Dica numero : 362 Inicio da pagina
Dica numero : 363 Inicio da pagina
Dica numero : 364
Inicio da pagina
Dica numero : 365 Inicio da pagina
Dica numero : 366 Inicio da pagina
Dica numero : 367 Inicio da pagina
Dica numero : 368 Inicio da pagina
Dica numero : 369 Inicio da pagina
Dica numero : 370 Inicio da pagina
Dica numero : 371 Inicio da pagina
Dica numero : 372 Inicio da pagina
Dica numero : 373 Inicio da pagina
Dica numero : 374 Inicio da pagina
Dica numero : 375 Inicio da pagina
Dica numero : 376 Inicio da pagina
Dica numero : 377 Inicio da pagina
Dica numero : 378 Inicio da pagina
Dica numero : 379 Inicio da pagina
Dica numero : 380 Inicio da pagina
Dica numero : 381 Inicio da pagina
Dica numero : 382 Inicio da pagina
Dica numero : 383 Inicio da pagina
Dica numero : 384 Inicio da pagina
Dica numero : 385 Inicio da pagina
Dica numero : 386 Inicio da pagina
Dica numero : 387
Inicio da pagina
Dica numero : 388 Inicio da pagina
Dica numero : 389 Inicio da pagina
Dica numero : 390 Inicio da pagina
Dica numero : 391 Inicio da pagina
Dica numero : 392 Inicio da pagina
Dica numero : 393 Inicio da pagina
Dica numero : 394 Inicio da pagina
Dica numero : 395 Inicio da pagina
Dica numero : 396 Inicio da pagina
Dica numero : 397 Inicio da pagina
Dica numero : 398 Inicio da pagina
Dica numero : 399 Inicio da pagina
Dica numero : 400 Inicio da pagina
Dica numero : 401 Inicio da pagina
Dica numero : 402 Inicio da pagina
Dica numero : 403 Inicio da pagina
Dica numero : 404 Inicio da pagina
Dica numero : 405 Inicio da pagina
Dica numero : 406 Inicio da pagina
Dica numero : 407 Inicio da pagina
Dica numero : 408 Inicio da pagina
Dica numero : 409 Inicio da pagina
Dica numero : 410
Inicio da pagina
Dica numero : 411 Inicio da pagina
Dica numero : 412 Inicio da pagina
Dica numero : 413 Inicio da pagina
Dica numero : 414 Inicio da pagina
Dica numero : 415 Inicio da pagina
Dica numero : 416 Inicio da pagina
Dica numero : 417 Inicio da pagina
Dica numero : 418 Inicio da pagina
Dica numero : 419 Inicio da pagina
Dica numero : 420 Inicio da pagina
Dica numero : 421 Inicio da pagina
Dica numero : 422 Inicio da pagina
Dica numero : 423 Inicio da pagina
Dica numero : 424 Inicio da pagina
Dica numero : 425 Inicio da pagina
Dica numero : 426 Inicio da pagina
Dica numero : 427 Inicio da pagina
Dica numero : 428 Inicio da pagina
Dica numero : 429 Inicio da pagina
Dica numero : 430 Inicio da pagina
Dica numero : 431 Inicio da pagina
Dica numero : 432 Inicio da pagina
Dica numero : 433
Inicio da pagina
Dica numero : 434 Inicio da pagina
Dica numero : 435 Inicio da pagina
Dica numero : 436 Inicio da pagina
Dica numero : 437 Inicio da pagina
Dica numero : 438 Inicio da pagina
Dica numero : 439 Inicio da pagina
Dica numero : 440 Inicio da pagina
Dica numero : 441 Inicio da pagina
Dica numero : 442 Inicio da pagina
Dica numero : 443 Inicio da pagina
Dica numero : 444 Inicio da pagina
Dica numero : 445 Inicio da pagina
Dica numero : 446 Inicio da pagina
Dica numero : 447 Inicio da pagina
Dica numero : 448 Inicio da pagina
Dica numero : 449 Inicio da pagina
Dica numero : 450 Inicio da pagina
Dica numero : 451 Inicio da pagina
Dica numero : 452 Inicio da pagina
Dica numero : 453 Inicio da pagina
Dica numero : 454 Inicio da pagina
Dica numero : 455 Inicio da pagina
Dica numero : 456
Inicio da pagina
Dica numero : 457 Inicio da pagina
Dica numero : 458 Inicio da pagina
Dica numero : 459 Inicio da pagina
Dica numero : 460 Inicio da pagina
Dica numero : 461 Inicio da pagina
Dica numero : 462 Inicio da pagina
Dica numero : 463 Inicio da pagina
Dica numero : 464 Inicio da pagina
Dica numero : 465 Inicio da pagina
Dica numero : 466 Inicio da pagina
Dica numero : 467 Inicio da pagina
Dica numero : 468 Inicio da pagina
Dica numero : 469 Inicio da pagina
Dica numero : 470 Inicio da pagina
Dica numero : 471 Inicio da pagina
Dica numero : 472 Inicio da pagina
Dica numero : 473 Inicio da pagina
Dica numero : 474 Inicio da pagina
Dica numero : 475 Inicio da pagina
Dica numero : 476 Inicio da pagina
Dica numero : 477 Inicio da pagina
Dica numero : 478 Inicio da pagina
Dica numero : 479
Inicio da pagina
Dica numero : 480 Inicio da pagina
Dica numero : 481 Inicio da pagina
Dica numero : 482 Inicio da pagina
Dica numero : 483 Inicio da pagina
Dica numero : 484 Inicio da pagina
Dica numero : 485 Inicio da pagina
Dica numero : 486 Inicio da pagina
Dica numero : 487 Inicio da pagina
Dica numero : 488 Inicio da pagina
Dica numero : 489 Inicio da pagina
Dica numero : 490 Inicio da pagina
Dica numero : 491 Inicio da pagina
Dica numero : 492 Inicio da pagina
Dica numero : 493 Inicio da pagina
Dica numero : 494 Inicio da pagina
Dica numero : 495 Inicio da pagina
Dica numero : 496 Inicio da pagina
Dica numero : 497 Inicio da pagina
Dica numero : 498 Inicio da pagina
Dica numero : 499 Inicio da pagina
Dica numero : 500 Inicio da pagina
Dica numero : 501 Inicio da pagina
Dica numero : 502
Inicio da pagina
Dica numero : 503 Inicio da pagina
Dica numero : 504 Inicio da pagina
Dica numero : 505 Inicio da pagina
Dica numero : 506 Inicio da pagina
Dica numero : 507 Inicio da pagina
Dica numero : 508 Inicio da pagina
Dica numero : 509 Inicio da pagina
Dica numero : 510 Inicio da pagina
Dica numero : 511 Inicio da pagina
Dica numero : 512 Inicio da pagina
Dica numero : 513 Inicio da pagina
Dica numero : 514 Inicio da pagina
Dica numero : 515 Inicio da pagina
Dica numero : 516 Inicio da pagina
Dica numero : 517 Inicio da pagina
Dica numero : 518 Inicio da pagina
Dica numero : 519 Inicio da pagina
Dica numero : 520 Inicio da pagina
Dica numero : 521 Inicio da pagina
Dica numero : 522 Inicio da pagina
Dica numero : 523 Inicio da pagina
Dica numero : 524 Inicio da pagina
Dica numero : 525
Inicio da pagina
Dica numero : 526 Inicio da pagina
Dica numero : 527 Inicio da pagina
Dica numero : 528 Inicio da pagina
Dica numero : 529 Inicio da pagina
Dica numero : 530 Inicio da pagina
Dica numero : 531 Inicio da pagina
Dica numero : 532 Inicio da pagina
Dica numero : 533 Inicio da pagina
Dica numero : 534 Inicio da pagina
Dica numero : 535 Inicio da pagina
Dica numero : 536 Inicio da pagina
Dica numero : 537 Inicio da pagina
Dica numero : 538 Inicio da pagina
Dica numero : 539 Inicio da pagina
Dica numero : 540 Inicio da pagina
Dica numero : 541 Inicio da pagina
Dica numero : 542 Inicio da pagina
Dica numero : 543 Inicio da pagina
Dica numero : 544 Inicio da pagina
Dica numero : 545 Inicio da pagina
Dica numero : 546 Inicio da pagina
Dica numero : 547 Inicio da pagina
Dica numero : 548
Inicio da pagina
Dica numero : 549 Inicio da pagina
Dica numero : 550 Inicio da pagina
Dica numero : 551 Inicio da pagina
Dica numero : 552 Inicio da pagina
Dica numero : 553 Inicio da pagina
Dica numero : 554 Inicio da pagina
Dica numero : 555 Inicio da pagina
Dica numero : 556 Inicio da pagina
Dica numero : 557 Inicio da pagina
Dica numero : 558 Inicio da pagina
Dica numero : 559 Inicio da pagina
Dica numero : 560 Inicio da pagina
Dica numero : 561 Inicio da pagina
Dica numero : 562 Inicio da pagina
Dica numero : 563 Inicio da pagina
Dica numero : 564 Inicio da pagina
Dica numero : 565 Inicio da pagina
Dica numero : 566 Inicio da pagina
Dica numero : 567 Inicio da pagina
Dica numero : 568 Inicio da pagina
Dica numero : 569 Inicio da pagina
Dica numero : 570 Inicio da pagina
Dica numero : 571
Inicio da pagina
Dica numero : 572 Inicio da pagina
Dica numero : 573 Inicio da pagina
Dica numero : 574 Inicio da pagina
Dica numero : 575 Inicio da pagina
Dica numero : 576 Inicio da pagina
Dica numero : 577 Inicio da pagina
Dica numero : 578 Inicio da pagina
Dica numero : 579 Inicio da pagina
Dica numero : 580 Inicio da pagina
Dica numero : 581 Inicio da pagina
Dica numero : 582 Inicio da pagina
Dica numero : 583 Inicio da pagina
Dica numero : 584 Inicio da pagina
Dica numero : 585 Inicio da pagina
Dica numero : 586 Inicio da pagina
Dica numero : 587 Inicio da pagina
Dica numero : 588 Inicio da pagina
Dica numero : 589 Inicio da pagina
Dica numero : 590 Inicio da pagina
Dica numero : 591 Inicio da pagina
Dica numero : 592 Inicio da pagina
Dica numero : 593 Inicio da pagina
Dica numero : 594
Inicio da pagina
Dica numero : 595 Inicio da pagina
Dica numero : 596 Inicio da pagina
Dica numero : 597 Inicio da pagina
Dica numero : 598 Inicio da pagina
Dica numero : 599 Inicio da pagina
Dica numero : 600 Inicio da pagina
Dica numero : 601 Inicio da pagina
Dica numero : 602 Inicio da pagina
Dica numero : 603 Inicio da pagina
Dica numero : 604 Inicio da pagina
Dica numero : 605 Inicio da pagina
Dica numero : 606 Inicio da pagina
Dica numero : 607 Inicio da pagina
Dica numero : 608 Inicio da pagina
Dica numero : 609 Inicio da pagina
Dica numero : 610 Inicio da pagina
Dica numero : 611 Inicio da pagina
Dica numero : 612 Inicio da pagina
Dica numero : 613 Inicio da pagina
Dica numero : 614 Inicio da pagina
Dica numero : 615 Inicio da pagina
Dica numero : 616 Inicio da pagina
Dica numero : 617
Inicio da pagina
Dica numero : 618 Inicio da pagina
Dica numero : 619 Inicio da pagina
Dica numero : 620 Inicio da pagina
Dica numero : 621 Inicio da pagina
Dica numero : 622 Inicio da pagina
Dica numero : 623 Inicio da pagina
Dica numero : 624 Inicio da pagina
Dica numero : 625 Inicio da pagina
Dica numero : 626 Inicio da pagina
Dica numero : 627 Inicio da pagina
Dica numero : 628 Inicio da pagina
Dica numero : 629 Inicio da pagina
Dica numero : 630 Inicio da pagina
Dica numero : 631 Inicio da pagina
Dica numero : 632 Inicio da pagina
Dica numero : 633 Inicio da pagina
Dica numero : 634 Inicio da pagina
Dica numero : 635 Inicio da pagina
Dica numero : 636 Inicio da pagina
Dica numero : 637 Inicio da pagina
Dica numero : 638 Inicio da pagina
Dica numero : 639 Inicio da pagina
Dica numero : 640
Inicio da pagina
Dica numero : 641 Inicio da pagina
Dica numero : 642 Inicio da pagina
Dica numero : 643 Inicio da pagina
Dica numero : 644 Inicio da pagina
Dica numero : 645 Inicio da pagina
Dica numero : 646 Inicio da pagina
Dica numero : 647 Inicio da pagina
Dica numero : 648 Inicio da pagina
Dica numero : 649 Inicio da pagina
Dica numero : 650 Inicio da pagina
Dica numero : 651 Inicio da pagina
Dica numero : 652 Inicio da pagina
Dica numero : 653 Inicio da pagina
Dica numero : 654 Inicio da pagina
Dica numero : 655 Inicio da pagina
Dica numero : 656 Inicio da pagina
Dica numero : 657 Inicio da pagina
Dica numero : 658 Inicio da pagina
Dica numero : 659 Inicio da pagina
Dica numero : 660 Inicio da pagina
Dica numero : 661 Inicio da pagina
Dica numero : 662 Inicio da pagina
Dica numero : 663
Inicio da pagina
Dica numero : 664 Inicio da pagina
Dica numero : 665 Inicio da pagina
Dica numero : 666 Inicio da pagina
Dica numero : 667 Inicio da pagina
Dica numero : 668 Inicio da pagina
Dica numero : 669 Inicio da pagina
Dica numero : 670 Inicio da pagina
Dica numero : 671 Inicio da pagina
Dica numero : 672 Inicio da pagina
Dica numero : 673 Inicio da pagina
Dica numero : 674 Inicio da pagina
Dica numero : 675 Inicio da pagina
Dica numero : 676 Inicio da pagina
Dica numero : 677 Inicio da pagina
Dica numero : 678 Inicio da pagina
Dica numero : 679 Inicio da pagina
Dica numero : 680 Inicio da pagina
Dica numero : 681 Inicio da pagina
Dica numero : 682 Inicio da pagina
Dica numero : 683 Inicio da pagina
Dica numero : 684 Inicio da pagina
Dica numero : 685 Inicio da pagina
Dica numero : 686
Inicio da pagina
Dica numero : 687 Inicio da pagina
Dica numero : 688 Inicio da pagina
Dica numero : 689 Inicio da pagina
Dica numero : 690 Inicio da pagina
Dica numero : 691 Inicio da pagina
Dica numero : 692 Inicio da pagina
Dica numero : 693 Inicio da pagina
Dica numero : 694 Inicio da pagina
Dica numero : 695 Inicio da pagina
Dica numero : 696 Inicio da pagina
Dica numero : 697 Inicio da pagina
Dica numero : 698 Inicio da pagina
Dica numero : 699 Inicio da pagina
Dica numero : 700 Inicio da pagina
Dica numero : 701 Inicio da pagina
Dica numero : 702 Inicio da pagina
Dica numero : 703 Inicio da pagina
Dica numero : 704 Inicio da pagina
Dica numero : 705 Inicio da pagina
Dica numero : 706 Inicio da pagina
Dica numero : 707 Inicio da pagina
Dica numero : 708 Inicio da pagina
Dica numero : 709
Inicio da pagina
Dica numero : 710 Inicio da pagina
Dica numero : 711 Inicio da pagina
Dica numero : 712 Inicio da pagina
Dica numero : 713 Inicio da pagina
Dica numero : 714 Inicio da pagina
Dica numero : 715 Inicio da pagina
Dica numero : 716 Inicio da pagina
Dica numero : 717 Inicio da pagina
Dica numero : 718 Inicio da pagina
Dica numero : 719 Inicio da pagina
Dica numero : 720 Inicio da pagina
Dica numero : 721 Inicio da pagina
Dica numero : 722 Inicio da pagina
Dica numero : 723 Inicio da pagina
Dica numero : 724 Inicio da pagina
Dica numero : 725 Inicio da pagina
Dica numero : 726 Inicio da pagina
Dica numero : 727 Inicio da pagina
Dica numero : 728 Inicio da pagina
Dica numero : 729 Inicio da pagina
Dica numero : 730 Inicio da pagina
Dica numero : 731 Inicio da pagina
Dica numero : 732
Inicio da pagina
Dica numero : 733 Inicio da pagina
Dica numero : 734 Inicio da pagina
Dica numero : 735 Inicio da pagina
Dica numero : 736 Inicio da pagina
Dica numero : 737 Inicio da pagina
Dica numero : 738 Inicio da pagina
Dica numero : 739 Inicio da pagina
Dica numero : 740 Inicio da pagina
Dica numero : 741 Inicio da pagina
Dica numero : 742 Inicio da pagina
Dica numero : 743 Inicio da pagina
Dica numero : 744 Inicio da pagina
Dica numero : 745 Inicio da pagina
Dica numero : 746 Inicio da pagina
Dica numero : 747 Inicio da pagina
Dica numero : 748 Inicio da pagina
Dica numero : 749 Inicio da pagina
Dica numero : 750 Inicio da pagina
Dica numero : 751 Inicio da pagina
Dica numero : 752 Inicio da pagina
Dica numero : 753 Inicio da pagina
Dica numero : 754 Inicio da pagina
Dica numero : 755
Inicio da pagina
Dica numero : 756 Inicio da pagina
Dica numero : 757 Inicio da pagina
Dica numero : 758 Inicio da pagina
Dica numero : 759 Inicio da pagina
Dica numero : 760 Inicio da pagina
Dica numero : 761 Inicio da pagina
Dica numero : 762 Inicio da pagina
Dica numero : 763 Inicio da pagina
Dica numero : 764 Inicio da pagina
Dica numero : 765 Inicio da pagina
Dica numero : 766 Inicio da pagina
Dica numero : 767 Inicio da pagina
Dica numero : 768 Inicio da pagina
Dica numero : 769 Inicio da pagina
Dica numero : 770 Inicio da pagina
Dica numero : 771 Inicio da pagina
Dica numero : 772 Inicio da pagina
Dica numero : 773 Inicio da pagina
Dica numero : 774 Inicio da pagina
Dica numero : 775 Inicio da pagina
Dica numero : 776 Inicio da pagina
Dica numero : 777 Inicio da pagina
Dica numero : 778
Inicio da pagina
Dica numero : 779 Inicio da pagina
Dica numero : 780 Inicio da pagina
Dica numero : 781 Inicio da pagina
Dica numero : 782 Inicio da pagina
Dica numero : 783 Inicio da pagina
Dica numero : 784 Inicio da pagina
Dica numero : 785 Inicio da pagina
Dica numero : 786 Inicio da pagina
Dica numero : 787 Inicio da pagina
Dica numero : 788 Inicio da pagina
Dica numero : 789 Inicio da pagina
Dica numero : 790 Inicio da pagina
Dica numero : 791 Inicio da pagina
Dica numero : 792 Inicio da pagina
Dica numero : 793 Inicio da pagina
Dica numero : 794 Inicio da pagina
Dica numero : 795 Inicio da pagina
Dica numero : 796 Inicio da pagina
Dica numero : 797 Inicio da pagina
Dica numero : 798 Inicio da pagina
Dica numero : 799 Inicio da pagina
Dica numero : 800 Inicio da pagina
Dica numero : 801
Inicio da pagina
Dica numero : 802 Inicio da pagina
Dica numero : 803 Inicio da pagina
Dica numero : 804 Inicio da pagina
Dica numero : 805 Inicio da pagina
Dica numero : 806 Inicio da pagina
Dica numero : 807 Inicio da pagina
Dica numero : 808 Inicio da pagina
Dica numero : 809 Inicio da pagina
Dica numero : 810 Inicio da pagina
Dica numero : 811 Inicio da pagina
Dica numero : 812 Inicio da pagina
Dica numero : 813 Inicio da pagina
Dica numero : 814 Inicio da pagina
Dica numero : 815 Inicio da pagina
Dica numero : 816 Inicio da pagina
Dica numero : 817 Inicio da pagina
Dica numero : 818 Inicio da pagina
Dica numero : 819 Inicio da pagina
Dica numero : 820 Inicio da pagina
Dica numero : 821 Inicio da pagina
Dica numero : 822 Inicio da pagina
Dica numero : 823 Inicio da pagina
Dica numero : 824
Inicio da pagina
Dica numero : 825 Inicio da pagina
Dica numero : 826 Inicio da pagina
Dica numero : 827 Inicio da pagina
Dica numero : 828 Inicio da pagina
Dica numero : 829 Inicio da pagina
Dica numero : 830 Inicio da pagina
Dica numero : 831 Inicio da pagina
Dica numero : 832 Inicio da pagina
Dica numero : 833 Inicio da pagina
Dica numero : 834 Inicio da pagina
Dica numero : 835 Inicio da pagina
Dica numero : 836 Inicio da pagina
Dica numero : 837 Inicio da pagina
Dica numero : 838 Inicio da pagina
Dica numero : 839 Inicio da pagina
Dica numero : 840 Inicio da pagina
Dica numero : 841 Inicio da pagina
Dica numero : 842 Inicio da pagina
Dica numero : 843 Inicio da pagina
Dica numero : 844 Inicio da pagina
Dica numero : 845 Inicio da pagina
Dica numero : 846 Inicio da pagina
Dica numero : 847
Inicio da pagina
Dica numero : 848 Inicio da pagina
Dica numero : 849 Inicio da pagina
Dica numero : 850 Inicio da pagina
Dica numero : 851 Inicio da pagina
Dica numero : 852 Inicio da pagina
Dica numero : 853 Inicio da pagina
Dica numero : 854 Inicio da pagina
Dica numero : 855 Inicio da pagina
Dica numero : 856 Inicio da pagina
Dica numero : 857 Inicio da pagina
Dica numero : 858 Inicio da pagina
Dica numero : 859 Inicio da pagina
Dica numero : 860 Inicio da pagina
Dica numero : 861 Inicio da pagina
Dica numero : 862 Inicio da pagina
Dica numero : 863 Inicio da pagina
Dica numero : 864 Inicio da pagina
Dica numero : 865 Inicio da pagina
Dica numero : 866 Inicio da pagina
Dica numero : 867 Inicio da pagina
Dica numero : 868 Inicio da pagina
Dica numero : 869 Inicio da pagina
Dica numero : 870
Inicio da pagina
Dica numero : 871 Inicio da pagina
Dica numero : 872 Inicio da pagina
Dica numero : 873 Inicio da pagina
Dica numero : 874 Inicio da pagina
Dica numero : 875 Inicio da pagina
Dica numero : 876 Inicio da pagina
Dica numero : 877 Inicio da pagina
Dica numero : 878 Inicio da pagina
Dica numero : 879 Inicio da pagina
Dica numero : 880 Inicio da pagina
Dica numero : 881 Inicio da pagina
Dica numero : 882 Inicio da pagina
Dica numero : 883 Inicio da pagina
Dica numero : 884 Inicio da pagina
Dica numero : 885 Inicio da pagina
Dica numero : 886 Inicio da pagina
Dica numero : 887 Inicio da pagina
Dica numero : 888 Inicio da pagina
Dica numero : 889 Inicio da pagina
Dica numero : 890 Inicio da pagina
Dica numero : 891 Inicio da pagina
Dica numero : 892 Inicio da pagina
Dica numero : 893
Inicio da pagina
Dica numero : 894 Inicio da pagina
Dica numero : 895 Inicio da pagina
Dica numero : 896 Inicio da pagina
Dica numero : 897 Inicio da pagina
Dica numero : 898 Inicio da pagina
Dica numero : 899 Inicio da pagina
Dica numero : 900
Criado por: