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

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

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

FormKeyDown(Sender: TObject. var Key: Word. Insira um componente Label no form (Label1). [Key]). Shift: TShiftState). Função . begin if DayOfWeek(dData) = 7 then dData := dData + 2 else if DayOfWeek(dData) = 1 then dData := dData + 1. end. 1. Result := dData. 2. end. begin Label1. 3.Caption := Format(‘O código da tecla pressionada é: %d’. Para testar execute e observe o Label enquanto pressiona as teclas desejadas.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. Altere o evento OnKeyDown do form como abaixo: procedure TForm1. Mude a propriedade KeyPreview do form para true. 6 .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.

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

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

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

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

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

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

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

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

snd_Async or snd_NoDefault). no evento OnCreate do formulário insira o código a seguir: procedure TForm1. end.wav'. 15 .Speak('Ramos da Informática'.CMMouseEnter(var AMsg: TMessage). implementation procedure TYourObject.var voice: OLEVariant. end.FormCreate(Sender: TObject). message CM_MOUSEENTER. begin sndPlaySound(nil. a rotina deve ficar assim: uses MMSystem..snd_Async or snd_NoDefault). procedure TYourObject.. begin Button1. voice. message CM_MOUSELEAVE. Hints com multiplas linhas É muito simples.SpVoice').. procedure CMMouseLeave(var AMsg: TMessage). begin sndPlaySound('c:\win\media\ding. private procedure CMMouseEnter(var AMsg: TMessage). voice := unassigned. begin voice := CreateOLEObject('SAPI.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. voice.Rate := 0. TYourObject = class(TAnyControl) . Multimídia . end.. voice. end.CMMouseLeave(var AMsg: TMessage). .0).Volume := 100. end.Hint:='Ramos da'+#13+'Informática'.

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

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

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

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

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

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

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

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

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

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

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

