Sei sulla pagina 1di 242

900 Dicas Delphi

Perdoenos mas o site aida esta em contruo 160 dicas delphi

1- Mostrar e esconder o Boto Iniciar 2- Mostrar e esconder a Barra de Tarefas 3- Pegando o nome do usurio e a empresa do Windows 4- Arrastar um Form sem clicar no caption 5- Bloquear a tecla CTRL+DEL do DBGrid 6- Escondendo a aplicao da Barra de Tarefas 7- Verificando atributo do arquivo 8- Fazer um BEEP no Computador 9- Fazer uma pausa por um perodo determinado 10- Desabilitando o Splash Screen do Report Smith 11- Lendo o volume do HD 12- Descobrindo o nmero serial do HD 13- Para saber somente o Path da aplicao 14- Interceptar as teclas de funo (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 diretrio onde seu programa est instalado 21- Bloqueando um arquivo em ambiente de rede 22- Usando Enter para mudar de campo de um DBGrid 23- Funo para obter o nmero do registro atual 24- Enviando um arquivo para a lixeira 25- Carregar um cursor animado (*.ANI) 26- Transferir o contedo de um Memo para o MemoField 27- Capturar o contedo 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 padro e carregar a pagina determinada pelo link 32- Copiar registros de uma tabela para outra incluindo valores Null 33- Deletar arquivos de um diretrio com o caractere curinga * 34- Capturar a lista de aliases disponveis 35- Abrir e fechar a bandeja do drive de CD-ROM 36- Cdigo usados pelas impressoaras HP 37- Copiando arquivos via Delphi 38- Abrir um TComboBox sem clic-lo 39- Mudar a cor da clula ativa do DBGrid 40- Como incrementar 1 ms 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 executvel correspondente a uma determinada aplicao 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 programao 49- Desabilitar as teclas de acesso (CTRL+ALT+DEL), (ALT+TAB), (CTRL+ESC) 50- Fazer um Splash Screen 51- Funo para encriptar uma string 52- Funo reverter uma string 53- Funo para converter um numero inteiro para binrio 54- Funo para converter um numero binrio para inteiro 55- Funo para Encriptar e Descriptar uma String 56- Rotina para verificar erros em toda a aplicao 57- Enviando informaes direto para a impressora 58- Enviando caracteres diretamente ao buffer da impressora 59- Imprimir diretamente para a impressora sem passar pelo gerenciado de impresso 60- Criar barra de status com suporte as caixas de edio do Windows 95 61- Capturando uma tela do Windows 62- Compactao de uma tabela Paradox

63- Configuraes internacionais 64- Listando todas as janelas abertas 65- Primeira letra de um EditBox maiscula 66- Desligar e ligar o monitor (OFF/ON) 67- Invertendo os botes 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 resoluo de vdeo 74- Verificar sistema operacional 75- Nome do usurio 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 botes da MESSAGEDLG 79- Ultimo acesso de um arquivo 80- Obtendo as informaes de verso dos arquivos 81- Acertar padro 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- Configurao de rede Windows 95/98 com Delphi 88- Criar um arquivo (Bando de dados) em tempo de execuo 89- Controle sobre a digitao 90- Criar arquivo DBF com ndices compostos 91- Sistemas em Delphi para Linux 92- Desenhar um Bitmap no Formulrio 93- Evitando a sada de formulrio 94- Desabilitando simultaneamente as teclas ( ALT + F4 ) 95- Filtrando registros 96- Como saber se um form j esta criado 97- No redimensionar o formulrio 98- Criando forms dinamicamente (SDI) 99- Criando forms dinamicamente (MDI) 100- Definindo o tamanho mnimo e mximo de um form 101- Para fazer protetor de tela com o Delphi 102- Linkar um OBJ ao executvel 103- Alterar LOCAL SHARE via programao 104- Verificando se o Delphi est aberto 105- Criando formulrios 106- Desabilitar acesso a windows 107- Impresso com o TPrinter ( Via gerenciador de impresso)

108- Definir o tamanho do papel em TPrinter 109- Como criar Forms em tempo de execuo 110- Adaptando para resolues de video diferentes? 111- Como posso rolar um form usando pgUP and pgDn. 112- Colocar Funes em uma DLL 113- Verifica validade de CGC e CPF 114- Gera nmero por extenso 115- Preenche com quantidade determinada de zeros o lado esquerdo de uma string 116- Ponto Decimal 117- FindNearest numa Query 118- Relatrios em HTML 119- Desligando Windows via programao 120- Como saber se o CD est no drive 121- Traduo de Mensagens Delphi 3 122- Funo 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 posio do cursor em um Memo 126- Fundo do texto transparente 127- Formatao 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- Diretrio de instalao 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 BMPs em arquivos RES 136- QR armazenado num Blop 137- Deletando um arquivo 138- Diretrio 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- Sugesto para tratamento de erros no Delphi / Cliente-Servidor 152- Gerenciando mais de uma linha selecionada num DBGrid (Multiselect)

153- Procura e substituio 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 parmetros 160- Como mudar a resoluo do vdeo via programao 161- Como rodar vdeos em um panel 162- Validar datas 163- Como gerar senhas aleatrias 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 Funo DayOfWeek 168- Coloca uma mscara nmerica em uma String com nmeros 169- Imprime um texto em outro angulo diferente de 90 170- Chama arquivos BMP de uma Dll 171- Rotina de resgate das variveis de ambiente DOS 172- Executa uma url com o Browser padro 173- Retorna os programas que esto abertos na memria 174- Promove um estado de espera no aplicativo

175 - Retorna a impressora Padro 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 prximo 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 numrico 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 diretrio aps o nome especificado. 188- Converte String em Pchar 189- Converte String em Booleano 190- Filtra todos os nmeros de uma string 191- Funo para impresso de linhas em um relatrio 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 nmero decimal em algarismos romanos 201- Idade de uma pessoa 202- Tipo de varivel 203- Porcentagem de um valor 204- Formata valor numrico inserindo mascaras de ponto 205- Converte um numero decimal em binrio 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 existncia de uma placa de som 210- Nmero de cpias para a impresso 211- Informaes do Ambiente 212- Alternando entre a declarao de procedure na seo interface e implementation 213- Abreviando Nomes 214- Adicionando hora atual, um nmero determinado de horas. 215- Funco 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 no

220- Reparar e Compactar um banco de dados MS-Access 221- Enviando email com Delphi pelo componente NMSMTP 222- Nmero de cores aceitas pelo monitor 223- Convertendo a 1 letra de um edit para maisculas 224- Obtendo o 'nome do computador' do windows 225- Localizando Valores por Proximidade em uma Tabela. 226- Funo para adquirir Data e Hora de um Arquivo 227- Criando Forms no retangulares 228- Trocando cor de uma linha no DBGrid por uma condio 229- Incrementando e Decrementando com INC( ) e DEC( ) 230- Como Inverter os Botes 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 impresso 235- Como fazer um TMemo receber um arquivo texto ? 236- Como se movimentar/manipular banco de dados? 237- Criao de ndices em tempo de execuo. 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 so 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 msica pelo Winamp 247- Descobrir o drive da aplicao 248- Registrar DLLs 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- Usurio e senha do DBA do MySql 255- Acessar tabelas DBF/NTX no Delphi sem usar o BDE 256- Impresso de cdigo de barras com o QuickReport 257- Como fechar todas as tabelas do DataModule de uma vez 258- Desabilita o boto Fechar do Formulrio 259- Inicializar vrios Edits em um formulrio 260- Executar Pack em Tabelas Paradox 261- Como deletar uma pasta com arquivos e subpastas dentro 262- Obter/Definir tempo mximo de Double-Click do mouse 263- Fazer que seu Programa s abra atravs de outro seu 264- Usar Assembly com Delphi

265- Verificar se a String uma Data vlida 266- Colocar linhas de diferentes alturas em um DBGrid 267- Ligar/Desligar Caps-Lock 268- Verificar se o Delphi est aberto 269- Configurar Sculo 270- Desabilitar Boto fechar do Form 271- Desabilitar um item do TRradioGroup 272- Envia direto para Impressora em Rede 273- Extrair palavra que est sob a posio 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 usurio mude de pgina no TabbedNotebook 278- Criar janela redonda 279- Detectar finalizao do Windows 280- Exibir ano com 4 Dgitos 281- Alterar Fonte do Hint 282- Mostrar Hint independente para cada clula 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 operaes padro de um Ole Container 292- Usando JPG no Delphi 3 293- Calculando feriado da Pscoa 294- Extrair cones de uma DLL ou de um EXE 295- Colocar monitor em estado de reduo de energia 296- Compartilhar Pastas 297- Visualizar imagem em um DBGrid 298- Imprimir com preciso Milimtrica 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 binrios no Registro do Windows 303- Mudar a resoluo do vdeo via programao 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 vlida 308- Fazer pesquisa incremental com DBGrid e Edit 309- Adicionar zeros esquerda de um nmero

310- Limpar um campo tipo data via programao 311- Implementar um campo auto-incremental via programao 312- Obter o endereo IP do Dial-Up 313- Exibir a caixa de dilogo padro de solicitao de senha do banco de dados 314- Obter a verso da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi) 315- Implementar rotinas assembly em Pascal 316- Exibir o dilogo 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 varivel 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 programao, se Local Share do BDE est TRUE 327- Criar um EXE que seja executado apenas atravs de outro EXE criado por mim 328- Resolver "Internal error near: IBCheck" do Interbase 5.1.1 Server no NT 329- Inverter os botes do mouse 330- Obter/definir o tempo mximo do duplo-click do mouse 331- Obter os atributos de um arquivo/diretrio 332- Obter o espao total e livre de um disco

