Coleção de Dicas sobre programação Delphi.

Retiradas do E-Zine Grandes Dicas em Delphi

Por Ramos de Souza Janones

www.ramosdainformatica.com.br

1

Índice
1 Índice ............................................................................................................................ 2 Descobrindo o código ASCII de uma tecla .................................................................. 6 Função - Retornando o próximo dia útil....................................................................... 6 DBGrid - Colocando em Letras maiúsculas uma coluna selecionada.......................... 7 DBGrid - Mostrando todo conteúdo de um campo Memo........................................... 7 Crítica de datas no objeto Edit sem mensagem de erro do Delphi ............................. 10 Preenchimento de zeros para completar a data........................................................... 14 Multimídia - Fazendo suas aplicações Delphi falar ................................................... 14 Multimídia - Toque um som quando o mouse passar por cima de um botão............. 15 Hints com multiplas linhas ......................................................................................... 15 Multimídia - Usando cursores animados .................................................................... 16 Detectando a versão do Internet Explorer .................................................................. 16 QuickReport - Filtrando registros............................................................................... 17 Evitando efeito de maximização................................................................................. 17 Calcula a quantidade de dias no mês .......................................................................... 18 Calculando abono salárial de modo progressivo ........................................................ 18 Checa se um processo está rodando ........................................................................... 19 Checa se um diretório está vazio ................................................................................ 20 dbExpress - Passando parâmetros com CommandText via programação.................. 20 Corrigindo problemas de instalação do Borland Data Provider For Firebird............. 21 Lendo texto de um arquivo PDF ................................................................................ 21 Deixando seu EXE mais enxuto e rápido e, mais seguro contra decompilação......... 24 Copiando (Upload) um diretório para um servidor FTP ............................................ 26 Trabalhando com arquivos texto no Delphi ............................................................... 29 Criando uma conexão ao DBExpress em tempo de execução.................................... 31 ActiveX - Pegar um texto selecionado no Internet Explorer...................................... 32 Cria um efeito na apresentação de um formulário...................................................... 33 Criando um Menu transparente .................................................................................. 34 Checa se um diretório está vazio ................................................................................ 36 Mostra multiplas linhas de texto em um ComboBox ................................................. 37 Criando atalhos no Windows pelo Delphi.................................................................. 38 Faça suas aplicações Falar.......................................................................................... 39 Imprimindo arquivos PDF sem abrir-los .................................................................... 39 Ler arquivos PDF ....................................................................................................... 39 Inno Setup - Script para criação de conexão OBDC DSN ......................................... 40 Colocar cursor no final do Edit ao receber o foco...................................................... 42 Mudar a cor de fundo de um Hint............................................................................... 42 Fazer um executável ser executado somente se chamado por um determinado executável ................................................................................................................... 42 DBGrid - Focando a célula selecionada mudando sua cor......................................... 43 Verificando a versão do Windows ............................................................................. 43 Rave Report - Alterar a impressora padrão ................................................................ 44 Atribuíndo efeitos para abertura de formulários......................................................... 44 API do Windows - Função para excluir uma pasta e todos arquivos desta pasta....... 45 Inno Setup - Verificando se existe determinada Chave no Registro do Windows..... 46 Controlando o PowerPoint no Delphi......................................................................... 46 Rave Report - Indicar página inicial........................................................................... 48 2

InnoSetup - Adicionar um programa no iniciar do Windows .................................... 48 Validando endereço de e-mail no Delphi em aplicações Win32, .Net e Asp.Net ...... 49 Memo redondo............................................................................................................ 50 Colocar Banners em Menus........................................................................................ 50 Usando a WebCam no Delphi .................................................................................... 51 Colocando imagens em um ComboBox ..................................................................... 52 Importando e Exportando Registro ............................................................................ 53 DBGrid - Colocar um ComboBox num DBGrid........................................................ 54 Enviando mensagens HTML com imagens anexadas ................................................ 54 Mostrando dicas balão para caixas de edição wm WindowsXP ................................ 56 CheckLisBox - Trocar a cor das linhas ...................................................................... 57 Windows - Verificar a impressora padrão.................................................................. 58 RichEdit - Pesquisar um texto, posicionar sobre ele e mostrar ao usuário................. 58 ActiveControl - Envia um valor para Edit que estiver em foco ................................. 59 Registro do Windows - Retorna portas seriais ........................................................... 59 Verifica se um programa está aberto, caso contrário, abre......................................... 60 Função que verifica a velocidade do processador ...................................................... 60 DBGrid - Ao clicar no campo no DBGrid ordenar os registros ................................. 61 Criando um lista Push and Pop em Delphi ................................................................. 61 Rave Report - Imprimindo código de barras em modo de programação.................... 64 Gerar planilhas no Excel através de uma Query......................................................... 64 Rave Report - Somar valores...................................................................................... 65 Colorir componente focado - Preservando sua cor original ....................................... 66 ActiveControl - Envia valor para Edit que tiver em foco........................................... 67 TFields - Adiciona Fields no Fields Editors em tempo de execução ......................... 67 ListBox - Colorir ........................................................................................................ 69 Associando um extensão de arquivo a um executável ............................................... 69 Retornar as contas de E-Mail...................................................................................... 70 HKEY, Registry ......................................................................................................... 71 Criar e ler chave.......................................................................................................... 72 Retornar lista de hardware via registry....................................................................... 73 Verificar se um valor existe dentro de uma Chave..................................................... 73 Quick Report - Selecionando itens do ComboBox para PapeSize ............................. 74 ListBox - Pesquisa incremental .................................................................................. 74 Acertar data e hora com o servidor............................................................................. 75 QuickReport - Access Violation no Windows 2000 e XP ......................................... 75 DBGrid - Alterar as cores do título em tempo de execução....................................... 75 Testa se a impressora está funcionando...................................................................... 76 Como implementar um AutoComplete num Edit comum.......................................... 76 Como adicionar um CheckBox em um StringGrig .................................................... 78 Abreviação automática de nomes ............................................................................... 80 Compilando a aplicação pelo MS-DOS ..................................................................... 81 Coloração gradiente no Form ..................................................................................... 82 Usar perfeitamente o LookupComboBox................................................................... 83 Como colocar um codigo para que a aplicacao feche apos XX segundos sem atividades no teclado ou sem cliques do mouse. ........................................................ 83 Escondendo a barra de tarefas do Windows............................................................... 85 Pega todos os erros do Sistema, captura tela do erro, grava em arquivo e envia por email ............................................................................................................................. 85 Detectando o tipo de Conexão com a internet............................................................ 86

3

....................................................................... 146 Gravando CDs ................................... 97 TForm ........................... 89 Alinhar título da barra de titulos do Form a esquerda ou direita..................Gerando um PDF.......... 110 Verifica se o BDE está instalado ..................................................................... 90 Criando arquivo Texto... 145 Finalizando processos do Windows via programação.............................................................................. 95 DBGrid ................................................................................... 94 Como colocar uma coluna do DBGrid em maiuscula ..... não instalar ........................................... então...................................................... 107 Como alterar o caption da janela de preview do quickreport ...... 152 4 ..........................Como fazer quebra de linhas ...................................................................... 116 Como mostrar um TMenuItem alinhado à direita? ..........................................................................................................Ordenando os itens ....................... 151 Rave Report – Indicar página inicial ......... 94 Rodar videos em um panel ............................................................................................... 112 Verificando se um alias está instalado............................................................ 121 Como mover o form clicando em qualquer lugar? .............................. 144 InnoSetup – Verificando a versão do software............... 87 Como criar uma figura do tipo marca d' água ...... 144 InnoSetup – Manipulação de arquivos texto ......................................................................................................Juros................................... 114 Como prevenir a movimentação do mouse para fora do form? ................. 107 Como chamar uma home page utilizando o seu browse padrão.................................. 147 Quick Report ..... 103 SetVolumeLabel ................... 114 Como capturar a tela? ..................................................................Criando formulários transparentes .... 104 Memo ................................ 87 Para trocar as cores dos botoes do radiogroup ........................................................................................... 88 Criptografando Imagens ......................Colocando CheckBox no grid .................................. 88 Alterar a fonte de determinado registro num DBGrid....Função de potenciação ...... 91 Como selecionar tudo (Ctrl+A) em um TMemo/TDBMemo..................................................... 109 Escondendo o Programa de Ctrl+Alt+Del................................................................................... 100 QuickReport e FastReport .....................................................Obtendo a lista de papeis disponíveis....................... 106 Alterando a cor dos TabSheet de um PageControl........................................................................Alinhando texto conforme condição .......................... 150 Treeview – Foco .................. 108 Como reduzir o tempo e carga de um programa .................................................................. 107 Como passar parâmetros entre 2 forms ............................................ 96 RichEdit ............................................................................................................................................................................. 105 Como adicionar o evento OnClick no DBGrid ........................................ 93 Texto na diagonal e girando ..........................................................................................................................................................................................................Como fazer uma pesquisa e substituição em um RichEdit ................................................................... 151 Desktop do Windows – auto-arranjar icones...................... 124 Mostra o total de páginas............................................................. 92 Mudando o IP da máquina via API do Windows ........................Rolagem vertical .......................................................... 148 Arquivo: Verificar se está ReadOnly......................... 122 Como criar tooltips com balões? ..................................................................... 93 Criar um alias dinamicamente na memória ...................... 114 Como criar hints customizados?......... 99 3 formas de dar um shutdown........................................................................................ 121 Como mostrar um texto de várias linhas em um TCombobox? .............. 98 TList ................................................................................................... 89 Alterar fonte do Hint...........................................................Mudando o Label do HD...................................................................................................................... se inferior..................................................................................................................... 95 DBGrid .............................................................................. 147 DBGrid ............

............ 155 Veja como criar atalhos no menu iniciar do Windows..... 155 Como mover um componente em Run-time............ 164 Windows – Como desabilitar uma combinação de teclas genericamente ........................................................................................................................... 163 Windows – Como criar grupos e subgrupos de programas no menu iniciar............................................Cálculo de Parcelas..................... 159 Como implementar um log de todos os erros gerados na aplicação?.... 153 Porta Serial – Como verificar se uma porta está em uso ..... 161 IP – Como retornar o hostname a partir de um endereço IP....... 165 5 ....................... 160 Printers .......................... 158 Como apresentar o número da linha e coluna em um DBGrid?................................................ 154 GIF – Como converter uma imagem GIF para BMP .........................................................Como retornar informações das impressoras instaladas na máquina ...................................

begin if DayOfWeek(dData) = 7 then dData := dData + 2 else if DayOfWeek(dData) = 1 then dData := dData + 1. Para testar execute e observe o Label enquanto pressiona as teclas desejadas. end.Descobrindo o código ASCII de uma tecla Para descobrir o código ASCII de uma determinada tecla você pode criar a seguinte aplicação. Shift: TShiftState). Altere o evento OnKeyDown do form como abaixo: procedure TForm1. [Key]). var Key: Word.Retornando o próximo dia útil Obtendo o próximo dia útil caso a data informada caia em um fim de semana function ProximoDiaUtil(dData : TDateTime) : TDateTime. Insira um componente Label no form (Label1). 2.Caption := Format(‘O código da tecla pressionada é: %d’. Função . end. 1.FormKeyDown(Sender: TObject. 6 . Mude a propriedade KeyPreview do form para true. 3. begin Label1. Result := dData.

Mem: TDBMemo. Mem := TDBMemo. begin Ret := False.Create(nil). existe um jeito fácil de resolver este problema.Align := alClient.RecordCount > 0 then if Dbg.Mostrando todo conteúdo de um campo Memo Desenvolvedores em geral utilizam o componente DBGrid para apresentar os dados de uma tabela ou banco de dados. if Dts. Fld: TField): Boolean.Create(nil).DataSet. begin if DBGrid1.Width := 240.DBGrid1KeyPress(Sender: TObject.X. Dbg: TDBGrid. Frm.CursorPos. Frm.DisplayLabel. Mem.Height := 120.CursorPos. try Mem. Os problemas surgem a partir do momento em que é necessário apresentar o conteúdo de um campo Memo.BorderStyle := bsToolWindow.SelectedField. Primeiro é desenvolvida uma função que realiza este processo: function TForm1.Colocando em Letras maiúsculas uma coluna selecionada procedure TForm1. 7 . try Frm. DBGrid .Parent := Frm.Top := Mouse. Frm.Y.Caption := Fld. Frm. end.DBGrid . seja apresentada uma janela com todas informações contidas neste memo.FieldName='NOME' THEN Key := AnsiUpperCase(Key)[Length(Key)]. Ret: Boolean. var Frm: TForm. Frm := TForm. Porém. Frm.Left := Mouse.MostraMemo(Dts: TDataSource. var Key: Char). ao usuário clicar sobre o conteúdo de algum campo Memo no DBGrid.SelectedField = Fld then begin Ret := True. O que iremos fazer é que.

Controls. DBGrid1: TDBGrid. end.Mem. DBGrids. end.SelectedField). end. DBGrid1. DBTables. type TForm1 = class(TForm) Table1: TTable.FieldName. end. é preciso colocar em prática. Classes. Mem. Mem. { Private declarations } public { Public declarations } end. Forms.ReadOnly := True. insira o código a seguir: procedure TForm1. Graphics. no evento OnCellClick do DBGrid. 8 . DataSource1: TDataSource. Frm. Mem.DataSource := Dts. procedure DBGrid1CellClick(Column: TColumn).Free. begin MostraMemo(DBGrid1. finally Frm.DataSource.DBGrid1CellClick(Column: TColumn). Uma vez desenvolvida nossa função. Dbg: TDBGrid. Messages.Free. end. interface uses Windows. Result := Ret. Fld: TField): Boolean. Dialogs. private function MostraMemo(Dts: TDataSource. DBCtrls. StdCtrls. Confira como ficou todo exemplo: unit Unit1. Grids. finally Mem. DB. SysUtils.ScrollBars := ssVertical.ShowModal. Variants.DataField := Fld. DBGrid1.

Mem := TDBMemo. Mem.Parent := Frm. Frm := TForm.MostraMemo(Dts: TDataSource. end.DisplayLabel. Mem. implementation {$R *. end. if Dts.Y.ShowModal. begin Ret := False. end.Free. Frm. Frm. Frm.Left := Mouse.DataSource := Dts.Create(nil).DataSet. Result := Ret.DataField := Fld.dfm} function TForm1. end. Mem. Dbg: TDBGrid. Fld: TField): Boolean.Free. Mem. finally Frm.ScrollBars := ssVertical.SelectedField = Fld then begin Ret := True. Frm.Width := 240. try Mem. try Frm.X.CursorPos. finally Mem. var Frm: TForm.CursorPos.Create(nil).RecordCount > 0 then if Dbg.var Form1: TForm1. 9 . Frm.Align := alClient.BorderStyle := bsToolWindow. Frm.ReadOnly := True. Mem.Top := Mouse.Caption := Fld. Mem: TDBMemo.Height := 120.FieldName. Ret: Boolean.

if Data = '' then Edit1. Foi criado uma procedure para fazer o tratamento das mensagens de erro. Barra1.text)). begin Data := Edit1. end.procedure TForm1. var Data : string. // Se não for um campo válido.Edit1Exit(Sender: TObject). Num : Array Of String. Ano : Integer. // Cria-se os Arrays K e M com 13 campos dos quais usaremos do 1 ao 12 SetLength (K. Crítica de datas no objeto Edit sem mensagem de erro do Delphi Fazer o tratamento de mensagens de erro em campos de data é fundamental.text := DateToStr(StrToDate(Edit1.DataSource. No evento OnExit do Edit1 foi inserido o código a seguir: No evento OnExit do objeto procedure TForm1. a procedure devolve a variável data vazia. Mes. end. 10 . SetLength (M. 13). //Em princípio o campo é considerado como correto(válido).text. //Sem controle dos caracteres digitados no objeto Edit1 var I. M : Array Of Integer.SelectedField).CriticaData(var Data: string). Neste exemplo. CriticaData(Data). begin Erro:='n'. DBGrid1. begin MostraMemo(DBGrid1. K. Caracter.SetFocus else Edit1. Erro : String. O componente Edit1 é o componente onde serão inseridos as datas e o componente Edit2 é apenas para que possamos fazer a transição entre os componentes. DBGrid1. são inseridos dois componentes Edit. end. // Verifica a posição das barras. Barra2 : Integer. Esta procedure terá o nome de Criticadata: procedure TForm1. Barras. Dia. 13).DBGrid1CellClick(Column: TColumn). J. para ilustrar.

if length(Caracter) < 4 then begin Caracter := '20' + Caracter. for I := 0 to 9 do Num[I] := IntToStr(I). if Barras > 2 then Erro := 's'.1).// A matriz M é preenchida com o último dia de cada mês // A matriz K é preenchida com 1.Barra2)+Caracter. A posição relativa de cada caracter do campo // data. if Caracter = '/' then begin Barras := Barras + 1. M[I] := 31. SetLength (Num. M[6] := 30. M[9] := 30. if (Barra1 > 3) or (Barra1 < 2) then Erro := 's'. // Se a data entrar no formato dd/mm/aa // fazemos a data ficar dd/mm/20aa Data := Copy(Data. end. end. end. // Posição da 1ª barra (pode ser 2 ou 3) Barra2 := 0.I. 11). //Num contém os números e / para controle do campo data.(Barra2 + 1). M[11] := 30. M[2] := 28. 5 ou 6) for I := 1 to length(Data) do begin Caracter := copy(Data. // Até aqui já sabemos que a data está em formato válido com barras if Erro = 'n' then begin Caracter := Copy(Data.1. if (length(data) < 6) or (length(data) > 10) then Erro := 's'. dentro da matriz K. end.//or // (length(data) = 9) then Erro := 's'. //Se Algum elemento da variável Data não for válido // seta o erro com s for J := 1 to length(Data) do if K[J] = 1 then Erro := 's'. 11 . Num[10] := '/'. M[4] := 30. // Caso contrário será setado Erro igual a s for I := 1 to 12 do begin K[I] := 1. // Verifica a quantidade de barras digitadas Barra1 := 0. if (Barra2 > 6) or (Barra2 < 4) then Erro := 's'. será prenchida com zero se o caracter for válido. for J := 0 to 10 do if Num[J] = Caracter then K[I] := 0. // Posição da 2ª barra (pode ser 4. // Barra controla a posição das duas // do campo data Barras := 0. if Barra1 = 0 then Barra1 := I else Barra2 := I.4).

Barra1. if Erro = 's' then begin Data := ''. //Em princípio o campo é considerado como correto(válido). Ano := StrToInt(Copy(Data. M : Array Of Integer. M[2] := 28. M[9] := 30.(Barra1+1). porém.0). M[4] := 30.(Barra2 .CriticaData(var Data: string). if J = 0 then M[2] := 29 else M[2] := 28.Barra1 .1))).// Podemos converter as posições da string em inteiros sem receio de recebermos // aquela mensagem de erro do delphi. messageDlg('Data inconsistente!!!'. // Verifica se o ano é bissexto para a crítica do dia se o mês for fevereiro. // Critica o dia if Erro = 'n' then if (dia < 1) or (dia > M[Mes]) then Erro := 's'.4)). 13).(Barra1 . J := Ano mod 4. // A matriz M é preenchida com o último dia de cada mês for I := 1 to 12 do begin M[I] := 31. Caracter. // Critica o mes if (mes < 1) or (mes >12) then Erro := 's'.1. Mes. end. end. end. end. [mbOk].1))). begin Erro:='n'.(Barra2 + 1). M[6] := 30. Barra2 : Integer. Dia := StrToInt(Copy(Data. Ano : Integer. Mes := StrToInt(Copy(Data.mtError. J. com o controle dos caracteres feito no evento OnKeyPress: procedure TForm1. Erro : String. Dia. A mesma procedure CriticaData. mais enxuta. // Esta será a única mensagem mostrada. //Com controle dos caracteres //digitados no objeto Edit1 através do evento OnKeyPress var I. // Cria-se o Array M com 13 campos dos quais usaremos do 1 ao 12 SetLength (M. // Verifica a quantidade de barras digitadas 12 . // Barra controla a posição das duas // do campo data Barras := 0. // Verifica a posição das barras. // critica o ano (Se quiser) if ano < 2003 then Erro := 's'. M[11] := 30. Barras.

5 ou 6) for I := 1 to length(Data) do begin Caracter := copy(Data. No evento onKeyPress do Edit1 é inserido códigos para que possa controlar os caracteres digitados: 13 . end.0).Barra2)+Caracter. if J = 0 then M[2] := 29 else M[2] := 28. if length(Caracter) < 4 then begin Caracter := '20' + Caracter. // Verifica se o ano é bissexto J := Ano mod 4. if Caracter = '/' then begin Barras := Barras + 1.1))).(Barra1+1).(Barra2 + 1).1). Ano := StrToInt(Copy(Data.4).(Barra2 .mtError. // Se a data entrar no formato dd/mm/aa // fazemos a data ficar dd/mm/20aa Data := Copy(Data. // critica o ano (Se quiser) if ano < 2003 then Erro := 's'. messageDlg('Data inconsistente!!!'. end. // Critica o dia if Erro = 'n' then if (dia < 1) or (dia > M[Mes]) then Erro := 's'.(Barra1 . if (Barra1 > 3) or (Barra1 < 2) then Erro := 's'. end. Dia := StrToInt(Copy(Data. if Erro = 's' then begin Data := ''. Mes := StrToInt(Copy(Data.4)).I. // Posição da 1ª barra (pode ser 2 ou 3) Barra2 := 0. // Posição da 2ª barra (pode ser 4.1. // Aqui já sabemos se a data é numérica e se está em formato válido com barras if Erro = 'n' then begin Caracter := Copy(Data. if Barras > 2 then Erro := 's'. if Barra1 = 0 then Barra1 := I else Barra2 := I.Barra1 := 0. if (Barra2 > 6) or (Barra2 < 4) then Erro := 's'.1))).(Barra2 + 1).Barra1 . end. end. [mbOk]. if (length(data) < 6) or (length(data) > 10) then Erro := 's'.1. // Critica o mes if (mes < 1) or (mes >12) then Erro := 's'. // Podemos converter as posições da string em inteiros sem receio de recebermos // aquela mensagem de erro do delphi.

no entanto era com sutaque "americado português".00.com/article/0. begin if not (Key = Chr(vk_Back)) then // Este if habilita a tecla Backspace para correção do objeto if not (Key in ['0'.borland.Edit1KeyPress(Sender: TObject. Preenchimento de zeros para completar a data Usuários podem não colocar os zeros de dias e meses menores que dez forçando um erro de digitação de data.. no evento onClick do botão é inserido o código a seguir: procedure TForm1.borland. links com downloads e exemplos: Para SAPI 4.1 tem o site http://bdn.'/']) then // Este if permite a digitação somente de números e da barra / abort. mas não sei onde encontrar engine em portugues para esta versao.0. Um exemplo simples para fazer o seu Delphi falar é este: Primeiro é declarada na cláusula uses “ComObj”. A seguir. 14 .borland.0 http://www.Button1Click(Sender: TObject).Fazendo suas aplicações Delphi falar Há um tempo atrás inserimos uma dica ensinando o Delphi a falar. Saiu o SAPI 4.exe/listing?id=19509 Para SAPI 5. Em seguida.html também com exemplos.com/msagent/downloads/user. end.1410. Para resolver este problema.00. // pode-se usar ‘dd/mm/yy’ para exibição no formato curto end.'9'.1410.microsoft.0 com a opção de Português Brasil. Multimídia . begin ShortDateFormat := 'dd/mm/yyyy'.com/article/0.29583. var Key: Char).asp Em Text-to-speech engines.29582. escolha o idioma Português Brasil E mais embaixo faça o download do SAPI 4.com/codecentral/ccWeb.0 runtime support No site http://bdn. no evento OnCreate do formulário insira o código a seguir: procedure TForm1.html você tem exemplos para delphi usando o SAPI 4. Download dos exemplos: http://codecentral.procedure TForm1.FormCreate(Sender: TObject).

Hints com multiplas linhas É muito simples. begin sndPlaySound('c:\win\media\ding.CMMouseEnter(var AMsg: TMessage). procedure CMMouseLeave(var AMsg: TMessage).wav'. end. .. voice. end. procedure TYourObject.SpVoice').0). TYourObject = class(TAnyControl) .FormCreate(Sender: TObject). end.var voice: OLEVariant.CMMouseLeave(var AMsg: TMessage). private procedure CMMouseEnter(var AMsg: TMessage).. end. Multimídia . 15 .snd_Async or snd_NoDefault)..Rate := 0. message CM_MOUSEENTER. implementation procedure TYourObject. a rotina deve ficar assim: uses MMSystem. voice. begin voice := CreateOLEObject('SAPI. voice := unassigned.Toque um som quando o mouse passar por cima de um botão Neste exemplo iremos utilizar CM_MOUSEENTER quando o mouse entrar no objeto e CM_MOUSELEAVE quando sair do objeto.snd_Async or snd_NoDefault). voice. no evento OnCreate do formulário insira o código a seguir: procedure TForm1.Hint:='Ramos da'+#13+'Informática'. begin Button1. begin sndPlaySound(nil.Volume := 100.Speak('Ramos da Informática'. message CM_MOUSELEAVE. end..

end.Version disponível a partir do IE 4.Multimídia .ani').IE para NT 4. acompanhe: procedure TForm1. 2 e 3 .codeproject.0.dll.0 102 .com/shell/detectie.Cursor:=MyCursor. você pode utilizar estes cursores em suas aplicações.IE 3. o código da função que obtém a versão: function GetIEVersion: string. neste pequeno exemplo inserimos o código no evento OnCreate do formulário. basta consultar uma chave do registro cujo endereço é: HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Internet Explorer Existem 3 chaves neste local que determinam a versão do IE: . var Reg: TRegistry. const MyCursor=1. Detectando a versão do Internet Explorer Para detectar a versão do Internet Explorer.IE 2.IE 1. Na página abaixo tem uma lista detalhada que relaciona um valor com o outro: http://www.Cursors[MyCursor]:=LoadCursorFromFile('C:\Shuttle.0 103 .Usando cursores animados Cursores animados existem aos montes pela internet.asp E finalmente. A chave IVer contém os seguintes valores: 100 .FormCreate(Sender: TObject). Screen. begin Screen.IVer disponível no IE 1. 16 . porém essa DLL só está disponível a partir da versão 3.0 101 .Build disponível a partir do IE 2 .0 É possível consultar a versão do IE através da versão da Shdocvw.0 A chave Version contém o número da versão por extenso que não corresponde ao número da versão que o usuário vê.

provavelmente você já se deparou com aquele deselegante problema em que o usuário acompanha a maximização do seu formulário. o componente é o TWebBrowser. begin LockWindowUpdate(Handle). utilize LockWindowUpdate(Handle).Filtrando registros procedure TForm1. 17 . finally Reg. begin PrintRecord:= ( Table1.CloseKey.ItemArqCadFor(Sender: TObject). Através da versão do IE determina-se qual ActiveX poderá ser carregado para fazer OLE com o IE. Para evitar isto. Após a criação do formulário. try Result := Reg. try Reg. Exemplo: procedure MainForm. Evitando efeito de maximização Se você já desenvolveu uma aplicação MDI com um formulário MDIChild que tem que ser exibido em estado Maximizado (WindowState=wsMaximized). faça o seguinte: Antes de criar o seu formulário para a exibição. end. Com isto. with TFrmCadFor.Create. end.0 o componente é o TWebBrowser_V1 e a partir do IE 4. Reg.ReadString('IVer').ReadString('Version'). if (Result='') then Result := Reg. QuickReport . end.begin Reg := TRegistry. utilize LockWindowUpdate(0).RootKey := HKEY_LOCAL_MACHINE.value > 21 ).OpenKey('Software\\Microsoft\\Internet Explorer'. Até a versão 3.0.Create(self) do Show. False). você dará um efeito mais profissional às suas aplicações. LockWindowUpdate(0).QuickReport1Filter(var PrintRecord:Boolean). Reg.fieldbyname ('idade'). end. except Result := ''. end.Free.