if nodetails.Disconnect. Vamos precisar também de uma variável tipo string para armazenar cada linha lida do arquivo: var linha: String. Pos('/'. 1. Delete(dir. 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. end.1)). end.(nodetails. if dir[Length(dir)] <> '\' then dir := dir + '\'. end.') or (nodetails. Esta dica apresenta um destes métodos: o uso de TextFiles.Delete(k). end. 1. FTPClient. end. 1.1)) = -1 then begin FTPClient.') then begin details. Inicialmente para acessar um arquivo de texto. nodetails. FTPClient. nodetails.Free.Strings[k] = '. details.ChangeDir(Copy(dir. Pos('/'.Strings[k] = '. dir) . você precisa definir uma variável tipo TextFile.MakeDir(Copy(dir. 29 .Delete(k). TextFile é um tipo de dado pré-definido no Delphi e corresponde ao tipo Text do Turbo Pascal e do Object Pascal.. dir := 'C:\your\local\directory\'. Pos('/'.1)). GetDir(dir). 1. Pos('/'. dir) . da seguinte forma: var arq: TextFile. end. dir) . end.IndexOf(Copy(dir.Free. no local que você achar mais apropriado. dir)).

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

end.Create(nil). begin Connection := TSQLConnection. Veja agora como fazer isso em tempo de execução. } procedure TVCLScanner. tam ). caminho do banco de dados. CloseFile ( arq ). Note também o uso de Write e WriteLn para gravar dados no arquivo texto. LastName: WideString). Finalmente note o uso de AjustaStr e FormatFloat para garantir que campos string e numericos sejam gravados com um número fixo de caracteres. var Connection: TSQLConnection. FormatFloat é uma rotina do próprio Delphi enquanto AjustaStr está definida abaixo: function AjustaStr ( str: String. Rewrite abre o arquivo para escrita. end. etc) para indicar a conexão. 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. DataSet: TSQLDataSet. 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. tam: Integer ): String. destruindo tudo que houver lá anteriormente . begin while Length ( str ) < tam do str := str + ' '. FirstName. end. 1.Next. if Length ( str ) > tam then str := Copy ( str. with Connection do begin 31 .PostUser(const Email.WriteLn ( arq ). Note nesta segunda rotina. a substituição de Reset por Rewrite logo após o AssignFile. nome da conexão. tabela. Result := str.

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

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

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

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

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

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

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

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

filename. Flags: unchecked [Code] function SQLConfigDataSource(hwndParent: LongInt.) Vá em Project + Import Type Library..) Selecione Acrobat Control para ActveX.. // add a system DSN ODBC_CONFIG_SYS_DSN = 5.. + install . // Remove data source ODBC_ADD_SYS_DSN = 4... external 'SQLConfigDataSource@ODBCCP32.. 5.) Vá depois na palheta ActiveX e escolha o componente PDF 6.) Aparcerá uma tela. // remove a system DSN function CreateDSN( showdlg: Boolean) : LongInt.. // Configure (edit) data source ODBC_REMOVE_DSN = 3.DLL stdcall'. // Configure a system DSN ODBC_REMOVE_SYS_DSN = 6. var 40 ..) Faça as devidos ajuste e digite no button: if opendialog1. lpszAttributes: String): LongInt. var hwnd : LongInt. clique em compilar. const ODBC_ADD_DSN = 1.. 4.execute then pdf1... fRequest: LongInt...... 3. Description: Config DSN with dialog.src:=opendialog1..2.. Inno Setup .. lpszDriver: String.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. // Add data source ODBC_CONFIG_DSN = 2. GroupDescription: Configuration:.

'. end. begin // by default go to next page Result := true. 41 . 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. if CreateDSN( showdlg ) = 0 then MsgBox( 'DSN not done. mbError. // MYSQL Sample { strDriver := 'MySQL'. ODBC_ADD_SYS_DSN. NewLine := Chr(0). // if curpage is wpSelectTasks check config DSN if CurPage = wpSelectTasks then begin showdlg := ShouldProcessEntry( ''. NewLine : String. } Result := SQLConfigDataSource( hwnd. end. strDriver. mbInformation. setting HWND of wizard let show // DSN setup dialog with attributes specified if not showdlg then hwnd := 0 else hwnd := StrToInt(ExpandConstant('{wizardhwnd}')).'cfgdsndlg') = srYes . function NextButtonClick(CurPage: Integer): Boolean. MB_OK ).strDriver. MB_OK ) else MsgBox( 'DSN Created !'. begin // if it is not auto configuration. var showdlg : Boolean. end. strAttributes. strAttributes).

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

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

Form2.Alterar a impressora padrão Basta informar o índice da impressora da seguinte forma: uses RpDevice. else Result := ‘SO desconhecido’. end. rvTestes.Show. AW_BLEND). RPDev.PrinterIndex := 0.BringToFront.Caption := GetWinVersion.Button1Click (Sender: TObject). { 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. begin Form2. end. end.PrinterIndex.Handle. XP case Win32MinorVersion of 0: Result := ‘Windows 2000’. procedure TForm1.5: // Win2K. AW_ACTIVATE : Activates the window AW_HIDE : Hides the window. Veja a seguir como chamar: procedure TForm1.Button1Click(Sender: TObject). else Result := ‘SO desconhecido’.DeviceIndex := Printer. // Chamada: { mostrar em um label } OSVersion.NET server’. Printers. AnimateWindow(Form2. 1: Result := ‘Windows XP or . Atribuíndo efeitos para abertura de formulários Existe uma função chamada AnimateWindow. begin Printer. Rave Report . end. 44 . 3000.ExecuteReport(‘Rep_Employee’).

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

end. Inno Setup . 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.Button1Click(Sender: TObject). 46 . por exemplo. ‘SOFTWARE\Firebird Project\Firebird Server’) then begin MsgBox(‘ Não posso instalar! ‘. begin if RegKeyExists(HKEY_LOCAL_MACHINE.end. mbInformation. veja agora como controlar o powerpoint em uma aplicação delphi uses comobj. Isso é muito interessante. end. para verificar se uma determinada aplicação já existe no computador do cliente. Aqui trazemos mais uma dica deste fantástico gerador de instalações. end else Result := true. Result := false.Verificando se existe determinada Chave no Registro do Windows O Inno Setup é o instalador oficial do nosso site. Controlando o PowerPoint no Delphi Seguindo a linha da automação OLE Office. MB_OK ). procedure TForm1.

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

Report: TRaveReport. // Abre RvProject. RvProject1. Report := RvProject1. [Code] [Setup] AppName=Adicionar no iniciar.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. DisableStartupPrompt=true Uninstallable=false DisableDirPage=true OutputBaseFilename=Adicionar no iniciar.FindRaveComponent (‘Report1.nil) as TRavePage. RvProject1. uses RVClass. procedure TForm1. apresentamos uma dica para adicionar sua aplicação para iniciar junto com o Windows.ProjMan. InnoSetup .btnChamaRelClick (Sender: TObject). QualPagina := ‘Page2’.ProjMan.Execute. // Pega referência da “Page” dentro do “Report”.’+QualPagina. var Pagina: TRavePage. // Indica a página inicial. AppVerName= Adicionar no iniciar. Pagina := RvProject1. // Executa o relatório.Rave Report . end. 48 . Neste exemplo. // Pega referência do “Report” // dentro do projeto Rave.ActiveReport.Open. DefaultDirName={pf}\ Adicionar no iniciar.FirstPage := Pagina. iremos demonstrar como definir via programação qual página será apresentada como inicial. RVProj. RVCsStd.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. Report. begin // Nome da página dentro do projeto Rave. A seguir. QualPagina: String.

[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

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

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

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

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

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

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

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

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

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

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

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

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

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

Table1Continent: TStringField.DFM} { Agora criamos os Objetos e configuramos suas propriedades } procedure TForm1.Enabled := True. begin Screen. TFields .SpeedButton1Click(Sender: TObject). end. end. procedure TForm1. 67 . implementation {$R *. Button2.Text := 'Teste'.FormClose(Sender: TObject. begin if (ActiveControl is TEdit) then (ActiveControl as TEdit). var Form1: TForm1. Table1Area: TFloatField. } public Table1Name: TStringField. Table1Population: TFloatField. begin Table1. se for envia um Texto para esse componente. trocando a propriedade Text utilizado neste exemplo pela propriedade do outro componente. ActiveControl .procedure TForm1.Button1Click(Sender: TObject). Button1. Funciona para outros componentes.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.Envia valor para Edit que tiver em foco Verifica se o componente que está com o foco é da classe do TEdit.Close.Enabled := False.OnActiveControlChange := Nil. var Action: TCloseAction). Table1Capital: TStringField. { Public declarations } end.

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

Style := [fsBold].Color := clYellow.Items[Index]) > 5 then begin ListBox1.Open.Create.Canvas.OpenKey(Chave. var K: TRegistry. NomeIcone.Items[Index]). ListBox1. end. end. begin if StrToInt(ListBox1. Ext: string)..ListBox1DrawItem(Control: TWinControl.Font. try K.RootKey := HKEY_CLASSES_ROOT.Color := clBlue. *** 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. ListBox . finally K.') end.Colorir procedure TForm1. Valor). ListBox1.Canvas. end.Canvas. Nome. K.. ListBox1.WriteString(Nome. end. State: TOwnerDrawState). K. true). Rect. ‘’.Top. begin K := TRegistry.Table1.Canvas. procedure CriaAssociacao(const NomeDoc. Listbox1. except ShowMessage('Adicione os campos.FillRect(Rect). end.Font.Brush. NomeApp). begin CriaChave(NomeDoc. Rect: TRect. NomeApp.TextOut(Rect. 69 . ListBox1.Canvas. Valor: string). NomeEXE.Free.Left. Index: Integer.

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

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

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

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

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

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

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

enter. listValues. var Key: Word. begin listValues. i.sorted := true.add(edtList. procedure TForm1. 13. 0. end. 46.create.text). procedure TForm1. var theText: string. begin listValues := TStringList.40: . listValues[i]) < 0 then begin text := listValues[i]. begin if not ckbxList. Shift: TShiftState).// 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.free. procedure TForm1.Duplicates := dupIgnore.edtListKeyUp(Sender: TObject. p). // cursor position theText := copy(text. // User can enable/disable with edtList do case key of 8. // Excludes searched portion // Match entered text portion for i := 0 to listValues. p: integer. ini file etc. 37. begin listValues. procedure TForm1.FormDestroy(Sender: TObject).checked then exit. end.edtListExit(Sender: TObject). initialize the list from a database..FormCreate(Sender: TObject). 77 . upperCase(listValues[i]))=1 then if compareText(theText. end. delete. // No backspace. listValues.count-1 do begin // Keep case of listed item if pos(upperCase(theText). or arrows else begin // Search for unselected portion at start of text p := selStart. selStart := p.

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

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

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

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