333- Obter o tipo de um drive (removvel, fixo, CD-ROM, unidade de rede, etc) 334- Obter informaes 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) esto 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 dgitos para o ano 340- Imprimir caracteres acentuados diretamente para a impressora 341- Imprimir texto justificado com formatao na impressora Epson LX-300 342- Formatar um disquete atravs de um programa Delphi 343- Alterar (e restaurar) o tamanho da pgina na impressora 344- Reproduzir um arquivo de som WAV sem o TMediaPlayer 345- Obter o nome do usurio e da empresa informado durante a instalao do Windows 346- Mostrar uma barra de progresso enquanto copia arquivos 347- Copiar arquivos usando o Shell do Windows 348- Descobrir o cdigo ASCII de uma tecla 349- Evitar que seu programa aparea na barra de tarefas 350- Usar eventos de som do Windows 351- Mudar a coluna ativa em um DBGrid via programao 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 nmero do registro atual 356- Trabalhar com Filter de forma mais prtica 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 vrias linhas 361- Reproduzir um vdeo AVI em um Form 362- Separar (filtrar) caracteres de uma string 363- Colocar zeros esquerda de nmeros 364- Copiar arquivos usando curingas (*.*) 365- Copiar arquivos 366- Trabalhar com cores no formato string 367- Verificar se determinado programa est em execuo (Word, Delphi, etc) 368- Excluir arquivos usando curingas (*.*) 369- Gerar uma tabela no Word atravs do Delphi 370- Obter a quantidade de registros total e visvel 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 relao ao Desktop do Windows 374- Saber a resoluo de tela atual 375- Verificar se uma unidade de disco (disk-drive) est preparada 376- Salvar/restaurar o tamanho e posio de Form's

377- Definir a quantidade de registros a ser impressa em uma pgina do QuickReport 378- Onde encontrar tutoriais sobre construo 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 regio de movimentao 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 proteo de tela durante seu programa 385- Fazer a barra de ttulo 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 atravs do programa 392- ENTER em vez de TAB no formulrio, no DBGrid e no StringGrid 393- Simular a vrgula atravs do ponto do teclado numrico 394- Paralizar um programa durante n segundos 395- Criar uma tabela (DB, DBF) atravs do seu programa 396- Verificar se um diretrio existe 397- Verificar se um arquivo existe 398- Criar um Alias temporrio atravs do seu programa