begin DecodeDate(Now.00). no nosso exemplo R$ 50. end. end. Day).Calcula a quantidade de dias no mês function DaysInMonth: Integer. A1. Calculando abono salárial de modo progressivo function Abono (S.00). 18 . Month.Button1Click(Sender: TObject). • • • • • Onde S = Salário (No nosso exemplo R$ 290. F= Faixa do Abono (No nosso exemplo R$ 300. A2: Double) : Double. Year.00). begin ShowMessage(IntToStr(DaysInMonth)). A1= 1º Abono (Valor mais alto. end. F. no nosso exemplo R$ 30.00). Result= Retorno da função com o calculo do novo salário. A2= 2º Abono (Valor mais baixo. Month].00 ou R$ 300. Para executar basta declarar as variáveis ou campos do banco de dados exatamente na ordem acima em modo ‘Double’. var Year. Begin If S>=F then begin Result:=S+A2 end else begin If S>F-A1 then Result:=(100-(((F-S)/A1)*100))*A2/100+F else Result:=S+A1 end. Result := MonthDays[IsLeapYear(Year). Exemplo de uso: procedure TForm1. Day: Word. Month.

Esta é uma função para calcular de modo progressivo um abono (por exemplo, folha de pagamento) sem cometer injustiça. Expl: Digamos que queremos que todos os funcionários que ganham até R$ 299,99 recebam um abono de R$ 50,00 e acima deste valor um abono de R$ 30,00. Se não aplicarmos a formula o que vai acontecer quem ganha, por exemplo, R$ 290,00 recebera R$ 340,00 (o correto seria ganhar R$ 324,00) passando a ganhar mais de quem ganhava R$ 300,00, pois este terá apenas um abono de R$ 30,00 percebendo R$ 330,00. A função acima corrige estas distorções, e pode ser aplicada num banco de dados para diversas faixas salariais.

Checa se um processo está rodando
{ .... } uses TlHelp32; { .... }

function processExists(exeFileName: string): Boolean; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); Result := False; while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then begin Result := True; end; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end;

// Exemplo: procedure TForm1.Button1Click(Sender: TObject); begin if processExists('calc.exe') then ShowMessage('Processo em execução') else 19

ShowMessage('O processo NÃO está em execução'); end;

Checa se um diretório está vazio
function DirectoryIsEmpty(Directory: string): Boolean; var SR: TSearchRec; i: Integer; begin Result := False; FindFirst(IncludeTrailingPathDelimiter(Directory) + '*', faAnyFile, SR); for i := 1 to 2 do if (SR.Name = '.') or (SR.Name = '..') then Result := FindNext(SR) <> 0; FindClose(SR); end;

// Exemplo: procedure TForm1.Button1Click(Sender: TObject); begin if DirectoryIsEmpty('C:\test') then Label1.Caption := 'empty' else Label1.Caption := 'not empty'; end;

dbExpress - Passando parâmetros com CommandText via programação
O parametro não é adicionado quando criamos o CommandText via programação, portanto devemos criá-lo da seguinte forma: procedure TForm1.Button1Click(Sender: TObject); begin SQLClientdataSet1.Close; SQLClientdataSet1.Params.Clear; SQLClientdataSet1.CommandText := 'select * from CLIENTE where CODIGO = :COD'; SQLClientdataSet1.Params.CreateParam(ftInteger, 'COD', ptInput).AsInteger := 1; SQLClientdataSet1.Open; end;

20

Corrigindo problemas de instalação do Borland Data Provider For Firebird
Em alguns casos, o Borland Data Provider For Firebird têm apresentado problemas de instalação, abaixo segue algumas dicas para tentar auxiliar na resolução dos mesmos: 1. Verificar se o D8 está atualizado com Update Pack#2; 2. Se o BDP For Firebird foi instalado 'antes' do D8 ter sido atualizado,desinstalar, atualizar o D8 e após isso instalar o BDP For Firebird novamente; 3. Efetuar testes diretamente via 'Data Explorer' a fim de verificar se a conexão ocorre sem problemas; 4. Copiar o arquivo 'FirebirdSql.Data.Bdp' para a pasta: C:\Arquivos de programas\Arquivos comuns\Borland Shared\BDS\Shared\Assemblies\2.0 5. No projeto, acesse 'Project Manager' | 'References' e adicione a referência ao 'Firebirdsql.Data.Bdp'

Lendo texto de um arquivo PDF
É o seguinte, esta dica peguei em um site Alemão, fiz aqui sua tradução e alguns testes e funciou. Para quem precisa criar algum sistema que leia o conteúdo de texto de um arquivo PDF. Não lembro quem havia pedido, mas aqui está a solução: {++++++++++++++++++++++++++++++++++++++++++++++++++ Esta é uma rotina para ler informações de arquivos PDF. No formulário adicione um TMemo, 5 TLabel, 1 TButton e um OpenDialog. Só um detalhe, vá oa menu do Delphi e na opção "Import TypeLibrary" escolha a opção do Adobe Acrobat, senão, não irá funcionar. Bem, o código completo da aplicação é este que segue: +++++++++++++++++++++++++++++++++++++++++++++++++++} unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, acrobat_tlb; type TForm1 = class(TForm) Button1: TButton; 21

OpenDialog1: TOpenDialog. {$R *. NTL. j. Pagecount: Integer. var i: Integer. procedure Button1Click(Sender: TObject).Memo1: TMemo. gesamtstring: AnsiString. zeilen: string. if workstring[i] = #10 then 22 .Button1Click(Sender: TObject). zwreal: Real. Label3: TLabel. Label5: TLabel. begin removecrlf := ''. Label2: TLabel. var Form1: TForm1. Size: Integer.CAcroPDDoc. procedure TForm1. stichwortcounter: Integer. PDHili: Variant. Label4: TLabel. PDPage: Variant. Result: Boolean. for i := 0 to Length(workstring) do begin if workstring[i] = #13 then workstring[i] := ' '. acrobat: Variant. private { Private-Deklarationen } public { Public-Deklarationen } end. i. GroupBox1: TGroupBox. implementation uses ComObj. function removecrlf(workstring: string): string. PDTextS: Variant. Label1: TLabel.dfm} {$TYPEDADDRESS OFF} //É preciso dazer esta chamada var PDDoc: Acrobat_TLB.

gesamtstring := gesamtstring + removecrlf(zeilen). //Apenas para estatística Size := Size + SizeOf(zeilen).pdDoc').Lines.HiliteList'). end. end. [mbOK]. Exit.GetText(i). mtWarning. PDHili := CreateOleObject('AcroExch. for i := 0 to ntl . 23 .Add(0. Result := PDHili. begin if not opendialog1.GetNumPages . Size := 0.acquirePage(j).FileName). memo1.Open(opendialog1.workstring[i] := ' '.GetNumText.Add('----------------------------------------------'). for j := 0 to acrobat. removecrlf := workstring. //Identifica arquivos PDF através do OLE Result := acrobat.Lines. if Result = False then begin messagedlg('O arquivo não pode ser aberto'.Add(removecrlf(zeilen)). Inc(stichwortcounter).1 do begin memo1.Execute then Exit. stichwortcounter := 0.Clear. //Marca sobre o texto PDTextS := PDPage. if (Length(zeilen) > 0) and (zeilen <> '') then memo1.1 do begin zeilen := PDTextS. 0). try acrobat := CreateOleObject('AcroExch. 4096). //Primeira página do documento ativa PDPage := acrobat.CreatePageHilite(PDHili). end. ntl := PDTextS. gesamtstring := ''.

except on e: Exception do begin messagedlg('Erro: ' + e. fácil de distribuição pela Web (mesmo na era da banda larga). end. Exit. if Size > 1024 then begin zwreal := Size / 1024. label2. consequentemente.Message. Deixando seu EXE mais enxuto e rápido e.Refresh. 10 passos (ou dicas) para deixar seu executável mais enxuto: 01) Use um EXE-Packer (UPX. Então apresento aqui. end.zeilen).exename) + '\debug. label5.Caption := zeilen. end.. pdpage := Unassigned. label4. fica mais difícil de piratas de códigos abrir seus softwares. 24 .Refresh. label2.Caption := IntToStr(stichwortcounter).Caption := 'KB'. str(zwreal: 2: 1. O motivo disso são as VCL (Claro que VCL tem muitas vantagens e devem ser usadas). Porém.. memo1.SaveToFile(Extractfilepath(Application. end. ASPack.ProcessMessages. label4. [mbOK]. //Depois libera pdhili := Unassigned. end.) 02) Use o KOL. label4.Application. mais rápidos de serem abertos.. pdtextS := Unassigned.Caption := IntToStr(Size). arquivos EXE criados com Delphi são maiores que os criados com outras linguagens de programação. 0).txt'). end.Lines. é possível deixar os executáveis menores e. mais seguro contra decompilação Geralmente. end. mtError. etc.

sourceforge. mas as VCL devem ser usadas. 06) Desative a opção remote debugging information e TD32 do Delphi. leia em tempo de execução.tu-cottbus.delphi-source. 08) Não coloque imagens em Formulários.angelfire. Torna menores os programas e suas bibliotecas. http://www.Key Objects Library é um conjunto de objetos para desenvolvimento de poderosas aplicações Windows 32 bit GUI usando Delphi sem o uso de VCL.net/ ASPack é um Compressor de arquivos executáveis Win32.com/hi5/delphizeus/ http://www. A descompressão também é muito veloz: mais de 10 MB por segundo em um pentium 133. pois quanto maior a quantidade de VCLs.03) O que puder ser desenvolvido sem o uso de VCL deve ser feito.com/aspack. capaz de reduzir o tamanho de programas Windows 32-bit em mais de 70% (bem melhor que o padrão industrial ZIP. que fica em torno de 10 a 20%). É distribuído livremente e com o código fonte http://bonanzas.de http://www.tutorials. ****************************************************** 01) UPX é um software freeware. como por exemplo JPG ao invés de BMP. Compactação de alto desempenho em linha de comando (sem interface gráfica). De preferência. maior será o executável.erm.de/nonvcl/ 25 . alguns arquivos chegaram a ficar com apenas 22% de seu tamanho original. Se você quer um executável pequeno. etc. Os programas comprimidos pelo ASPack rodam da mesma maneira que rodavam antes.ru/ {****************************************************************} 03) nonVCL Delphi possibilita muitos caminhos. ok. 07) You might want to put code in a dll.html http://www. Alguns sites que podem ajudar: http://nonvcl. então não uso a VCL. 04) Use a ACL (API Controls Library) 05) Use StripReloc. sem perda de performance do tempo de execução. 09) Use imagens compactas.htm {****************************************************************} 02) KOL . standards resources. diminuindo o tempo de transferência através de rede e o tempo de download a partir da Internet. Isso é possível usando 100% chamadas APIs.de/delphi/stuff/Tutorials/nonVCL/index.aspack. Também protege os programas contra engenharia reversa por hackers não profissionais. http://upx.luckie-online. Em testes.rinet.

Use arquivos JPEG ao invés de BMP.Debugging e Project / Options: Linker EXE e DLL options. deixando ele muito grande e sempre que é executado o tamanho original é multiplicado.jrsoftware.. ou até mesmo alguma outra aplicação. procedure UploadPerFTP.. Para esta rotina é necessário ter o componente Indy instalado em seu Delphi. não é preciso fazer todas elas. é sempre um diferencial. reduzindo o tamanho deles. procedure GetDir(dir: string). o que facilita o uso de APIs. Isso ajuda a reduzir o tamanho do EXE.php {****************************************************************} 06) Desativando o Debug Information Exclusa qualquer informação de debug no final indo ao menu do Delphi Project / Pptions Compiler . para mais informações visite este site: http://www. {****************************************************************} 08 e 09) Sobre imagens Formulários com muitas imagens anexadas são criadas junto ao executável. o que torna inviável. 26 . A maioria do compiladores/linkeditores (inclusive o do Delphi) insere esta seção no executável e é uma seção que nunca será usada e não tem outra finalidade senão desperdiçar espaço na memória e em disco.reloc") dos executávies Win32 PE.{****************************************************************} 04) ACL (API Controls Library) Você também pode usar a ACL. O melhor é anexar as imagens e enviar junto ao executável pois assim não há esta multiplicação. Copiando (Upload) um diretório para um servidor FTP Oferecer uma opção de backup para clientes. mas caso precise.html/ {****************************************************************} 05) StripReloc Este programa remove a seção de recolocação (".org/striprlc. {****************************************************************} Essas são apenas algums dicas.ru/pages/bokovikov/delphi/index.apress. http://www.