{ Modifique para obter cores diferentes } FillRect(Rect(0. var altura. 0). Para compilar. begin Invalidate. Coloração gradiente no Form procedure TForm1. coluna: Word. 82 . que é nada mais que o seu projeto compilado. simplesmente digite na linha do prompt : dcc32 teste Pronto. no mesmo diretório.ARQUIVO: teste. é só colocar no . etc. ClientWidth.dfm. Você terá. alinhamento.Color := RGB(coluna. procedure TForm1. Caso você queira alterar cor. um arquivo chamado teste. coluna * altura. begin altura := (ClientHeight + 255) div 256. etc e etc. for coluna := 0 to 255 do with Canvas do begin Brush.dfm como se fosse a janela de propriedades do objeto. 0.exe. end.FormPaint(Sender: TObject).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 . end. end. (coluna + 1) * altura)) .FormResize(Sender: TObject).

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

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

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

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

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

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

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

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

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

//abre o arquivo para escrita Writeln(f.linhadecodigo. Key := 0. //le do arquivo e desce uma linha.br'). var Key: Word.SelectAll. end. 92 . Shift: TShiftState) . While not eof(f) do begin Readln(f. Closefile(f). O conteúdo lido é transferido para a variável linha Memo1.'Linha de Código .www. End. Rewrite(f). begin AssignFile(f. //fecha o handle de arquivo End.F:TextFile.'c:\qq_arquivo.txt'). 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. end. //escreve no arquivo sem descer a linha Closefile(f). linha:String.add(linha).linha).'Testando'). end. //abre o arquivo para leitura. begin if (Key = Ord('A')) and (ssCtrl in Shift) then begin TMemo(Sender).lines. Begin AssignFile(f.com. escreve no arquivo e desce uma linha Write(f.'c:\qq_arquivo.txt'). Reset(f). ///Rotina para ler de um arquivo texto: var f:TextFile.