399- Criar um Alias atravs do seu programa 400- Detectando a sada 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 ms 406- Verificar se o nmero 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 ms 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 Aplicao a uma extenso 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 Carto de Crdito 421- Validando Ttulo 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- Ttulos 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 ocorrncias de um caractere em uma string 433- Aprendendo a usar o TSplitter 434- Implementando a Funo SubString 435- Criando ToolTips no Estilo Balo 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 atravs 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/diretrio. 450- Obtendo o tipo de um drive (removvel, 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 dgitos para o ano. 453- Alterando/Restaurando o tamanho da pgina na impressora. 454- Copiando arquivos usando o Shell do Windows. 455. Descobrindo o cdigo ASCII de uma tecla. 456- Mudando a coluna ativa em um DBGrid via programao. 457- Como trabalhar com Filter de forma mais prtica? 458- Cores no formato string. 459- Como executar um "COMMIT" no Delphi? 460- Posicionando Form's em relao 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 atravs do programa. 464- Registrando o .NET FrameWork para o IIS 465- Verificando se usurio 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 no parar a aplicao durante um processo longo? 470- Desativando o menu de contexto padro (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- Verso do .EXE 477- Verificar qual o cdigo 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..." padro do Windows 483- Utilizando TList e Record como Array 484- Uso do TAG 485- Uso de um vetor dinmico (Pascal) 486- Utilizando Arquivo Help em um sistema 487- Usando um InputQuery 488- Usando Locate em campo no 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 no 497- Testa se a sigla do estado vlido 498- Tempo do Hint 499- Tarja lateral (parecido com o Menu iniciar do Windows) 500- Usando SQL para totalizaes 501- Serial em rede 502- Senha universal p/ tabelas PARADOX 503- Testa se a String uma url ou no. 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 extenso 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 Mn e Mx de um formulrio 518- Potncia 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 parmetro que foi executado com a aplicao. 525- OnClick do DbGrid 526- Nmero para telefone 527- Limpar um campo tipo data via programao 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 execuo

534- Arquivos armazenado num blop 535- Imprimir um TMemo 536- Exibir a caixa de dilogo de solicitao de senha 537- cones do ListView 538- Hints do DbNavigator 539- Habilitar o "Autorun" para CD-Rom 540- Gerar SQL 541- Gerar letras aleatrias 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 posio do mouse 549- Extrair ano, ms ou dia via SQL 550- Exemplo de utilizao ADO 551- Exemplo de como manipular a Porta Serial 552- Executar um mdulo CPL (Painel de Controle) 553- Executar sem o form principal 554- Executar LogOFF 555- Criar um EXE que seja executado apenas atravs 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- Configurao de Rede Windows 95/98 com Delphi 573- Compilar projeto corretamente 574- Como usar a clusula 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 inicializao 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 relatrio 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 formatao 595- Como tocar sons no auto-falante interno do PC 596- Informaes sobre uma impressora 597- Autoocultar a barra de tarefas 598- Ativar a proteo de tela do windows 599- Alterar o cone do boto iniciar do windows 600- Simular um CharCase no dbgrid 601- Simular o pressionamento de uma combinao de teclas

602- Bloqueio de palavras 603- Usando funes externas (de dlls) 604- Exclusividade para o programa 605- Modificando configuraes da impressora entre as pginas 606- Evitando o erro key violation 607- Conferindo se o processador da mquina 386, 486 ou Pentium 608- Desligar/ligar monitor, 486 ou pentium 609- Colocar uma progressbar numa statusbar 610- Cdigo usados pelas impressoaras HP 611- Como criar um contador de pgina para um relatrio 612- Marcando um pedao do cdigo 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 disponveis para o BDE 617- Detectando mudanas de hardware PlugnPlay 618- Usando o adobe acrobat de dentro de sua aplicao 619- Verificar o dgito do cdigo ean13 620- Como saber se existe um componente no seu form 621- Function trim(j:string):string; export; 622- Calcular quantos controles esto no form 623- Implementar rotinas assembly em pascal

624- Funes Aritmticas 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 pginas 633- Data por extenso no quickreport 634- Indexando um vetor 635- Como evitar efeito de maximizao 636- Ordenando um DBGrid clicando no ttulo da coluna (usando Query) 637- Retorna uma String em nmero definido (Replicate) 638- Cancelando a exibio do Form 639- Apagar arquivos via MS-DOS 640- Apagar um subdiretrio 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 contedo de um TstringList 645- Compara dois arquivos textos 646- Como implementar a utilizao 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 diretrio para diretrio 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 direo 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 diretrio 662- Deletando um Diretrio 663- Criar sub-diretrio no diretrio do Aplicativo 664- Transformando cone (*.ico) em bitmap (*.bmp) 665- Sobre arquivos de Inicializao (.ini) 666- Como fazer funes de rolagem num TForm usando comandos de teclado? 667- Encriptar/Desencriptar arquivos 668- Exibindo ou compararando data de arquivos

669- Retornar a verso do projeto que esta sendo desenvolvido 670- Como fazer para imprimir o rodap s na ltima pgina. Usando quickreport 671- Listar Arquivos de Um Diretrio 672- Localizar arquivos do Windows 673- Liga o Boto (x) do form 674- Nomes dos arquivos que esto sendo executados 675- Retorna quantos caracteres tem um Edit especificado 676- Desabilitar e habilitar o boto 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 restaurao 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 criao de um diretrio 683- Tamanho de um Diretorio 684- Largura do display do campo de um dbgrid igual ao seu prprio tamanho na tabela 685- Como centralizar o formulrio na rea de trabalho 686- Verificar tipo de arquivo 687- Alterando o NetDir via programao 688- Como fazer para tudo o que for digitado aparecer em maisculo 689- Backup & Restaurao 690- Cdigos de Erro do BDE

691- Digitando uma string (senha) e devolvendo essa string equivalente ao valor hexadecimal 692- Checa se o Smbolo da UF vlido 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 prxima inicializao do windows 696- Alterando a configurao 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 Diretrios 700- Corrigir Erros de campo AutoIncremento 701- Como posicionar os dados a direita de uma campo edit 702- Includo 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 dilogo personalizada de solicitao de senha do banco dados 707- Exibindo corretamente o contedo dos campos boolean 708- Como formatar CEP 709- Retorna o tipo de conexo com a Internet 710- Foto no InterBase 711- Como criar um formulrio 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 automtica em ListBox 716- Utilizando a funo StrtoIntDef 717- Obtendo a verso da tabela 718- Obtendo a verso e outras informaes 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 genrica para tratamento de erros na aplicao BDE 725- Insere uma mscara em um valor numrico 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 alteraes feitas no DBGrid em tempo de execuo 731- Limpar o conteudo de um LookupComboBox 732- Cria qualquer controle em tempo de execuo (button, label, stringlist, memo ...) 733- Converter DBGrig em Html 734- Como desabilitar o acesso ao windows

735- Desenhar Um cone (bitmap) Em Clulas do Dbgrid 736- Mudar as imagens do DbNavigator 737- Como retornar 2(dois) valores em uma funo 738- Retorna o total de memria do computador 739- Removendo a barra de rolagem vertical do DBGrid 740- Simulando Checkbox em Dbgrid 741- Executvel com Parmetros 742- Teclas de funes no Dbgrid 743- Gravar um arquivo .Avi ou .Wav dentro de um arquivo Paradox 744- Como formatar data para exibio por extenso 745- Como saber quantos dias tem no ms 746- Como imprimir um form 747- Diferena entre duas horas 748- Converte hora (formato HH:MM) para minutos 749- Como ajustar seu formulrio de acordo com a resoluo de vdeo 750- Converte segundos em horas digital 751- Como criar um link para envio de e-mails sem manipular API, e sempre executando o programa padro para envio de e-mails 752- Obtendo a menor data vlida 753- Nmero 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- Funo que envia e-mail pelo Delphi, anexando mais de um arquivo 760- Capturar a tela do computador e enviar via rede 761- Deletar um diretrio 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 representao binria de um Character 766- Retornando a linha e a coluna atual de um Tmemo 767- Como identificar se o Interbase est ativo ou no 768- Como retornar a verso do Word 769- Selecionando os cadastros do ms digitado- SQL 770- Mudando as cores das linhas de um ListBox 771- Ocultando janelas MDI filhas minimizadas 772- Eliminando a movimentao de janels MDI maximizadas 773- Exibindo ProgressBar enquanto copia um arquivo 774- Imprimindo um bitmap da rea de tranferncia 775- Usando OnGetText e OnSetText 776- Mude o separador de casas decimais ('.' e ',') 777- Como fazer para no repetir dados numa listbox 778- Enviando comando de rolagem vertical para um TMemo

779- Parmetros em tempo de execuo para a Query 780- Transformando horas em minutos 781- Como extrair o ms de um campo data usando comando SQL 782- Mostrando um formulrio Modal usando Show 783- Como retornar o nome das Units de um projeto em Run-Time (RTTI) 784- Descobrindo o nmero de linhas de um arquivo TXT 785- Como filtrar registros com o QR 786- Convertendo String para Integer, tratando excesses quando a string no for vlida 787- Definindo uma borda para Memos 788- Criptografando tabelas Paradox 789- Colocando uma figura de fundo em um Memo ou DbMemo 790- Executando procedure/mtodo genricamente 791- Pedindo confirmao para fechar um form 792- Sorteando nmeros com a funo Random 793- Permite que seu DBF ignore o ndice MDX e recrie-o 794- Remove caracteres de uma string deixando apenas nmeros 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 genricamente 800- Como simular a vrgula atravs do ponto do teclado numrico?

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 aplicao 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 cdigo-fonte de stored procedure (Interbase/FireBird) 822- Obter a data do servidor (Interbase) 823- Alterar parcialmente o contedo de uma Query

824- Arredondamento financeiro 825- Lendo os campos da chave-primria (Interbase/FireBird) 826- Obter a clula 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 execuo no Interbase 833- Mostrar bitmap progressivamente 834- Limpar todas as clulas 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 formulrio 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 contedo de um campo memo 850- Formulrio 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 posio certa do formulrio (milmetro) 855- Selecionando todos os registros do DBGrid 856- Relao de Funes 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 dilogo 860- Executando Sons Atravs 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 boto barra de ferramentas do IE 866- Como fazer um DateTimePicker com o display vazio 867- Hints para Itens de Menu 868- Mudando o endereo IP em runtime

869- Mudando o Tamanho de Arquivos JPEG x Qualidade 870- Como exibir linhas longas em um ListBox sem a utilizao 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 contedo de um TRichEdit 875- Mostrando arquivos GIF 876- Criptografando Imagens com o Delphi 877- Formatando tags HTML com o Delphi 878- Busca Rpida em um ListBox 879- Funo DirectoryExists 880- Criando Labels em 3D 881- Funo 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 padro do Windows 885- Como insere uma mscara de valores $ em um valor integer 886- Ocultando uma coluna em um DBGrid 887- Fazendo pesquisa incremental apenas com DBGrid 888- Como apresentar o nmero da linha e coluna em um DBGrid 889- Testa se o arquivo possui caracteres invlidos em seu nome 890- Como usar os arquivos QRP criados com QuickReport

891- Retornando o Path da aplicao no Intraweb 892- Verificando a existncia de uma tabela em um banco de dados MS-Access 893- Como converter um texto acentuado no DOS para Windows 894- Implementando mtodo UpdatesPending em objetos ADODataSet 895- Pegando servidor smtp do Outlook 896- Como apagar vrios 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 relatrio 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 boto} else ShowWindow(buttonhandle, SW_HIDE); {esconde o boto} 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 declarao na seo private do Form: procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest; procedure TForm1.WMNCHitTest(var M: TWMNCHitTest); begin inherited; { ativa a herana 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 cdigo para suas necessidades. Eis os possveis valores para o Result: HTBORDER - Borda da janela que no 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 Ttulo(Caption) HTCLIENT - rea cliente HTERROR - igual ao HTNOWHERE, a diferena 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 diviso entre janelas HTREDUCE - Boto minimizar HTRIGHT - Borda direita da janela HTSIZE - Caixa de tamanho (igual ao HTGROWBOX) HTSYSMENU - Boto 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 - Boto 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 diretrio do Windows); // Na seo [ReportSmith] inclua a linha seguinte: ShowAboutBox=0