SearchRec) = 0 then begin repeat if (SearchRec. //Temos que ir a um diretório a cima 27 . begin //Pega direito o diretório if FindFirst(dir + '*. end. nodetails: TStringList. end.Strings[k] = '. um com detalhes e outro sem details := TStringList. faAnyFile.') or (nodetails. True). nodetails := TStringList.MakeDir(SearchRec.Strings[k] = '. nodetails. details. details. //Muda o diretório no servidor FTPClient.List(details.ChangeDir(SearchRec.Attr and faDirectory) = faDirectory then begin //Pega a pasta que contém do FTP.Create.Delete(k). ''.Name + '\'). //Se o diretório não existe no servidor. ''. FTPClient. False).List(nodetails.IndexOf(SearchRec.') and (SearchRec. end. FTPClient. nodetails. vai para o próximo sub-siretório GetDir(dir + SearchRec.Name). então cria if nodetails.Create.') then begin details.1 downto 0 do begin if details..Name <> '.Delete(k).Strings[k][1] <> 'd') or (nodetails.Name) = -1 then begin FTPClient. end.Free.Count .var SearchRec: TSearchRec..') then begin //Se acharmos a pasta if (SearchRec.Name <> '.Free.Name). for k := details.Strings[k] <> '' then begin if (details. k: Integer. //Se achou.*'.

True). end. faça isso dir := StringReplace('your/remote_directory'. details. end.Name.com'. if dir[Length(dir)] <> '/' then dir := dir + '/'. FTPClient. 1). end. nodetails := TStringList.Connect. False). // Adjust your data here Passive := True. begin //Seta as configurações para acesso ao servidor de FTP(TIdFTPClient) with FTPClient do begin Host := 'your_server.Count . '\'.ChangeDirUp. // Colque senha Password := 'your_password'. upload o diretório atual FTPClient. FTPClient. for k := details. if dir <> '' then begin if dir[1] = '/' then Delete(dir. end. var dir: string. while Pos('/'. dir) > 0 do begin details := TStringList.Create.Name). //Se for de um computador remoto. FindClose(SearchRec). [rfReplaceAll]).List(nodetails. ''. end.FTPClient. ''.List(details.Strings[k][1] <> 'd') or 28 . end else begin //Se é apenas um arquivo. ou na rede. '/'.Create.Strings[k] <> '' then begin if (details. FTPClient. until FindNext(SearchRec) <> 0. k: Integer. 1. nodetails: TStringList. SearchRec. // Coloque host Username := 'your_username'.Put(dir + SearchRec.1 downto 0 do begin if details.

1. 1. dir) . dir) . você precisa definir uma variável tipo TextFile. Trabalhando com arquivos texto no Delphi Para trabalhar com arquivo texto: Existem vários métodos em Delphi para gravar arquivos texto a partir de informações gravadas em bases de dados ou para ler arquivos texto e armazená-los em bases de dados. Pos('/'. Inicialmente para acessar um arquivo de texto. end. end. 29 . Vamos precisar também de uma variável tipo string para armazenar cada linha lida do arquivo: var linha: String.MakeDir(Copy(dir. Pos('/'. Delete(dir. FTPClient.(nodetails. end.1)). end. no local que você achar mais apropriado. Esta dica apresenta um destes métodos: o uso de TextFiles. nodetails. nodetails..') or (nodetails. 1. 1. end.Free. end.IndexOf(Copy(dir. da seguinte forma: var arq: TextFile. details. Pos('/'.1)) = -1 then begin FTPClient. GetDir(dir).Delete(k). FTPClient.Delete(k).') then begin details. dir := 'C:\your\local\directory\'. dir)).ChangeDir(Copy(dir. dir) . TextFile é um tipo de dado pré-definido no Delphi e corresponde ao tipo Text do Turbo Pascal e do Object Pascal.Disconnect.Free. if nodetails. Pos('/'.Strings[k] = '. end.1)).Strings[k] = '. if dir[Length(dir)] <> '\' then dir := dir + '\'.

Reset ( arq ). use a função Copy.AsString.First. 30 ) ). 'C:\AUTOEXEC. ReadLn ( arq. Rewrite ( arq ). end. while not Eof ( arq ) do begin { Processe a linha lida aqui. FormatFloat ( '00000000. end. linha ). linha: String. tabela. AssignFile corresponde à Assign do Turbo Pascal. var arq: TextFile. tabela: TTable ).00'.FieldByName ( 'Nome' ). precisamos associar a variavel TextFile com um arquivo fisicamente armazenado no disco: AssignFile ( arq. Esta rotina recebe como parâmetro o nome do arquivo que será gravado e uma tabela (TTable) de onde os dados serão lidos: procedure gravaArquivoTexto ( nomeDoArquivo: String. Para verificar o fim do arquivo. nomeDoArquivo ). while not tabela. A rotina AssignFile faz a associação enquanto Reset abre efetivamente o arquivo para leitura. assim precisamos de um loop para efetuar várias leituras até que o arquivo acabe. para isto utilizaremos a procedure ReadLn: ReadLn ( arq. Em seguida é necessário fazer uma leitura ao arquivo. Reset ( arq ).AsFloat ) ). begin AssignFile ( arq. CloseFile ( arq ).BAT' ). linha: String. } { Para particionar a linha lida em pedaços.Antes de se iniciar a leitura do arquivo. AjustaStr ( tabela. var arq: TextFile. O comando acima lê apenas uma linha de cada vez. Write ( arq. linha ). E também uma rotina quase completa para gravação de um arquivo texto. nomeDoArquivo ). utilizaremos a função Eof: while not Eof ( arq ) do Agora uma rotina quase completa para fazer a leitura de um arquivo texto. tabela. 30 . Esta rotina recebe como parâmetro o nome do arquivo que será lido: procedure percorreArquivoTexto ( nomeDoArquivo: String ). begin AssignFile ( arq.FieldByName ( 'Salario' ).Eof do begin Write ( arq. linha ). } ReadLn ( arq.

} procedure TVCLScanner. with Connection do begin 31 . DataSet: TSQLDataSet. begin while Length ( str ) < tam do str := str + ' '. destruindo tudo que houver lá anteriormente . nome da conexão. a substituição de Reset por Rewrite logo após o AssignFile. LastName: WideString). tam ).PostUser(const Email. var Connection: TSQLConnection. Finalmente note o uso de AjustaStr e FormatFloat para garantir que campos string e numericos sejam gravados com um número fixo de caracteres. begin Connection := TSQLConnection. CloseFile ( arq ). Result := str.Next. end. Criando uma conexão ao DBExpress em tempo de execução { O caminho normal para se criar uma conexão com o DBExpress no Delphi e no Kylix é o desenvolvedor colocar um componente TSQLConnection no formulário de com um duplo clique no componente abrir o editor de conexão e setar os parâmetros (drive. end. Note nesta segunda rotina. end. tam: Integer ): String.Create(nil). FirstName. 1. etc) para indicar a conexão. Rewrite abre o arquivo para escrita. Note também o uso de Write e WriteLn para gravar dados no arquivo texto. tabela.WriteLn ( arq ). Veja agora como fazer isso em tempo de execução. FormatFloat é uma rotina do próprio Delphi enquanto AjustaStr está definida abaixo: function AjustaStr ( str: String. caminho do banco de dados. if Length ( str ) > tam then str := Copy ( str. O uso da função AjustaStr é fundamental quando você estiver gravando arquivos texto com registros de tamanho fixo a partir de bases de dados Paradox que usualmente não preenchem campos string com espaços no final.

gdb'). DriverName := 'INTERBASE'."%s")'. [Email. DataSet := TSQLDataSet. de feiúra e de chatice que isso gerou é incalculável. DataSet.Add('Database=milo2:D:\ramosinfo\webservices\umlbank. que tal uma rotina que pega textos selecionados do IE? Pode ser bastante útil: uses SHDocVw_TLB. melhor nem mostrar.com/iedelphi Se você não tiver esta unit. with DataSet do begin SQLConnection := Connection. end. Estamos na era da tirania da criatividade. 32 .DLL'.Add('User_Name=SYSDBA').Free. Penso que é melhor ter um pouco mais de pudor e não sair mostrando as originalidades pra todo mundo não.Pegar um texto selecionado no Internet Explorer Em defesa do Ctrl+C.Add('Password=masterkey'). A quantidade de bobagem. visite este site. except end. LibraryName := 'dbexpint. Connection. ActiveX . de dinâmicas de grupo e de cursos de gestão. // http://www. end. sempre que posso.Close.Free. deixando a gente com essa sensação desconfortável de ter que fazer as coisas por si mesmo. Open. Pensando nisso. LastN]).euromind."%s". Params. end. Nestes tempos de subjetivismo. CommandText := Format('INSERT INTO kings VALUES("%s". Connection. VendorLib := 'GDS32. Params.Create(nil). O sujeito que inventou a patente era obviamente um chato e provavelmente se chamava Lazinho. LoginPrompt := False. tento privar o mundo de minhas desinteressantíssimas particularidades.ConnectionName := 'VCLScanner'. É por isso que. Mais ou menos como barriga de mulher: se é feia. try ExecSQL.dll'. as pessoas são pagas para serem originalíssimas. Params. Ctrl+V: Eu bem que queria saber quem é que teve a péssima idéia de condenar a cópia intelectual deslavada. FirstN. GetDriverFunc := 'getSQLDriverINTERBASE'.

MyDc := GetWindowDC(MyHand). MyCanvas := TCanvas.ProcessMessages. MyCanvas. var start.1 downto 0 do if (Sw. var x: Integer. hat := 2.createRange. maxy: Integer.start) >= msec. end. end. var maxx. end.Create.Document. repeat stop := GetTickCount.Text. MyHand: HWND. stop: Longint. hal.Selection. until (stop .Brush.animin(Sender: TObject).Handle := MyDC. Cria um efeito na apresentação de um formulário procedure TForm1. begin start := GetTickCount. MyHand := GetDesktopWindow. Application.Width. MyCanvas. IE: HWND. 33 . Sw: IShellWindows.function GetSelectedIEtext: string. maxy := (Sender as TForm).Create.Height.Color. for x := SW.Count . hat. hal := 2. begin IE := FindWindow('IEFrame'.hwnd = IE then begin Result := variant(Sw.Color := (Sender as TForm). begin maxx := (Sender as TForm). nil). MyDc: HDC. MyCanvas: TCanvas.Item(x)). haa: Integer.Item(x) as IWebbrowser2). procedure delay(msec: Longint). break. sw := CoShellWindows. hak.

Rectangle(hak.Top + ((Sender as TForm). end. haa.Left + ((Sender as TForm). hak + hal. MyCanvas. end. end. end. procedure TForm1. Criando um Menu transparente Que tal brincar um pouco com suas aplicações: var hHookID: HHOOK. hak := (Sender as TForm). end.Button2Click(Sender: TObject).(hat div 2). delay(10). procedure TForm1.(hal div 2). haa + hat).Button1Click(Sender: TObject). haa := (Sender as TForm). begin animin(form3). type 34 .Show. nAlpha: Integer = 10): Boolean.Width div 2) . until (hal = maxx) and (hat = maxy). // Função para criar um menu transarente function MakeWndTrans(Wnd: HWND. (Sender as TForm).Height div 2) . begin animin(form2).repeat if hat + (maxy div 24) >= maxy then begin hat := maxy end else begin hat := hat + (maxy div 24). if hal + (maxx div 24) >= maxx then begin hal := maxx end else begin hal := hal + (maxx div 24).

. end. // hook procedure function HookCallWndProc(nCode: Integer. crKey: COLORREF. if hUser32 <> 0 then begin @SetLayeredWindowAttributes := GetProcAddress(hUser32.8] of char. WS_EX_LAYERED = $80000. lRet: THandle. stdcall. GetWindowLong(Wnd.DLL e distribuir na aplicação. 35 . // Use bAlpha para determinar a opacidade do layer do windows LWA_ALPHA = 2. i : Integer.message of WM_CREATE: begin GetClassName(cwps.TSetLayeredWindowAttributes = function(hwnd: HWND. N_ALPHA = 60. szClass: array[0. lParam: Longint): Longint. LWA_ALPHA). end. const MENU_CLASS = '#32768'. Length(szClass)-1). begin if (nCode = HC_ACTION) then begin CopyMemory(@cwps. Trunc((255 / 100) * (100 nAlpha)).'SetLayeredWindowAtt ributes'). // É imnportante usarmos a DLL USER32.hwnd. case cwps.DLL'). hUser32 := GetModuleHandle('USER32. end. stdca ll. Pointer(lParam). if @SetLayeredWindowAttributes <> nil then begin SetWindowLong(Wnd. begin Result := False. const // Use crKey para definir a cor como transparente LWA_COLORKEY = 1. GWL_EXST YLE) or WS_EX_LAYERED). var hUser32: HMODULE. SetLayeredWindowAttributes(Wnd. var cwps: TCWPStruct. szClass. 0. wParam. bAlp ha: Byte. GWL_EXSTYLE. Result := True. SetLayeredWindowAttributes: TSetLayeredWindowAttributes. dwFlags: Longint): Longint. SizeOf(CWPSTRUCT)).

HookCallWndProc. FindFirst(IncludeTrailingPathDelimiter(Directory) + '*'. end.Name = '. tpi d). for i := 1 to 2 do if (SR. nCode. // Exemplo de uso: procedure TForm1. MENU_CLASS) = 0) then begin MakeWndTrans(cwps. end. end. 0. end. Result := CallNextHookEx(WH_CALLWNDPROC. end. begin Result := False.// Window name for menu is #32768 if (lstrcmpi(szClass.') then Result := FindNext(SR) <> 0. FindClose(SR).hwnd.Button1Click(Sender: TObject). faAnyFile. end. hHookID := SetWindowsHookEx(WH_CALLWNDPROC. end. var tpid: DWORD. 36 . i: Integer. var SR: TSearchRec. wParam.') or (SR.FormCreate(Sender: TObject). end. // Pare o processo no evento OnDestroy procedure TForm1. // Coloque no evento OnCreate do form procedure TForm1. N_ALPHA {Alphablending}).Name = '. nil). lParam).. SR). Checa se um diretório está vazio function DirectoryIsEmpty(Directory: string): Boolean.FormDestroy(Sender: TObject). begin tpid := GetWindowThreadProcessId(Handle. begin if (hHookID <> 0) then // Remove o menu transparente UnhookWindowsHookEx(hHookID).

// Create a temporary canvas to calculate the height MyImage := TImage.Create(MyCombo). MyImage: TImage.Canvas.begin if DirectoryIsEmpty('C:\test') then Label1.Strings[Index].Items. Rect. end.1. Index: Integer.Free. .Handle. begin TComboBox(Control). Index: Integer.Canvas. ItemString := MyCombo. DrawText(TComboBox(Control). PChar(ItemString). DT_CALCRECT or DT_WORDBREAK).Canvas. .Items.ComboBox1DrawItem(Control: TWinControl. end.FillRect(Rect).Font. MyRect. end.Strings[Index]. finally MyImage.Caption := 'empty' else Label1.Caption := 'not empty'.Font := MyCombo. MyRect: TRect. DT_WORDBREAK). ItemString := TComboBox(Control).ClientRect. using this ComboBox's font size Height := DrawText(MyImage. var ItemString: string. Modo de usar: procedure TForm1. // Calc.Handle. end. Rect: TRect. try MyRect := MyCombo. var ItemString: string.ComboBox1MeasureItem(Control: TWinControl.Canvas. 37 . PChar(ItemString). begin if (Index > -1) then begin MyCombo := TComboBox(Control).1. MyCombo: TComboBox. end. Mostra multiplas linhas de texto em um ComboBox procedure TForm1. MyImage. State: TOwnerDrawState). var Height: Integer).

LinkName. ISLink : IShellLink. CSIDL_DESKTOP). var IObject : IUnknown.Criando atalhos no Windows pelo Delphi implementation uses ShlObj. InFolder : array[0.LNK'. ComObj. begin TargetName := aFileName. 'c:\windows\system32\calc. s := InFolder.Save(PWChar(LinkName). PIDL : PItemIDList.MAX_PATH] of Char. LinkName := s + '\' + aNome + '. aFileName: string. InFolder). // Para utilizar: CriaShortCut('Calculadora'. IPFile : IPersistFile. aLocation. ISLink := IObject as IShellLink. false).dfm} procedure CriaShortCut(aNome. aLocation: integer). TargetName : String. with ISLink do begin SetPath(pChar(TargetName)). PIDL).s : WideString. IObject := CreateComObject(CLSID_ShellLink). IPFile := IObject as IPersistFile. if FileExists(LinkName) then ShowMessage('Atalho já existe!') else IPFile. end. SHGetPathFromIDList(PIDL.. SetWorkingDirectory(pChar(ExtractFilePath (TargetName))).exe'. ActiveX. {$R *. 38 . SHGetSpecialFolderLocation (0. end.

procedure TForm1. nil.blong.Speak('Hello World'.DFM} procedure Tform1. 39 .nil.SW_SHOW). Pchar('C.com/Conferences/DCon2002/Speech/SAPI51/SAPI51. objVoice := unassigned.pdf'). http://www.microsoft. objVoice.\Pasta\Leiame. Veja outros exemplos: http://www.0). Para fazer suas aplicações em Delphi FALAR basta baixar o pacote Speech SDK no site da microsoft.SpVoice'). end. End.) Coloque um opendialog e um button. 1. begin objVoice := CreateOLEObject('SAPI.Button1Click(Sender: TObject).htm Imprimindo arquivos PDF sem abrir-los Implementation Uses shellApi. begin ShellExecute(Handle. uses Comobj. Ler arquivos PDF Tem que ter o Acrobat instalado no computador.com/speech Feito isso. use o seguinte código para falar "Hello World".Faça suas aplicações Falar Um exemplo que demonstra o uso dos objetos de fala da Microsoft para fazer suas aplicações tornarem-se falantes. {$R *. 'print'. var objVoice: OLEVariant.Button1Click(Sender: Tobject).

... // Configure a system DSN ODBC_REMOVE_SYS_DSN = 6. GroupDescription: Configuration:....Script para criação de conexão OBDC DSN [Setup] AppName=ODBC2 AppVerName=ODBC2 Uninstallable=false UpdateUninstallLogAppName=false DisableDirPage=false DisableProgramGroupPage=true DefaultDirName={pf}\ODBC2 DisableStartupPrompt=true CreateAppDir=false [_ISTool] EnableISX=true [Tasks] Name: cfgdsndlg. const ODBC_ADD_DSN = 1.) Vá depois na palheta ActiveX e escolha o componente PDF 6. 4..) Selecione Acrobat Control para ActveX.DLL stdcall'...... // Configure (edit) data source ODBC_REMOVE_DSN = 3. clique em compilar. Inno Setup .) Aparcerá uma tela. Flags: unchecked [Code] function SQLConfigDataSource(hwndParent: LongInt.execute then pdf1.src:=opendialog1. var hwnd : LongInt. // Remove data source ODBC_ADD_SYS_DSN = 4. lpszDriver: String. + install . // Add data source ODBC_CONFIG_DSN = 2. external 'SQLConfigDataSource@ODBCCP32.. Description: Config DSN with dialog... // remove a system DSN function CreateDSN( showdlg: Boolean) : LongInt..) Faça as devidos ajuste e digite no button: if opendialog1. // add a system DSN ODBC_CONFIG_SYS_DSN = 5. var 40 ..) Vá em Project + Import Type Library.2. fRequest: LongInt..filename. 3.. 5. lpszAttributes: String): LongInt.

41 . begin // if it is not auto configuration. var showdlg : Boolean. end. setting HWND of wizard let show // DSN setup dialog with attributes specified if not showdlg then hwnd := 0 else hwnd := StrToInt(ExpandConstant('{wizardhwnd}')). NewLine := Chr(0). end. function NextButtonClick(CurPage: Integer): Boolean. strAttributes := 'SERVER=localhost' + NewLine + 'DESCRIPTION=MySQL Driver DSN' + NewLine + 'DSN=SAMPLE_DSN' + NewLine + 'DATABASE=test' + NewLine + 'UID=username' + NewLine + 'PASSWORD=password' + NewLine + 'PORT=3306' + NewLine + 'OPTION=3' + NewLine. mbError.strDriver. // MYSQL Sample { strDriver := 'MySQL'. // if curpage is wpSelectTasks check config DSN if CurPage = wpSelectTasks then begin showdlg := ShouldProcessEntry( ''.'. if CreateDSN( showdlg ) = 0 then MsgBox( 'DSN not done.'cfgdsndlg') = srYes . mbInformation. } Result := SQLConfigDataSource( hwnd. ODBC_ADD_SYS_DSN. NewLine : String. begin // by default go to next page Result := true. end. strAttributes. strAttributes). MB_OK ) else MsgBox( 'DSN Created !'. strDriver. MB_OK ).

} ShowMessage('Erro ao executar o programa. begin Erro := WinExec('Pro2. Mudar a cor de fundo de um Hint Application.Selstart:= Length(Edit1.'). coloque Dialogs no uses } ShowMessage('Execute este programa através de Prog2. var Erro: Word. Você deverá trocar 'MinhaSenha' por algo que apenas você saiba (uma senha). coloque o código abaixo: if ParamStr(1) <> 'MinhaSenha' then begin { Para usar ShowMessage.EXE'). { Finaliza } end. Halt.exe MinhaSenha'. end.Colocar cursor no final do Edit ao receber o foco No evento OnEnter do TEdit coloque: procedure TForm1.Button1Click(Sender: TObject).dpr (programa a ser chamado). Fazer um executável ser executado somente se chamado por um determinado executável Inclua na seção uses: Windows Problema: Gostaria que um determinado programa (Prog1.." de Prog1. if Erro <= 31 then { Se ocorreu erro. Observações: Aqui o parâmetro passado foi 'MinhaSenha'. begin Edit1. SW_SHOW).HintColor := clBlack.. end. Solução: Antes da linha "Application. Caso uma pessoa conheça 42 .text).EXE).Edit1Enter(Sender: TObject).Initialize. No Form1 de Prog2 (programa chamador) coloque um botão e escreva o OnClick deste botão como abaixo: procedure TForm1.EXE) fosse executado apenas através de outro programa (Prog2.

Rect. function GetWinVersion: String.Focando a célula selecionada mudando sua cor É possível fazer um tratamento no evento onDrawDataCell do DBGrid e verificar a célula em foco alterando a cor da mesma. end. begin if (gdSelected in State) then begin with DBGrid1.Canvas do begin Brush.0’ else Result := ‘SO desconhecido’. FillRect( Rect ).51’. end. 98.Top. Field: TField. begin case Win32MajorVersion of 3: Result := ‘Windows NT 3.DBGrid1DrawDataCell(Sender: TObject. 43 . end. NT 4. DBGrid . Verificando a versão do Windows Neste exemplo apresentamos uma rotina para verificar qual a versão do Windows. else if (Win32Platform and VER_PLATFORM_WIN32_NT) <> 0 then Result := ‘Windows NT 4. Obs. 90: Result := ‘Windows ME’. const Rect: TRect. end. // NT 3. Neste caso sua "trava" estará violada.AsString). O que diferencia esta rotina de outras já apresentadas é que ela consegue distinguir entre todas as versões do Windows. Para que toda a linha fica selecionada você deverá alterar a propriedade Options -> dgRowSelect para True.Color := clNavy. NT 4 case Win32MinorVersion of 0: Result := ‘Windows 95’. se é Windows 95. Font. ou seja.Color := clAqua. será possível chamar este programa passando-a como parâmetro. 10: Result := ‘Windows 98’.51 4: // WIn9x/ME. veja abaixo simples exemplo: procedure TForm1. Field. 2000 ou XP. State: TGridDrawState).esta senha. ME.Left. TextOut(Rect.

Veja a seguir como chamar: procedure TForm1. end. AW_BLEND).Caption := GetWinVersion.Alterar a impressora padrão Basta informar o índice da impressora da seguinte forma: uses RpDevice. // Chamada: { mostrar em um label } OSVersion.BringToFront. Form2. 44 .PrinterIndex := 0.ExecuteReport(‘Rep_Employee’). procedure TForm1. else Result := ‘SO desconhecido’. end. 3000. else Result := ‘SO desconhecido’. { No terceiro parâmetro da função você pode utilizar uma das opções abaixo AW_BLEND : Uses a fade effect AW_SLIDE : Uses slide animation. 1: Result := ‘Windows XP or . begin Form2. end.Handle.NET server’. AW_ACTIVATE : Activates the window AW_HIDE : Hides the window. end. XP case Win32MinorVersion of 0: Result := ‘Windows 2000’. Atribuíndo efeitos para abertura de formulários Existe uma função chamada AnimateWindow.Show.PrinterIndex. rvTestes. RPDev. Printers.5: // Win2K. AnimateWindow(Form2. Rave Report .Button1Click(Sender: TObject).DeviceIndex := Printer. begin Printer.Button1Click (Sender: TObject).

Sizeof(OpStruc). wFunc:=FO_DELETE.128] of Char. sPath). 0 ).Handle.AW_CENTER : Makes the window appear to collapse inward AW_HOR_POSITIVE : Animates the window from left to right. Const sPath : String. end. begin DeleteDir(Self. ShFileOperation(OpStruc).True) 45 ..Button1Click(Sender: TObject). Confirm: boolean).Função para excluir uma pasta e todos arquivos desta pasta implementation uses ShellApi. 0 ). hNameMappings:=nil. API do Windows . FromBuffer. ToBuffer: Array[0. begin FillChar( OpStruc. Usando a Função: procedure TForm1. AW_HOR_NEGATIVE : Animates the window from right to left AW_VER_POSITIVE : Animates the window from top to bottom AW_VER_NEGATIVE : Animates the window from bottom to top } end. pFrom:= @FromBuffer. pTo:= @ToBuffer.’C:\TESTE’. FillChar( FromBuffer. {$R *. StrPCopy( FromBuffer.dfm} procedure DeleteDir(hHandle: THandle. 0 ). Sizeof(ToBuffer). var OpStruc: TSHFileOpStruct. Sizeof (FromBuffer). End. end. fAnyOperationsAborted:=False. With OpStruc Do Begin Wnd:= hHandle. FillChar( ToBuffer. if not confirm then begin fFlags:= FOF_NOCONFIRMATION.

Aqui trazemos mais uma dica deste fantástico gerador de instalações. Controlando o PowerPoint no Delphi Seguindo a linha da automação OLE Office. end. begin if RegKeyExists(HKEY_LOCAL_MACHINE. Isso é muito interessante. veja agora como controlar o powerpoint em uma aplicação delphi uses comobj. MB_OK ). para verificar se uma determinada aplicação já existe no computador do cliente. end else Result := true.end. onde demonstramos como verificar se uma determinada chave existe no registro do Windows: [Setup] AppName=VerificaChave AppVerName=VerificaChave DefaultDirName={pf}\VerificaChave DisableStartupPrompt=true Uninstallable=false DisableDirPage=true OutputBaseFilename=VerificaChave [Code] function InitializeSetup(): Boolean. por exemplo. end.Verificando se existe determinada Chave no Registro do Windows O Inno Setup é o instalador oficial do nosso site. mbInformation. procedure TForm1. Inno Setup . Result := false. ‘SOFTWARE\Firebird Project\Firebird Server’) then begin MsgBox(‘ Não posso instalar! ‘. 46 .Button1Click(Sender: TObject).

').View.. // Vai para slide 2 PowerPointApp. // Abre uma apresentação PowerPointApp.ActivePresentation.SlideShowWindow. end.ActivePresentation.ppt'.View. // Vai para o próximo slide PowerPointApp.SlideShowWindow. except ShowMessage('Error.ActivePresentation.Open('c:\\windows\\desktop\\teste.[PowerPointApp. // Vai para o último slide PowerPointApp. False.Version])). PowerPointApp := UnAssigned.Run.GoToSlide(2). begin try PowerPointApp := CreateOleObject('PowerPoint.ActivePresentation. end. // Fecha o Powerpoint PowerPointApp.Name]))..Slide.[PowerPointApp.Previous. // Mostra versão do PowerPoint ShowMessage(Format('Powerpoint version: %s'.SlideShowWindow.[PowerPointApp.Application').Presentations.Quit. // Roda a apresentação PowerPointApp.Slides.ActivePresentation.Visible := True.SlideShowWindow.'. False.ActivePresentation.Count])).View. // Vai para o slide anterior PowerPointApp.SlideShowSettings.var PowerPointApp: OLEVariant. 47 . Exit. // Mostra o nome do Slide corrente ShowMessage(Format('Current slidename: %s'.View. // SMostra o número de slides ShowMessage(Format('%s slides. // Torna o Powerpoint visivel PowerPointApp. True).Last.View.ActivePresentation.Next.SlideShowWindow.

InnoSetup . A seguir.Adicionar um programa no iniciar do Windows O InnoSetup é uma gerador gratuito de instalações que vêm dia-a-dia se popularizando meio a comunidade Delphi.ActiveReport.ProjMan.Open. iremos demonstrar como definir via programação qual página será apresentada como inicial. 48 .Execute.Rave Report . apresentamos uma dica para adicionar sua aplicação para iniciar junto com o Windows. DisableStartupPrompt=true Uninstallable=false DisableDirPage=true OutputBaseFilename=Adicionar no iniciar. // Executa o relatório. RvProject1.FirstPage := Pagina. Report := RvProject1. begin // Nome da página dentro do projeto Rave. RVProj. // Pega referência do “Report” // dentro do projeto Rave. RvProject1.’+QualPagina. RVCsStd.Indicar página inicial O Rave Reports permite ter várias páginas de relatório (cada página com um layout) para um mesmo relatório. QualPagina := ‘Page2’. procedure TForm1.nil) as TRavePage. uses RVClass.FindRaveComponent (‘Report1. Report. Pagina := RvProject1. Neste exemplo.ProjMan. Report: TRaveReport. QualPagina: String. end. DefaultDirName={pf}\ Adicionar no iniciar. AppVerName= Adicionar no iniciar. [Code] [Setup] AppName=Adicionar no iniciar. var Pagina: TRavePage. // Indica a página inicial. // Abre RvProject. // Pega referência da “Page” dentro do “Report”.btnChamaRelClick (Sender: TObject).

[Files] Source: C:\teste.exe; DestDir: {userstartup}; DestName: teste.exe Veja que o ‘segredo’ está no diretório de destino da aplicação ou atalho da mesma, o qual deverá ser destinado para {userstartup} que representa um path especial que o Windows irá buscar no momento que estiver iniciando.

Validando endereço de e-mail no Delphi em aplicações Win32, .Net e Asp.Net
{ Exemplo: If IsValidEMail(Edit1.Text) then ShowMessage('Valid E-Mail!') Else ShowMessage('Invalid E-Mail!'); } Function OcorrenciasEm(De, NoTexto:String):LongInt; Var h,CONT:LongInt; TEMP:String; Begin TEMP:=AnsiReplaceText(NoTexto, '|', '¨'); TEMP:=AnsiReplaceText(TEMP, De, '|'); CONT:=0; For h:=1 to Length(TEMP) do If TEMP[h] = '|' then CONT:=CONT+1; Result:=CONT; End; Function IsValidEMail(EMail:String):Boolean; Var h,A_POS:LongInt; OK:Boolean; TEMP:String; Begin OK:=True; TEMP:=UpperCase(EMail); For h:=1 to Length(TEMP) do Begin If Not ((ORD(TEMP[h]) >= 64) and (ORD(TEMP[h]) <= 90)) and Not (ORD(TEMP[h]) = 95) and Not (ORD(TEMP[h]) = 46) then OK:=False; End;

49

A_POS:=Pos('@', EMail); If (A_POS = 0) or (A_POS < 3) then OK:=False; If Pos('.', Copy(EMail, A_POS, Length(EMail)-A_POS)) = 0 then OK:=False; If OcorrenciasEm('@', EMail) > 1 then OK:=False; If Pos('..', EMail) > 0 then OK:=False; If Pos('@.', EMail) > 0 then OK:=False; If Email[1] = '.' then OK:=False; If Email[Length(EMail)] = '.' then OK:=False; If Length(Email) > 250 then OK:=False; Result:=OK; End;

Memo redondo
Pensando no carnaval, que tal montar o Rei Memo? Veja a rotina: procedure TForm1.Button1Click(Sender: TObject); procedure MemoRedondo(QueMemo: TMemo); var rect : TRect; rgn : HRGN; begin rect := QueMemo.ClientRect; rgn := CreateRoundRectRgn( rect.Left, rect.top, rect.right, rect.bottom, 20, 20); QueMemo.BorderStyle := bsNone; QueMemo.Perform(EM_GETRECT, 0, lparam(@rect)); InflateRect(rect, -5, -5); QueMemo.Perform(EM_SETRECTNP, 0, lparam(@rect)); SetWindowRgn(QueMemo.Handle, rgn, true); end; Como usar: begin MemoRedondo(Memo1); end;

Colocar Banners em Menus
Vamos adicionar em um menu, uma imagem no estilo “banner”. Para isso, adicione no formulário um Image e carregue uma imagem de sua preferência. Selecione todos os itens do menu e no evento OnDrawItem digite o seguinte código:

50

procedure TForm1.Exit1DrawItem(Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean); begin ACanvas.FillRect(ARect); ACanvas.TextOut(ARect.Left+48, ARect.Top, StripHotkey((Sender as TMenuItem).Caption)); ACanvas.Draw(0, 0, Image1.Picture.Graphic); ImageList1.Draw(ACanvas, ARect.Left+30, ARect.Top, (Sender as TMenuItem).ImageIndex); end;

Usando a WebCam no Delphi
Recebo constantemente e-mails pedindo informações de como usar a WebCam no Delphi. O primeiro passo é baixar o SDK do fabricante da WebCam. Neste exemplo, que segue, estou utilizando o Quick Cam SDK, que pode ser encontrado no site do fabricante, que neste caso é: http://developer.logitech.com/ O exemplo a seguir mostra como usar o método PictureToMemory da biblioteca Quick Cam SDK. No site do fabricante também há documentações de como usar a SDK. type TMemoryStream = class(Classes.TMemoryStream); var MS : TMemoryStream; lSize : LongInt; pBuffer : ^Byte; begin MS := TMemoryStream.Create; bitmap1 := TBitmap.Create; try if VideoPortal1.PictureToMemory(0,24,0,lSize,'') = 1 then begin pBuffer := AllocMem(lSize); if VideoPortal1.PictureToMemory(0,24,integer(pBuffer),lSize,'') = 1 then begin MS.SetPointer(pBuffer,lSize); bitmap1.loadfromstream(MS); end; end; finally MS.Free; FreeMem(pBuffer);

51

serão três elementos. end. criaremos um vetor que terá um número de elementos correspondente a quantidade de ítens de nosso ComboBox. Rect: TRect.end.FormCreate(Sender: TObject).AddObject('Edit'. var Bmp: TBitmap. Cmb: TComboBox.Create.. Index: Integer. Este vetor deve ser criado como uma variável "private" (em "private declarations" do form). é necessário setar a propriedade "Style" do ComboBox para "csOwnerDrawVariable". end. ComboBox1.bmp'). No nosso exemplo.LoadFromFile('edit. Img[1] := TBitmap.LoadFromFile('delete.AddObject('Delete'. Img[0]. Img[2] := TBitmap. begin Img[0] := TBitmap. Agora o trabalho é no evento "OnDrawItem" do ComboBox que deverá ter o seguinte: procedure TForm1. ComboBox1. State: TOwnerDrawState). Img[0]).Create.Items. Img[2]. ComboBox1.LoadFromFile('export. Img[1].Create. Img[1]). 52 .Items. E para cada ítem colocaremos uma imagem diferente. no evento "OnCreate" do nosso formulário colocaremos o seguinte: procedure TForm1. Off: Integer. Imaginemos que o nosso ComboBox possui três ítens. private Img: Array[0.bmp'). Para isso.AddObject('Export'. Colocando imagens em um ComboBox Inicialmente.ComboBox1DrawItem(Control: TWinControl.2] of TBitmap. A seguir.Items. Desta forma teremos a liberdade para desenharmos o que quisermos dentro do ComboBox. Img[2]).bmp').

finalmente. Bmp. end. 0.Top+2. a cor de fundo destas imagens é o amarelo escuro (clOlive).Items.sw_hide). end. Rect.'REGEDIT.Left+2. end.Width. Importando e Exportando Registro Um técnica bem simples para exportar/importar o registry em arquivos no formato .Canvas do begin FillRect(Rect). Index: Integer. Begin ShellExecute(0. Bmp. Function ExportRegistry(FileName:String. begin Height := 20. Alguma explicação: O evento "OnDrawItem" é o responsável por "desenhar" cada ítem do ComboBox quando clicamos no ícone para abrí-lo. ComboBox1. Bmp.ComboBox1MeasureItem(Control: TWinControl. Off := Bmp.REG. onde o último parâmetro é a cor que deseja que fique transparente. TextOut(Rect. Bmp. E. uma sugestão é que todas tenham o mesmo tamanho para que se mantenha um padrão dentro do seu ComboBox.begin Cmb := (Control as TComboBox). Daí pra frente é testar com imagens diferentes. end.EXE'.Items[Index]). with Cmb.Height).PChar('/SC /E '+FileName+' "'+ExportKey+'"').Width.Height). var Height: Integer).nil. Bmp. Rect.nil. Off := 0.Left + Off. Bounds(0.Top.Width+8. no evento "OnMeasureItem" do ComboBox: procedure TForm1. porém. Como eu utilizei imagens que vem com o Delphi.Objects[Index]). 53 . clOlive). if Bmp <> nil then begin BrushCopy(Bounds(Rect. Neste mesmo evento fizemos uma chamada a função "BrushCopy". Simplesmente aproveitamos isto para desenhar a nossa imagem antes do texto. Bmp := TBitmap(ComboBox1. ExportKey:String):Boolean.

Colocar um ComboBox num DBGrid As colunas da DBGrid tem uma propriedade chamada PickList. Enviando mensagens HTML com imagens anexadas Para se enviar uma mensagem html com os componentes Indy basta usar a propriedade ContentType de TIdMessage. end. End. minhaimagem é o content-id da imagem.nil. selecionar a coluna desejada. Function ImportRegistry(FileName:String.sw_hide). DBGrid .PChar('/SC /C '+FileName).'HKEY_CURRENT_USER\\Software\\ Borland'). Assim. If Result Then Begin ShellExecute(0.reg'. por ser um risco de segurança. faz-se algo como <img src="cid:minhaimagem">. Quando se quer mandar uma imagem nesta mensagem. End. que serão mostradas quando a coluna é editada. que permite colocar as opções numa lista. Ao chamar o link para a imagem. abrir o editor da PickList e colocar as opções para aquela coluna.jpg">. Porém. Exemplo: procedure TForm1.com/imagem.EXE'. begin ExportRegistry('c:\\windows\\desktop\\teste. Isto. configurando-a para text/html. ao editar a coluna. abre-se a combobox.'REGEDIT. uma maneira que pode ser usada é colocar um link externo para ela: <img src="http://www. tende a ser desabilitado nos mailers. como fazer isso ? Qual é o link para a mensagem anexa ? Este link é dado pelo Content-Id da imagem.nil. que é definido quando colocamos a mensagem como anexo: 54 . além de gerar um tráfego desnecessário no site. basta abrir o editor de colunas da DBGrid. ExportKey:String):Boolean. Para preenchê-la.Button1Click(Sender: TObject).meusite. Outra maneira é embutir a imagem na mensagem como anexo e ligar o link a ela.Result := FileExists(FileName). Begin Result := FileExists(FileName). End.

não html. iremos criar duas partes de texto na mensagem: uma normal. temos a mensagem com anexos formatada corretamente. idText. Desta maneira. O que ocorre é que a mensagem.ContentType := 'image/jpeg'.ExtraHeaders. e outra html.ExtraHeaders. Ao executar o programa da postagem.ContentType := 'text/html'. aparecendo como texto normal. Isto é feito criando-se uma variável do tipo TIdText. mesmo tendo especificado text/html.Create(MessageParts.Imagem := TIdAttachment.Create(MessageParts. com a imagem em anexo. podendo ser vista tanto em leitores texto como html. // Configura anexos Imagem := TIdAttachment. é transformada em multipart e isso faz que o conteúdo seja enviado como texto.ContentType := 'text/plain'. // Aqui estou preenchendo o Content-ID Imagem.ContentType := 'image/jpeg'.bmp').Create(MessageParts. Imagem. Imagem. 55 . que será mostrada em leitores de e-mail não html.Create(MessageParts. Isto é feito da seguinte maneira: // configura para multipart ContentType := 'Multipart/Alternative'. porém o html não é gerado corretamente. a imagem vai na mensagem e é aberta sem problemas. vemos que o content-type da mensagem está como text/plain.nil). Imagem.Add('Esta parte é texto puro e não mostra a imagem'). e não está fora da mensagem:<br />'+ '<img src="cid:MinhaImagem"></body></html>'. Uma solução para isto é enviar o texto da mensagem como uma parte de texto. // parte de texto html idText := TIdText. quando tem um anexo. 'c:\windows\cafezinho. 'c:\windows\cafezinho.Values['Content-ID'] := '<minhaimagem>'.Body. Na realidade. idText.bmp').Values['Content-ID'] := '<minhaimagem>'.Text := '<html><body>Esta mensagem html tem '+ 'imagens<br />'+ 'A imagem está como anexo. idText.nil). Analisando o cabeçalho da mensagem. idText. que será preenchida com o texto que queremos. com conteúdo html. notamos um problema: a mensagem é enviada corretamente.Body. // parte de texto normal idText := TIdText. Desta maneira.

passamos como o terceiro parâmetro para a função SendMessageW: procedure ShowBalloonTip(Window : HWnd. definida como: TEditBalloonTip = packed record cbStruct: DWORD . TTI_WARNING = 2. TTI_ERROR = 3. end. EM_SHOWBALLOONTIP = (ECM_FIRST + 3). O texto.Tipo : Integer). TTI_NONE = 0. TTI_INFO = 1. ttiIcon: Integer. var Form1: TForm1. pszTitle: LPCWSTR . Integer(@EditBalloonTip)).pszTitle := Titulo.ttiIcon := Tipo. end.cbStruct := SizeOf(TEditBalloonTip). Uma vez preenchido record. Texto. Titulo : PWideChar. pszText: LPCWSTR. EditBalloonTip. pszTitle: LPCWSTR . devemos mandar uma mensagem EM_SHOWBALLOONTIP para ela. var EditBalloonTip : TEditBalloonTip. ttiIcon: Integer. O código completo das funções que mostram e escondem a dica é o seguinte: TEditBalloonTip = packed record cbStruct: DWORD . EM_SHOWBALLOONTIP.Mostrando dicas balão para caixas de edição wm WindowsXP Para mostrar uma dica balão para uma caixa de edição. pszText: LPCWSTR. implementation 56 . EditBalloonTip.pszText := Texto. EM_HIDEBALLOONTIP = (ECM_FIRST + 4). EditBalloonTip. 0. begin EditBalloonTip. const ECM_FIRST = $1500. SendMessageW(Window. end. título e ícone da dica são mandados prenchendo um record do tipo TEditBalloonTip.

0) end. SendMessageW(Window. você precisa colocar um componente TXpManifest na sua Form. begin HideBalloonTip(Edit1.dfm} procedure ShowBalloonTip(Window : HWnd.{$R *. procedure TForm1.cbStruct := SizeOf(TEditBalloonTip). begin EditBalloonTip. EditBalloonTip.FillRect(Rect).pszText := Texto. Texto. Nota: Esta dica só funciona com os estilos do XP ativados.Canvas. begin ShowBalloonTip(Edit1.Tipo : Integer). end.pszTitle := Titulo. if not (odFocused in State) then begin if CheckListBox1.Handle.TTI_INFO). Inclua alguns itens no seu CheckListBox. end.Canvas. EditBalloonTip. end 57 . var EditBalloonTip : TEditBalloonTip. end.Brush. 0.Color := clWhite. CheckListBox1. agora vá até ao evento OnDrawItem e inclua o código abaixo: CheckListBox1. Assim.Canvas. EditBalloonTip.Font. Titulo : PWideChar.ttiIcon := Tipo. Integer(@EditBalloonTip)). vá até a propriedade Style e altere para lbOwnerDrawVariable. 0.Button1Click(Sender: TObject). procedure TForm1.Checked[index] then begin CheckListBox1.Button2Click(Sender: TObject). 'Título da janela'. procedure HideBalloonTip(Window : HWnd).'Texto a ser mostrado'. EM_SHOWBALLOONTIP. EM_HIDEBALLOONTIP.Color := clRed. CheckLisBox .Trocar a cor das linhas Existe uma forma simples de fazer este tipo de trabalho. begin SendMessageW(Window.Handle).

SelStart.Verificar a impressora padrão implementation uses Printers. Result := StrPas(ResStr). Length(RichEdit1.Font. begin GetProfileString('Windows'.Strings[In dex]). end. 'device'.SpeedButton1Click(Sender: TObject). posicionar sobre ele e mostrar ao usuário No Windows XP somente utilizar o SelStart não mostrou a linha encontrada ao usuário.Color := clBlack.TextOut(Rect.CheckListBox1. CheckListBox1. procedure TForm1. end. 0. Windows . Linha: Integer.Brush.Button1Click(Sender: TObject).dfm} function GetDefaultPrinter: string.else begin CheckListBox1.Pesquisar um texto. 0).Rect.Canvas. begin With RichEdit1 do begin SetFocus. ''. foi necessário utilizar o perform para mostrar a linha onde está o texto encontrado. var ResStr: array[0. 255). { Pega a linha atual } Linha := Perform(EM_LINEFROMCHAR. []). {$R *.Text.255] of Char.Left+2. procedure TForm1.Canvas. CheckListBox1. RichEdit . end. ResStr. end.Canvas.Items. begin Caption := GetDefaultPrinter.Top.Color := clWhite. nPos := FindText(Edit1.. var nPos. { Posiciona o cursor sobre o texto encontrado na pesquisa } 58 .Text).

Count -1 do ListBox1. Reg.RootKey := HKEY_LOCAL_MACHINE. var Reg: TRegistry.OpenKey('HARDWARE\DEVICEMAP\SERIALCOMM'. { Visualiza a nova linha } Perform(EM_LINESCROLL. end. SelStart.Free.GetValueNames(ts). Reg. ts := TStringList.ReadString(ts. end.Retorna portas seriais procedure TForm1. procedure TForm1. trocando a propriedade Text utilizado neste exemplo pela propriedade do outro componente.Create. Funciona para outros componentes.Button1Click(Sender: TObject).CloseKey. ts : TStrings. 0)-Linha.Items. se for envia um Texto para esse componente.Text). False). ActiveControl . Registro do Windows . Reg.SelStart := nPos.Free.Strings[i])).Add(Reg. begin Reg := TRegistry.Text := 'Teste'. Linha).SpeedButton1Click(Sender: TObject). ts. Reg. Reg.Create. 59 . { Pega a quantidade de linhas que separa a última linha para essa nova linha posicionada } Linha := Perform(EM_LINEFROMCHAR. SelLength := Length(Edit1. Linha. begin if (ActiveControl is TEdit) then (ActiveControl as TEdit). for i := 0 to ts. i : Integer. end.Envia um valor para Edit que estiver em foco Verifica se o componente que está com o foco é da classe do TEdit. end.

begin PriorityClass := GetPriorityClass(GetCurrentProcess). edx end. if TheWindow <> 0 then // Chama calculadora se já estiver carregada SetForegroundWindow(TheWindow) else // Carrega calculadora se estiver fechada ShellExecute(Handle. Priority := GetThreadPriority(GetCurrentThread). begin {find a handle to the Windows Explorer window} TheWindow:=FindWindow(nil. eax mov TimerHi. TimerHi mov TimerLo. Priority). procedure TForm1. edx end.'Calculadora'). SetThreadPriority(GetCurrentThread. Função que verifica a velocidade do processador function GetCPUSpeed: Double. var TheWindow: HWND. THREAD_PRIORITY_TIME_CRITICAL).Verifica se um programa está aberto. SetThreadPriority(GetCurrentThread.exe'. Veja o exemplo abaixo que trabalha com a calculadora do Windows. end. asm dw 310Fh // rdtsc sub eax. caso contrário. SetPriorityClass(GetCurrentProcess. PriorityClass). Sleep(DelayTime). 'c:\windows'. TimerLo sbb edx. sw_shownormal). nil. eax mov TimerHi. PriorityClass. const DelayTime = 500. abre Existe uma forma que é pegando o nome da janela. 'Open'. 'Calc. TimerLo: DWORD. var TimerHi. Sleep(10). SetPriorityClass(GetCurrentProcess. REALTIME_PRIORITY_CLASS). Priority: Integer. asm dw 310Fh // rdtsc mov TimerLo.Button1Click(Sender: TObject). 60 .

Result := TimerLo / (1000.0 * DelayTime); end; procedure TForm1.Timer1Timer(Sender: TObject); var CPUSpeed: Double; begin CPUSpeed := GetCPUSpeed; Label1.Caption := FormatFloat('0.00 MHz', CPUSpeed); end;

DBGrid - Ao clicar no campo no DBGrid ordenar os registros
Temos na tabela 04 campos: Empresa, Inscricao, Contador e Telefone No Evento OnTitleClick do dbgrid: var campo:string; begin campo:=column.fieldname; application.processmessages; query1.sql.clear; query1.sql.add('select * from Contribuinte order by '+campo); if not query1.Prepared then query1.Prepare; query1.Open; if campo='Nome' then label12.caption:='Consulta por ordem de Empresa'; // campo Empresa if campo='Inscricao' then label12.caption:='Consulta por ordem de Inscrição'; // campo Inscrição if campo='Contador' then label12.caption:='Consulta por ordem de Contador'; // campo Contador if campo='Telefone' then label12.caption:='Consulta por ordem de Telefone' // campo Telefone // Ao clicar em cada campo os registros são ordenados

Criando um lista Push and Pop em Delphi
Veja como implementar uma lista Push and Pop (Last In First Out) usando Array e TList. Demonstra ainda a técnica do uso de Arrays em um TList.

61

Type TInfo = Record Nome : String; End; PInfo = ^TInfo; //============================================================= ================= // Coloca itens na lista //============================================================= ================= Procedure PushItem(List:TList; Nome:String); Var Info : PInfo; Begin New(Info); Info.Nome := Nome; List.Add(Info); End; //============================================================= ================= // Retira o ultimo item da lista //============================================================= ================= Procedure PopItem(List:TList; Var Nome:String); Begin If List.Count>0 then Begin Nome := PInfo(List[List.Count-1]).Nome; Dispose(PInfo(List[List.Count-1])); List.Delete(List.Count-1); End Else Begin Nome := ''; End; End; //============================================================= ================= // Retorna um item a partir de sua posicao //============================================================= ================= Procedure GetItem(List:TList; Var Info:PInfo; RecordNumber:Integer); Begin Info := PInfo(List[RecordNumber]); End; //============================================================= ================= // Cria o objeto de lista //============================================================= =================

62

Procedure CreateList(Var List:TList); Begin If not Assigned(List) then List := TList.Create Else List.Clear; End; //============================================================= ================= // Destroi a lista e remove os ponteiros //============================================================= ================= Procedure DestroyList(List:TList); Var I : Integer; Begin for i := 0 to List.Count-1 do Dispose(PInfo(List[i])); List.Free; End; //============================================================= ================= // Exemplo de Uso da lista //============================================================= ================= procedure TForm1.Button1Click(Sender: TObject); Var List : TList; i : Integer; Info : PInfo; Nome : String; begin CreateList(List); // Empilha itens PushItem(List,'Adenilton'); PushItem(List,'Ana'); PushItem(List,'Roberto'); PushItem(List,'Marta'); PushItem(List,'Silvia'); PushItem(List,'Pedro'); // Remove itens comecando pelo ultimo inserido PopItem(List,Nome); ShowMessage('Retirando '+Nome+' da lista '); PopItem(List,Nome); ShowMessage('Retirando '+Nome+' da lista '); PopItem(List,Nome); ShowMessage('Retirando '+Nome+' da lista ');

63

except Application. // Destroi a lista DestroyList(List). valor: string. begin With TRPBars2of5. PrintXY(1. Text := '27596000000000000000902900000124000341010150'. var coluna. Gerar planilhas no Excel através de uma Query Procedimento que recebe um Query e gera um planilha do Excel. excel: variant.RvSystem1Print(Sender: TObject). end.PushItem(List. BarWidth := 0. excel. procedure GerarExcel(Consulta:TQuery). Free.5. linha: integer.1).Application'). begin try excel:=CreateOleObject('Excel.add(1). Rave Report . WideFactor := BarWidth. end.Count-1 downto 0 do Begin GetItem(List. // Mostra os demais Itens de baixo para cima for i := List.Workbooks. end.'Carlos').Nome).Info. End.065.Create(Sender as TBaseReport) do Begin BarHeight := 1. ShowMessage(Info.Imprimindo código de barras em modo de programação // Uses rpBars procedure TForm1.i).MessageBox ('Versão do Ms-Excel'+ 64 .

apontando para seu DataView . Consulta.MB_OK+MB_ICONEXCLAMATION).coluna]:=valor.Fields[coluna-1].'Incompatível'. Adicione um componente DataText e configure sua propriedade DataField apontando para a variável que recebeu o valor no item acima. excel. excel. Consulta.cells [linha+2.Fields[coluna-1].MB_OK+MB_ICONEXCLAMATION). end.'Erro'. 2. Adicione um CalcOp em sua banda de totalização. Para utilizar. try for linha:=0 to Consulta.CalcType.AutoFit.cells[1. // esta linha é para fazer com que o Excel dimencione as células adequadamente. uma variável criada na propriedade PIVars da "page" . end.MessageBox ('Aconteceu um erro desconhecido durante a conversão'+ 'da tabela para o Ms-Excel'. faça o seguinte: 1. Rave Report .Controller. end. for coluna:=1 to Consulta. end.FieldCount do // eliminei a coluna 0 da relação do Excel begin valor:= Consulta.DataView.Next.visible:=true. Configure suas propriedades: . ctSum 3.Somar valores Existe um componente chamado "CalcTotal" o qual faz praticamente as mesmas operações que o QRExpr.DestPIVar. campo a ser totalizado .columns. end.RecordCount-1 do begin for coluna:=1 to Consulta. banda "detalhe" . o será efetuada a soma do campo e apresentado no referido DataText. excel. end.DisplayLabel.First.DataField.coluna]:=valor. excel. except Application.FieldCount do // eliminei a coluna 0 da relação do Excel begin valor:= Consulta.'Erro'. 65 .AsString. Com isso.

FormCreate(Sender: TObject).ActiveControl is TForm then Exit.ActiveControl).Showing) then begin ControlaCor. end. end. end.Cor := TComboBox(Screen.ActiveForm do begin TComboBox(ControlaCor.ColorControl(Sender: TObject). end.OnActiveControlChange := ColorControl. ControlaCor: TControlaCor. {Procedure que altera a cor} procedure TForm1.Preservando sua cor original public procedure ColorControl(Sender: TObject).Objeto).ActiveControl.ActiveControl).Colorir componente focado . ControlaCor.Color. begin if Screen.Objeto = Nil) or (not TComboBox(ControlaCor. 66 . begin Screen.Color.Objeto := Screen.Objeto := Screen. end. With Screen.ActiveControl). Cor: TColor. type TControlaCor = Record Objeto: TComponent.ActiveControl. TComboBox(Screen. var Form1: TForm1.Color := ControlaCor.Cor := TComboBox(Screen.Color := clInfoBk end. implementation {$R *.dfm} procedure TForm1. if (ControlaCor. ControlaCor.Objeto). ControlaCor.Cor.

Table1Capital: TStringField.Envia valor para Edit que tiver em foco Verifica se o componente que está com o foco é da classe do TEdit.procedure TForm1.Enabled := False.FormClose(Sender: TObject.SpeedButton1Click(Sender: TObject).DFM} { Agora criamos os Objetos e configuramos suas propriedades } procedure TForm1. Table1Population: TFloatField. Button1. var Form1: TForm1. trocando a propriedade Text utilizado neste exemplo pela propriedade do outro componente. Funciona para outros componentes. se for envia um Texto para esse componente. begin Table1. ActiveControl .Button1Click(Sender: TObject).OnActiveControlChange := Nil. begin Screen. TFields . begin if (ActiveControl is TEdit) then (ActiveControl as TEdit). Button2. 67 . { Public declarations } end. Table1Area: TFloatField. procedure TForm1. var Action: TCloseAction).Enabled := True.Text := 'Teste'. end. end.Close.Adiciona Fields no Fields Editors em tempo de execução { Primeiramente temos que ter declarado as variáveis onde serão criado os Objetos Fields. implementation {$R *. Table1Continent: TStringField. } public Table1Name: TStringField.

Enabled := True. { Um simples exemplo de como configurar a máscara via programação } procedure TForm1.Table1Name := TStringField.FieldName := 'Capital'. { Aqui destruimos todos os objetos Fields criados } procedure TForm1. Table1Capital.FieldName := 'Name'. Button1. Table1Population := TFloatField.Button2Click(Sender: TObject). Table1Continent. Table1Capital.Button3Click(Sender: TObject).FieldKind := fkData.Create(Table1). Table1Area. Button2.###.Size := 24.DataSet := Table1.Free. Table1Name. 68 .Create(Table1).FieldName := 'Continent'. Table1Continent. Table1Capital := TStringField.Free. Table1Area. Table1Name. end. Table1Area.Create(Table1).DisplayFormat := '###. Table1Continent := TStringField.Create(Table1).FieldKind := fkData.Close.Open. Table1Area.Close. Table1Population.Free. Table1Name. Table1. Table1Continent.Size := 24.DisplayFormat := '###.FieldKind := fkData.Create(Table1).Free.FieldName:= 'Population'. Table1Capital.DataSet := Table1. Table1Name. end.###.Enabled := False.Size := 24.DataSet := Table1.Open. Table1Name. Table1Population.DataSet := Table1. begin try Table1. Table1. Table1Capital.Free.##0'.FieldName := 'Area'. Table1Capital.##0'. Table1Continent. Table1Population. Table1Population. begin Table1. Table1Area := TFloatField.DataSet := Table1. Table1Continent.

69 .Open. end. Rect: TRect. end. K. *** Alterar a propriedade Style para onDrawVariable Associando um extensão de arquivo a um executável { é necessário declarar a unit abaixo } Registry procedure CriaChave(const Chave.Font.Font.Create.Color := clYellow. Index: Integer. NomeApp). Ext: string).WriteString(Nome.Items[Index]) > 5 then begin ListBox1. ListBox1. ListBox1.Table1. ListBox1.Colorir procedure TForm1.Canvas. Valor).ListBox1DrawItem(Control: TWinControl.Top.OpenKey(Chave.Items[Index]). except ShowMessage('Adicione os campos. procedure CriaAssociacao(const NomeDoc.Left. State: TOwnerDrawState). K. NomeEXE. true). Listbox1. Rect.Free. finally K.. begin K := TRegistry. end. ListBox1.Brush.Style := [fsBold].Canvas.Canvas.RootKey := HKEY_CLASSES_ROOT. NomeApp.FillRect(Rect). begin CriaChave(NomeDoc. end.Canvas. Valor: string). NomeIcone.Color := clBlue. end.Canvas.TextOut(Rect. ‘’. ListBox .') end. begin if StrToInt(ListBox1.. var K: TRegistry. Nome. try K.

GetKeyNames(ListBox1. EdNome.‘’. NomeIcone). finally 70 . begin Button1.DFM} { Evento OnShow do Formulário } procedure TForm1. Reg.Text. Retornar as contas de E-Mail Nesta dica iremos demonstrar como obter as contas de email registradas na Máquina. // EdEXE. finally Button1. Try // EdDoc.Text. Reg. end. procedure TForm1. verificando as informações armazenadas do registrador do Windows.exe // EdExt. CriaChave(NomeDoc+‘\shell\open\command’. try Reg.Text = Nome do programa Exemplo:NotePad // EdExe. {$R *. end.Text = Ícone Exemplo: // c:\windows\notepad.Text). var Reg: TRegistry. implementation uses Registry.Text = Nome do arquivo Exemplo: Doc01 // EdNome..xxx // CriaAssociacao(EdDoc.Items). end.Text..Button1Click(Sender: TObject).CriaChave(Ext. begin Reg := TRegistry.Text.Text = Executável Exemplo: // c:\windows\notepad.Create. CriaChave(NomeDoc + ‘\DefaultIcon’. False).‘’. NomeDoc).Text = Extensão Exemplo: . Neste exemplo iremos utilizar um componente TListBox e um TButton.exe %1 // EdIcone.Enabled := true.Enabled := false.NomeEXE). EdIcone. EdExt.FormShow(Sender: TObject).OpenKey(‘\Software\Microsoft\Internet Account Manager\Accounts’. ‘’.RootKey := HKEY_CURRENT_USER.

Reg := TRegistry. OpenKey(RamosInformatica\curso\teste'. Free.ValueExists(‘SMTP Server’) then ShowMessage( ‘O SMTP da conta selecionada é :’+#13+ Reg.Reg. begin if ListBox1.CloseKey. end.ItemIndex = -1 then Exit.CloseKey. sKey := ‘\Software\Microsoft\Internet Account Manager\Accounts\’. { evento OnClick do TButton } procedure TForm1. try Reg. HKEY.Free.Create.'Teste Teste').Free. end. sKey := sKey + ListBox1. Registry implementation uses registry.RootKey := HKEY_CURRENT_USER. WriteString('Teste_Reg1'. sKey : String. var Reg: TRegistry. end. { Atribui um informacao para o Registry } procedure TForm1. True).Items[ListBox1.ItemIndex]. Reg. Reg. With TRegistry.Create.Create do begin RootKey:= HKEY_USERS. end. 71 . if Reg. finally Reg.BitBtn2Click(Sender: TObject). Reg.ReadString(‘SMTP Server’) ) else ShowMessage(‘SMTP não existe para esta conta’). end. begin Reg := Tregistry. Var Reg : TRegistry. False).Button1Click(Sender: TObject).OpenKey(sKey.

Criar e ler chave procedure TForm1. end. if Reg. { Recupera um valor do Registry } procedure TForm1. Reg: TRegistry.. Reg. With TRegistry.True) then { Cria ou Abre a chave principal } begin Reg.free.Button1Click(Sender: TObject). OpenKey('Ramosinformatica\curso\teste'. 72 . True).Create do begin RootKey:= HKEY_USERS.ReadString('(Padrão)'). { Cria Sub-Chave dentro de RamosDaInformatica} Reg. Reg.') end else ShowMessage('Erro na criação da Chave.').Openkey('RamosDaInformatica'. // S := Reg. end. S: String..CreateKey('Empresa'). Reg.RootKey := HKey_Classes_Root. begin Reg := TRegistry. { Cria Sub-Chave dentro de RamosDaInformatica} ShowMessage('Chave Criada. //Lê informações da Empresa cadastrado na máquina procedure TForm1.Create. Caption := ReadString('Teste_Reg1').end.Create. begin Reg := Tregistry.Button1Click(Sender: TObject). Var Reg : TRegistry. end. Value : string.RootKey := HKEY_LOCAL_MACHINE.CreateKey('Chave'). var Info: TRegDataInfo.Create.BitBtn7Click(Sender: TObject)... Free. var Reg: TRegistry. begin Reg := TRegistry.

i. t: integer. if tmp.RootKey := HKEY_LOCAL_MACHINE. false).Create. Reg. Reg. Memo1.Free. Reg.: ' + Reg. Reg. FALSE) then Reg.Create. Retornar lista de hardware via registry var Reg: TRegistry.GetKeyNames(Chs).Add(tmp.Text). begin Chs := TStringList.Add('---> ' + Chs[i]). tmp := TStringList.if not Reg.Count = 0 then Reg. Reg := TRegistry..ReadString('RegisteredOwner').Free.RootKey := HKEY_LOCAL_MACHINE.Free.Create.Caption := 'Usuario.Caption := 'Empresa.Lines. Info).Lines.GetDataInfo('RegisteredOrganization'.Free.OpenKey('hardware\devicemap\' + Chs[i].GetKeyNames(tmp).OpenKey('\SOFTWARE\Microsoft\Windows\CurrentVersion'. Reg. {$R *. Reg. for i := 0 to Chs. tmp: TStringList... end.CloseKey. Memo1. Chs.Add('------------------------').Lines.ReadString('RegisteredOrganization').DFM} 73 . Reg.OpenKey('hardware\devicemap\'. end. Label1.GetValueNames(tmp). Reg := TRegistry. end.Count -1 do begin Reg. Chs. false).: ' + Reg.. Label2. Memo1. Reg. tmp. Verificar se um valor existe dentro de uma Chave implementation uses Registry.Create.

RootKey := HKEY_LOCAL_MACHINE.Items. end. end.Selecionando itens do ComboBox para PapeSize procedure TForm1.Page.Page.Items. False). 74 . ListBox .Items[ComboBox1.procedure TForm1. begin //Atribui o item selecionado no ComboBox a prop. PaperSize For i := 1 to ComboBox1.Pesquisa incremental Para fazer uma pesquisa incremental no ListBox você irá precisar também de um componente Edit. begin Reg := TRegistry.Items.Items.Create.Button1Click(Sender: TObject).ADD('Custom').Page.Items[ComboBox1. ComboBox1.ComboBox1Click(Sender: TObject). Reg. ComboBox1. Inclua o código abaixo no evento OnChange do componente Edit. end.ItemIndex] = 'A4' then QuickRep1.Count-1 do begin if ComboBox1.ItemIndex] = 'Letter' then QuickRep1.PaperSize := Letter else if ComboBox1.PaperSize := Custom else if ComboBox1.Items[ComboBox1.ValueExists('DSQUERY') then Showmessage('Existe!').PaperSize := A4.OpenKey('\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo\'.ItemIndex] = 'Custom' then QuickRep1. procedure TForm1.ADD('Letter'). Quick Report . var Reg: TRegistry. begin // Atribui os nomes ao ComboBox ComboBox1.ADD('A4'). var i : integer. Reg.FormCreate(Sender: TObject). if Reg. end.

Confirme se este diretório já está criado.count-1 do begin DBGrid1. end. QuickReport .Edit1Change(Sender: TObject). procedure TForm1. begin WinExec(PChar(‘net time ‘ + ServerName +’ /set /yes’). procedure AcertaHora(ServerName: String).ItemIndex] <> Edit1.ItemIndex := -1.255] of char.Text).ItemIndex < 0) or (ListBox1.Access Violation no Windows 2000 e XP Ocorre devido ao tamanho do caminho do diretório temporário do Windows. var I: integer. 0). end.Text) then ListBox1. Altere o caminho da variável TMP para um caminho menor. begin for i:=0 to DBGrid1.Items[ListBox1.Columns[i]. DBGrid . if (ListBox1. porém é possível implementar via um utilitário DOS e com isso acertar a data e hora de uma máquina com outra da rede. Edit1. 0. LongInt(@S)). porém com Windows 9x não encontramos APIs com o mesmo efeito. with ListBox1 do ItemIndex := Perform(LB_SELECTSTRING.Color := clBtnFace. begin StrPCopy(S. Acertar data e hora com o servidor No Windows NT/2000/XP existem APIs específicas para obter a data e hora de um Servidor.procedure TForm1.. Vá em Control Panel -> System -> Clique na aba Advanced -> Clique no botão Environment Variables.DBGrid1TitleClick(Column: TColumn). var S: Array[0 .Title. como por exemplo c:\temp.Columns.Alterar as cores do título em tempo de execução. 75 .

end.Font.Lpt.Columns[i]. const PrnStInt : Byte = $17.Title.Font.ah.Title. O parâmetro da função equivale ao número da porta da impressora.Color := clBlack.Title.Title. Column.Style := [ fsBold. begin asm mov ah. Column. Result := (nResult and $80) = $80. 76 . Modo de utilização: if PrinterOK(0) then ShowMessage('Impressora OK') else ShowMessage('Impressora sem papel ou desligada'). fsItalic]. Column. DBGrid1. 0. Int $17.LPT1 1. var nResult : Byte.LPT2 Como implementar um AutoComplete num Edit comum Esta dica vou publicar sem tradução. StRq : Byte = $02. primeiro porque no original é bem melhor e segundo para não haver erros. mov dx.Style := []. end.StRq.Font. end. Testa se a impressora está funcionando function PrinterOK(Lpt: Word): Boolean.Columns[i].Color := clRed.color := ClYellow.Title. mov nResult.DBGrid1. end.Font.

procedure TForm1. listValues[i]) < 0 then begin text := listValues[i].add(edtList.FormDestroy(Sender: TObject).FormCreate(Sender: TObject). i. // Excludes searched portion // Match entered text portion for i := 0 to listValues. procedure TForm1. begin listValues. initialize the list from a database. // cursor position theText := copy(text. or arrows else begin // Search for unselected portion at start of text p := selStart. // No backspace.. var theText: string. Shift: TShiftState). 13. 0. 77 .Duplicates := dupIgnore. listValues. procedure TForm1. // User can enable/disable with edtList do case key of 8. delete.sorted := true. begin listValues. upperCase(listValues[i]))=1 then if compareText(theText. enter.create. p: integer. selStart := p. p). procedure TForm1. ini file etc.text). end. end. 37.// To add auto-complete capability to a TEdit component // 1) Declare a global TStringlist object // 2) Create it on the form create event // 3) Free it on the form destroy event // 4) Add new entry to it on the TEdit exit event // 5) Do the auto-complete on the TEdit keyUp event // 6) Add a TCheckbox control for enable/disable // If desired.edtListExit(Sender: TObject).edtListKeyUp(Sender: TObject.checked then exit. begin listValues := TStringList. 46. listValues.40: . end. begin if not ckbxList.free.count-1 do begin // Keep case of listed item if pos(upperCase(theText). var Key: Word.

Visible := false. 78 . begin StringGrid1.Cells[3. StringGrid1.0] := 'Marcar'.Cells[0. // with end.Cells[4.Width := 0. //é bom não esquecer de limpar controles não utilizados for i := 1 to 4 do begin StringGrid1. // case end.SelLength := length(text) . NovoCheckBox. begin ShowMessage('Aqui').selStart.Cells[1.Caption := 'OK'. //rotina que adiciona os Check end. e um StringGrid. NovoCheckBox. // for end.Cells[3. end. NovoCheckBox.com 5 colunas e 4 linhas. ou qualquer outro objeto.0] := 'Para'. so quit search end.i] := 'c'.Cells[1.Cells[2.CheckBox1Click(Sender: TObject). StringGrid1.Color := clWindow. AdicionarCheckBoxes. Como adicionar um CheckBox em um StringGrig Esta é uma maneira bem simples de adicionar um checkbox.i] := 'b'.Create(Application).FormCreate(Sender: TObject).i] := 'a'.0] := 'Uma Maneira'. num StringGrid Para fazer este exemplo. procedure TForm1. adicione TPanel. // Match found. StringGrid1. procedure TForm1.i] := 'd'.Cells[2. break. StringGrid1. begin limpaBuffer. NovoCheckBox. StringGrid1.0] := 'Simples'. NovoCheckBox: TCheckBox.0] := 'Fazer'. var i: Integer. NovoCheckBox := TCheckBox. StringGrid1.AdicionarCheckBoxes. StringGrid1.Cells[0. no Painel . end. procedure TForm1.

Visible := false. State: TGridDrawState).Left + Rect. 79 .Height := Rect.i] := nil.Rect.Right .Left+2. StringGrid1. end. if NovoCheckBox <> nil then begin Rect := StringGrid1.StringGrid1DrawCell(Sender: TObject.CellRect(4.Objects[4. Rect: TRect.Left.OnClick := CheckBox1. // aqui descobrimos a posição da celula para utilizarmos no check NovoCheckBox. StringGrid1. end.Top. NovoCheckBox. var NovoCheckBox: TCheckBox. end. ACol. // agora vamos alinhar o check na celular end. StringGrid1.Top := StringGrid1. Procedure TForm1.Rect.Visible := True. //Associar um evento OnClick já existente para o Novo CheckBox NovoCheckBox.RowCount do begin NovoCheckBox := (StringGrid1. NovoCheckBox.i). end.Left := StringGrid1.Limpabuffer. var NovoCheckBox: TCheckBox.NovoCheckBox. procedure TForm1.i] := NovoCheckBox. begin for i := 1 to StringGrid1.Objects[4.OnClick.Objects[4. Rect: TRect.i] as TCheckBox). if NovoCheckBox <> nil then // o objeto deve existir para poder ser destruído begin NovoCheckBox.Parent := Panel1. i: Integer. begin for i := 1 to StringGrid1. end.RowCount := i.Top+2.Bottom .i] as TCheckBox). NovoCheckBox.Top + Rect.Tag := i. NovoCheckBox.RowCount do begin NovoCheckBox := (StringGrid1. NovoCheckBox. AlinhaCheck. ARow: Integer.Width := Rect.Objects[4. i: Integer. end. Procedure TForm1.AlinhaCheck. end.

Result := ''. Delete(Nome. i . das. dos. Abreviação automática de nomes Abrevia nomes extensos pegando a primeira letra do nome e acrescentando ponto no final. i := Pos(#32. function AbreviaNome(Nome: String): String. end. Ótimo para impressão de etiquetas. if i > 0 then begin TotalNomes := 0.1). exceto o último. Result := Trim(Result).. i.} for i := 2 to TotalNomes . if TotalNomes > 2 then begin {Abreviar a partir do segundo nome. da. Nome). end. TotalNomes: Integer. Nome). {Pega a posição do primeiro espaço} i := Pos(#32.)} if Length(Nomes[i]) > 3 then {Pega apenas a primeira letra do nome e coloca um ponto após. 1.} Nomes[i] := Nomes[i][1] + '. end. 1. etc. for i := 1 to TotalNomes do Result := Result + Trim(Nomes[i]) + #32. do. {Separa todos os nomes} while i > 0 do begin Inc(TotalNomes).20] of string. {Insere um espaço para garantir que todas as letras sejam testadas} Nome := Nome + #32. var Nomes: array[1. Nomes[TotalNomes] := Copy(Nome.1 do begin {Contém mais de 3 letras? (ignorar de. 80 . begin Nome := Trim(Nome).'. Result := Nome.begin if not (gdFixed in State) then AlinhaCheck. end. i).

dfm (definicoes do formulario). constructor create(aowner:tcomponent). end.frm).button1click(sender:tobject). end. application.forms. end.height div 2)-height div 2.initialize. top:=(screen. begin application.pas (o programa propriamente dito) e teste. você precisará criar dois arquivos : teste. crie o programa teste. Primeiro. end. type tfrm = class(tform) button1 : tbutton. begin inherited create(aowner). Compilando a aplicação pelo MS-DOS Apenas a título de curiosidade. {$R *.run. procedure button1click(sender:tobject).caption:='Clique'.end.width div 2)-width div 2. left:=(screen. ------------------------------------------------------- 81 .create(aowner:tcomponent). constructor tfrm.dfm. ARQUIVO: teste.caption = 'Clique' then button1.override.createform(tfrm.pas ------------------------------------------------------program teste. end. Para fazer o programa.stdctrls.pas e teste. usando somente o compilador do Delphi utilizado na linha de comando (dcc32) e o prompt do dos.dfm} var frm : tfrm. uses windows.classes. application. este texto explica como criar um programa em Delphi a partir do zero. procedure tfrm.caption:='Aperte' else button1.sysutils. begin if button1.

for coluna := 0 to 255 do with Canvas do begin Brush. (coluna + 1) * altura)) . Você terá. end.exe. 0. etc e etc.FormPaint(Sender: TObject). alinhamento. 82 . coluna: Word. 0). end. coluna * altura. ClientWidth. Para compilar. que é nada mais que o seu projeto compilado. Caso você queira alterar cor.dfm ------------------------------------------------------object frm: tfrm width = 350 height = 290 caption = 'programa teste' object button1: tbutton caption = 'Clique' left = 20 top = 20 width = 100 height = 30 onclick = button1click end end ------------------------------------------------------Pense no arquivo . { Modifique para obter cores diferentes } FillRect(Rect(0.Color := RGB(coluna. end.dfm como se fosse a janela de propriedades do objeto. procedure TForm1. etc. um arquivo chamado teste.FormResize(Sender: TObject). é só colocar no . simplesmente digite na linha do prompt : dcc32 teste Pronto.dfm. begin Invalidate.ARQUIVO: teste. begin altura := (ClientHeight + 255) div 256. no mesmo diretório. var altura. Coloração gradiente no Form procedure TForm1.

interface 83 .Oeste . abaixo segue de novo um exemplo de como colocar um codigo para que a aplicacao feche apos XX segundos sem atividades no teclado ou sem cliques do mouse.Ligar a DataSource da Tabela ao qual vai receber o valor do registro selecionado. Nao esquecer de colocar o timer. De qualquer forma apesar de ter postado no forum a resposta que recebi de outro camarada. pois é este campo que manterá os valores iguais entre as duas tabelas. O campo de ligação entre as duas tabelas pode ser um campo código.Ligar o campo de ligação entre as duas tabelas.Ligar a DataSource da Tabela ao qual vai Ter o registro selecionado. As propriedades necessárias para a utilização são: DataSource . Como colocar um codigo para que a aplicacao feche apos XX segundos sem atividades no teclado ou sem cliques do mouse. DataField . Este codigo deve ser colocado no Form principal e fazer os devidos ajustes. mas depois que consegui a resposta ninguem mais comentou sobre o assunto.Ligar o campo que será listado quando o usuário abrir a janela para seleção do registro. ao qual vai receber o valor do registro selecionado.Ligar o campo de ligação entre as duas tabelas. enviei uma duvida no forum do Ramos e nao esperava ter tido tanta discussao. ListField . Olá Ramos. ao qual terá o seu valor enviado para gravação. ListSource . KeyField .SC e ele tambem havia encontrado na Net unit Unit1. Esta dica foi enviada por Cristiano Menusi.Usar perfeitamente o LookupComboBox O componente DBLookupComboBox é utilizado para seleciona registros de uma tabela e gravar em outra tabela.

begin Timer1. end. procedure FormCreate(Sender: TObject). end.WM_KEYDOWN :Timer1. Dialogs. 84 . begin Case Msg. implementation {$R *. type TForm1 = class(TForm) Timer1: TTimer.Enabled := False. var Form1: TForm1. var Done: Boolean). Classes. var Handled: Boolean). end.Enabled := True. Forms.uses Windows. Messages. begin Application. public { Public declarations } end.FormCreate(Sender: TObject).OnIdle := AppIdle.AppMessage(var Msg: TMsg. private procedure AppIdle(Sender: TObject.DFM} { TForm1 } procedure TForm1. procedure TForm1. procedure AppMessage(var Msg: TMsg.WM_RBUTTONDOWN. Graphics.Timer1Timer(Sender: TObject). Application. procedure Timer1Timer(Sender: TObject). Controls.message of WM_LBUTTONDOWN. procedure TForm1.Terminate. begin Application.AppIdle(Sender: TObject. var Handled: Boolean). var Done: Boolean). ExtCtrls. SysUtils. procedure TForm1.OnMessage := AppMessage. end. end.

ToolWin. ExtDlgs. type TFrm_Menu = class(TForm) MainMenu1: TMainMenu. DBITypes. Coloque esta rotina no menu principal de seu sistema. Mask.Buttons. DBIErrs. Forms. Classes. Pega todos os erros do Sistema. implementation //------------------------------------// //.. Menus.Rotina de manipulaco de erros // //------------------------------------// 85 . if Jan <> 0 then ShowWindow(Jan. captura tela do erro. Messages.SW_Hide). ExtCtrls. public { Public declarations } end. DB. E: Exception). Dialogs. DBIPROCS. jpeg. ComCtrls. ImgList. DBTables.Escondendo a barra de tarefas do Windows var Jan: HWnd. Controls. begin Jan:= FindWindow(Nil. var Frm_Menu: TFrm_Menu. Gauges. PRIVATE { Private declarations } Procedure ManipulaExcecoes(Sender: TObject. grava em arquivo e envia por e-mail Como montar uma rotina para pegar todos os erros do sistema e capturar tela do erro e gravar em arquivo para futura inspecao ou envio por e-mail. SysUtils. end. interface uses Windows. Graphics. StdCtrls. unit Form_Menu.'Nome_do_projeto')..

Message + #13#13 +'Suporte técnico:'#13 +'aceinfo@starknet. if (flags and INTERNET_CONNECTION_LAN) = INTERNET_CONNECTION_LAN then ShowMessage('LAN'). begin Result := InternetGetConnectedState(@flags. if (flags and INTERNET_CONNECTION_PROXY) = INTERNET_CONNECTION_PROXY then ShowMessage('Proxy').ManipulaExcecoes(Sender: TObject. var flags: DWORD.DFM} procedure TFrm_Menu. end.Screen. Detectando o tipo de Conexão com a internet uses Wininet function ConnectionKind: Boolean.OnException := ManipulaExcecoes..Create. [mbOK]... Begin Application.SaveToFile(ExtractFilePath(Application.0.Procedure TFrm_Menu.ExeName)+'erro. BitMap := TBitmap.bmp') . if Result then begin if (flags and INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM then ShowMessage('Modem'). {$R *. Var BitMap : TBitmap.com. E: Exception).Captura e salva a tela atual do erro. BitMap := CaptureScreenRect(Bounds(0.FormCreate(Sender: TObject)..br'. BitMap. //.Free. BitMap. end. End. 0).mtError. 0).Screen.Width. if (flags and INTERNET_CONNECTION_MODEM_BUSY) = INTERNET_CONNECTION_MODEM_BUSY then 86 .Height)).Messagem de erro do sistema MessageDlg(E. Begin //.

expoente: real ):real.Button1Click(Sender: TObject). end. (pz/30) ) //Resultado 1.050. pois as funções financeiras costumam ser bem extensas. end. Var i : Integer. no excel a Pot é substituída pelo sinal ^ Ex.00 end. var i: Real.Juros Segue abaixo uma função para efetuar a potenciação. procedure TForm1. // valor base para calculo do valor futuro. end. Para trocar as cores dos botoes do radiogroup No Object Inspector na propriedade Font coloque a cor verde. begin ConnectionKind. // taxa de juros valor: Real. É útil para compor formulas financeiras.00 pz := 30 Result:= valor*( Pot( (1+i). // Potenciação begin { utiliza a função de exponencial e de logaritmo } Result:= Exp((expoente * Ln( base ))). Função de potenciação . procedure TForm1. como a de VP ("PV" valor presente) VF ("FV" valor futuro) Exemplo: Calcular o valor de um produto para o prazo de 30 dias com a taxa de juros de 5% mês. Dica: Não amplie o nome da função.ShowMessage('Modem Busy'). =E18*((1+C19)^(C20/30)) Function Pot( base. valor:= 1000. end.RADIOGROUP1Click(Sender: TObject). 87 . pz: Integer // prazo em dias begin i := 5//100.

p: pByteArray. end. begin try BytesPorScan := Abs(Integer(BMP. Como criar uma figura do tipo marca d' água procedure TForm1.ScanLine[1]) Integer(BMP.Font.Style := [fsBold]. for y:=0 to image1. end.canvas. for w := 0 to BytesPorScan .Style := [fsBold].ItemIndex]). TRadioButton(RADIOGROUP1. Criptografando Imagens procedure cripto(const BMP: TBitmap.ScanLine[0])).Font.y]:=clWhite.width-1 do begin if (x mod 2)=(y mod 2) then image1.Height .Items.style := bsClear.Button1Click(Sender: TObject). end.pixels[x.ScanLine[h]. TRadioButton(RADIOGROUP1. w. except raise Exception. RandSeed := Key. Y : Integer.1 do 88 .Controls[RADIOGROUP1. TRadioButton(RADIOGROUP1.Controls[RADIOGROUP1. for h := 0 to BMP.height-1 do for x:=0 to image1.Font.begin // Para trocar as cores dos botoes do RadioGroup for i := 0 to RADIOGROUP1.Color := clRed.1 do begin P := BMP. Key: Integer). h: integer. end. begin brush.Controls[i]). var X.Font. end.Color := clGreen.Count-1 do begin TRadioButton(RADIOGROUP1.Create('Erro !').ItemIndex]).Controls[i]). var BytesPorScan: Integer.

wParam: Integer). Image1.DefaultDrawDataCell(Rect. No caso.Color := clRed. Ao chamar a rotina passamos como parâmetro o caminho da imagem que no exemplo foi utilizado o componente image e 1 como um valor inteiro para retornamos a imagem normal. DbGrid1.Button1Click(Sender: TObject). 1).pos.Bitmap.Style := [fsBold]. begin cripto(Image1.Titulo(Titulo: Pchar. end. begin DC := GetWindowDC(Handle). procedure Titulo(Titulo: Pchar.Canvas.Refresh. utilize a rotina abaixo no evento OnDrawDataCell: if Tabela. //e declarada na clausua private. State). DbGrid1. Nota: Não é necessário mover o ponteiro da tabela para colorir os registros. logo após a execução da nossa procedure atualizamos o image para que ele possa exibir nossa imagem criptografada.pos.Canvas. end. end.P^[w] := P^[w] xor Random(256). Agora vamos ao evento onclick do Button chamar a nossa procedure cripto.wParam: Integer). R1. somente os registros com salário maior que R$ 10.000. Alterar a fonte de determinado registro num DBGrid Para trocar a fonte de um DBGrid.Value >= 10000 then begin DbGrid1.FieldByName ('Salario'). Alinhar título da barra de titulos do Form a esquerda ou direita //Deve ser usada assim: //Procedure TForm1.Font.Font. end.Picture. 89 . R2: TRect. basta digitar o seguinte código: procedure TForm1. Field. var DC: THandle.00 ficarão com cor vermelha e em negrito.

unit Unit1. Messages. R1.Left .Right .Left := GetSystemMetrics(SM_CXSIZE) + GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXFRAME). StdCtrls. Classes. SysUtils. end. GetSysColor(COLOR_INACTIVECAPTION)).Bottom := R1. Forms. DT_LEFT or DT_VCENTER). R1.Left . type TForm1 = class(TForm) Edit1: TEdit. DC).Right := R2.try SetWindowText(Handle. end. if pos = 1 then begin DrawText(DC. DT_RIGHT or DT_VCENTER). -1. if wParam = 1 then begin SetBkColor(DC. SetTextColor(DC. nil). R1. R1. Dialogs. end. Nestes componentes coloque informações na propriedade Hint de cada componente e altere a propriedade ShowHint para True.R2. -1. end else begin SetBkColor(DC. Titulo. GetWindowRect(Handle. 90 .Top + GetSystemMetrics(SM_CYSIZE). end. end else begin DrawText(DC. R1. R1. R2). GetSysColor(COLOR_ACTIVECAPTION)). Graphics.R1.Top := GetSystemMetrics(SM_CYFRAME). interface uses Windows. GetSysColor(COLOR_CAPTIONTEXT)). finally ReleaseDC(Handle. Titulo.2 * GetSystemMetrics(SM_CXSIZE). Alterar fonte do Hint Para testar este exemplo inclua no seu form alguns componentes. Controls.

var HintInfo: HintInfo). var CanShow: Boolean. HintInfo.HintColor := clWhite.Edit2: TEdit.Size := 18. var Form1: TForm1. end. Edit3: TEdit.Style := [fsBold].OnShowHint := MyShowHint.DFM} // Função que irá alterar a fonte do Hint procedure TForm1. var HintInfo: THintInfo).Components[i] is THintWindow then with THintWindow(Application. procedure FormCreate(Sender: TObject). end. Font. var CanShow: Boolean. Criando arquivo Texto Veja abaixo os passos básicos para criação de arquivos texto: Var 91 . end.ComponentCount . Font.Name := 'Arial'. implementation {$R *. begin // Ativa a função que irá alterar o formato do Hint Application.Canvas do begin Font. var i : integer. // Evento OnCreate do Form procedure TForm1. begin for i := 0 to Application.1 do if Application.MyShowHint(var HintStr: string. private { Private declarations } public { Public declarations } procedure MyShowHint(var HintStr: string. end.FormCreate(Sender: TObject).Components[i]).

End. begin if (Key = Ord('A')) and (ssCtrl in Shift) then begin TMemo(Sender).linha).lines. linha:String. Reset(f). var Key: Word. 92 .linhadecodigo.'Testando'). //fecha o handle de arquivo End. Begin AssignFile(f.'Linha de Código . While not eof(f) do begin Readln(f.txt'). //escreve no arquivo sem descer a linha Closefile(f).txt'). Closefile(f). Key := 0.br'). Shift: TShiftState) .add(linha). end. ///Rotina para ler de um arquivo texto: var f:TextFile. Como selecionar tudo (Ctrl+A) em um TMemo/TDBMemo Você pode selecionar todo o conteúdo de um TMemo ou TDBMemo utilizando as teclas de atalho Crtl+A adicionando no evento OnKeyDownEvent destes componentes o código a seguir: procedure OnKeyDown(Sender: TObject.SelectAll. escreve no arquivo e desce uma linha Write(f. Rewrite(f). end. end.com.'c:\qq_arquivo. O conteúdo lido é transferido para a variável linha Memo1.www.'c:\qq_arquivo. //le do arquivo e desce uma linha. //abre o arquivo para leitura. begin AssignFile(f.F:TextFile. //abre o arquivo para escrita Writeln(f.

'esse Comando não pode ser rodado fora da plataforma NT'. 'esse {Comando não pode ser rodado fora da plataforma NT'. Pronto seu IP. SW_SHOWNORMAL) else MessageBox(Handle. Texto na diagonal e girando Procedure TForm1. SubnetMask e Gateway foram mudados. Mudando a Configuração para DHCP: Crie uma aplicação no Delphi.Button1Click(Sender: TObject).Mudando o IP da máquina via API do Windows {Como posso mudar meu IP? via API? A resposta para essa pergunta é não neste artigo estou unsando o Delphi 7.168.104 255. {onde verifico se a plataforma do Programa é uma plataforma NT. mas pode ser feito com qualquer outra versão do delphi. 'NETSH'. MB_ICONWARNING).0 192.1 1'. caso contrário informo ao usuário que esse comando não pode ser rodado fora de uma plataforma NT. menos os DNS: Na mesma aplicação do exemplo acima Ponha outro TButton e no Evento OnClick dele escreva:} if Win32Plataform = VER_PLATAFORM_WIN32_NT then WinExec('cmd /c netsh interface ip set address "Conexão local" static 192. Mudando as Configurações dos IPs da máquina. 'NETSH'. nos Windows 2000 e XP existe um aplicativo chamado NETSH que faz essa mudança para nós sem que precisemos reiniciar o computador.168. 93 . NEW -> Application no FormDesigner ponha um TButton e no evento OnClick escreva o seguinte código:} if Win32Plataform = VER_PLATAFORM_WIN32_NT then WinExec('cmd /c netsh interface ip set address "Conexão local" DHCP'. SW_SHOWNORMAL) else MessageBox(Handle. Para maiores informações sobre o NETSH visite o site da Microsoft: Suporte Microsoft. MB_ICONWARNING).255. bem vamos por a mão na massa e brincarmos um pouco com as configurações de IP.10.10.255.

filename. Rodar videos em um panel begin if opendialog1. 94 . Height div 2. Criar um alias dinamicamente na memória procedure TForm1.open.$00090009). end. tf.Free. tf : TFont.ExeName). begin if not Session. @lf).IsAlias(‘Teste’) then session.Perform (wm_lbuttondown. end.Canvas do begin Font. //Sleep(10). GetObject(tf.Name := 'Verdana'. lf. 'Ramos da Informática'). tf := TFont. end. i : integer.’PARADOX’).Create.Handle := CreateFontIndirect(lf). Form1.execute then begin mediaplayer1. end.Size := 16.Handle. end.FormCreate(Sender: TObject). begin with Form1. Font. tf.Perform (wm_lbuttonup.lfEscapement := i.Assign(tf). Este pode cria um Delay na execução end.Font. mediaplayer1. tf.$00090009).AddStandardAlias(‘Teste’.TextOut(200.Canvas. For i:= 50000 Downto 1 do Begin lf.var lf : TLogFont. mediaplayer1.0. mediaplayer1. ExtractFilePath(Application.lfOrientation := 1000.0. sizeof(lf).Assign(Font). Form1.filename:= opendialog1.Canvas.

Handle.AsString = 'North America') and (DataCol = 1) then begin gridCountry. DBGrid . acompanha o código abaixo: { constantes para o alinhamento } const FmtCentered = DT_SingleLine or DT_VCenter or DT_NoClip or DT_Center.FillRect(Rect).Como colocar uma coluna do DBGrid em maiuscula procedure TForm1. DrawText(gridCountry. R. R := Rect.AsString). Estamos utilizando a tabela COUNTRY do alias DBDemos e verificamos o conteúdo do campo Continent. var Key: Char).Canvas. State: TGridDrawState).SelectedField. begin if DBGrid1.DFM} procedure TForm1.AsString). PChar(Column. FmtLeft. DataCol: Integer. Column: TColumn. implementation implementation {$R *. var Format: integer. end.gridCountryDrawColumnCell(Sender: TObject.Color := clGreen.Alinhando texto conforme condição Aqui iremos demonstrar como colorir e alinhar o texto de uma coluna do DBGrid com base em uma condição. FmtRight = DT_SingleLine or DT_VCenter or DT_NoClip or DT_Right. o qual será ‘redesenhado’ através da API DrawText.Field.Font.AsString = 'South America') and (DataCol = 1) then begin 95 . Format). R: TRect.Canvas. const Rect: TRect. begin if (tabCountryContinent. FmtLeft = DT_SingleLine or DT_VCenter or DT_NoClip or DT_Left. { poderá utilizar: FmtCentered. FmtRight } gridCountry. end. Format := FmtRight.Field. Este tratamento será feito no evento OnDrawColumnCell do próprio DBGrid.Canvas. Caso seja ‘North America’ iremos mudar a cor da fonte para verde e o alinhamento do texto para direita. if (tabCountryContinent. Length Column.FieldName='NOME' THEN Key := AnsiUpperCase(Key)[Length(Key)].DBGrid1KeyPress(Sender: TObject.

end. R := Rect. Rect. alterna o valor True/False } if Column.FillRect(Rect). Length Column.Top+1.Draw(grdExemplo.grdExemploDrawColumnCell(Sender: TObject. No evento OnDrawColumnCell verificamos se a coluna atual é ‘situacao’ e conforme o valor do referido campo desenhamos a imagem correspondente.FieldName = 'Situacao' then begin 96 . DBGrid .Field.FieldName = 'Situacao' then begin grdExemplo.AsString).Field.IsNull then if cdsExemploSituacao. PChar(Column. Column: TColumn. Neste exemplo iremos codificar os eventos: OnDrawColumnCell.Canvas. Rect. DataCol: Integer. begin { Quando clicar.Canvas. R. end.Left+10.Left+10. State: TGridDrawState). E finalizando. Rect. OnCellClick e OnEnter do DBGrid. procedure TForm1.Top+1. end. Format). Format := FmtCentered. FmtRight } gridCountry.Canvas.Canvas. 1). o campo lógico possui o nome de ‘situacao’. Rect. além ainda de um componente ImageList que será responsável em armazenar e fornecer as imagens que serão desenhada referida coluna.gridCountry. begin { Desenha CheckBox } if Column. if not cdsExemploSituacao.Draw(grdExemplo. DrawText(gridCountry.Draw(grdExemplo. end.Color := clRed.Top+1.grdExemploCellClick(Column: TColumn). const Rect: TRect.Canvas.AsString).Colocando CheckBox no grid Frequentemente e-mail de nossos visitantes sobre como colocar um CheckBox em uma coluna referente um campo lógico apresentada no DBGrid. Imagens. Rect.AsBoolean then Imagens. No evento OnCellClick permitimos a alteração do valor do campo que. { poderá utilizar: FmtCentered.Left+10.Handle. Neste exemplo. Rect. 2) else Imagens.Canvas. 0). Aqui irei demonstrar uma abordagem bem simples que ‘desenha’ uma imagem que irá imitar um CheckBox e caso o conteúdo do campo seja verdadeiro. mostraremos uma imagem ‘checada’ e do contrário uma imagem ‘desmarcada’.Font. no evento OnEnter do DBGrid efetuamos um tratamento para não permitir a edição ‘direta’ na coluna referente o campo lógico. quando estiver = true irá receber false e vice-versa. FmtLeft. procedure TForm1.FillRect(Rect).Canvas.

[dgEditing] else Options := Options + [dgEditing].Cursor := crHourglass. procedure TForm1. procedure TForm1.AsBoolean. InReplace: string) . var X. []) .grdExemploEnter(Sender: TObject). ToEnd := length(Text) . end. begin { Não permite edição na célula do CheckBox } with grdExemplo do begin if SelectedField = cdsExemploSituacao then Options := Options . end. begin cdsExemploSituacao. 97 . ToEnd.AsBoolean := not cdsExemploSituacao. procedure TForm1. X := FindText(inSearch. cdsExemploSituacao.Edit. SelLength := length(inSearch) .Cursor. SelText := InReplace. X. X := FindText(inSearch. oldCursor : TCursor. while X <> -1 do begin SetFocus. Screen. Tenha certeza que você tem o RichEdit1 em seu Form1. RichEdit .State = dsBrowse then cdsExemplo. begin oldCursor := Screen.cdsExemploNewRecord(DataSet: TDataSet). end.RearchAndReplace (InSearch. ToEnd : integer.Como fazer uma pesquisa e substituição em um RichEdit O código abaixo procurará por uma string e a substituirá.AsBoolean := True. SelStart := X.if cdsExemplo. with RichEdit1 do begin X := 0. end. end.

CtlRgn: THandle. end. ReplaceText) . RearchAndReplace(SearchText. CtlY: Integer. var SearchText.ClientWidth) div 2. ReplaceText: string..ClientHeight .X + length(InReplace). ClientRgn. if (AControl is TWinControl) or (AControl is TGraphicControl) then with AControl do begin if Visible then begin 98 . A. Y + ClientHeight).} implementation {.MakeTransparent. CombineRgn(FullRgn.. FullRgn := CreateRectRgn(0. ToEnd.1 do begin AControl := Controls[A]. Height). procedure TForm1. for A := 0 to ControlCount . procedure UndoTransparent. Width. Y := Height . ReplaceText := ‘Delphi’. X.Margin. Y. end. X + ClientWidth. begin SearchText := ‘Pascal’. ClientRgn := CreateRectRgn(X.} procedure TForm1. Margin.Cursor := oldCursor.Button1Click (Sender: TObject) . {. end. var AControl: TControl. end. ClientRgn. begin Margin := (Width . Y. RGN_DIFF).. end. procedure MakeTransparent. 0. TForm .. CtlX. []) .Criando formulários transparentes private { Private declarations } FullRgn. FullRgn. X := Margin. Screen.

CtlY.Button1Click(Sender: TObject). Para usar: // Teste: procedure TForm1. FullRgn. FullRgn. O exemplo a seguir mostra como ordenar os itens em ordem alfabética baseado nos nomes. pode usar o código abaixo.UndoTransparent.Ordenando os itens Quando você está trabalhando com um objeto TList e quer ordenar os itens baseados um critério seu. Height). CtlRgn := CreateRectRgn(CtlX. onde TMyListItem é definida como: type TMyListItem = record Points : Integer. True). RGN_OR). Name: string[255] . SetWindowRgn(Handle. 99 . end.CtlX := X + Left. CombineRgn(FullRgn. Width. end. Ele assume que a lista contém apenas referências para as variáveis do tipo TMyListItem. 0. CtlY := Y + Top. end. end. FullRgn. A função CompareNames faz as comparações entre os objetos da lista. CombineRgn(FullRgn. begin MakeTransparent end. SetWindowRgn(Handle. A lista é ordenada quando o usuário clicar no botão. end. TList . RGN_COPY). FullRgn. begin UndoTransparent end. CtlX + Width. CtlY + Height).Button1Click(Sender: TObject). True). CtlRgn. begin FullRgn := CreateRectRgn(0. FullRgn. end. procedure TForm1. procedure TForm1.

Button1Click (Sender: TObject) . begin ExitWindowsEx(EWX_FORCE and EWX_SHUTDOWN.function CompareNames (Item1. and a negative value if Item1 is greater than Item2. //------------.Button1Click(Sender: TObject).Name.Forma 2----------------- 100 . Item2: Pointer): Integer. (Item2 as TMyListItem).0). type TListSortCompare = function (Item1. } 3 formas de dar um shutdown Existem 3 formas distintas de fazer a mesma coisa. 0 if they are equal. Your sorting / comparison function should return a positive value if Item1 is less than Item2.Forma 1----------------- procedure TForm1. end. procedure TForm1. begin Result := CompareText((Item1 as TMyListItem). end.Sort(@CompareNames) .Name) . //EWX_SHUTDOWN para shutdown //EWX_REBOOT para reboot //EWX_LOGOFF para logoff end. begin List1. { Note: the Sort method needs a pointer to a custom function (with the signature below) that indicates how the items are to be ordered. são elas: //------------. Item2: Pointer): Integer.

Controls. private { Private declarations } public { Public declarations } end.exe Example : procedure TForm1. Forms. bEnabled: Boolean) : Boolean. Messages. procedure Button1Click(Sender: TObject). //------------. var Form1: TForm1. Variants. TP : TTokenPrivileges. begin WinExec('shutdown.exe do Windows: run %Windir%\system32\shutdown. begin 101 . StdCtrls. Graphics. type TForm1 = class(TForm) Button1: TButton. Token : THandle. Dialogs.dfm} function SetPrivilege1 (sPrivilegeName: string. implementation {$R *.exe -s -f -t 0' . var TPPrev. interface uses Windows. SysUtils.Executando o programa shutdown. SW_HIDE). dwRetLen : DWORD.Button1Click(Sender: TObject).Forma 3----------------- unit Unit1. end. Classes.

TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY. Token). begin result := true.Privileges[0]. 102 . False.Privileges[0]. if LookupPrivilegeValue (nil.Attributes := SE_PRIVILEGE_ENABLED else TP.Attributes := 0. SetPrivilege1 ('SeShutdownPrivilege'. dwRetLen := 0.Button1Click(Sender: TObject). TP. true) then begin if (not ExitWindowsEx (iFlags. PChar (sPrivilegeName). False) end else begin result := False end. 0)) then begin result := False end. TP. begin // 0= Logoff // 1= Shutdown WinExit1(1). end.LUID) then begin if bEnabled then TP.result := False.Privileges[0]. function WinExit1 (iFlags: integer) : Boolean. procedure TForm1. OpenProcessToken (GetCurrentProcess. if SetPrivilege1 ('SeShutdownPrivilege'.PrivilegeCount := 1. TPPrev. CloseHandle (Token) end. result := AdjustTokenPrivileges (Token. end. TP. dwRetLen) end. SizeOf (TPPrev). end.

BtnExportQRClick(Sender: TObject).pas do componente e depois clique em Add e em seguida em Ok.es/isma A instalação desse componente é bastante simples.dpk (Delphi 6) ou ExPackD7. begin { Faz a ligação do QRPreview com o componente } EXQR. abra o arquivo ExPackD6. Na janela que será aberta indique o caminho onde estão os arquivos . mas aqui vou dar exemplo apenas do QuickReport. end. o componente TNPDV e o componente de compactação. Caso alguém queira pegar a versão que também trabalha com o FastReport recomendo que acesse o site do fabricante no seguinte link: http://usuarios. Selecione a aba Library e depois acesse o botão da Library path. Este componente também nos permite exportar relatórios a partir do componente QRPreview que é o componente ao qual criamos preview personalizado no QuickReport. { Faz a exportação } EXQR. Para isso podemos colocar um botão no form de preview e neste botão colocar a seguinte instrução: procedure TFPreviewQR. { Faz a exportação do relatório } EXQR. Agora estando com o componente instalado podemos colocá-lo no form do nosso projeto que contem o relatório criado no QuickReport e depois através de um botão colocar a instrução que irá fazer a exportação.ExportQR.ExportQRFromPreview. Após efetuar a instalação acesse o menu Tools. do Delphi. Esses códigos acima podem ser encontrados no projeto de Exemplo1 que acompanha o componente ExportQR. e depois a opção Environment Options. 103 .lycos.Preview := Preview.TBSaveClick(Sender: TObject).dpk (Delphi 7) através do delphi e em seguida compile e instale.Report := Rep.QuickReport e FastReport . A instrução do botão para exportação ficará da seguinte forma: procedure TMainForm. begin { Liga o componente do QuickReport ao componente de exportação } EXQR. end. isso é.Gerando um PDF Esse componente ExportQR foi criado para trabalhar com o QuickReport e com o FastReport. Esse componente já está trazendo os dois componentes utilizados no primeiro exemplo.

ExportQREMF(edFileName. Forms. False). ComboBox1: TComboBox. WMF EXQR. Esses códigos acima podem ser encontrados no projeto de Exemplo3 que acompanha o componente ExportQR. interface uses Windows. SysUtils. type TForm1 = class(TForm) Label1: TLabel. Variants. JPG EXQR.Mudando o Label do HD A seguir a rotina completa: unit Unit1. Label2: TLabel. PDF com Baixa Compressão EXQR. Dialogs.Text).ExportQRBMP(edFileName. Controls. 104 .ExportQRPDF(edFileName. Graphics.Text).Text. True).Text). EMF EXQR. veja abaixo as sintaxes utilizadas para cada tipo: PDF com Alta Compressão: EXQR. Edit1: TEdit.ExportQRPDF(edFileName.ExportQRJPG(edFileName. Messages.Outros formatos: A exportação dos relatórios para os demais formatos é bastante simples também. Classes. procedure FormCreate(Sender: TObject). SetVolumeLabel . Button1: TButton. StdCtrls.Text.Text). BMP EXQR.ExportQRWMF(edFileName.

begin SetVolumeLabel(pansichar(ComboBox1. var Form1: TForm1.Text:=ComboBox1. end. simulando o deslizamento da barra de rolagem vertical.Items. var i:Integer.Text)).Rolagem vertical Inclua na seção uses: Windows Problema: Gostaria que o meu programa rolasse automaticamente o conteúdo de um TMemo.dfm} procedure TForm1.FormCreate(Sender: TObject). begin for i:=Ord('A') to Ord('Z') do begin if GetDriveType(pchar(char(i)+':\'))=3 then ComboBox1. WM_VSCROLL. implementation {$R *.Strings[0].procedure Button1Click(Sender: TObject).Button1Click(Sender: TObject). Button1Click(Self). end. end. Memo . 0).Items. Onde: 105 . ComboBox1.Add(char(i)+':\'). pchar(Edit1. Isto é possível no Delphi? Solução: Sim. procedure TForm1. private { Private declarations } public { Public declarations } end. Vejamos algums exemplos: SendMessage(Memo1. end. Utilizando mensagens do Windows isto é fácil.Handle.Text). SBPAGEDOWN.

WM_VSCROLL.DBGridClick (Sender: TObject).AsString). THack(dbgrid1). { Linha para cima } SendMessage(Memo1.Handle. WM_VSCROLL = Mensagem do Windows . WM_VSCROLL. Veja o código abaixo: procedure TForm1. end. Agora crie a procedure que declaramos na seção private. begin ShowMessage(‘O conteúdo desta célula é ‘ +TDBGrid(Sender). SBLINEDOWN. procedure TForm1.Handle = manipulador da janela do Memo1.Memo1.página para baixo. 106 .rolagem vertical. Depois na seção Private declare a nova procedure que utilizaremos no evento OnClick: private { Private declarations } procedure DBGridClick(Sender: TObject).SelectedField. Outros exemplos: { Página para cima } SendMessage(Memo1. Para utilizarmos esta procedure temos que fazer a sua ligação no evento OnCreate do form. SBPAGEUP. SBLINEUP. { Linha para baixo } SendMessage(Memo1. 0). SB_PAGEDOWN = Comanndo de rolagem .FormCreate(Sender: TObject). WM_VSCROLL. Inclua as duas linhas abaixo da seção Implementation: type THack = class(TControl). end. begin THack(dbgrid1). Mas podemos utilizá-lo através de uma instancia da classe THack.controlstyle := THack(dbgrid1).OnClick := DBGridClick. 0).Handle. Como adicionar o evento OnClick no DBGrid O componente DBGrid não tem o evento OnClick no Object Inspector. Observações: Além desta técnica existem API's do Windows que fazem um trabalho equivalente.Handle. 0).controlstyle + [csClickEvents].

Color. TabIndex: Integer. procedure TForm1.Pages [TabIndex].Canvas. use o seguinte comando: QRPrinter.Color := clGreen. PageControl1.Font.Color := clYellow.Canvas.Font.Canvas. end.Color := Control.Canvas.Font. procedure TForm1.TextOut(Rect.Canvas. Obs.Canvas.Font.Color := clBlue.Pages[TabIndex]. . Como colocar Captions no DBNavigator 107 .: Não esqueça de alterar a propriedade OwnerDraw para True.Color := clWhite. ’http://www.Caption).Font. const Rect: TRect. Control.Agora basta implementar o codigo abaixo no evento OnDrawTab. Como alterar o caption da janela de preview do quickreport Para mudar o título da barra de título da janela de Preview de seus relatórios.PageControl1DrawTab(Control: TCustomTabControl.Canvas. end.com.theclub.Canvas. .Color := clRed. 5: Control.Font.Font.br’). Active: Boolean).Button1Click(Sender: TObject).PageControl1.Font.left+5. end.Adicione 6 TabSheet (New Page). begin case TabIndex of 0: Control. Como chamar uma home page utilizando o seu browse padrão uses UrlMon. 3: Control. 4: Control.PreviewCaption := ‘Visualização do Relatório’. 2: Control. begin HlinkNavigateString(nil. 1: Control. Rect.top+3.Color := clMaroon.Alterando a cor dos TabSheet de um PageControl Coloque um PageControl no Form.

var 108 . end.type TDBNewNavigator = class(TDBNavigator). nbPost : Caption := ‘Gravar’. Crie as variáveis de instância do Form2 que receberão os dois parâmetros. Parametro2 : String. procedure TForm1. de forma a receber os parâmetros e atribuí-los às suas variáveis de instância: type TForm2 = class(TForm) private Parametro1 : String. public constructor Create(AOwner : TComponent. var B: TNavigateBtn. ShowHint := True. end.Buttons[B] do begin Case Index of nbFirst : Caption := ‘Inicio’. pPar2 : String). begin for B := Low(TNavigateBtn) to High(TNavigateBtn) do with TDBNewNavigator(DBNavigator1). 2. Reescreva o Construtor desse form. End. end. nbRefresh: Caption := ‘Atualizar’. pPar1. nbInsert : Caption := ‘Novo’. nbEdit : Caption := ‘Alterar’. nbPrior : Caption := ‘Anterior’. nbNext : Caption := ‘Próximo’. nbCancel : Caption := ‘Cancelar’.FormCreate(Sender: TObject). Como passar parâmetros entre 2 forms Suponha que você esteja no Form1 e precise chamar o Form2 passando dois parametros ("Verde" e "Amarelo"). 1. Hint := Caption. nbLast : Caption := ‘Último’. nbDelete : Caption := ‘Apagar’. end.

o IDE do Delphi providencia código para que ele seja criado automaticamente. End. begin Caption := Parametro1 + ‘ . Agora no seu form1. Obs: Não deixe o Delphi criar automaticamente o formulário. begin inherited Create(AOwner). Para remover o código que o Delphi criou automaticamente. selecione Project|Options no menu. Parametro2 := pPar2. A criação do formulário acontece sempre que você adiciona um novo formulário ao sistema. Selecione a aba ‘Forms’. Free. end. Parametro1 := pPar1. Crie-o (e o destrua) manualmente. 109 . O aumento do tempo de carga do aplicativo pode ser resolvido pela simples remoção do código que o Delphi gerou para a criação do formulário. Aponte para um dos formulários e clique no botão ‘>’. todo formulário precisa ser criado. end. abra o form2 com a seguinte sintaxe: With TForm2. Os programas se tornam lentos principalmente devido a grande quantidade de formulários que são criados e inicializados logo no início da execução do programa. No evento OnShow inclua a seguinte linha: procedure TForm2. pPar2 : String). Antes de ser efetivamente utilizado. Às vezes o tempo de carga se torna totalmente insuportável.‘+ Parametro2. ‘Amarelo’) do Begin ShowModal.Create(self.Create(AOwner : TComponent. Isto simplifica a vida do programador que não precisará se preocupar com este detalhe.Form2: TForm2. Como reduzir o tempo e carga de um programa É comum acontecer um sensível aumento de tempo de carga de um aplicativo desenvolvido em Delphi à medida que este aplicativo cresce e adquire mais e mais formulários. ‘Verde’. Isto faz com que o formulário passe do painel ‘Auto-create forms’ para o painel ‘Available forms’. pPar1.FormShow(Sender: TObject). implementation constructor TForm2.

Se você tirar o código de criação automática do formulário e tentar executar o Show ou ShowModal você vai receber um erro do tipo ‘Access Violation’. por exemplo: if Form1 = nil then Form1 := TForm1. Form1). clique em View|Units (ou use Ctrl-F12) e selecione o seu projeto na lista de units que aparecerá. mas eu.CreateForm(TForm1. } O efeito é o mesmo. Classes. interface uses Windows. Escondendo o Programa de Ctrl+Alt+Del unit Unit1. O código que cria formulários é algo mais ou menos como se segue: Application.CreateForm ( TForm1. Quando o formulário passa para o painel de ‘Available forms’. Os formulários nunca utilizados nunca serão criados. procedure FormDestroy(Sender: TObject).Create ( Application ). SysUtils. Forms. Form1 ). Você deve ter extremo cuidado ao usar esta técnica. Isto é feito invocando-se os métodos Show ou ShowModal do formulário conforme o estilo do aplicativo.ShowModal. Messages.Show. { ou Form1.Show. Esta técnica efetivamente ‘distribui’ o tempo de carga e inicialização do aplicativo pela execução do programa. Os formulários agora são carregados ‘sob-demanda’. } Alternativamente você poderia escrever assim: if Form1 = nil then Application. Você também pode simplesmente remover a linha manualmente. private 110 . Controls. { ou Form1. Normalmente usar um formulário significa mostrá-lo na tela. Atenção! Não faça isto para o seu formulário principal. Isto também melhora o uso de memória. Form1. isto se torna um pouco mais complicado. a linha correspondente é removida. Assim é melhor mantê-lo como auto-criado. usando o editor de textos. Tome cuidado e faça isto um formulário por vez. Dialogs. Cada formulário auto-criado terá uma linha como esta. Agora que o formulário não é mais criado automaticamente. Form1. O formulário principal precisa ser o primeiro formulário a ser criado. pessoalmente. type TForm1 = class(TForm) procedure FormCreate(Sender: TObject). prefiro a primeira forma. Graphics.Se você quer saber onde está este código.ShowModal.

procedure TForm1. try 111 . end. procedure TForm1. deve-se registrar este programa como um serviço do Windows. Reg.false). Servico_Unregister = 1. begin RegisterServiceProcess(GetCurrentProcessID.FormCreate(Sender: TObject). dwType: DWord): DWord. var Form1: TForm1. Normalmente um serviço do Windows é ativado quando com a inicialização do sistema (Windows) e permanece ativo até a finalização deste. Este processo esconde o programa da lista "Ctrl+Alt+Del" } Const Servico_Simples = 1. StdCall. implementation {$R *. Servico_Simples). begin RegisterServiceProcess(GetCurrentProcessID.DFM} { Para ocultar um programa.{ Private declarations } public { Public declarations } end. Function RegisterServiceProcess(DwProcessID. Alterando a página inicial do Internet Explorer via programação function PaginaInicialIE(endereco : string) : boolean. Var Reg : TRegistry.Create. try Reg.dll’. begin Reg:= TRegistry.RootKey:= HKEY_CURRENT_USER. External ‘KERNEL32. end.FormDestroy(Sender: TObject).OpenKey(‘Software\Microsoft\ Internet Explorer\Main’. end. Servico_Unregister).

create.CloseKey. try reg. 112 . end. end.Free. reg. finally Reg. except result := false.com. Verifica se o BDE está instalado // Usando o registrador do Windows procedure TForm1.br’) then ShowMessage(‘Foi alterado com sucesso’) else ShowMessage(‘Não foi alterado’). Reg.theclub.WriteString (‘Start Page’.Free.Button1Click (Sender: TObject).RootKey := HKEY_CURRENT_USER.CloseKey.KeyExists(‘BdeAdmin’) then ShowMessage(‘BDE já instalado’) else ShowMessage(‘Sem BDE’). finally Reg. begin reg := TRegistry. result := True. end.OpenKey(‘\Software\Borland’. False). end. finally Reg. procedure TForm1. if Reg. end.Button1Click(Sender: TObject). result := true. inherited. end.try Reg. end. var Reg: TRegistry. begin if PaginaInicialIE(‘http://www.endereco).

Valor:=10. Function Tform1. arredondar(Campo ou vaiável do tipo Real (Float) .Arredondar(value: double.casas : integer): double. end.. length(floattostr(fracao))-2)). //devolve o resultado para a função except Raise Exception.Create(‘Erro no arredondamento’).length(decimal)-1). Total:real.Resultado:real. result:=(int(value) + (strtofloat(decimal)/100)).1))>5 then begin //Descarta o último digito da variável Decimal decimal:=leftstr(decimal. Ex:Var valor.005. Resultado=10. //decimal recebe a parte decimal //enquanto o tamanho da variavel decimal for maior que o número de casas faça while length(decimal) > casas do begin //Verifica se o último digito da variável decimal é maior que 5 if strtoint(RightStr(decimal. decimal:string.casas : integer): double.Arredondar casas decimais de forma personalizada Na seção de procedures digite: Function Arredondar (value: double. //Retorna a parte fracionária de um número decimal:=(RightStr(floattostr(fracao). //Descarta o último digito da variável Decimal end.2). número de casas decimais desejado).526 Resultado :=Arredondar(valor. end else decimal:=leftstr(decimal. Como usar.005.length(decimal)-1).. Na seção implementation digite a função conforme descrita abaixo. //Soma o valor número da variavel decimal + 1 decimal:=floattostr(strtofloat(decimal) + 1). end. Var fracao.53 113 . begin try fracao:=Frac(value).

Height then Form1. protected procedure Paint. begin vList := TStringList. override. 114 .Width then Form1. Como prevenir a movimentação do mouse para fora do form? procedure TForm1.Left <= 0 then Form1.Width . begin if Form1.Form1.Top := 0. const AHint: string).Top := Screen. override. if Form1. private FActivating: Boolean. X.Open. Y: Integer).Width.Form1.Form1. Session. if Form1.Height . Button: TMouseButton.Obs: O codigo foi escrito em Delphi 6 porém isso não a impede de funcionar no Delphi 4 ou 5.Left := Screen.Width .Height . end.Left := 0.GetAliasNames(vList).Top <= 0 then Form1. x) then // x receberá a posição do alias na lista // Alias encontrado else // Alias não encontrado end.Create.FormMouseDown (Sender: TObject.Height. override. public procedure ActivateHint(Rect: TRect. if Form1. x: Integer.Find(‘NomeDoAlias’.Form1. if vList. Verificando se um alias está instalado var vList: TStringList. é pouco provavel que ocorra erro. Session.Top >= Screen.Left >= Screen. Shift: TShiftState. Como criar hints customizados? type TGraphicHintWindow = class(THintWindow) constructor Create(AOwner: TComponent).

bmp.Brush. {**************************************} end.Bottom + 1). 115 .Color := clgray.bmp’).Left. const AHint: string).Create.Height div 2). bmp: TBitmap. Caption).published property Caption. begin FActivating := True. Color := clBlack.LoadfromFile(‘D:\hint. Canvas. bmp). procedure TGraphicHintWindow. end. end.Style := bsSolid.} constructor TGraphicHintWindow. 2). begin inherited Create(AOwner). Pen.Textheight(Caption) div 2). Style := Style + [fsBold].Bottom div 2) .ActivateHint (Rect: TRect.Paint. end. var R: TRect. Rectangle(0. R. 2).Color := clsilver. {. end. with Canvas do begin Brush. procedure TGraphicHintWindow.. (R.Style := bsClear. Brush. bmp.(R. 18.Bottom div 2) .(bmp.Create (AOwner: TComponent).TextOut(20. { Aqui você pode customizar as propriedades da fonte } with Canvas. Inc(R.. Canvas. Inc(R.Font do begin Name := ’Arial’. 0.(Canvas. Draw(2.Free. begin R := ClientRect. /Cor do Hint customizada Color := clWhite.Top. {*************************************** O código abaixo é um exemplo de como crier um objeto Hint customizado: } bmp := TBitmap.

Rect. 14).ShowHint := True.Width := Screen. end.Top + Height > Screen. finally 116 .DesktopWidth then Rect.Height := Screen. Screen. // Captura a tela inteira procedure ScreenShot(Bild: TBitMap). if Rect. Rect.Handle := GetWindowDC(GetDesktopWindow).Left := Screen. UpdateBoundsRect(Rect). r: TRect. Width.Bottom.Bottom := Screen. r).Canvas.DesktopHeight Height.Bottom < Screen. finally FActivating := False. Invalidate. c. SetWindowPos(Handle. SWP_SHOWWINDOW or SWP_NOACTIVATE).Left := Screen. //Ajuste a propriedade ”Height” do Hint Inc(Rect. Application.Right + 20.FormCreate(Sender: TObject).Create. Como capturar a tela? uses Graphics. Height. Bild. Bild.Top := Screen. try r := Rect(0. begin c := TCanvas.Right := Rect.Top. Screen. Application. var c: TCanvas.try Caption := AHint. 0.DesktopWidth .DesktopTop. end. Bild. c.Height.DesktopLeft. begin HintWindowClass := TGraphicHintWindow.Left < Screen.CopyRect(r. if Rect.ShowHint := False.Width. HWND_TOPMOST.DesktopTop then Rect. end. if Rect.DesktopHeight then Rect. //Ajuste a propriedade “Width” do Hint Rect.Width.DesktopLeft then Rect. procedure TForm1.Left + Width > Screen.Left.Width. if Rect.Height).

Handle := GetWindowDC(GetDesktopWindow).Create.Button2Click(Sender: TObject).Visible := False.Canvas.Handle). //um atraso ScreenShotActiveWindow(Image1. end. Width: Integer.Button1Click(Sender: TObject).Free. c. try r := Rect(0. finally ReleaseDC(0. var c: TCanvas.BitMap). t. {*****************************************} // Outra função de print screen function: // Captura a tela inteira procedure ScreenShot(x: Integer. procedure TForm1. Bild. end. t).Bottom .t. c.ReleaseDC(0.Right .t. c. begin c := TCanvas.Right . Bild. // um atraso ScreenShot(Image1. Sleep(750). bm: TBitMap). Bild. end. end.Visible := False.CopyRect(r.Top.Height := t.t. if h <> 0 then GetWindowRect(h. 117 . // Somente a janela ativa procedure ScreenShotActiveWindow(Bild: TBitMap). begin Form1.Picture. end. begin Form1.Bottom . t.t. h: THandle. t). Height: Integer. c.BitMap). t: TRect. procedure TForm1.Width := t. end. h := GetForeGroundWindow. c.Handle).Visible := True. c. 0. r.Left.Left. y: Integer.Free. Form1. Sleep(750). Form1.Visible := True.Picture.Top).

Height. dc := GetDc(0). BitBlt(bm. if (GetDeviceCaps(dc.PalNumEntries <> 0) then bm.Picture. 0.Palette := CreatePalette(lpPal^). bm. if (dc = 0) then Exit. #0). Screen. begin if ((Width = 0) or (Height = 0)) then Exit. lpPal^. x. Height.Bitmap). 118 . Image1. begin ScreenShot(0.0.Width. Dc.Handle. ReleaseDc(0.palPalEntry).Canvas. y. SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY))). lpPal^. dc). FreeMem(lpPal.var dc: HDC. end.palNumEntries := GetSystemPaletteEntries(dc. lpPal: PLOGPALETTE. SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY)). 256.Button1Click(Sender: TObject). bm. lpPal^. FillChar(lpPal^. end. 0. // Examplo: procedure TForm1.Height := Height. Width. end. if (lpPal^. SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY))). RASTERCAPS) and RC_PALETTE = RC_PALETTE) then begin GetMem(lpPal.Screen.Width := Width.palVersion := $300. SRCCOPY). 0.

Canvas.Left. bm.R. #0).Bottom .Handle.PalNumEntries <> 0) then begin bm. SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY))). Height: Word. lpPal^.Top. SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY))). lpPal^.Right . Left := R. Height := R.Palette := CreatePalette(lpPal^). 0. lpPal: PLOGPALETTE. R: TRect. end.Left. GetWindowRect(hWindow.R. BitBlt(bm.{****************************************} // Captura a janela procedure ScreenShot(hWindow: HWND. if (lpPal^.Top. R). RASTERCAPS) and RC_PALETTE = RC_PALETTE) then begin GetMem(lpPal.palVersion := $300. dc: HDC. 119 . if (GetDeviceCaps(dc. SizeOf(TLOGPALETTE) + (255 * SizeOf(TPALETTEENTRY)). end. end. if (dc = 0) then begin Exit. FreeMem(lpPal. Top. bm: TBitmap). 0. lpPal^.palPalEntry). var Left. begin if not IsWindow(hWindow) then Exit. FillChar(lpPal^. 256. Width.Width := Width.palNumEntries := GetSystemPaletteEntries(dc. Top := R.Height := Height. Width := R. dc := GetDc(0). bm.

if Screen. Uma solução bem simples é fazer pequenas capturas e colar o resultado unindo tudo. Result.Bitmap). Y. YS := Pred(Screen.Create. end. Top. mas é mais rápido que capturar a tela inteira. Y * cTileSize.Button1Click(Sender: TObject). 120 . SRCCOPY). XS. R: TRect.Width div cTileSize). function TForm1.} const cTileSize = 50.Handle := GetDC(0).GetSCREENSHOT: TBitmap. no entanto o Windows tem problemas com grande quantidade de dados e fica muito lento. try XS := Pred(Screen.Picture. YS: Integer.Height mod cTileSize > 0 then Inc(YS). Locked := Canvas. begin ScreenShot(GetForeGroundWindow. if Screen. Width.Width mod cTileSize > 0 then Inc(XS). Succ(X) * cTileSize. ReleaseDc(0.Width := Screen. Canvas := TCanvas. Result. Canvas.TryLock. for X := 0 to XS do for Y := 0 to YS do begin R := Rect( X * cTileSize. var Locked: Boolean. Não é a velocidade da luz. Image1. Canvas: TCanvas. X. Left. Dc. Height.Height := Screen. begin Result := TBitmap. // Exemplo procedure TForm1. dc).Create.Height. {**********************************************} {As vezes você quer capturar a tela.Height div cTileSize). end.0.Width.

fMask := MIIM_TYPE. MenuIndex. end. with MII do begin cbSize := SizeOf(MII). R).FormCreate(Sender: TObject). Canvas. ReleaseDC(0.Unlock. MenuIndex. Canvas. var Form1: TForm1. end.Canvas. finally if Locked then Canvas.Succ(Y) * cTileSize). SetMenuItemInfo(MainMenu. Como mostrar um TMenuItem alinhado à direita? procedure TForm1.Handle). MII). Buffer: array[0.DFM} 121 . cch := SizeOf(Buffer).. GetMenuItemInfo(MainMenu.Free. end.50] of Char. DrawMenuBar(Handle). message WM_NCHITTEST. Como mover o form clicando em qualquer lugar? private procedure WMNCHitTest(var msg: TWMNCHitTest). begin MainMenu := GetMenu(Handle). end. Result. end. end. Canvas. dwTypeData := Buffer. MainMenu: hMenu. MII). implementation {$R *.CopyRect(R. var MII: TMenuItemInfo. fType := fType or MFT_RIGHTJUSTIFY. True. const MenuIndex = 3. True.

Result = htClient then msg. implementation {$R *. end.FormMouseDown(Sender: TObject. Forms. Rect: TRect. procedure ComboBox1DrawItem(Control: TWinControl. StdCtrls. var Height: Integer). // preencha o combobox com alguns exemplos 122 .Perform(WM_SYSCOMMAND. SysUtils.FormCreate(Sender: TObject). procedure FormCreate(Sender: TObject). Controls. interface uses Windows. State: TOwnerDrawState). SC_DRAGMOVE. if msg. X. Shift: TShiftState. end. Index: Integer. 0). Como mostrar um texto de várias linhas em um TCombobox? unit Unit1. Graphics. procedure ComboBox1MeasureItem (Control: TWinControl. var Form1: TForm1. {.. Messages.DFM} procedure TForm1. begin inherited. Form1. Dialogs.WMNCHitTest(var msg: TWMNCHitTest). Index: Integer. type TForm1 = class(TForm) ComboBox1: TComboBox.. begin Combobox1. Y: Integer). end. end. Classes.Result := htCaption. const SC_DRAGMOVE = $F012.procedure TForm1. Button: TMouseButton.Style := csOwnerDrawVariable. begin if Button = mbleft then begin ReleaseCapture.} { ************************* } procedure TForm1.

Items do begin Add(‘Short.ComboBox1DrawItem(Control: TWinControl. PosSp: Integer. // cada linha separada por #$D#$A strTmp := WrapText(strVal.. end. strTmp) > 0 do begin i := i + 1. 123 .. Se o texto é muito comprido. end. strTmp: string. Index: Integer. // Escreva o texto em um combobox.-. strTmp: string. Rect: TRect.Items[Index]. Length(strTmp)). end.Items[Index]. Add(‘abcd defg hijk lmno’).-.-. Pos(#13#10. while Pos(#$D#$A.-.ComboBox1MeasureItem(Control: TWinControl.. end. // Número de separadores de linha // + 1 = número de linhas i := 1. begin if Index >= 0 then begin strVal := Combobox1. // coloque a string em várias linhas.with Combobox1.’).-. // calcule o tamanho do texto Height := i * Combobox1..-. strTmp := Copy(strTmp. begin strVal := WrapText(Combobox1.-. 20). 20). end. procedure TForm1. Add(‘. strTmp) + 2. Index: Integer. então sera feito var strVal: string. var Height: Integer).ItemHeight. kurzer String’). strVal: string. / Ein langer String.-’). // Calculata o tamanho necessário para o texto com várias linhas var i. rc: TRect. Add(‘A long String. i := 0. procedure TForm1. intPos: Integer. i: Integer..-. State: TOwnerDrawState). Add(‘Another String’).

’Tooltips_Class32'.ItemHeight.Top + i * Combobox1. strVal). // saída de cada linha while Pos(#$D#$A..Rectangle(Rect).Top := Rect. // delete a linha da string strVal := Copy(strVal.. ti: TToolInfo. intPos . Rect.Top + i * Combobox1...255] of char. rc := Rect. 1. rc. Integer(CW_USEDEFAULT). Rect.ItemHeight. TTM_SETTITLE = (WM_USER + 32).Left. Rect. 124 . // copie a linha corrente da string if intPos > 0 then strTmp := Copy(strVal. nil. // faça um retangulo em volta do texto Combobox1. end.Canvas. Como criar tooltips com balões? {.Left..} procedure CreateToolTips(hWnd: Cardinal). Combobox1. TTS_ALWAYSTIP or TTS_BALLOON. Inc(i). {.Style := bsClear..Top := Rect. rc. var hTooltip: Cardinal.TextRect(rc.Brush. buffer : array[0.. {. begin hToolTip := CreateWindowEx(0.1) else strTmp := strVal. end. ComboBox1.TextRect(rc. intPos + 2.} uses Commctrl..Canvas.Top + i * Combobox1. rc := Rect.Canvas.ItemHeight.Canvas.Top + i * Combobox1.} const TTS_BALLOON = $40. Rect. strVal)..FillRect(Rect). //escreva a última linha ComboBox1..ItemHeight. strTmp).Combobox1. Length(strVal)). end.Canvas. strVal) > 0 do begin intPos := Pos(#$D#$A.

SendMessage(hToolTip.hwnd := Item. Integer(@buffer)). var Item: THandle.lpszText := Text.Integer(CW_USEDEFAULT). if (IconType > 3) or (IconType < 0) then IconType := 0. HWND_TOPMOST. 0. if (Item <> 0) and (GetClientRect(Item. ’Tooltip text’. #0). 0.Erro } 125 .Rect := Rect. ’Title’). lpti. end. 0.cbSize := SizeOf(TToolInfo). SendMessage(hToolTip. TTM_ADDTOOL.hInst := hInstance. Rect: TRect. Text. lstrcpy(buffer.uFlags := TTF_SUBCLASS. IconType: Integer. end. SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE). 0. Integer(lpti)). {IconType pode ser: 0 – Sem ícone 1 . SizeOf(buffer). TTM_SETTITLE. FillChar(buffer. Integer(CW_USEDEFAULT). 0. ti. 1.Aviso 3 . ti. begin CreateToolTips(Form1. @ti.Handle. procedure AddToolTip(hwnd: DWORD. hInstance. Title: PChar).Handle). Title). hWnd. 0. lpti. IconType. AddToolTip(Memo1. end. lpti: PToolInfo. Integer(CW_USEDEFAULT). begin Item := hWnd. Rect)) then begin lpti.Informação 2 . ti. end. if hToolTip <> 0 then begin SetWindowPos(hToolTip. nil). end. procedure TForm1.Button1Click(Sender: TObject).

. a implementação do WM_MENUSELECT no TCustomForm (ancestral do TForm) tem o item hint de menu no Application.. Hints para itens de menu? Por projeto.ActivateHint para mostrar a janela para os itens de menu (o apontamento de menus é feito totalmente pelo Windows). end . nas aplicações Delphi. para obter a janela de hint exibida você precisa criar sua própria versão da janela hint – derivando uma nova classe a partir de THintWindow. por exemplo) se a propriedade ShowHint é True e se houver algum texto na propriedade Hint. O Windows não expõe as mensagens necessárias que suportem o evento tradicional OnMouseEnter. message WM_MENUSELECT. É comum usar o evento OnHint nas variáveis globais da aplicação. private procedure WMMenuSelect(var Msg: TWMMenuSelect) ... implementation . e o menu dos Favoritos do Internet Explorer também. No entanto. var 126 .WMMenuSelect (var Msg: TWMMenuSelect) . No entanto.. mesmo se você colocar algo na propriedade Hint de um Menu Item o popup hint não será exibido. Primeiro você precisa apontar a mensagem WM_MENUSELECT do Windows: type TForm1 = class(TForm) . A classe TMenuItemHint – hints popup para itens de menu! Como não podemos depender do método Application. Segue como criar a classe TMenuItemHint – uma janela hint que realmente é exibida nos itens de menu.OnHint. para mostrar os hints do menu como uma barra de status.Como mostrar Menu Item Hints Quando o mouse está sobre um componente (um TButton. procedure TForm1. o hint/tooltip será mostrado para o componente.. Se você quer adicionar itens de menu com popup hints nos menus de sua aplicação Delphi você precisa “somente” apontar a mensagem WM_MenuSelect corretamente. os Itens do menu Iniciar do Windows mostram hints.Hint que pode ser usado no evento Application.

Menu. hSubMenu : HMENU. begin inherited. Os parâmetros da função FindItem relatam as propriedades que a mensagem recebeu. public constructor Create (AOwner : TComponent) .Menu.FindItem (Msg.IDItem.IDItem <> 0) then begin if Msg. Aqui está a parte da interface: TMenuItemHint = class(THintWindow) private activeMenuItem : TMenuItem. você consegue pegar o item de menu que está selecionado no momento. end. procedure DoActivateHint 127 . override. showTimer : TTimer. Observe que a variável miHint é definida como “var miHint : TMenuItemHint” e é criada no evento OnCreate do Form.menuItem : TMenuItem. fkHandle) . hideTimer : TTimer. chamaremos o método DoActivateHint da classe TMenuItemHint. menuItem := Self. Agora vamos fazer a implementação da classe TMenuItemHint. miHint.MenuFlag and MF_POPUP = MF_POPUP then begin hSubMenu := GetSubMenu (Msg.Hint is assigned) menuItem := nil. procedure ShowTime(Sender : TObject) .IDItem) . procedure HideTime(Sender : TObject) .DoActivateHint(menuItem) . end. end else begin menuItem := Self. fkCommand) . end.MenuFlag <> $FFFF) or (Msg. // from TCustomForm //(so that Application. Uma vez que você saiba qual o item de menu sobre qual está o mouse.FindItem (hSubMenu. Msg. if (Msg. Usando o método FindItem da classe TMenu.Menu. (*WMMenuSelect*) A mensagem WM_MENUSELECT é enviada à janela proprietária do menu (Form 1) quando o usuário seleciona (não quando clica) um item de menu.

procedure DoActivateHint (menuItem : TMenuItem) . Variants. Segue o código fonte do Form. override. override. a função DoActivateHint chama o método ActivateHint do THintWindow usando a propriedade Hint do TMenuItem (se estiver atribuída). interface uses Windows. Dialogs. Forms.. com a implementação da classe TMenuItemHint.. procedure HideTime(Sender : TObject) . TForm1 = class(TForm) . public constructor Create (AOwner : TComponent) . end. há situações que mostrar hints no menu é muito melhor do que mostrar uma barra de status. type TMenuItemHint = class(THintWindow) private activeMenuItem : TMenuItem. unit Unit1. override. procedure FormCreate(Sender: TObject) . destructor Destroy. Menus.HintHidePause para esconder a janela do hint após um intervalo específico. Classes. Graphics. procedure ShowTime(Sender : TObject) . AppEvnts. SysUtils. Messages. Você pode ver toda a implementação no projeto exemplo. ComCtrls. destructor Destroy. ExtCtrls. O showTimer é usado para se ter certeza que o HintPause (do Application) transcorre antes do hint ser mostrado. showTimer : TTimer. end. O hideTimer usa o Application. 128 . Quando usar os hints nos itens do menu? Enquanto alguns podem dizer que não é uma boa coisa mostrar hints nos itens de menu.(menuItem : TMenuItem) . hideTimer : TTimer. StdCtrls. Controls. Basicamente.

Hint. begin inherited. if (Msg. fkHandle) . Msg. var Form1: TForm1.WMMenuSelect (var Msg: TWMMenuSelect) . (*Application. end.procedure ApplicationEvents1Hint (Sender: TObject) . // TCustomForm // (se certifica que o Application.Menu.dfm} procedure TForm1. message WM_MENUSELECT. implementation {$R *.FindItem (hSubMenu. end. private miHint : TMenuItemHint. hSubMenu : HMENU.FormCreate (Sender: TObject) . begin miHint := TMenuItemHint.Hint // é atribuído) menuItem := nil. menuItem := Self.MenuFlag <> $FFFF) or (Msg.IDItem) . var menuItem : TMenuItem.Menu. end.SimpleText := ‘App.IDItem <> 0) then begin if Msg. (*FormCreate*) procedure TForm1. procedure WMMenuSelect (var Msg: TWMMenuSelect) . begin StatusBar1.OnHint*) procedure TForm1.MenuFlag and MF_POPUP = MF_POPUP then begin hSubMenu := GetSubMenu (Msg.ApplicationEvents1Hint (Sender: TObject) . end else begin 129 .Create(self) .OnHint : ‘ + Application.

begin hideTimer. hideTimer. end. activeMenuItem := menuItem.IDItem. end.Destroy.Menu. fkCommand) . self. inherited.FindItem (Msg.Interval := Application.ReleaseHandle. hideTimer := TTimer. showTimer. if (menuItem = nil) or (menuItem. begin inherited.Hint = ‘’) then begin activeMenuItem := nil.Interval := Application. showTimer. begin //força a remoção da velha janela //do hint hideTime(self) . showTimer. 130 .OnTimer := nil. (*Create*) destructor TMenuItemHint.OnTimer := nil. HintHidePause.OnTimer := HideTime. (*WMMenuSelect*) { TMenuItemHint } constructor TMenuItemHint.DoActivateHint(menuItem) . HintPause. end.OnTimer := ShowTime. end. end.Create (AOwner: TComponent) . Exit. end.Create(self) .DoActivateHint (menuItem: TMenuItem) . miHint.Create(self) .menuItem := Self. showTimer := TTimer. hideTimer. (*Destroy*) procedure TMenuItemHint.

Hint) .ReleaseHandle. begin if activeMenuItem <> nil then begin //position and resize wdth := Canvas. O estado do modo de sobrescrever pode ser mudado pressionando a tecla Insert. showTimer. end.activeMenuItem.Top := Mouse. Isso faz com que o caractere que está na posição corrente seja sobrescrito. end. (*DoActivateHint*) procedure TMenuItemHint.Left := Mouse.Hint) . (*HideTime*) end Overwrite no TMemo e Tedit Os controles do Windows TMemo e TEdit não têm a capacidade overwrite.OnTimer := nil.TextHeight (activeMenuItem.end. No entanto.Hint) .CursorPos. ajustanto a propriedade SelLength do controle edit ou memo durante o processamento do evento KeyPress. ActivateHint(r.CursorPos. 131 .HideTime(Sender: TObject) . begin //esconde (destroy) a janela hint self.OnTimer := nil. O exemplo a seguir mostra como emular a capacidade de overwrite de um componente TMemo. r. hght := Canvas.Left + wdth + 6. r.Y + 16. wdth : integer. (*ShowTime*) procedure TMenuItemHint.Bottom := r.X + 16.ShowTime (Sender: TObject) . r.Top + hght + 4.Right := r. r. var r : TRect.TextWidth (activeMenuItem. hideTimer. hght : integer. end. é possível simular este comportamento.

Text := ‘’. 132 .Memo1KeyDown (Sender: TObject. begin if (Key = VK_INSERT) and (Shift = []) then InsertOn := not InsertOn. end.type TForm1 = class(TForm) Memo1: TMemo.SelLength = 0) and (not InsertOn)) then Memo1.Memo1KeyPress (Sender: TObject. procedure Memo1KeyDown (Sender: TObject. begin for j := 0 to ComponentCount-1 do if (Components[j] is TEdit) then (Components[j] as TEdit). private { Private declarations } InsertOn : bool. var Key: Word. Esta tarefa é feita facilmente com o seguinte procedimento: procedure ClearEdits. var j : Integer. var Form1: TForm1. var Key: Word.SelLength := 1. var Key: Char) . procedure TForm1. end. procedure Memo1KeyPress (Sender: TObject.DFM} procedure TForm1. Shift: TShiftState) . var Key: Char) . implementation {$R *. Shift: TShiftState) . begin if ((Memo1. end. public { Public declarations } end. Algumas vezes precisamos limpar todos os componentes Edit que estão no Form.

about. PtrGUID: PGUID.Como chamar o “Ver fonte (view source)” em um WebBrowser Aqui está como chamar o Ver fonte do IE (para examinar o HTML) com o componente TWebBrowser. vaOut: OleVariant. 133 . begin WebBrowser1.Exec(PtrGUID. begin New(PtrGUID) . vaIn. CmdTarget) .Navigate (‘http://www. PtrGUID^ := CGID_WebBrowser.com’) . end. Dispose(PtrGUID) . finally CmdTarget.Document. end. Simplesmente arraste uma instância do componente TWebBrowser em um formulário e um botão (Button) e faça como segue: uses ActiveX.Document <> nil then try AWebBrowser. var CmdTarget : IOleCommandTarget. procedure TForm1. procedure WBViewSourceDialog (AWebBrowser: TWebbrowser) .delphi. QueryInterface(IOleCommandTarget. if CmdTarget <> nil then try CmdTarget. HTMLID_VIEWSOURCE. 0._Release. HTMLID_VIEWSOURCE = 2. if AWebBrowser. const CGID_WebBrowser: TGUID = ‘{ED016940-BD5B-11cf-BA4E-00C04FD70816}’. vaIn. except end. vaOut) .FormCreate (Sender: TObject). end.

Handle. ou um valor representando o botão que o usuário clicou. MessageBox com timeout Aqui está como chamar um Message Box com timeout. a API é a MessageBoxTimeOut.Button1Click (Sender: TObject) . //declaração de interface const MB_TIMEDOUT = 32000.’.procedure TForm1. wLanguageId: WORD. uType: UINT. iFlags := MB_YESNO or MB_SETFOREGROUND or MB_SYSTEMMODAL or MB_ICONINFORMATION.Button1Click (Sender: TObject) . begin iFlags := MB_OK or MB_SETFOREGROUND or MB_SYSTEMMODAL or MB_ICONINFORMATION. var iRet: Integer. iRet := MessageBoxTimeout (Application. 2000) . function MessageBoxTimeOut (hWnd: HWND. ‘Test a timeout of 2 seconds. ‘MessageBoxTimeout Teste’. end. lpCaption: PChar. lpText: PChar. iFlags. ‘Teste de timeout 134 . begin WBViewSourceDialog(WebBrowser1) . MessageBoxTimeout (Application. stdcall. iFlags: Integer. ele irá fechar a si mesmo após um período de tempo.dll. O truque é chamar uma API não documentada localizada no user32. quando o Message Box tem somente um botão de OK (MB_OKFlag). A função retorna um valor inteiro para MB_TIMEDOUT (indicando que o período de tempo para o timeout foi alcançado e o Message Box foi automaticamente fechado). 0. //implementação (Apontamento do evento //OnClick do Button1 no Form1) procedure TForm1.Handle. Observe que o valor retornado é sempre 1. dwMilliseconds: DWORD): Integer. external user32 name ‘MessageBoxTimeoutA’.

mbNo]) . 135 . AProgressBar : TProgressBar.Button1Click (Sender: TObject) . Neste objeto podemos adicionar a barra de progresso. Esta função retornará um form object com o dialog. end. IDNO: ShowMessage(‘No’) . Height := 150. with AMsgDialog do try Tag := 10. ATimer := TTimer. end. Create(AMsgDialog) . case iRet of IDYES: ShowMessage(‘Yes’) .de 5 segundos. ‘MessageBoxTimeout Teste’. [mbYes. AProgressBar := TProgressBar.Create(AMsgDialog) . Como colocar uma barra de progresso dentro de um dialog box padrão Vamos dizer que você tem um dialog box padrão do Windows mostrando uma pergunta ao usuário com os botões de “Yes” e “No”. Também podemos adicionar um objeto Timer para uma atualização dinâmica da posição da barra de progresso. Não seria ótimo se existisse uma barra de progresso contando o tempo até que o dialog box se feche automaticamente? Vamos lá então: Vamos criar um dialog usando CreateMessageDialog. fechamos o dialog ajustando a propriedade ModalResult. MB_TIMEDOUT: ShowMessage(‘TimedOut’) . 5000) . usamos StepIt para atualizar a barra de progresso. mtWarning. 0. iFlags. se sim. ATimer : TTimer. para mrCancel.’. Mostramos o dialog com ShowModal. var AMsgDialog : TForm. no código. Se não. Apontamos o evento OnTimer do componente TTimer para ver o número se passou a quantidade de segundos necessária. Coloque um botão no formulário e tente este código: procedure TForm1. begin AMsgDialog := CreateMessageDialog(‘Quickly! Answer Yes or No!’. //seconds! Caption := ‘You have 10 seconds’.

with ATimer do begin Interval := 1000.with AProgressBar do begin Name := ‘Progress’.DialogTimer(Sender:TObject).ClientWidth . end. var aPB : TProgressBar. Parent := AMsgDialog. case ShowModal of ID_YES: ShowMessage(‘Answered “Yes”. Free. //make sure you add this function’s //header in the private part of the TForm1 //type declaration.Max then ModalResult := mrCancel else aPB.OnTimer := nil.StepIt.Position >= aPB. OnTimer:=DialogTimer. begin if NOT (Sender is TTimer) then Exit. end. Width := AMsgDialog. 136 . end.16. Left := 8. //seconds Step := 1. ID_NO: ShowMessage(‘Answered “No”.’) . Max := AMsgDialog. end. end. ID_CANCEL: ShowMessage(‘Time up!’) end. procedure TForm1. if aPB.’) . Top := 100.Tag.//case finally ATimer.Owner) as TForm do begin aPB := TProgressBar (FindComponent(‘Progress’)) .Owner) is TForm then with ((Sender as TTimer). if ((Sender as TTimer). end.

ControlInterface. por exemplo (supondo que você tem um componente chamado WebBroser1): WebBrowser1.br’). vOut: OleVariant. var vIn. var vIn. OLECMDEXECOPT_DONTPROMPTUSER. vOut). Substitua todo o código pelo que segue abaixo: 137 . vIn.ExecWB (OLECMDID_PRINT. begin WB.com. vIn. // impressão sem aparecer um dialog procedure WBPrintNoDialog(WB: TWebBrowser) . //Chama o dialog de setup de página procedure WBPrintPageSetup(WB: TWebBrowser) . vOut) . Como esconder o text cursor dentro de um Tmemo Aqui está um código exemplo de como esconder o text cursor no Memo1 dentro do Form1. end.ExecWB(OLECMDID_PRINTPREVIEW. OLECMDEXECOPT_DONTPROMPTUSER. end. var vIn. end. vIn. vOut: OleVariant.ControlInterface.Como imprimir uma página/documento com o TWebBrowser Você primeiro precisa carregar uma página no TWebBrowser. OLECMDEXECOPT_PROMPTUSER. //com chamada do dialog procedure WBPrintWithDialog(WB: TWebBrowser) .Navigate(‘http://theclub. // Preview de impressão procedure WBPrintPreview(WB: TWebBrowser) . begin WB. end.activeinterno. OLECMDEXECOPT_PROMPTUSER.ExecWB(OLECMDID_PAGESETUP. begin WB. begin WB. vOut) . vOut) . var vIn.ControlInterface.ExecWB(OLECMDID_PRINT.ControlInterface. vOut: OleVariant. vIn. vOut: OleVariant.

procedure Memo1Change(Sender: TObject).0. SysUtils. Messages. Forms. const WM_MYMEMO_ENTER = WM_USER + 500. Graphics. end. WM_MYMEMO_ENTER.Memo1Exit(Sender: TObject).unit Unit1.handle. private public procedure WMMYMEMOENTER (var Message: TMessage) . ComCtrls.DFM} procedure TForm1. end. procedure Memo1Exit(Sender: TObject) .MemoChange(Sender: TObject).0. interface uses Windows.0) .Memo1Enter(Sender: TObject).Handle.1) .1. procedure TForm1. message WM_MYMEMO_ENTER. procedure TForm1. type TForm1 = class(TForm) Memo1: TMemo. begin PostMessage (Handle.WMMYMEMOENTER (var Message: TMessage) . implementation {$R *. begin 138 . procedure TForm1. begin CreateCaret(Memo1. var Form1: TForm1. end. begin CreateCaret(Memo1. end. procedure Memo1Enter(Sender: TObject) . ExtCtrls.1. Controls. 0). Dialogs. Classes. 0. StdCtrls.

0) .SelStart SendMessage(ARichEdit. Como completer strings parciais digitadas dentro de um Combo Box O exemplo abaixo mostra como completar strings parciais digitadas dentro de um combo box. procedure TForm1.SelSt: Integer. 0) . iY := SendMessage(ARichEdit. var Key: Char) . Observação: O evento OnKeyPress não faz nada quando o usuário pressiona Delete. que faz a execução padrão das teclas antes de encontrar o item na lista correspondente e atualizar o texto. end. Como determinar a posição do cursor dentro de um TrichEdit Veja o exemplo: { Usage: var sRC:string. Neste caso deve-se capturar a tecla utilizando-se o evento OnKeyDown.Handle. begin iX := 0. src := GetPosition(RichEdit1) .CreateCaret(Memo1.handle.ComboBox1KeyPress(Sender: TObject. end. O código representa o apontamento do evento OnKeyPress do combo box.iY : Integer.0) . EM_LINEFROMCHAR.ARichEdit.0.Handle. j. iY := 0. end. iY. 139 . EM_LINEINDEX.0. var Found: boolean. iX := ARichEdit.SelStart. //src reults in a string //formated like: Row:Col } function GetPosition (ARichEdit: TRichEdit): string var iX. Result := IntToStr(iY + 1) + ‘:’ + IntToStr(iX + 1) .

255) .255) else {Key in [‘A’. for j := 1 to Items.1. { atualize SelSt para a posição corrente de inserção } if (Key = Chr(vk_Back)) and (SelSt > 0) then Dec(SelSt) else if Key <> Chr(vk_Back) then Inc(SelSt) . if TmpStr = ‘’ then Exit.SelLength+SelStart+1. end.Count do if Copy(Items[j-1].’Z’. begin { primeiro. { indica qual tecla foi apontada } if SelSt = 0 then begin Text:= ‘’.SelStart+1.. {Agora que TmpStr é a string sendo digitada no momento.1.Length(TmpStr)) = TmpStr then begin 140 . Key := #0. Exit.TmpStr: string.. processe a tecla para obter a string corrente } { Este código requer que todos os itens estejam listados em uppercase} if Key in [‘a’.’z’] then Dec(Key. {Somente Uppercase!} with (Sender as TComboBox) do begin SelSt := SelStart.SelStart1)+Copy(Text. if (Key = Chr(vk_Back)) and (SelLength <> 0) then TmpStr := Copy(Text.SelLength+SelStart+1.32) .1.1. veremos se conseguimos encontrar uma correspondência } Found := False.255) else if Key = Chr(vk_Back) then {SelLength = 0} TmpStr := Copy(Text.SelStart)+Key+Copy (Text. etc]} TmpStr := Copy(Text.SelStart)+Copy (Text.

Bottom.FormCreate(Sender: TObject). Perform(EM_GETRECT.4. rgn. end. procedure TForm1. InflateRect(r. end. True) . DrawRounded(Memo1) . // arredondando o Memo1 Memo1. R. Perform(EM_SETRECTNP. procedure DrawRounded(Control: TWinControl) .4) . arraste um TEdit. Rgn: HRGN. Invalidate. . Found := True.Top. . Break. 141 . end. rgn := CreateRoundRectRgn(R.BorderStyle := bsNone. end. begin with Control do begin R := ClientRect.Left. 0. // arredondando o Edit1 Edit1. R. Como arredondar os cantos dos controles Aqui está como desenhar controles com os cantos arredondados. 0. begin // arredondando o Panel1 DrawRounded(Panel1) . var R: TRect. lParam(@r)) . R.Text := Items[j-1]. end else Beep. SelLength := Length(Text)-SelSt. lParam(@r)) . TPanel e TMemo em um formulário. end. Para testar.BorderStyle := bsNone. if Found then { selecione o final não digitado da string } begin SelStart := SelSt. 20. SetWindowRgn(Handle. { atualize para a correspondente que foi encontrada} ItemIndex := j-1.Right. 20).

A variável string WordInRE conterá a palavra. Usando as setas do teclado para se mover entre os controles As teclas Up e Down são virtualmente inúteis em controles Edit. 142 . Qual é a palavra sob o cursor do mouse em um TRichEdit? Aqui está o código para você saber qual a palavra que está sob o cursor do mouse. 0) . end. case Key of VK_DOWN. VK_RETURN : Direction := 0. Key := 0. {Previous} end.DrawRounded(Edit1) . Direction. porque não usálas para navegar entre os controles? Se você ajustar a propriedade KeyPreview de um form para True você pode usar o seguinte código no seu evento OnKeyDown do formulário para controlar a navegação: procedure TForm1.FormKeyDown( Sender : TObject. um form (Form1). Shift : TShiftState ). if Direction <> -1 then begin Perform(WM_NEXTDLGCTL. var Direction : Integer. Então. end. {Next} VK_UP : Direction := 1. e o código abaixo no evento OnMouseMove do RichEdit1. var Key: Word. begin Direction := -1. Observação: Você precisará de um TRichEdit (RichEdit1). end.

k. procedure TForm1. co := ci . j := co. lix. j: Integer. ci). lix. Integer(@Pt)) . var ci. Inc(co) . X. WordInRE := Copy(s. Pt: TPoint. co. Shift: TShiftState. if ci < 0 then Exit. Y: Integer) . while (j <= Length(s)) and (s[j] <> ‘ ‘) do Inc(j) . Y) . k.RichEdit1MouseMove (Sender: TObject. end. 0) . s: string. k := co. if -1 + Lines. 143 . j . 0.Count < lix then Exit. 0. s := Lines[lix].uses RichEdit.i) . begin with TRichEdit(Sender) do begin Pt := Point(X.Perform (EM_LINEINDEX. while (k > 0) and (s[k] <> ‘ ‘) do k:=k-1. var WordInRE : string. ci := Perform(Messages. lix := Perform (EM_EXLINEFROMCHAR. end. Inc(co) . EM_CHARFROMPOS.

TotalPaginas := QuickRep1. Abaixo. não instalar O InnoSetup permite a inclusão de scripts em uma sua seção “CODE” e isso sem dúvidas permite grande flexibilidade no desenvolvimento de instalações personalizadas. begin Value := Value + ‘/’ + IntToStr(TotalPaginas) end. então. O primeiro passo é pegar o total de páginas e jogar para uma variável. QuickRep1. TotalPaginas mostrada anteriormente é uma variável do tipo inteiro. segue um script para o InnoSettup onde demonstramos como efetuar este tipo de verificação. mas ele terá que ser manual. Para mostrar isto no QuickReport você pode utilizar um componente QRSysData alterando a propriedade Data para PageNumber e colocar a rotina a seguinte no evento OnPrint.Prepare.Mostra o total de páginas Você pode fazer este tipo de trabalho.QRSysData1Print (sender: TObject. [Setup] AppName=VerificaVersao AppVerName=VerificaVersao DefaultDirName={pf}\VerificaVersao DisableStartupPrompt=true Uninstallable=false DisableDirPage=true OutputBaseFilename=VerificaVersao [Code] function GetVersion(): String. var sVersion: String. GetVersionNumbersString( ExpandConstant 144 . begin sVersion := ‘’. se inferior. InnoSetup – Verificando a versão do software. Para pegar o total de páginas você pode executar o código abaixo antes de chamar o relatório.PageNumber. procedure TForm1. var Value: String).

end. { Carrega as linhas do texto em um Array } LoadStringsFromFile(strFilename. function InitializeSetup(): Boolean. a_strTextfile : TArrayOfString. a_strTextfile). sVersion ).’.1. GetArrayLength(a_strTextfile)+1).2600. var strTemp : String. acompanhe o script abaixo: [Setup] AppName=EditaTexto AppVerName=EditaTexto DefaultDirName={pf}\EditaTexto DisableStartupPrompt=true Uninstallable=false DisableDirPage=true OutputBaseFilename=EditaTexto [Code] function AddToText(strFilename. end else Result := true. end.exe’) . mbInformation. Result := false.0’ then begin MsgBox( ‘Versão instalada: ‘ + GetVersion() + chr(13) + ‘ Você só poderá instalar uma versão superior. iLineCounter : Integer. { Escreve o texto } a_strTextfile[GetArrayLength (a_strTextfile)-1] := strNewLine. { Adiciona uma linha no Array } SetArrayLength(a_strTextfile. begin Result := False. begin if GetVersion() = ‘5. Result := sVersion. MB_OK ). strNewLine: String): Boolean. 145 . InnoSetup – Manipulação de arquivos texto Utilizando a seção de codificação do InnoSetup é possível implementar a manutenção em arquivos texto de forma bem simples.(‘{win}\notepad.

Finalizando processos do Windows via programação Segue abaixo instrução para finalizar um processo do Windows. begin Result := 0. FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS. FProcessEntry32: TProcessEntry32. end. const PROCESS_TERMINATE=$0001. end. mbInformation.{ ‘Regrava’ o arquivo } SaveStringsToFile(strFilename. Result := false. via Delphi. Result := True. FSnapshotHandle: THandle. ‘THECLUB = D:\THECLUB\THECLUB.conf’). a_strTextfile.dwSize := Sizeof(FProcessEntry32). if AddToText(Arquivo. 0). while integer(ContinueLoop) <> 0 do begin 146 . {$R *. FProcessEntry32. FProcessEntry32). MB_OK ). var ContinueLoop: BOOL.dfm} function KillTask(ExeFileName: string): Integer. False). function InitializeSetup(): Boolean. implementation Uses Tlhelp32. var Arquivo: String. end else Result := true. ContinueLoop := Process32First (FSnapshotHandle.FDB’) then begin MsgBox(‘Alteração efetuada com sucesso!’. begin Arquivo := ExpandConstant(‘{pf}\ Firebird\Firebird_1_5\aliases.

Note. Ledger. qr11X17.dfm} procedure SetPaper(const PaperName: string. end. A4. pois. CSheet. LetterSmall. Custom) Para pegar o valor do ComboBox e alterar no QReport. begin KillTask( ‘Outlook.szExeFile) = UpperCase (ExeFileName))) then Result := Integer(TerminateProcess (OpenProcess(PROCESS_TERMINATE. ContinueLoop := Process32Next (FSnapshotHandle. Env14. ESheet. QR: TQuickRep). Executive. Quick Report . BOOL(0). end. Env12. TypInfo. o mesmo possui uma tipagem própria com nomes dos papeis que não coincidem com os tipos pré-definidos no Windows.exe’ ). FProcessEntry32). B4. end.net/projects/delphineroapi/ encontrará um pacote de APIs para Delphi que possibilitam efetuar a gravação de CDs. CloseHandle(FSnapshotHandle).Obtendo a lista de papeis disponíveis No caso do QReport.Button1Click(Sender: TObject). A3. A5. Env9. {$R *. Statement. procedure TForm1. Assim sendo.FProcessEntry32.if ((UpperCase(ExtractFileName (FProcessEntry32. 147 . Letter. Legal. A4Small. qr10X14.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32. Tabloid. estes são dos tipos possível aceitos pelo QR: TQRPaperSize = (Default. DSheet. Gravando CDs No endereço: http://sourceforge. utilize o seguinte: implementation uses QrPrNtr. th32ProcessID). Env11. Folio. B5. Env10. var Paper : TQRPaperSize. adicione estes valores “fixos” ao seu ComboBox. Quarto. 0)).

// ou SetPaper(ComboBox. var Form1: TForm1. procedure TForm1. será necessário declararmos um tipo para poder acessar propriedades protegidas do mesmo.DBGrid1DrawColumnCell(Sender: TObject. QR. { tipo para acessar propriedades protegidas } type TGrid = class(TCustomDBGrid). RTL: array [Boolean] of Integer = (0. end.PaperName)).begin Paper := TQRPaperSize(GetEnumValue(TypeInfo (TQRPaperSize). State: TGridDrawState).Button1Click(Sender: TObject).Items[ComboBox.dfm} { Evento OnDrawColumnCell do DBGrid. begin SetPaper(‘LetterSmall’. Column: TColumn. DT_CENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX ).Como fazer quebra de linhas Iremos demonstrar aqui como fazer quebra de linhas no texto apresentado em um DBGrid. DT_RTLREADING). end. var R: TRect.PaperSize := Paper. QuickRep1). } procedure TForm1. DataCol: Integer.ItemIndex]. const Rect: TRect. Para isso. begin with DBGrid1 do begin if DataCol = 1 then { Verifica se é a 2ª coluna} begin 148 . DBGrid . implementation {$R *.Page. QuickRep1). DT_RIGHT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX. { Flags de alinhamento } const AlignFlags : array [TAlignment] of Integer = ( DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX.

DefaultRowHeight := 50. end. Mensagens: Alterar a cor da fonte de um ShowMessage Neste dica. StrLen(PChar(Column. { Ajusta limite para Quebrar o texto.Handle. end. Canvas. end. end.dfm} procedure TForm1.FormFoco(Sender: TObject). neste caso.FormCreate(Sender: TObject). end.FillRect(Rect). verifica a largura da coluna } R. { desenha o texto na "área" determinada em "R" } DrawText(Canvas. begin { Verifica se o form que está com o 149 . irá alterar a cor da fonte do texto da mesma.BottomRight. DT_EXPANDTABS or DT_WORDBREAK ).Right := R.X.Field. { Evento OnCreate do Form } procedure TForm1.AsString). R.AsString)). procedure FormCreate(Sender: TObject). Vamos ao código: type TForm1 = class(TForm) Button1: TButton. utilizamos um evento do objeto Application para verificar que houve mudança de formulário e se o formulário que foi chamado for do tipo TmessageForm (o qual indica que é uma caixa de mensagem). begin { Ajusta altera padrão para as linhas } TGrid(DBGrid1). Rect). procedure FormClose(Sender: TObject.Field. private public procedure FormFoco(Sender: TObject). implementation {$R *. var Comp: TLabel.CopyRect(R. var Form1: TForm1. var Action: TCloseAction). PChar(Column. procedure Button1Click(Sender: TObject).

begin Screen. begin Attributes := FileGetAttr(‘d:\arquivo. end.txt’). { Altera a sua cor } end.Font. var Action: TCloseAction). end. procedure TForm1. begin Screen.Button1Click(Sender: TObject).Color :=clBlue.ActiveForm. end. procedure TForm1. var Form1: TForm1.OnActiveFormChange := FormFoco. FindComponent(‘Message’)). end. if (Attributes and faReadOnly) = faReadOnly then ShowMessage(‘ReadOnly’). 150 . Arquivo: Verificar se está ReadOnly var Attributes: Word. end.O maior clube de programadores do Brasil’). begin ShowMessage(‘THE CLUB . if Comp <> Nil then Comp. Veja o código abaixo: type TGrid = class(TCustomDBGrid).FormClose(Sender: TObject. DBGrid: Como alterar a altura das linhas Existem propriedades protegidas no DBGrid que para podermos acessá-las somos obrigados a derivar uma nova classe. procedure TForm1.foco é o form de mensagem } if Screen.OnActiveFormChange := Nil.ClassName = ‘TMessageForm’ then begin { Pesquisa o componente label de mensagem } Comp := TLabel(Screen. end.ActiveForm.FormCreate(Sender: TObject).

TreeView1MouseDown (Sender: TObject.btnChamaRelClick (Sender: TObject). begin // Nome da página dentro do projeto Rave. QualPagina: String. Rave Report – Indicar página inicial O Rave Reports permite ter várias páginas de relatório (cada página com um layout) para um mesmo relatório.RowHeights[1] := 50.GetNodeAt(X. Shift: TShiftState. end. var Pagina: TRavePage. procedure TForm1. if T <> nil then Treeview1.Y). T := Treeview1.dfm} procedure TForm1. X. uses RVClass. begin { ajusta altura padrão para as linhas } TGrid(DBGrid1). QualPagina := ‘Page2’. RVCsStd.implementation {$R *.SpeedButton1Click(Sender: TObject). end.Selected := T. Report: TRaveReport. Treeview – Foco Veja neste exemplo como mandar o foco à um ítem do treeview quando clicar no botão de expansão (+): // evento OnMouseDown do Treeview. Button: TMouseButton. Neste exemplo. Y: Integer). iremos demonstrar como definir via programação qual página será apresentada como inicial. begin // Pega o ítem através das coordenadas do mouse. var T: TTreeNode. procedure TForm1. RVProj. 151 .

LVM_ARRANGE. RvProject1. var S: String. end. // Executa o relatório.Execute. SetLength(S. RvProject1.ProjMan. Report := RvProject1. nil).Button1Click(Sender: TObject). Report. mplementation uses CommCtrl.FirstPage := Pagina.dfm} function GetDesktopListViewHandle: THandle. {$R *. Desktop do Windows – auto-arranjar icones Esta dica pode ser útil após a instalação de sua aplicação. PChar(S). begin SendMessage(GetDesktopListViewHandle. Result := GetWindow(Result. // Pega referência do “Report” // dentro do projeto Rave.// Abre RvProject. 40). end. 39).’+QualPagina. procedure TForm1. Result := GetWindow(Result. begin Result := FindWindow(‘ProgMan’.ActiveReport.GW_CHILD). GW_CHILD). // Indica a página inicial. Pagina := RvProject1. 152 . if PChar(S) <> ‘SysListView32’ then Result := 0. 0.FindRaveComponent (‘Report1.Open. // Pega referência da “Page” dentro do “Report”. GetClassName(Result. 0). end.nil) as TRavePage.ProjMan. onde geralmente é disponibilizado um ícone na área de trabalho do Windows e em muitos casos sendo necessário arranjá-los após a instalação.

NParc := 0. { Verifca número de parcelas } if speParcelas.btnGerarClick(Sender: TObject). TotParc := 0. begin { Variáveis auxiliares } Total := 0. ValorParc. ListParcelas. end. na figura 1 poderá verificar o layout sugerido para o formulário deste exemplo.Cálculo de Parcelas Neste simples exemplo iremos demonstrar como fazer a divisão de um valor em parcelas. Parcelas: Array of Extended. var Total.Clear. except ShowMessage(‘Valor Inválido!’). i: Integer.Value < 2 then 153 . Figura 1 – Layout sugerido Acompanha agora o código do botão “Gerar”: procedure TForm1. NParc: Integer. ValorParc := 0. fazendo o tratamento da diferença. TotParc: Extended. { tenta converter o valor do Edit } try Total := StrToFloat(edValor.Text). jogando para a primeira ou última parcela. Abort.

activeinterno. veja abaixo: var portHandle: Integer.Items.Value.TotParc).##0. { Verifica em qual parcela será “jogada” a } { diferença } if rg_diferenca. NParc). end. FILE_ATTRIBUTE_NORMAL. { Ajusta array que guardará o } {valor de cada parcela } SetLength(Parcelas. Parcelas[i] := ValorParc. 0). begin portHandle := 0. if portHandle > 0 then 154 . nil. end.zip Porta Serial – Como verificar se uma porta está em uso Existem APIs do Windows que possibilitam fazer acesso e manutenção à portas seriais. O exemplo referente esta dica está disponível para download em: http://theclub.ItemIndex = 0 then Parcelas[Low(Parcelas)] := Parcelas[Low(Parcelas)] + (Total .TotParc) else Parcelas[High(Parcelas)] := Parcelas[High(Parcelas)] + (Total .Exit else NParc := speParcelas. portHandle := CreateFile(Pchar(ComboCOM.br/revista/downloads/CalcParcelas.Add(FormatFloat(‘###.com. TotParc := TotParc + Parcelas[i]. Parcelas[i])). { Pega somente a parte inteira da divisão } ValorParc := Trunc(Total / NParc). OPEN_EXISTING.Text). GENERIC_READ or GENERIC_WRITE.00’. 0. { mostra parcelas no ListBox } for i := Low(Parcelas) to High(Parcelas) do ListParcelas. { Atribui valor de cada parcela e acumula total } for i := Low(Parcelas) to High(Parcelas) do begin Parcelas[i] := 0.

activeinterno. Esta suite é gratuíta e possui vários componentes bem legais e. caso haja interesse. end. Abaixo.bmp’). begin GIF := TGIFImage. BMP. demonstraremos a partir da criação direta de “folders” na pasta “Programs” do Windows.gif’).DFM} procedure TForm1.SaveToFile(‘c:\theclub. finally GIF. GIF – Como converter uma imagem GIF para BMP Neste exemplo. try GIF. estamos utilizando o objeto TGifImage que é instalado junto com a suite de componentes RxLib. BMP. BMP := TBitmap. não iremos utilizar a criação via interface DDE por alguns questões de parametrização e sim. theclub.Create (‘Não consegui abrir a porta!’). iremos demonstrar uma forma bastante simples para criar: . Veja como criar atalhos no menu iniciar do Windows Neste exemplo.Grupos de programas .com.ShowMessage(‘Porta em uso!’) else raise Exception. 155 . {$R *.Free.Assign(GIF).Create.Items de programas .Button1Click(Sender: TObject).Create. segue a rotina de conversão: implementation uses RxGif. end.Atalhos para programas Em nossa abordagem.br. var GIF: TGIFImage. BMP: TBitmap.Free. end.LoadFromFile(‘c:\banner_theclub. poderá baixar em nosso site. BMP.

s := InFolder. PIDL). ISLink : IShellLink. SHGetSpecialFolderLocation(0. begin Result := False. SHGetPathFromIDList(PIDL. end.s : WideString.Primeiramente.LNK’. InFolder : array[0. PIDL : PItemIDList. LinkName := s + ‘\’ + aPathGroup + ‘\’ + aNome + ‘. hPath: PChar. aLocation: integer). ActiveX. aLocation. IPFile. var pIdl: PItemIDList. 156 . TargetName : String.dfm} procedure CriaShortCut(aNome. {$R *. var IObject : IUnknown. Agora vamos para a procedure responsável em criar o Grupo e o Ítem de Programa: function CreateFolder(Foldername: string. false).. o caminho e nome do aplicativo a ser executado. ISLink := IObject as IShellLink. SetWorkingDirectory(pChar(ExtractFilePath(TargetName))). vamos criar uma procedure para criação de atalhos: implementation uses ShlObj. aFileName. aPathGroup: string. ComObj. LinkName. aLocation: integer): boolean. IPFile := IObject as IPersistFile. InFolder). begin TargetName := aFileName.Save(PWChar(LinkName). Esta procedure recebe como parâmetro o Nome do atalho a ser apresentado. with ISLink do begin SetPath(pChar(TargetName)). IObject := CreateComObject(CLSID_ShellLink). IPFile : IPersistFile.MAX_PATH] of Char. end. e por último o grupo ao qual ele irá pertencer no menu Iniciar do Windows.

CriaShortCut(‘Bloco de Notas’. SHGetPathFromIDList(pIdl. Trabalhando com esta constante.exe’ . aLocation. CSIDL_PROGRAMS). // cria sub-grupo dentro do “The Club” CreateFolder(‘The Club\Grupo 3’.Button1Click(Sender: TObject). CSIDL_PROGRAMS). ‘c:\windows\system32\calc. StrDispose(hPath). CSIDL_PROGRAMS). end. CSIDL_PROGRAMS). Dica: A constante CSIDL_PROGRAMS indica a pasta padrão onde os ítens do menu iniciar do Windows ficam armazenados.exe’. CSIDL_PROGRAMS). // cria sub-grupo dentro do “The Club\Grupo 3” CreateFolder(‘The Club\Grupo 3\Sub Grupo 4’. 157 . ‘The Club\Grupo 2’. SetLastError(0). // cria sub-grupo dentro do “The Club\Grupo 2” CreateFolder(‘The Club\Grupo 2\Sub Grupo 1’. // cria atalho para os programas CriaShortCut(‘Calculadora’. CSIDL_PROGRAMS). a pasta irá ser criada no local correto. Observe que primeiramente criamos um grupo principal. hPath). Seguindo. ou seja. chamado “The Club”. ‘The Club\Grupo 1’. independente da versão e linguagem do Windows. pidl)) then begin hPath := StrAlloc(max_path). ‘C:\Program Files\Windows NT\Accessories\wordpad. if ForceDirectories(PChar(hPath + ‘\\’ + Foldername)) then Result := true. // cria sub-grupo dentro do “The Club” CreateFolder(‘The Club\Grupo 2’. onde ele deverá ser criado. CSIDL_PROGRAMS). Observe que esta procedure recebe como parâmetro o nome do grupo (que na realidade será o nome de um “Folder” e a localização.if SUCCEEDED(SHGetSpecialFolderLocation(0. end. CSIDL_PROGRAMS).exe’. Exemplo de utilização: procedure TForm1. CSIDL_PROGRAMS). ‘The Club\Grupo 3’. CriaShortCut(‘WordPad’. begin // cria Grupo principal. ‘c:\windows\system32\notepad. CreateFolder(‘The Club’. // cria sub-grupo dentro do “The Club” CreateFolder(‘The Club\Grupo 1’. // cria sub-grupo dentro do “The Club\Grupo 1” CreateFolder(‘The Club\Grupo 1\Sub Grupo 1’. end. dentro de “The Club” criamos sub-grupos e dentro dos sub-grupos os atalhos que irão chamar os aplicativos em questão. CSIDL_PROGRAMS).

Classes. var Form1: TForm1.zip Como mover um componente em Run-time Para montar este exemplo vamos incluir um componente Button. 158 . Button: TMouseButton. Shift: TShiftState. Forms. X. Para testar este exemplo mantenha a tecla CTRL pressionada clique com o mouse sobre o componente Button e arraste-o para qualquer lugar do form. Y: Integer). Shift: TShiftState.br/revista/download/CriaGrupoAtalho.Button1MouseDown(Sender: TObject. procedure Button1MouseUp(Sender: TObject. Variants. Shift: TShiftState. StdCtrls. X. Dialogs. procedure Button1MouseDown(Sender: TObject. X. Y: Integer).dfm} // Evento OnMouseDown do botão procedure TForm1. Messages. unit Unit1. implementation {$R *. SysUtils.activeinterno. type TForm1 = class(TForm) Button1: TButton.com. Button: TMouseButton. Capturing : bool. X. Y: Integer). Y: Integer). Controls. Shift: TShiftState. private { Private declarations } public { Public declarations } MouseDownSpot : TPoint. interface uses Windows. end. procedure Button1MouseMove(Sender: TObject. Button: TMouseButton. Graphics.Este exemplo está disponível para download em nosso site no endereço: http://theclub.

Shift: TShiftState. porém elas não estão visíveis para acesso direto.DFM} type TMostraProp = class (TDBGrid). Button: TMouseButton. Shift: TShiftState.Top := Button1.Left(MouseDownSpot. begin if Capturing then begin Button1. Contudo. end. end. MouseDownSpot. end.Left := Button1.Top:= Button1.Left:= Button1.Top (MouseDownSpot. end. Como apresentar o número da linha e coluna em um DBGrid? O DBGrid possui estas informações. X... // Evento OnMouseMove do botão procedure TForm1. end. Y: Integer).Button1MouseMove(Sender: TObject. implementation {$R *.x -x). podemos derivar uma classe a partir de TDBGrid e utilizá-las sem problemas. Button1. MouseDownSpot.Y := Y. Button1.y).Left (MouseDownSpot.y . Capturing := true.y-y). Y: Integer).Handle).Top (MouseDownSpot. Capturing := false. end.X := x. X. begin if Capturing then begin ReleaseCapture.x-x). Button1.Button1MouseUp(Sender: TObject. 159 . // Evento OnMouseUp do botão procedure TForm1.begin if ssCtrl in Shift then begin SetCapture(Button1.

LogException(Sender: TObject. interceptando seu evento OnException e gerando um arquivo texto com as mensagens de erros geradas durante a execução do aplicativo. end. { pega ponteiro para o arquivo } AssignFile(Arquivo. Row: %2d’.Exename. var NomeDoLog: string.Row]). trocando a extensão para “. ‘. Field: TField). adicione um componente TapplicationEvents no Form principal de sua aplicação e abra o evento OnExxception onde iremos programar o seguinte: procedure TFormLog.Col. Arquivo: TextFile.ShowException(E). end.log’). NomeDoLog). end.DataSource1DataChange(Sender: TObject. E: Exception). begin DBGrid1ColEnter(Sender). Como implementar um log de todos os erros gerados na aplicação? Isso poderá ser implementado utilizando um componente TApplicationEvents (aba Additional). begin { preparar o arquivo de log utiliza o nome da aplicação. { verifica se existe } if FileExists(NomeDoArquivo) then Append(Arquivo) { se existir.DBGrid1ColEnter(Sender: TObject). DateTimeToStr(Now) + ‘:’ + E. Para isso. begin Caption := Format(‘Coluna: %2d. gerar uma exceção de divisão por zero: 160 . { mostra mensagem original de erro } Application. bastará por exemplo em um botão. Para testar. TMostraProp(DbGrid1).Message). { evento OnDataChange do DataSource } procedure TForm1.{evento OnColEnter do DBGrid} procedure TForm1. } NomeDoLog := ChangeFileExt(Application. [TMostraProp(DbGrid1).log”. end. apenas adiciona linhas } else ReWrite(Arquivo). { cria um novo se não existir } try { grava Data e Hora + Mensagem de erro } WriteLn(Arquivo. finally { fecha o arquivo } CloseFile (LogFile).

procedure TForm1.Button1Click(Sender: TObject); var a, b, c: Integer; begin a := 10; b := 0; c := a div b; ShowMessage(IntToStr(c)); end;

Printers - Como retornar informações das impressoras instaladas na máquina
Nesta dica, demonstraremos como retornar informações úteis das impressoras instaladas na máquina, como por exemplo, o caminho da rede, seu nome de compartilhamento, porta, etc. Insira um componente ListView e um botão, como mostra a figura 1.

Na lista de uses, declare:

uses Printers, WinSpool; { Procedure que irá adicionar as informações ao ListView } procedure AdicionaImpressoras(LV: TListView; Servidor, NomeImpressora, Compartilhamento, Porta, NomeDriver, Comentario: String); var i: integer; begin with LV do begin Items.Add; i := Items.Count-1; Items[i].Caption := Servidor; Items[i].SubItems.Add(NomeImpressora); Items[i].SubItems.Add(Compartilhamento); Items[i].SubItems.Add(Porta); Items[i].SubItems.Add(NomeDriver); Items[i].SubItems.Add(Comentario);

161

end; end;
O retorno das informações será feito através da API EnumPrinters:

procedure GetPrinterList(List: TListView); var Buffer, PrinterInfo: PChar; Flags, Count, NumInfo: DWORD; i: Integer; Level: Byte; begin Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL; Level := 2; Count := 0; EnumPrinters(Flags, nil, Level, nil, 0, Count, NumInfo); if Count > 0 then begin GetMem(Buffer, Count); try if not EnumPrinters(Flags, nil, Level, PByte(Buffer), Count, Count, NumInfo) then Exit; PrinterInfo := Buffer; for i := 0 to NumInfo - 1 do begin case Level of 2: begin AdicionaImpressoras(List, PPrinterInfo2(PrinterInfo)^.pServerName, PrinterInfo2(PrinterInfo)^.pPrinterName, PPrinterInfo2(PrinterInfo)^.pShareName, PPrinterInfo2(PrinterInfo)^.pPortName, PPrinterInfo2(PrinterInfo)^.pDriverName, PPrinterInfo2(PrinterInfo)^.pComment); Inc(PrinterInfo, SizeOf(TPrinterInfo2)); end; 4: begin AdicionaImpressoras(List, PPrinterInfo4(PrinterInfo)^.pServerName, PPrinterInfo4(PrinterInfo)^.pPrinterName, ‘null’, ‘null’, ‘null’, ‘null’); Inc(PrinterInfo, SizeOf(TPrinterInfo4)); end; 5: begin AdicionaImpressoras(List, ‘null’, PPrinterInfo5(PrinterInfo)^.pPrinterName, ‘null’, PPrinterInfo2(PrinterInfo)^.pPortName,

162

‘null’, null’); Inc(PrinterInfo,SizeOf(TPrinterInfo5)); end; end; end; finally FreeMem(Buffer, Count); end; end; end; { abaixo, fazemos a chamada da procedure no evento OnClick do botão } GetPrinterList(LView);
O projeto completo referente esta dica está disponível para download em http://theclub.activeinterno.com.br/revista/download/ListaImpressoras.zip

IP – Como retornar o hostname a partir de um endereço IP
Em muitas situações, necessitamos saber o nome de uma máquina e temos apenas seu endereço IP. Na unit WinSock, poderemos encontrar diversas APIs para este tipo de abordagem, veja abaixo um simples exemplo: implementation uses WinSock; {$R *.dfm} function ResolveHostByIp(IP: string): String; type TAPInAddr = Array[0..100] of PInAddr; PAPInAddr = ^TAPInAddr; var WSAData: TWSAData; Address: String; InetAddr: u_long; HostEntPtr: PHostEnt; HostEnt: THostEnt; HostName: String; len, struct: Integer; i: Integer; begin Result := ‘’; WSAStartUp( $101, WSAData );

163

ShowMessage( E.h_name ). é obtendo o path de sistema onde o Windows guarda estas informações e nele criar os grupos.Create ( ‘Invalid address entered’ ). end. if Address = ‘’ then raise Exception. Para utilizar: Edit.try Address := Trim(IP). // retorna o nome da máquina Windows – Como criar grupos e subgrupos de programas no menu iniciar Uma das formas para fazer a criação de grupos e subgrupos de aplicativos no menu iniciar do Windows.Create ( ‘IP address not entered’ ). len. Veja abaixo como proceder: implementation uses ShlObj.16’). Result := HostName.Text := ResolveHostByIp(‘200. if InetAddr = SOCKET_ERROR then raise Exception.71. end.Message ). // Get hist entry by IP HostEntPtr := GetHostByAddr( @InetAddr. except on E: Exception do begin Beep().210. WSACleanUp().Create( ‘WinSock error: ‘ + IntToStr( WSAGetLastError() ) ). struct ). {$R *. if HostEntPtr = NIL then raise Exception. end. // Convert textual IP address to binary format InetAddr := inet_addr( PChar(Address) ).dfm} 164 . // Insert hostname into list HostName := String( HostEntPtr^. FileCtrl.

MAX_PATH] of char. será necessário fazer um tratamento de mensagens do Windows. Windows – Como desabilitar uma combinação de teclas genericamente Para desabilitar uma combinação de teclas válida para todos os formulários da aplicação. Result := path. Result := Result + ‘\’. begin Result := ForceDirectories(GetProgramFolder+Path). if CriaGrupo(‘TheClub\Grupo 3’) then ShowMessage(‘Grupo TheClub\Grupo 3 criado com sucesso!’). function CriaGrupo(Path: string): Boolean.. pidl). var Form1: TForm1. private procedure ProcessaMsg(var Msg: TMsg. CSIDL_PROGRAMS. Path: array[0. begin if CriaGrupo(‘TheClub\Grupo 1’) then ShowMessage(‘Grupo TheClub\Grupo 1 criado com sucesso!’). var pidl: PItemIDList. { Private declarations } public { Public declarations } end. if CriaGrupo(‘TheClub\Grupo 2’) then ShowMessage(‘Grupo TheClub\Grupo 2 criado com sucesso!’).Button1Click(Sender: TObject). var Handled: Boolean).path).Handle. end. procedure TForm1. O exemplo abaixo demonstra como desabilitar a combinação CTRL+P: type TForm1 = class(TForm) procedure FormCreate(Sender: TObject). SHGetPathFromIDList(pidl. end.function GetProgramFolder: string. begin SHGetSpecialFolderLocation(Application. 165 . end.

end. Veja como definir o papel de impressão personalizado no Windows XP/2000/NT No Windows 9x. para definirmos um papel como personalizado basta acessar as propriedades da impressora que iremos encontrar este tipo de papel.ProcessaMsg(var Msg: TMsg. porém temos a opção de criar um novo tipo de papel nas medidas que desejarmos. end. var Handled: Boolean).DFM} { procedure de tratamento } procedure TForm1. pois não há um papel pré-definido como personalizado. Porém.FormCreate(Sender: TObject). end. begin { liga a procedure } Application. Para isso. begin if Msg.wParam := VK_CLEAR.implementation {$R *. bastará clicar em “Create a new form” e criar o seu papel personalizado e salvar logo em seguida e clicar em OK para finalizar! 166 . end. Agora. end. no Windows XP isso é um pouco diferente.message = WM_KEYDOWN then begin if (GetASyncKeyState(VK_CONTROL) <> 0) and (GetASyncKeyState(Ord(‘P’)) <> 0) then // Ctrl+P begin ShowMessage(‘Ctrl+P está sendo desabilitado!’). abra o item “Impressoras & Faxes” de seu Windows e sem selecionar NENHUMA impressora acesse o menu “Arquivo ( ou File)” e neste selecione a opção “Propriedades do Servidor (ou Server Properties)” como mostra a imagem ao lado. procedure TForm1.OnMessage := ProcessaMsg. Msg.

dfm} function GetTotFiles(Diretorio: String): Integer.Bom. como exemplo: função que me retorne a quantidade de arquivos existentes em um dado diretório? Poderá utilizar o objeto TSearchRec para obter o número de arquivos em um dado diretório: implementation {$R *. var SRec: TSearchRec. agora bastará acessar as propriedades da impressora e definir este novo papel nas configurações de sua impressora. 167 .

Res: Integer. Res := FindFirst(Diretorio+’\*. end. procedure TForm1. 168 .Button1Click(Sender: TObject). faAnyFile. Inc(Result). end.*’. begin Caption := IntToStr( GetTotFiles(‘d:\testes’) ). SRec). while Res = 0 do begin Res := FindNext(SRec). begin Result := 0. end.

Sign up to vote on this title
UsefulNot useful