'NETSH'.10.255. 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.10. Texto na diagonal e girando Procedure TForm1. MB_ICONWARNING). SW_SHOWNORMAL) else MessageBox(Handle.168. mas pode ser feito com qualquer outra versão do delphi. 'esse {Comando não pode ser rodado fora da plataforma NT'.168. bem vamos por a mão na massa e brincarmos um pouco com as configurações de IP. {onde verifico se a plataforma do Programa é uma plataforma NT. nos Windows 2000 e XP existe um aplicativo chamado NETSH que faz essa mudança para nós sem que precisemos reiniciar o computador. SW_SHOWNORMAL) else MessageBox(Handle.104 255. Para maiores informações sobre o NETSH visite o site da Microsoft: Suporte Microsoft. MB_ICONWARNING). Pronto seu IP.1 1'. 'esse Comando não pode ser rodado fora da plataforma NT'.255. Mudando a Configuração para DHCP: Crie uma aplicação no Delphi.0 192. 'NETSH'.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. Mudando as Configurações dos IPs da máquina.Button1Click(Sender: TObject). 93 . SubnetMask e Gateway foram mudados. caso contrário informo ao usuário que esse comando não pode ser rodado fora de uma plataforma NT. 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'.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Isto faz com que o formulário passe do painel ‘Auto-create forms’ para o painel ‘Available forms’. ‘Verde’. Às vezes o tempo de carga se torna totalmente insuportável. Isto simplifica a vida do programador que não precisará se preocupar com este detalhe.Create(AOwner : TComponent. End. Aponte para um dos formulários e clique no botão ‘>’. 109 . pPar1.FormShow(Sender: TObject). Agora no seu form1. 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. Parametro1 := pPar1. Para remover o código que o Delphi criou automaticamente. todo formulário precisa ser criado.Form2: TForm2. implementation constructor TForm2. Free. No evento OnShow inclua a seguinte linha: procedure TForm2. Obs: Não deixe o Delphi criar automaticamente o formulário. begin inherited Create(AOwner). 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. Antes de ser efetivamente utilizado. begin Caption := Parametro1 + ‘ . pPar2 : String).‘+ Parametro2. Parametro2 := pPar2. o IDE do Delphi providencia código para que ele seja criado automaticamente. A criação do formulário acontece sempre que você adiciona um novo formulário ao sistema. end. selecione Project|Options no menu. Crie-o (e o destrua) manualmente. ‘Amarelo’) do Begin ShowModal. end. 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.Create(self. abra o form2 com a seguinte sintaxe: With TForm2. Selecione a aba ‘Forms’.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

begin AMsgDialog := CreateMessageDialog(‘Quickly! Answer Yes or No!’. se sim. IDNO: ShowMessage(‘No’) . ATimer : TTimer. AProgressBar := TProgressBar. AProgressBar : TProgressBar. para mrCancel. Também podemos adicionar um objeto Timer para uma atualização dinâmica da posição da barra de progresso. Neste objeto podemos adicionar a barra de progresso. end. Se não. Create(AMsgDialog) . mbNo]) . var AMsgDialog : TForm. mtWarning. Esta função retornará um form object com o dialog. Mostramos o dialog com ShowModal. ‘MessageBoxTimeout Teste’. 135 . Apontamos o evento OnTimer do componente TTimer para ver o número se passou a quantidade de segundos necessária. iFlags. usamos StepIt para atualizar a barra de progresso. ATimer := TTimer. //seconds! Caption := ‘You have 10 seconds’. 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”. fechamos o dialog ajustando a propriedade ModalResult. Height := 150. 5000) .de 5 segundos.Create(AMsgDialog) . no código. with AMsgDialog do try Tag := 10. Coloque um botão no formulário e tente este código: procedure TForm1. 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. 0. MB_TIMEDOUT: ShowMessage(‘TimedOut’) . case iRet of IDYES: ShowMessage(‘Yes’) .’.Button1Click (Sender: TObject) . end. [mbYes.

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

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

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

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