// Na seo [RS_RunTime] inclua a linha seguinte: ShowAboutBox=0 // No se esquea 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 funo (F1, F2, F3...) Primeiro, coloque a propriedade KeyPreview do formulrio como TRUE. Depois, insira este cdigo no evento OnKeyDown do formulrio: procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_F5 then showMessage('I pressed the F5 key'); end;

Voc tambm pode usar as variveis VK_F1 at VK_F12 referentes as outras teclas de funo. Inicio da pagina

Dica numero : 15
Quando clicamos sobre o boto de deleo no DBNavigator (o do sinal de menos) surge uma box com a mensagem "Delete Record?" com botes Ok e Cancel. Para fazer aparecer a mensagem em portugus 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 relatrio, criar a procedure SHOWPREVIEW contendo: Procedure Showpreview;

begin preview.showmodal; end; Onde preview o nome do form criado para preview. No esquecer de incluir o nome da procedure na clusula uses. Aps isso, deve-se incluir no evento CREATE do formulario principal ou do relatrio 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 formulrio 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 cdigo em um evento OnKeyPress de um controle de edio: 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 vriavel do tipo String e insira a seguinte linha no evento ou funo desejada do formulrio:

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, ento 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 diretrio 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 executvel, deve-se usar a funo da API Extraction. Ela usa 3 parmetros: Instance - Instncia da aplicao FileName - Nome do executvel. Deve ser um PChar NumIcon - Nmero do cone a ser recuperado. Se for Word(-1), a funo retorna a quantidade de cones do executvel. Coloque ShellAPI em uses no comeo 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 cdigo: {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 seo PUBLIC da unit. procedure JumpTo(const aAdress: String); 2 Coloque a clusula ShellAPI na uses no incio 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 cdigo: 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 mtodos para ver por exemplo como capturar o diretrio ou caminho de um Alias com o mtodo '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 cdigos 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 varivel 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('No tem Disco no Drive A:'); end; end. Inicio da pagina

Dica numero : 42
Para acessar as variveis do ambiente DOS, deve-se usar a funo 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 usurio. Para executar um programa DOS que fecha sua janela aps a execuo, deve ser especificado "command.com /c programa" na linha de comando. Usando a funo 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 usurio, o segundo parmetro deve ser sw_Hide. Deve ser especificada a extenso .com, seno o programa no 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 vrias funes da API do windows, chamadas de atom functions, que permitem que uma aplicao insira, apague, procure por uma determinada atom string, etc.. O cdigo abaixo garante que somente uma instncia do executvel de sua aplicao estar carregado em memria. O form1 seria o form principal da aplicao: 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 convenincia} if GlobalFindAtom(MINHA STRING') = 0 then {zero significa no encontrar} atom := GlobalAddAtom(MINHA STRING) else begin {Se o programa j estiver rodando, ento mostrar a mensagem e parar} MessageDlg(A aplicao j encontra-se em execuo!!', mtWarning, [mbOK], 0); Halt; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin {Remove o item da tabela, de modo que a aplicao 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 genrica, em todo o seu programa, insira no mtodo ON CREATE do formulrio principal a linha: Application.OnException:=RotinaGeral; RotinaGeral uma procedure na qual dever constar o cdigo para verificar e enviar as mensagens de erro do seu sistema. Inicio da pagina

Dica numero : 57
Muitas vezes torna-se necessrio, ou at mesmo, imprescindvel que voc envie informaes diretamente para a impressora, uma vez que a utilizao da impresso tpica do Windows um pouco demorada e o uso do driver Genrico/Somente Texto no muito confivel. Uma boa soluo para enviar informaes diretamente para a impressora usar o seguinte cdigo: 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 possvel, inclusive, utilizar os cdigos de configurao da impressora. Para a impressora padro Epson, por exemplo, voc poderia utilizar algo assim:

Write(Imp, #27#69 + 'Teste' + #27#70); { impresso em negrito } Write(Imp, #15 + 'Teste' + #18); { impresso no modo condensado } Write(Imp, #12); { salto de pgina } Inicio da pagina

Dica numero : 58
Ao trabalharmos com impresso, em certos casos desejamos alterar o comportamento da impressora.

Algumas opes, principalmente em impressoras matriciais, so obtidas atravs do envio dos chamados "cdigos de escape" para a impressora (por exemplo, alterar espaamento entre as linhas (#45), tipo de fonte (#18, #23), etc). Em verses 16-bit do Windows, isso no era complicado, mas agora, nas verses 32-bit, o acesso direto ao hardware no mais possvel. Portanto, para enviarmos caracteres diretamente a impressora, devemos utilizar o "escape" chamado "PASSTHROUGH" do Windows e enviarmos a informao desejada diretamente. Na documentao do Win32 SDK este escape dado como obsoleto, mas enquanto utilizarmos impressoras matriciais que necessitem de "cdigos escape" para certas funcionalidades, ele ser necessrio. Ao utilizar impressoras Postscript tenha cuidado, pois nem sempre esta tcnica ir funcionar. Em impressoras matriciais, voc pode enviar qualquer tipo de caracteres que achar necessrio. Abaixo segue um cdigo 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 funo "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; { Informao qualquer a enviar diretamente para a impressora } strFoo := 'Passthrough string'; { Copia da string para a estrutura } StrPCopy(Buff.Buffer, strFoo); { Indicamos o tamanho da informao} 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 Impresso - Linha 2'); Writeln(F,Teste de impressao - Linha 3'); Writeln(F,#27#18+Teste de Impresso - Linha 4'); Writeln(F,Teste de impressao - Linha 5'); Writeln(F,#12); // Ejeta a pgina 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 cdigo: 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 numrico da Configurao

Internacional do Painel de Controle. Isto pode levar a erros quando avaliando datas, nmeros 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 precedncia sobre a configurao padro. Para uma lista completa das variveis, 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 funo API EnumWindows, que usa uma funo Callback, com dois parmetros, um Handle para a janela e um ponteiro. Voc pode us-la como um cdigo semelhante a este (este lista as janelas abertas, mesmo invisveis, 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 maisculas este cdigo 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 clusula Uses, Shellapi. Digitar os seguintes parmetros: Swapmousebutton(true) ; Para voltar ao normal basta mudar para False. Inicio da pagina

Dica numero : 68
Primeiro deve-se adicionar clusula 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 pgina Drivers; Selecionar o driver PARADOX e alterar o parmetro NET DIR para o local onde sero gravados os arquivos de controle para compartilhamento. Por exemplo, "G:\MEUAPLIC", onde G corresponde ao drive de rede e MEUAPLIC, o diretrio onde est o aplicativo (executvel); Depois selecionar a pgina System; Alterar o parmetro LOCAL SHARE para TRUE. Aps 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 cdigo 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 cdigo 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. No 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 resolues de vdeo disponveis, deve-se usar a funo da API EnumDisplaySettings: ela pega todos os modos de vdeo disponveis. Para alterar os modos, deve-se usar a funo ChangeDisplaySettings, que muda a resoluo de vdeo 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 AS INFORMAES 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 := 'Verso : '+ IntToStr(verInfo.dwMajorVersion) + IntToStr(verInfo.dwMinorVersion); stOSBuilder.Caption := 'Compilao : '+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 := 'Informaes 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 usurio 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 cdigo ao seu programa(Neste caso o cdigo 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 mtodo GetTableNames trabalha com cinco parmetros: 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 smbolos(Wildcards) como por exemplo '*'. 3-Item do tipo Boolean=Para pesquisas em Paradox e dBASE, defina True para incluir a extenso 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 tambm o nome das tabelas de sistema as quais contm a estrutura dos dados. Defina False para tabelas Paradox e dBASE. 5-Item do tipo TStringList=Nome do StringList onde sero guardados os nomes das tabelas. Inicio da pagina

Dica numero : 77
Caracter Definies ! Faz com que a digitao da mscara fique parada no primeiro caracter, fazendo com que os caracteres digitados que se movam. Ex: !;0;_ > Todos os caracteres digitados sero convertidos para maisculas. Ex: >aaa;0;_ < Todos os caracteres digitados sero convertidos para minsculas. Ex: <> Anula o uso dos caractes > e <, ou seja, utilizado para cancelar a opo de mscara para os caracteres a direita. Ex: >aaa<>aaa;0;_ \ Utilizado para marcar determinado caracter no especial como fixo. Ex: !\(999\)0000000;0;_ L Exige caracteres alfabticos obrigatrios para a posio, do tipo A-Z, a-z. Ex: LLL;1;_ l Somente caracteres alfabticos para a posio, mas no-obrigatrios, do tipo A-Z, a-z. Ex: lll;1;_ A Exige caracteres alfanumricos obrigatrios para a posio, do tipo A-Z, a-z, 0-9. Ex: AAA;1;_ a Somente caracteres alfanumricos para a posio, mas no-obrigatrios, do tipo A-Z, a-z, 0-9. Ex: aaa;1;_

C Requer um caracter obrigatrio para a posio. Ex: CCC;1;_ c Permite o uso de qualquer caracter para a posio, limitando apenas o nmero de caracteres. Ex: ccc;1;_ 0 Exige caracteres numricos obrigatrios para a posio, do tipo 0-9. Ex: 000;1;_ 9 Somente caracteres numricos para a posio, no-obrigatrios, do tipo 0-9. Ex: 999;1;_ # Somente caracteres numricos para a posio e o uso dos sinais de - ou +, noobrigatrios. Ex: ###;1;_ : Utilizado como separador de horas, minutos e segundos. / Utilizado como separador de dia, ms e ano. Inicio da pagina

Dica numero : 78
Para traduzir algumas as mensagens do Delphi que aparecem nos botes e nas caixas de avisos da funo 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 esto gravados em C:\DELPHI2\SOURCE\VCL. Os arquivos *.RC so arquivos "s texto", e contm diversas mensagens utilizadas nos programas compilados no Delphi. O exemplo que se segue realiza alteraes nos arquivos CONSTS.RC e DBCONSTS.RC. A alterao de outros arquivos "RC" pode ser feita de modo similar. Para maiores detalhes, envie-me um e-mail (paulosd@dglnet.com.br), ou, melhor ainda, consulte o livro "Dominando o Delphi" (edio para o Delphi 1), de Marcos Cant, ed. Makron Books. O assunto "Usando recursos de tabelas de strings" est no captulo 21, pgina 876. No sei se a edio para o Delphi 2 cobre este assunto. a) Faa uma cpia dos arquivos CONSTS.RC e DBCONSTS.RC em um diretrio seguro, para o caso de algo sair errado. b) Pelo mesmo motivo, faa uma cpia dos arquivos CONSTS.RES e DBCONSTS.RES, que esto no diretrio LIB do Delphi. No meu caso, o diretrio destes arquivos C:\DELPHI2\LIB. c) Use o Bloco de Notas para abrir e alterar os arquivos CONSTS.RC e DBCONSTS.RC. (O Edit tambm serviria; entretanto, para acentuao correta no Windows, o Bloco de Notas melhor).

Voc s deve alterar as strings que esto entre aspas. No altere o nome das constantes, que esto no incio 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, "&No" No necessrio alterar todas as mensagens. Se desejar, altere apenas aquelas que voc utiliza em seus sistemas. Lembre-se de salvar as alteraes efetuadas. d) Acione o prompt do DOS, e execute do seguinte modo o compilador de recursos do Delphi 2 (BRC32.EXE), que est no diretrio 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 iro gerar os arquivos CONSTS.RES e DBCONSTS.RES. Copie os dois "*.RES" para o diretrio LIB do DELPHI (no meu caso C:\DELPHI2\LIB) f) Crie uma aplicao no Delphi que utilize a funo MessageDlg, e botes "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 customizao das informaes de verso a serem "anexadas" na linkagem. Pouco utilizado, este recurso muito interessante, pois possibilita o cadastro de diversas informaes sobre o arquivo gerado, como: nmero de verso, nome do produto, nome interno do arquivo, nome da empresa, etc. Podemos alterar as informaes na pgina "Version Info", da pgina "Project Options": Ateno com o item "Auto-increment build number": ele s ser incrementado automaticamente quando for executada a opo "Build All" para compilar o projeto. Porm, no existem rotinas "prontas" para obtermos estas informaes. necessrio fazermos chamadas diretamente a API Win32, mais espeficamente, para as funes como a "GetFileVersionInfo" e a "VerQueryValue". Abaixo encontramos uma funo, a "FileVerInfo", que exemplifica o processo de obteno das informaes. Ela ir retornar "True" caso o arquivo informado no parmetro

"FileName" possuir as informaes de verso, e devolver por referncia um "TStringList" contendo as informaes.

//Cdigo 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 funo "VerQueryValue" e conseguimos informaes 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 Padro. Cdigo: ', 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 Vdeo'); 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','Tera','Quarta','Quinta', 'Sexta', 'Sbado'); 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', 'Maro','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 fcil de usar j que existem apenas trs mtodos que lhe

permitem utilizar este recurso. Para marcar um determinado local em uma tabela necessitamos criar uma nova instancia de TBookmark e executar o mtodo 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 mtodo GotoBookMark() , este mtodo recebe como parmetro o TBookmark recebido como retorno de GetBookMark.}

table1.GotoBookMark(bmLocalImportante); {Aps utilizar o Bookmark para o que desejar importante que a memria utiliza por este recurso seja novamente liberada para o sistema,para executar esta operao utilize o mtodo FreeBookMark.}

table1.FreeBookMark(bmLocalImportante); {Podem ser criados vrios Bookmarks para uma mesma tabela, sendo este numero limitado apenas pela quantidade de memria livre no equipamento.} end; OBS:Mas cuidado com o uso indevido deste recurso, cada instancia de TBookMark reserva uma determinada poro de memria que s ser novamente liberada para ser reutilizada aps a execuo de um FreeBookmark. Se vrios Bookmarks forem criados e no liberados podem comprometer a execuo 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 tambm para o Table2, mas use uma tabela diferente 5. adicione todos os campos do Table1 atravs do Fields Editor 6. mude a propriedade Visble para False do campo do Combobox 7. d um clique com o boto 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 usurio no Combobox > 9. Execute a aplicao. 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 facl, mais facl que um rede ponto a ponto como Windows 95 ... Primeiro precisamos de um diretrio onde ser criado o NET FILE do Paradox, normalmente um diretrio partindo do raiz do servidor ser o suficiente, vamos usar o drive padro da Novell para exemplificar o caso ... F: <-- drive da rede F:\NETDIR <-- o diretrio do NET FILE Para o diretrio onde sero armazenados os arquivos do seus sistema no necessrio nenhum cuidado especial, podemos assumir alguma configurao como a que segue ... F:\SISTEMA\DADOS <-- diretrio 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 executvel na rede, sem grandes problemas desde que voc tenha um cuidado bsico. Sempre que voc executa um programa que trata com base Paradox o PRIVATE DIR fica sendo o diretrio onde este executvel se encontra, no caso de voc colocar este executvel em um diretrio da rede para ser acessado por muitos como fica este diretrio PRIVATE ??? j no mais tanto PRIVATE n ... Para resolver este problema voc deve "programaticamente" alterar o Private Dir para um diretrio local,para isso voc tem de adicionar as seguintes linhas de cdigo ao iniciar a sua aplicao. 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 razo 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: diretrio 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 execuo 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 criao 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); { Definies de Campos e criao 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 algum esta digitando algum valor que posteriormente ser utilizado para calculo alguns cuidados so necessrios, 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 ento 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 digitao ignora-se o smbolo. Observem que o mais importante aqui o conceito utilizado, o fato de se interceptar os caracteres digitados pelo usurio e poder filtrar esses caracteres para evitar uma entrada de dados inconsistente. O exemplo de numero e smbolos no conclusivo, uma vez que o

mesmo efeito poderia ter sido obtido com a aplicao 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 execuo. Isto ocorre por dois motivos, embora exista na internet documentao sobre o assunto, dizendo ser possvel, ainda no encontrei ningum que tenha tido sucesso nesta tarefa. O outro motivo a existncia de um parmetro no documentado necessrio 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 possvel. Assim a criao do indice fica para logo depois da criao 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 aps CreateTable no 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 opes do Borland Pascal e vai alm, dando suporte ao modelo de objetos do Object Pascal e otimiza pra 386/486/Pentium/Pentium Pro/MMX e Pentium II. O cdigo todo gerado para modo protegido e, devido a isso, no possui quaisquer limites para arrays ou ponteiros. Mas o melhor de tudo que ele GRATIS!!! Para pega-lo v o endereo 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 cdigo: 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 cdigo: procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose:=False; end; Inicio da pagina

Dica numero : 95
O caminho mais fcil e rpido 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 varivel 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 rpidas e fceis 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 verificaes para decidir se um deter- minado registro deve ou no 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 no criado, melhor dizer instanciado, no um problema muito critico, abaixo pode-se ver uma unit padro criada com um form vazio no Delphi, esta unit alem de declarar o nova classe TForm1 cria tambm uma varivel Form1 do tipo TForm1. Isto muito importante que seja observado, um varivel para um tipo "FORM" nada mais que um ponteiro, ou seja ela apenas mostra em que local da memria esta a instancia do seu form, enquanto o seu form no 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 no instanciado verificando o valor guardado em FORM1, se este valor for diferente de "NIL" significa que o Form j foi instanciado... bem a coisa no assim to simples, imagine que um amigo mudou-se para So Paulo e lhe passou seu novo endereo, voc recebe e anota em sua agenda... depois de dois meses ele resolve que

no quer mais morar em So Paulo e vai embora, ok o fato de seu amigo ir embora por si s no vai fazer com que o endereo dele se auto apague da sua agenda, assim sendo quando o form for destrudo o ponteiro continuara guardando o endereo de memria onde o form estava e ai o nosso mtodo de controle vai pro brejo :( A forma mais limpa e automtica 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 destrudo ele apaga o seu endereo junto, timo no mesmo .... Assim quando for instanciar um form utilize a seguinte verificao ... 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 no funciona para forms com mltiplas instancias, a no ser que voc crie uma varivel para cada instancia. Pessoalmente eu nunca usei isso, se um form pode ter mltiplas instancias em MDI ento controle por ActiveMDIChild e se for SDI ento no sei porque ter mais de uma instancia.

2 - Quando for criar um novo form no crie variveis desnecessariamente, utilize a varivel 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 varivel FORM2 estar

acessvel, use-a.

FORM2 := TFORM2.CREATE(SELF); 3 - Quando um Form mostrado com ShowModal este tipo de controle no se aplica j que ser impossvel mostrar qualquer outro form. Inicio da pagina

Dica numero : 97
Veja abaixo um exemplo para que o seu Form no seja redimensionado. Inclua o cdigo 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 execuo uma das grandes "sacadas" do Delphi, uma tarefa no to complicada mas com varias alternativas de como ser executada. Vamos supor inicialmente que vc esta trabalhando com uma aplicao 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 execuo 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 contm os forms que devem ser criados automaticamente quando sua aplicao 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 porm no so automaticamente criados. (importante) Nesse momento voc retirou do Delphi a obrigao de criar o Form2,se vc no 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 cdigo 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 aps {$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 execuo :) 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 aplicao utilize ShowModal e no Show para chamar o segundo form... Form2 := TForm2.Create(self); Form2.ShowModal; O ShowModal vai fazer com que a aplicao fique com Form2 permanentemente em primeiro plano, Form1 no 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 no podem existir forms no visiveis, ou sej, assim que um determinado form criado ele j se torna visivel,no necessario um SHOW ou SHOWMODAL para fazer isso, portanto no existe outro caminho seno criar todos os forms de sua aplicao em RUN TIME. Todos os passos descritos no exemplo acima so validos aqui tambm, 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 aplicao tem de estar como fsMDIForm. - Os outros forms que fazem parte da aplicao 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 obrigao de criar o Form2,se vc no o criar e em algum momento fizer referencia a ele isso deve causar um erro. Pois bem, como uma das caracteristicas de uma aplicao MDI o form principal conter os outros forms no podemos ficar colocando botes para testar a criao 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 no mais necessrio usar o Show :) ... Alguns cuidados devem ser tomados quando trabalhamos com uma aplicao MDI. Primeiro no existe porque ficar discutindo como evitar que o usurio fique abrindo muitos forms ao mesmo tempo, j que est a principal qualidade de um projeto MDI, caso voce no 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 parmetros 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 executvel. No Delphi , isto eh feito com a diretriz de compilao $L. Fica, na sua unit principal, assim: {$L MyOBject.OBJ} Incluindo as chaves. Logo depois, voc deve declarar a funo contida em MyObject.OBJ da forma usual. Voc precisara conhecer os parmetros 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 opo. 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 no poder utilizar esta aplicao! 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 proprietrio a aplicao. b) fmClientes := TForm.Create(self); Cria o Form; o proprietrio ele mesmo. c) fmClientes := TForm.Create(Application); Cria o Form; o proprietrio a aplicao. d) fmClientes := TForm.Create(nil); Cria o Form; teoricamente sem proprietrio; na prtica a aplicao. e) fmClientes := TfmClientes.Create(self); Cria o Form; o proprietrio ele mesmo. f) fmClientes := TfmClientes.Create(Application); Cria o Form; o proprietrio a aplicao. g) fmClientes := TfmClientes.Create(nil); Cria o Form; teoricamente sem proprietrio; na prtica a aplicao. Poderiam me informar a diferenca entre elas? Quando voc cria um Form dinamicamente: 1. se criar atravs de CreateForm, que um mtodo de TApplication, voc passa como parmetro a instncia da classe e o nome do seu objeto (TfmClientes, fmClientes); 2. se criar atravs de Create - mtodo de TForm, entre outros - voc passa como parmetro o proprietrio do componente criado (no caso o Form). 2.1 se o proprietrio for a aplicao, o Form s ser destrudo 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 proprietrio for ele mesmo (self), o form ter que ser destrudo por voc; 2.3 se voc criar, por exemplo, Form2 e passar como proprietrio Form1; no momento em que Form1 for destrudo, Form2 tambm o ser. Quanto melhor maneira, depende de como voc quer controlar a aplicao, mas leve em conta que enquanto um objeto no destrudo, ele est na memria. 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,'Relao 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,'Endereo'); 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 mtodo 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 memria, pode-se criar os forms de sua aplicao somente no momento da execuo. Na criao do Form voc define se ele MODAL ou NO MODAL. Para Isso observe os seguintes cdigos: MODAL - Mostra form em modo exclusivo procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2);{Carrega form na memria} Form2.ShowModal;{Mostra form em modo exclusivo} Form2.Free; {Libera Memria} end; NO MODAL - Mostra form em modo no exclusivo procedure TForm1.Button1Click(Sender: TObject); begin Application.CreateForm(TForm2, Form2);{Carrega form na memria} Form2.ShowModal;{Mostra form em modo exclusivo} end; No evento OnClose do Form2 coloque o seguinte cdigo. procedure TForm2.FormClose (Sender: Tobject; var Action : TCloseAction); begin Action:= caFree; end;