veremos se conseguimos encontrar uma correspondência } Found := False.32) .Count do if Copy(Items[j-1].SelLength+SelStart+1. Key := #0. 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. { 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) ..’Z’.. { indica qual tecla foi apontada } if SelSt = 0 then begin Text:= ‘’. for j := 1 to Items.255) .SelStart1)+Copy(Text. if TmpStr = ‘’ then Exit.1.255) else if Key = Chr(vk_Back) then {SelLength = 0} TmpStr := Copy(Text. {Agora que TmpStr é a string sendo digitada no momento.SelStart)+Copy (Text.SelLength+SelStart+1.1. etc]} TmpStr := Copy(Text. if (Key = Chr(vk_Back)) and (SelLength <> 0) then TmpStr := Copy(Text. {Somente Uppercase!} with (Sender as TComboBox) do begin SelSt := SelStart.SelStart)+Key+Copy (Text.1.TmpStr: string. Exit.255) else {Key in [‘A’.SelStart+1.Length(TmpStr)) = TmpStr then begin 140 . begin { primeiro. end.1.

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

end. 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. var Direction : Integer. um form (Form1). Usando as setas do teclado para se mover entre os controles As teclas Up e Down são virtualmente inúteis em controles Edit. case Key of VK_DOWN. 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) . Shift : TShiftState ). {Previous} end. Observação: Você precisará de um TRichEdit (RichEdit1). end. Então. var Key: Word. VK_RETURN : Direction := 0. A variável string WordInRE conterá a palavra. if Direction <> -1 then begin Perform(WM_NEXTDLGCTL. Key := 0. e o código abaixo no evento OnMouseMove do RichEdit1. 142 . begin Direction := -1.FormKeyDown( Sender : TObject.DrawRounded(Edit1) . end. Direction. {Next} VK_UP : Direction := 1.

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

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. var Value: String). Abaixo. QuickRep1. procedure TForm1. 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. TotalPaginas := QuickRep1.PageNumber. Para pegar o total de páginas você pode executar o código abaixo antes de chamar o relatório. var sVersion: String. [Setup] AppName=VerificaVersao AppVerName=VerificaVersao DefaultDirName={pf}\VerificaVersao DisableStartupPrompt=true Uninstallable=false DisableDirPage=true OutputBaseFilename=VerificaVersao [Code] function GetVersion(): String. O primeiro passo é pegar o total de páginas e jogar para uma variável.Prepare. então. begin sVersion := ‘’.QRSysData1Print (sender: TObject. GetVersionNumbersString( ExpandConstant 144 . 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. se inferior.Mostra o total de páginas Você pode fazer este tipo de trabalho. InnoSetup – Verificando a versão do software. begin Value := Value + ‘/’ + IntToStr(TotalPaginas) end.

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. { Escreve o texto } a_strTextfile[GetArrayLength (a_strTextfile)-1] := strNewLine. a_strTextfile). { Adiciona uma linha no Array } SetArrayLength(a_strTextfile. end. begin Result := False. begin if GetVersion() = ‘5.2600. 145 . acompanhe o script abaixo: [Setup] AppName=EditaTexto AppVerName=EditaTexto DefaultDirName={pf}\EditaTexto DisableStartupPrompt=true Uninstallable=false DisableDirPage=true OutputBaseFilename=EditaTexto [Code] function AddToText(strFilename.(‘{win}\notepad. strNewLine: String): Boolean.exe’) . a_strTextfile : TArrayOfString.’. end else Result := true. mbInformation. Result := sVersion.1. function InitializeSetup(): Boolean. sVersion ). iLineCounter : Integer. MB_OK ). var strTemp : String. { Carrega as linhas do texto em um Array } LoadStringsFromFile(strFilename. end. GetArrayLength(a_strTextfile)+1).0’ then begin MsgBox( ‘Versão instalada: ‘ + GetVersion() + chr(13) + ‘ Você só poderá instalar uma versão superior. Result := false.

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

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

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

StrLen(PChar(Column. end.AsString).Field. implementation {$R *. end. begin { Ajusta altera padrão para as linhas } TGrid(DBGrid1).BottomRight. end. procedure Button1Click(Sender: TObject). procedure FormClose(Sender: TObject.AsString)). DT_EXPANDTABS or DT_WORDBREAK ). end. { Ajusta limite para Quebrar o texto. PChar(Column.FormCreate(Sender: TObject). neste caso. var Action: TCloseAction). procedure FormCreate(Sender: TObject).CopyRect(R.DefaultRowHeight := 50.FormFoco(Sender: TObject). begin { Verifica se o form que está com o 149 . var Comp: TLabel.FillRect(Rect). irá alterar a cor da fonte do texto da mesma. R.Right := R.Handle. { Evento OnCreate do Form } procedure TForm1. Vamos ao código: type TForm1 = class(TForm) Button1: TButton.X. verifica a largura da coluna } R.dfm} procedure TForm1. 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). Canvas. Rect). { desenha o texto na "área" determinada em "R" } DrawText(Canvas. Mensagens: Alterar a cor da fonte de um ShowMessage Neste dica. var Form1: TForm1.Field. end. private public procedure FormFoco(Sender: TObject).

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

Report: TRaveReport. end. uses RVClass. begin { ajusta altura padrão para as linhas } TGrid(DBGrid1). procedure TForm1. if T <> nil then Treeview1. end. var T: TTreeNode. RVProj.Selected := T. iremos demonstrar como definir via programação qual página será apresentada como inicial. begin // Nome da página dentro do projeto Rave. 151 .btnChamaRelClick (Sender: TObject).GetNodeAt(X.SpeedButton1Click(Sender: TObject). RVCsStd. X. var Pagina: TRavePage. 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. 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. begin // Pega o ítem através das coordenadas do mouse.implementation {$R *. Shift: TShiftState.Y). T := Treeview1.RowHeights[1] := 50. procedure TForm1. QualPagina := ‘Page2’. QualPagina: String.TreeView1MouseDown (Sender: TObject. Y: Integer). Neste exemplo.dfm} procedure TForm1.

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

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

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

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

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

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

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

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

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

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

16’). ShowMessage( E. if HostEntPtr = NIL then raise Exception. // Insert hostname into list HostName := String( HostEntPtr^.dfm} 164 .h_name ). if Address = ‘’ then raise Exception. Result := HostName.71. // Convert textual IP address to binary format InetAddr := inet_addr( PChar(Address) ). Para utilizar: Edit. except on E: Exception do begin Beep(). end. // Get hist entry by IP HostEntPtr := GetHostByAddr( @InetAddr. end. len.Create ( ‘Invalid address entered’ ). é obtendo o path de sistema onde o Windows guarda estas informações e nele criar os grupos.Message ). {$R *.Create ( ‘IP address not entered’ ). FileCtrl. struct ). if InetAddr = SOCKET_ERROR then raise Exception.Text := ResolveHostByIp(‘200.Create( ‘WinSock error: ‘ + IntToStr( WSAGetLastError() ) ).try Address := Trim(IP).210. end. WSACleanUp(). // 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. Veja abaixo como proceder: implementation uses ShlObj.

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

Porém.FormCreate(Sender: TObject). begin if Msg.OnMessage := ProcessaMsg. var Handled: Boolean).ProcessaMsg(var Msg: TMsg. 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 . Veja como definir o papel de impressão personalizado no Windows XP/2000/NT No Windows 9x. pois não há um papel pré-definido como personalizado. Msg.wParam := VK_CLEAR. porém temos a opção de criar um novo tipo de papel nas medidas que desejarmos. end. 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. end. end. procedure TForm1.implementation {$R *. begin { liga a procedure } Application. Para isso. no Windows XP isso é um pouco diferente.DFM} { procedure de tratamento } procedure TForm1. Agora. end. end. para definirmos um papel como personalizado basta acessar as propriedades da impressora que iremos encontrar este tipo de papel.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!’).

dfm} function GetTotFiles(Diretorio: String): Integer. agora bastará acessar as propriedades da impressora e definir este novo papel nas configurações de sua impressora. var SRec: TSearchRec.Bom. 167 . 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 *.

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

Sign up to vote on this title
UsefulNot useful