Aliado a este cdigo, deve deve alterar no delphi, no menu Options, opo Project. Mudando os forms a serem criados dinamicamente da coluna Auto-Create Forms para Avaliable Forms. Inicio da pagina

Dica numero : 110


LOYDS TIPS: Resoluo de Vdeo: Quando criamos formulrios, s vezes til escrever um cdigo para que a tela e todos os seus objetos sejam mostrados no mesmo tamanho, no importando qual a resoluo da tela. Aqui esta um cdigo 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) esto 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; Ateno: Nem todos os objetos tem a propriedade FONT. Isso deve ser o suficiente para voc comear.

Ateno: A seguir, algumas dicas para ter em mente quando representar aplicaes Delphi (formulrios) em diferentes resolues de Tela: * Decida antecipadamente, na etapa de criao do formulrio, se ele ser escalvel ou no. A vantagem de um no escalvel que nada muda em tempo de execuo. A desvantagem equivalente (seu formulrio pode ser muito pequeno ou grande para

alguns sistemas se no for usada escala). * Se voc no for usar formulrio escalvel, configure o set scaled to False. * Ou ento, configure a propriedade scaled do formulrio para True. * Configure a propriedade AutoScroll para False. AutoScroll = True quer dizer "no mexa no tamanho do frame do formulrio em tempo de execuo", o que no parece bom quando o contedo do formulrio muda de tamanho. * Configure a fonte do formulrio para uma True Type escalvel, 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.ATENO: Se a fonte usada em uma aplicao no estiver instalada no computador, o Windows selecionar uma fonte alternativa da mesma famlia para utilizar. O tamanho dessa fonte pode no corresponder ao da fonte original, podendo causar problemas. * Configure a propriedade position do formulrio para uma opo diferente de poDesigned. poDesigneddeixa o formulrio 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. * No amontoe controles no formulrio - deixe pelo menos 4 pixels entre else, para que uma mudana de um pixel nas margens (devido a apresentao em escala) no 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 espao em branco suficiente num componente de labels para alteraes no tamanho da fonte - um espao 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 espao equivalente a 30% de espanso para string labels se voc pretende traduzir sua aplicao 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 espao suficiente para que o label se amplie. * Em labels de mltiplas linhas ou de termos ocultos, deixe pelo menos uma linha em branco na base. Isso vai ser necessrio para incluir o que estiver sobrando quando o texto for oculto de maneira diferente, pela mudana do tamanho da fonte com a escala. No assuma isso porque est usando fontes grandes. Voc no tem que deixar sobra de texto as fontes (grandes) de outros usurios podem ser maiores que as suas! * Tenha cuidado quando abrir um projeto em IDEs com resolues diferentes. Assim que o formulrio for aberto, sua propriedade Pixel per Inch ser moditificada, e gravada para o DFM se voc salvar o projeto. melhor testar a aplicao rodando sozinho, e editar o formulrio em apenas uma resoluo. Editar em vrias resolues e tamanhos de fonte provoca problemas de fluxo e tamanho dos componentes. *Falando em fluxo de componentes, no represente o formulrio 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 so rigorosamente interias. Quando valores fracionrios forem retirados das origens e tamanhos do controle com cada sucessiva representao em escala, os conttroles parecero deslizar para noroeste e ficar menores. Se voc quer deixar seus usurios representarem o formulrios em escala quantas vezes quiserem, comece com um formulrio recentemente criado para que erros de escala no se acumulem. * Definitivamente, no mexa na propriedade Pixel pre Inch do formulrio. * Em geral, no necessrio criar formulrios em uma resoluo especfica, mas essencial que voc os revise em 640 x 480

com fontes pequenas e/ou grandes, e em alta resoluo com fontes pequenas e/ou grandes antes de liberar suas aplicaes. Isso deverser parte de sua lista de conferncia para testar a compatibilidade do sistema regularmente. * Preste bastante ateno em todos os componentes que so basicamamente TMemo de uma linha - com oTDBLookupCombo. O controle de edio (multi-linhas) do Windows sempre mostra apenas linhas inteiras de texto. Se o controle for muito curto para sua fonte, um TMemo no mostrar coisa alguma, e um TEdit mostrar um pedao do texto. melhor fazer esses componentes um pouco maiores do que deix-los um pixel menores e no aparecer nada do texto. * Tenha em mente que toda representao em escala proporcional diferena da altura da fonte entre o modo de execuo e o modo de desenho, NO resoluo ou ao tamanho do monitor. Lembre tambm que as origens dos seus controles sero alteradas quando o formulrio for representado em escala. Voc no pode aumentar componentes muito bem sem tambm mov-los um pouco, novamente.

Obtendo e modificando a posio do cursor em um TMemo Modificando a posio: ActiveControl:=Memo1; MemoCursorTo(Memo1,2,3); Obtendo a Posio: 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 funo que tira os espaos no incio 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 funes em DLL so: 1. O programa exigir menos memria 2. Voc poder reaproveitar as funes 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 nmero deve ser maior ou igual a zero e menor que 999.999,99.'; msg:=msg+' Se no for corrigido o nmero no 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 numricos 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 usurio atual EWX_SHUTDOWN = 1; // "Shutdown" padro do sistema EWX_REBOOT = 2; // D "reboot" no equipamento EWX_FORCE = 4; // Fora o trmino 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 portugus, consegui uma soluo muito fcil de implementar no ambiente de programao do Delphi 3. CHEGA DE YES/NO !!! messagedlg('Confirma ? mtConfirmation, [mbYes, mbNo], 0); A vai: 1 - No diretrio 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 diretrio DELPHI3\DOC E faa as devidas alteraes nas mensagens que desejares alterar e nas partes duplicadas da Unit como "implement" e etc, tambm deixe o cabealho como Unit Consts. 4 - Salve esta nova Unit no diretrio DELPHI\LIB e pronto todas as mensagens alteradas por voc estaro aplicadas nos seus

prximos 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 nmero 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 nmero 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 := ' ms e '; { --- O Nmero 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); { Fora todos os programa a desligarem-se } ExitWindowsEx(EWX_FORCE, 0); Inicio da pagina

Dica numero : 125


Modificando a posio: ActiveControl:=Memo1; MemoCursorTo(Memo1,2,3); Obtendo a Posio: 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, 'No 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 // condio 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 configurao 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 ento, pode-se tentar o seguinte mtodo: 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 cdigo 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 aps 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 no. 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 operao de abertura demore um pouco. Agora vamos aos codigos:

1) Acrescente a unit BDE no seu USES da unit. 2) Acrescente algumas declaraes na declarao 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 cifro se existir e transforma a string em um valor formatando em quanta casas decimais passar como parmetro. 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 no, passando o Estado e o Cep como parmetro. 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 nmero do pis vlido ou no} 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 vlido ou no} 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 = Fora o cancelamento do mapeamento begin WNetCancelConnection2(Letra,0,Forcada); Case GetLastError() of 1205: Result := 'No foi possvel abrir o perfil'; 1206: Result := 'Perfil do usurio no encontrado ou invlido'; 1208: Result := 'Ocorreu um Erro especfico na rede'; 2138: Result := 'Rede no encontrada ou fora do ar'; 2250: Result := 'Mapeamento invlido ou no 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 so 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 alterao de uma ou mais tabelas no Banco de Dados. aconselhvel que se coloque uma rotina de tratamento de erro listada abaixo: - Onde esto as tabelas, coloque as suas tabelas que sero 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; Sugesto Delphi / Oracle Criar uma funo que ir verificar qual o cdigo de erro enviado pela exceo e ento

emitir uma mensagem em portugus. Abaixo est uma idia desta rotina que ser inserida no formulrio principal da sua aplicao. 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 no pode ser excludo porque'+#10+ 'existem outros que dependem dele e que no foram excludos'); 12203 : showmessage('Base de Dados est fora do ar. Favor entrar'+#10+ 'em contato com o responsvel 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 no 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 boto. 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 boto no form - Altere o evento OnClick do boto 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 Invlida!); 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:

Delphus Script Desenvolvimentos Web e Desktop


Mais informaoes : ( 0-xx-12-9172-6562 )