Вы находитесь на странице: 1из 63

Dicas de Delphi - Outros

y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y

Mac Address do adaptador de rede Escrever no Bloco de Notas Captions no DBNavigator Arredondamento financeiro Calcular idade (em anos completos) DBGrid zebrado Consultar por ms de um campo data Mudar a cor do Edit ao receber o foco Selecionar um item no ListView Alinhar ao centro e direita em StringGrid Copiar o texto do Edit para o Clipboard Mostrar bitmap progressivamente Converter JPeg para Bitmap Converter Bitmap para JPeg Colocar arquivo como recurso dentro do EXE Pintar bitmap no DBGrid Pintar um Bitmap diretamente no Canvas do Form Mostrar o nome do EXE no caption do form Obter tipo de uma propriedade Pintar uma imagem JPG no form Executar comando do MS-DOS Formatar CEP Permitir cancelar processo demorado Descobrir se uma data fim do ms Obter o tipo de dado de um valor no Registro do Windows Obter a clula de um StringGrid que est sob o cursor do mouse Limpar todas as clulas de um StringGrid Programar meu aplicativo para abrir arquivos a partir do Windows Explorer Ocultar aplicao da lista de tarefas - CTRL+ALT+DEL Ativar a proteo de tela do Windows Desligar/Ligar monitor Mostrar mensagem mesmo que esteja no Prompt do DOS Ocultar o aplicativo do CTRL+ALT+DEL Personalizar a caixa de mensagem de excees (erro) do Delphi Implementar procedure Delay do Pascal no Delphi Criar uma DLL de Bitmaps e us-la Obter status da memria do sistema Mostrar o dilogo About (Sobre) do Windows Converter de Hexadecimal para Inteiro Colocar uma ProgressBar na StatusBar Configurar linhas de diferentes alturas em StringGrid Adicionar o evento OnClick do DBGrid Converter a primeira letra de um Edit para maisculo Verificar se uma string contm uma hora vlida Verificar se uma string contm um valor numrico vlido Mostrar uma mensagem durante um processamento Mostrar um cursor de ampulheta durante um processamento

y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y y

Ler e escrever dados binrios no Registro do Windows Mudar a resoluo do vdeo via programao Ler e escrever dados no Registro do Windows Adicionar barra de rolagem horizontal no ListBox Verificar se uma string uma data vlida Adicionar zeros esquerda de um nmero Obter a verso da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi) Implementar rotinas assembly em Pascal Exibir o dilogo About do Windows Obter a linha e coluna atual em um TMemo Exibir um arquivo de ajuda do Windows Obter o valor de uma varivel de ambiente Fechar um aplicativo com uma mensagem de erro fatal Criar um EXE que seja executado apenas atravs de outro EXE criado por mim Truncar valores reais para n casas decimais Saber se o sistema est usando 4 dgitos para o ano Obter o nome do usurio e da empresa informado durante a instalao do Windows Evitar que seu programa aparea na barra de tarefas Fechar o Windows a partir do seu programa Carregar um cursor animado (.ani) Executar um programa DOS e fech-lo em seguida Fechar um programa a partir de um programa Delphi Colocar Hint's de vrias linhas Separar (filtrar) caracteres de uma string Colocar zeros esquerda de nmeros Trabalhar com cores no formato string Verificar se determinado programa est em execuo (Word, Delphi, etc) Gerar uma tabela no Word atravs do Delphi Evitar que um programa seja executado mais de uma vez Saber a resoluo de tela atual Onde encontrar tutoriais sobre construo de componentes em Delphi Para que servem OnGetEditMask, OnGetEditText e OnSetEditText do TStringGrid Descobrir o nome de classe de uma janela do Windows Ocultar/exibir a barra de tarefas do Windows Evitar a proteo de tela durante seu programa Criar cores personalizadas (sistema RGB) Adicionar uma nova fonte no Windows Saber se determinada Font est instalada no Windows Acertar a data e hora do sistema atravs do programa Paralizar um programa durante n segundos Criar um Alias atravs do seu programa

Mac Address do adaptador de rede


function MacAddress: string;

A funo abaixo retorna o Mac Address do adaptador de rede:

var Lib: Cardinal; Func: function(GUID: PGUID): Longint; stdcall; GUID1, GUID2: TGUID; begin Result := ''; Lib := LoadLibrary('rpcrt4.dll'); if Lib <> 0 then begin @Func := GetProcAddress(Lib, 'UuidCreateSequential'); if Assigned(Func) then begin if (Func(@GUID1) = 0) and (Func(@GUID2) = 0) and (GUID1.D4[2] = GUID2.D4[2]) and (GUID1.D4[3] = GUID2 .D4[3]) and (GUID1.D4[4] = GUID2.D4[4]) and (GUID1.D4[5] = GUID2.D4[5]) and (GUID1.D4[6] = GUID2.D4[6]) and (GUID1.D4[7] = GUID2.D4[7]) then begin Result := IntToHex(GUID1.D4[2], 2) + ' -' + IntToHex(GUID1.D4[3], 2) + ' -' + IntToHex(GUID1.D4[4], 2) + ' -' + IntToHex(GUID1.D4[5], 2) + ' -' + IntToHex(GUID1.D4[6], 2) + ' -' + IntToHex(GUID1.D4[7], 2); end; end; end; end;

Incio

Escrever no Bloco de Notas


Problema: Gostaria verificar se o bloco de notas est aberto e, caso esteja, escrever um texto a partir de um programa feito em Delphi. Isto possvel? Soluo: Sim, isto possvel. O cdigo abaixo escreve o contedo de uma varivel no Bloco de Notas caso ele esteja aberto no momento do Click em Button1:
procedure TForm1.Button1Click(Sender: TObject); var JanelaPrincipal, JanelaFilha: THandle; I: integer; Texto: string; begin Texto := 'Daniel'; JanelaPrincipal := FindWindow('Notepad', nil); if JanelaPrincipal > 0 then begin

JanelaFilha := FindWindowEx(JanelaPrincipal, 0, 'Edit', nil); if JanelaFilha > 0 then begin for I := 1 to Length(Texto) do PostMessage(JanelaFilha, WM_CHAR, Ord(Texto[I]), 0); end; end; end;

Observaes: Uma alternativa mais interessante seria abrir o Bloco de Notas caso ele ainda no esteja aberto. Mas vou deixar este problema como exerccio de fixao. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Captions no DBNavigator
Por padro, o DBNavigator no possui uma propriedade para especificar os captions dos botes, mas isto pode ser resolvido com o cdigo abaixo:
type TMeuDBNavigator = class(TDBNavigator); procedure TForm1.FormCreate(Sender: TObject); const Legendas: array[TNavigateBtn] of string = ( 'Primeiro', 'Anterior', 'Prximo', 'ltimo', 'Incluir', 'Excluir', 'Editar', 'Salvar', 'Cancelar', 'Atualiza r'); var Botao: TNavigateBtn; begin for Botao := nbFirst to nbRefresh do begin with TMeuDBNavigator(DBNavigator1).Buttons[Botao] do begin Caption := Legendas[Botao]; Layout := blGlyphTop; end; end; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Arredondamento financeiro

muito comum encontrar programadores Delphi que tm dvidas sobre como arredondar um valor real para "n" casas aps o separador decimal. A princpio parece um problema simples, pois o prprio Delphi j possui uma funo que arredonda para o inteiro mais prximo, a qual poderia facilmente ser utilizada para arredondar para qualquer quantidade de casas decimais. Exemplo:
{ x receber o valor de y arredondado para 2 casas aps o separador. } x := Round(y * 100) / 100; { z receber o valor de y arredondado para 3 casas aps o z := Round(y * 1000) / 1000; separador. }

No entanto dois problemas podero aparecer com os exemplos acima:


y y

O arredondamento feito pelo Delphi difere daquele feito pelas calculadores financeiras, bem como bancos de dados como InterBase e FireBird. podero ocorrer pequenos arredondamentos devido ao modo como o Delphi trata nmeros reais, tais como aparecer 3.9999999... em vez de 4.

A funo abaixo resolve estes dois problemas.


{ Esta funo faz arredondamento de valores reais para "n" casas decimais aps o separador decimal, seguindo os critrios das calculadoras financeiras e dos bancos de dados InterBase e FireBird. } function TBRound(Value: Extended; Decimals: integer): Extended; var Factor, Fraction: Extended; begin Factor := IntPower(10 , Decimals); { A converso para string e depois para float evita erros de arredondamentos indesejveis. } Value := StrToFloat(FloatToStr(Value * Factor)); Result := Int(Value); Fraction := Frac(Value); if Fraction >= 0.5 then Result := Result + 1 else if Fraction <= -0.5 then Result := Result - 1; Result := Result / Factor; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Calcular idade (em anos completos)


A funo abaixo calcula o nmero de anos completos entre duas datas. ideal para calcular idades de pessoas, por exemplo.
function CalcAnos(const Data1, Data2: TDateTime): integer;

var D1, M1, A1, D2, M2, A2: Word; begin DecodeDate(Data1, A1, M1, D1); DecodeDate(Data2, A2, M2, D2); Result := A2 - A1; if (M1 > M2) or ((M1 = M2) and (D1 > D2)) then Dec(Result); end;

Exemplo de uso:
y y y

Coloque um Edit (TEdit) para digitar a data de nascimento. Coloque um boto (TButton). Coloque o cdigo a seguir no evento OnClick do boto:

var DataNasc: TDateTime; begin DataNasc := StrToDate(Edit1.Text); ShowMessage(IntToStr(CalcAnos(DataNasc, Date)) + ' anos'); end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

DBGrid zebrado
Programe o evento OnDrawColumnCell do DBGrid como abaixo:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if State = [] then begin if Table1.RecNo mod 2 = 1 then DBGrid1.Canvas.Brush.Color := clAqua else DBGrid1.Canvas.Brush.Color := clWhite; end; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;

Observao: O objeto Table1 da classe TTable (relativa ao BDE), mas esta dica poder ser usada com outros DataSet's, tais como IBDataSet, ClientDataSet, etc.

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Consultar por ms de um campo data


Problema: Tenho um cadastro de clientes com Codigo, Nome, DataNasc, etc. Preciso fazer uma consulta onde apareceo apenas os clientes que fazem aniversrio em determinado ms. Como fazer? Soluo: Use uma Query como abaixo: - Coloque no form os seguintes componentes: * TQuery * TDataSource * TDBGrid * TEdit * TButton - Altere as propriedades dos componentes como abaixo: * Query1.DatabaseName = (alias do BDE) * DataSource1.DataSet = Query1 * DBGrid1.DataSource = DataSource1 - Coloque o cdigo abaixo no evento OnClick de Button1: Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('select * from dCli'); Query1.SQL.Add('where extract(month from DataNasc) = :Mes'); Query1.ParamByName('Mes').AsInteger := StrToInt(Edit1.Text); Query1.Open; - Execute. Digite um nmero de 1 a 12 no Edit e clique no boto.

Observaes Os nmeros de 1 a 12 representam, respectivamente, os meses de Janeiro a Dezembro. Este exemplo foi testado com Delphi4, BDE5 e tabela Paradox7. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mudar a cor do Edit ao receber o foco

Alguns programas mostram o Edit que est com o foco em uma cor diferente dos demais. Como fazer isto em Delphi? Na seo private do form declare o procedimento abaixo: private procedure MudancaDeFoco(Sender: TObject); public end; Na seo implementation, escreva o cdigo do procedimento: { Esta rotina ser chamada atravs do evento OnExit (perda do foco) de todos os componentes do tipo TEdit que existirem no form. } procedure TForm1.MudancaDeFoco(Sender: TObject); var I: integer; Ed: TEdit; begin { Percorre a matriz de componentes do form } for I := 0 to ComponentCount - 1 do { Se o componente do tipo TEdit... } if Components[I] is TEdit then begin { Faz um type -casting pata o tipo TEdit } Ed := Components[I] as TEdit; { Se o Edit est com o foco... } if Ed.Focused then Ed.Color := clYellow { Amarelo } else Ed.Color := clWhite; { Branco } end; end; No evento OnCreate do Form, coloque o cdigo abaixo: procedure TForm1.FormCreate(Sender: TObject); var I: integer; begin { Percorre a lista de componentes do form (matriz de componentes) e verifica cada componente para saber se um TEdit. Se for, associa o evento OnExit do componente com a procedure "MudancaDeFoco". } for I := 0 to ComponentCount - 1 do if Components[I] is TEdit then (Components[I] as TEdit).OnExit := MudancaDeFoco; end; No evento OnActivate coloque: procedure TForm1.FormActivate(Sender: TObject); begin { Esta chamada necessria para que o estado inicial seja controlado. } MudancaDeFoco(nil); end;

Observaes

Existem outras tcnicas mais profissionais para resolver o problema proposto. Uma alternativa excelente a criao de um novo componente herdado da classe TEdit (ou TCustomEdit) que implemente a mudana de cor no mtodo DoEnter e DoExit. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Selecionar um item no ListView


Para selecionar um item no ListView via programao use o cdigo abaixo. { Manda o foco para o ListView } ListView1.SetFocus; { Seleciona o quarto item } ListView1.Items.Item[3].Selected := true; { Manda o foco para o quarto item } ListView1.Items.Item[3].Focused := t rue;

Observaes Um procedimento semelhante pode ser usado com o TreeView. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Alinhar ao centro e direita em StringGrid


1. Coloque no formulrio um componente TStringGrid. 2. No evento OnCreate do formulrio escreva: procedure TForm1.FormCreate(Sender: TObject); begin { Nmero de linhas } StringGrid1.RowCount := 5; { Nmero de colunas } StringGrid1.ColCount := 3; { Linhas fixas } StringGrid1.FixedRows := 1; { Colunas fixas } StringGrid1.FixedCols := 0; { Largura padrao das colunas (em p ontos) } StringGrid1.DefaultColWidth := 80; { Permite editar } StringGrid1.Options :=

StringGrid1.Options + [goEditing]; { Cabealho } StringGrid1.Cells[0,0] := 'Esquerda'; StringGrid1.Cells[1,0] := 'Centro'; StringGrid1.Cells[2,0] := 'Direit a'; end; 3. No evento OnDrawCell do StringGrid escreva: var LarguraTexto, AlturaTexto, X, Y: integer; Texto: string; begin { Pega o texto da clula } Texto := StringGrid1.Cells[ACol, ARow]; { Calcura largura e altura (em pontos) do texto } LarguraTexto := StringGrid1.Canvas.TextWidth(Texto); AlturaTexto := StringGrid1.Canvas.TextHeight(Texto); { Calcula a posio horizontal do incio do texto } if ACol = 0 then { Esquerda } X := Rect.Left + 2 else if ACol = 1 then { Centro } X := Rect.Left + (Rect.Right - Rect.Left) div 2 LarguraTexto div 2 else { Direita } X := Rect.Right - LarguraTexto - 2; { Calcula a posio vertical do incio do texto para que seja impresso no centro (verticalmente) da clula } Y := Rect.Top + (Rect.Bottom - Rect.Top) div 2 AlturaTexto div 2; { Pinta o texto } StringGrid1.Canvas.TextRect(Rect, X, Y, Texto); end;

Observaes Uma tcnica semelhante a esta pode ser usada para pintar figuras nas clulas do StringGrid. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Copiar o texto do Edit para o Clipboard


O prprio componente TEdit possui um mtodo para copiar o texto para a rea de transferncia (clipboard). No entanto este mtodo copia apenas o texto selecionado, de forma que temos que chamar o mtodo SelectAll() antes de chamar CopyToClipboa rd().

Veja o exemplo: procedure TForm1.Button1Click(Sender: TObject); begin Edit1.SelectAll; Edit1.CopyToClipboard; end;

Observaes Outros componentes, tais como TMemo, possuem tambm este mtodo. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mostrar bitmap progressivamente


Inclua na seo uses: Graphics
Esta uma boa dica para quem deseja fazer aplicativos para exibir fotografias. 1. Coloque no form um TButton e um PaintBox. 2. No evento OnClick do Button escreva: procedure TForm1.Button1Click(Sender: TObject); var I, J: integer; R: TRect; Bmp: TBitmap; begin Bmp := TBitmap.Create; try Bmp.LoadFromFile('c: \teste\imagem.bmp'); PaintBox1.ClientWidth := Bmp.Width; PaintBox1.ClientHeight := Bmp.Height; PaintBox1.Canvas.FillRect(PaintBox1.ClientRect); R.Left := 0; R.Right := Bmp.Width -1; for I := 1 to 10 do begin J := I - 1; while J < (Bmp.Height -1) do begin R.Top := J; R.Bottom := J+1; PaintBox1.Canvas.CopyRect(R, Bmp.Canvas, R); J := J + 10; end; Sleep(50); end; finally Bmp.Free; end;

end;

Observaes Esta dica s uma idia inicial, mas com um pouco de criatividade o programador poder criar outros efeitos mais interessantes. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Converter JPeg para Bitmap


Inclua na seo uses: Graphics, JPeg
O procedimento abaixo converte um arquivo de imagem JPeg para Bitmap. O arquivo Bitmap ter o mesmo nome do arquivo JPeg, mas com a extenso bmp. procedure ConverterJPegParaBmp(Arquivo: string); var JPeg: TJPegImage; Bmp: TBitmap; begin JPeg := TJPegImage.Create; try JPeg.LoadFromFile(Arquivo); Bmp := TBitmap.Create; try Bmp.Assign(JPeg); Bmp.SaveToFile(ChangeFileExt(Arquivo, '.bmp')); finally Bmp.Free; end; finally JPeg.Free; end; end; Exemplo de uso: ConverterJPegParaBmp('c: \diretorio\arquivo.jpg');

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Converter Bitmap para JPeg


Inclua na seo uses: Graphics, JPeg
O procedimento abaixo converte um arquivo de imagem Bitmap

para JPeg. O arquivo JPeg ter o mesmo nome do arquivo Bitmap, mas com a extenso jpg. procedure ConverterBmpParaJPeg(Arquivo: string); var Bmp: TBitmap; JPeg: TJPegImage; begin Bmp := TBitmap.Create; try Bmp.LoadFromFile(Arquivo); JPeg := TJPegImage.Create; try JPeg.CompressionQuality := 100; { Qualidade: 100% } JPeg.Assign(Bmp); JPeg.SaveToFile(ChangeFileExt(Arquivo, '. jpg')); finally JPeg.Free; end; finally Bmp.Free; end; end; Exemplo de uso: ConverterBmpParaJPeg('c: \diretorio\arquivo.bmp');

Observaes Veja que usei neste exemplo 100% de qualidade para a imagem JPeg. Isto faz com que o arquivo fique grande. Se preferir pode usar uma qualidade inferior, mas lembre-se que a aparncia da imagem ser prejudicada. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Colocar arquivo como recurso dentro do EXE


Inclua na seo uses: Classes
Existem alguns casos em que precisamos levar para a mquina do usurio, alm do EXE, alguns arquivos sem os quais nossa aplicao teria problema. Normalmente estes casos incluem: arquivos com imagem (bmp, jpeg, gif, etc); arquivos de fontes (TTF); bibliotecas (dll); e outros.

A partir desta dica voc sab er como incluir tais arquivos dentro do prprio EXE. Dentro do EXE podemos colocar qualquer tipo de arquivo que se comportar como um recurso. Vamos aos passos.

1. Crie um arquivo texto com o nome ARQ_RECURSO.RC e escreva neste arquivo a linha abaixo: NOME_DO_RECURSO RCDATA "c: \diretorio \arquivo.ext" 2. Compile este arquivo de recurso com o programa BRCC32.EXE: BRCC32 ARQ_RECURSO.RC 3. 4. 5. 5. Confira Abra um Salve o Escreve se foi criado um arquivo chamado ARQ_RECURSO.RES. novo projeto no Delphi. projeto no mesmo diretrio de ARQ_RECURSO.RES. a linha abaixo aps a palavra implementation

{$R ARQ_RECURSO.RES} 6. Escreva o evento OnCreate do form como abaixo: procedure TForm1.FormCreate(Sender: TObject); var Stream: TResourceStream; begin Stream := TResourceStream.Create(hInstance, 'NOME_DO_RECURSO', RT_RCDATA); try Stream.SaveToFile('c: \diretorio \arquivo_extraido.ext'); finally Stream.Free; end; end; Pronto! Muito fcil! Vamos agora entender os passos citados. Primeiro criamos um script (arquivo .rc) para gerar o arquivo de recurso (.res). No script informamos o nome do recurso, o tipo e o contedo. O contedo, neste caso, foi o arquivo "c:\diretorio \arquivo.ext". Depois comp ilamos o script com o compilador de recursos da Borland (BRCC32.EXE). Este processo gerou o arquivo ARQ_RECURSO.RES. A seguir colocamos no cdigo -fonte uma instruo para que o compilador do Delphi inclusse o arquivo de recurso (.res) no executvel - {$R ARQ_RECURSO.RES}. No evento OnCreate do form acessamos o recurso como um Stream e o salvamos em arquivo no disco.

Observaes Para incluir um arquivo de fonte no EXE e instalar a fonte na mquina do usurio na primeira vez que o programa for executado, combine este dica com a dica nmero 12. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Pintar bitmap no DBGrid


Embora parea complicada, esta tarefa muito simples. O Delphi nos permite controlar totalmente o desenho de cada clula do DBGrid atravs do evento OnDrawColumnCell. O que precisamos fazer neste evento : 1. 2. 3. 4. 5. 6. Verificar o estado da clula (fixa, selecionada, etc). Verificar se a coluna do campo da imagem. Criar um objeto bitmap. Copiar o contedo do campo da imagem para o bitmap. Desenhar o bitmap na clula do DBGrid. Destruir o bitmap.

Agora que j con hecemos os passos, vamos ao exemplo: 1. Coloque um TTable e ligue ao Alias DBDEMOS e tabela animals.dbf. 2. Coloque um TDataSource e ligue -o ao Table1. 3. Coloque um DBGrid e ligue -o ao DataSource1. 3. Mude Table1.Active para true. 4. No evento OnDrawColumnCell escreva o cdigo abaixo: procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var Bmp: TBitmap; begin if (not (gdFixed in State)) and (UpperCase(Column.FieldName) = 'BMP') then begin Bmp := TBitmap.Create; try Bmp.Assign(Table1.FieldByName('Bmp')); DBGrid1.Canvas.StretchDraw(Rect, Bmp); finally Bmp.Free; end; end; end; Conforme eu disse no incio, muito simples!

Observaes Neste exemplo usei o mnimo possvel de cdigo. Para obtermos um visual melhor poderamos, por exemplo, deixar uma margem em torno da imagem. No difcil, mas vou deixar como desafio aos interessados. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Pintar um Bitmap diretamente no Canvas do Form


- Declare a variavel Bmp na seo private: private Bmp: TBitmap; - Coloque um boto no Form e no evento OnClick digite: Bmp:= TBitMap.Create; try Bmp.LoadFromFile('c: \teste\arquivo.bmp'); Canvas.Draw(0,0, Bmp); finally Bmp.Free; end; Pronto! Ir aparecer a imagem no Canvas. til para fazer animaes. Dica enviada por: Alisson Viana Jardim Revisada por: Daniel Pereira Guimares

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mostrar o nome do EXE no caption do form


{ Esta funo extrai apenas o nome do arquivo passado, sem path e extenso } function Titulo(Nome: String): String; var N, D: String; begin N := ExtractFileName(Nome); { Retira o path } D := ChangeFileExt(N,''); { Retira a extenso } { Coloca a primeira letra em maiscula e o resto em minscula } Titulo := UpperCase(Copy(D,1,1)) + LowerCase(Copy(D,2,Length(D) -1)); end; { No OnCreate do form, coloque: } procedure TForm1.FormCreate(Sender: TObject); begin Caption := Titulo(ParamStr(0)); end; - Dica enviada por: Luiz Eduardo.

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter tipo de uma propriedade


Inclua na seo uses: TypInfo
{ Esta funo retorna uma string com o nome do tipo de dado de uma propriedade. Exemplos de retornos: PropType(Button1, 'Caption'); // Retorna 'TCaption' PropType(Edit1, 'Width'); // Retorna 'Integer'; PropType(Edit1, 'Color'); // Retorna 'TColor'; } function PropType(const Obj: TObject; const PropName: string): string; var Info: PPropInfo; begin Info := GetPropInfo(Obj.ClassInfo, PropName); if Assigned(Info) then Result := Info^.PropType^.N ame else Result := ''; end; { Exemplo de uso: - Coloque um TButton e um TEdit; - No OnClick do Button1 coloque o cdigo abaixo; - Execute, digite 'Caption' no Edit1 e clique em Button1. } procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(PropType(Button1, Edit1.Text)); end;

Observaes Verdadeiramente no sei exatamente onde poderamos aplicar esta dica, mas divulgueia porque achei interessante. Acredito que o Object Inspector use algo parecido. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Pintar uma imagem JPG no form


Inclua na seo uses: Graphics, JPeg

Problema: Gostaria de pintar imagens de arquivos JPG (JPeg) nos forms de minha aplicao. Isto possvel? Como? Soluo: Para trabalhar com arquivos JPG voc precisa usar um objeto TPicture, assim como colocar no uses a unit JPeg. Siga os passos abaixo para pintar uma imagem JPG no form: - No evento OnPaint do form coloque o cdigo abaixo: procedure TForm1.FormPaint(Sender: TObject); var Imagem: TPicture; begin Imagem := TPicture.Create; try Imagem.LoadFromFile('c: \teste\foto.jpg'); Canvas.StretchDraw(ClientRect, Imagem.Graphic); finally Imagem.Free; end; end; - E no evento OnResize do form, coloque: procedure TForm1.FormResize(Sender: TObject); begin Repaint; end;

Observaes No se esquea de trocar o nome do arquivo JPG conforme sua necessidade. Este exemplo foi elaborado usando Delphi4. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Executar comando do MS-DOS


Usando WinExec voc pode executar qualquer comando do DOS. Para isto chame o COMMAND.COM passando como parmetro a linha de comando a ser executada. O parmetro /C opcional e faz com que a janela do DOS seja fechada assim que o comando terminar. No exemplo abaixo estou executando a seguinte linha de comando: DIR C: \*.* WinExec('COMMAND.COM /C DIR C: \*.*', SW_SHOW);

Observaes

Para que a janela do DOS no seja exibida, use SW_HIDE no lugar de SW_SHOW. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Formatar CEP
{ Esta funo forma CEP como: 99.999 -999 } function tbFormataCEP(const CEP: string): string; var I: integer; begin Result := ''; for I := 1 to Length(CEP) do if CEP[I] in ['0'..'9'] then Result := Result + CEP[I]; if Length(Result) <> 8 then raise Exception.Create('CEP invlido.') else Result := Copy(Result, 1, 2) + '.' + Copy(Result, 3, 3) + ' -' + Copy(Result, 6, 3); end; === Para testar === - Coloque um Edit e um Button no form; - No evento OnClick do Button coloque a instruo abaixo: Edit1.Text := tbFormataCEP(Edit1.Text);

Observaes Para formatar outros cdigos como CPF, CGC, etc., pode-se usar a mesma idia. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Permitir cancelar processo demorado


Problema: Em determinadas partes no programa existem processos que podem demorar vrios minutos para serem concludos. Muitas vezes o usurio desiste e deseja cancelar o processamento. Como

permitir este cancelamento? Soluo: Em aplicativos para Windo ws comum, em processamentos demorados, o programa mostrar uma janela de dilogo avisando que o processo pode levar um tempo extra. Nesta mesma janela normalmente coloca -se tambm um boto "Cancelar" que d ao usurio a opo aguardar ou desistir do pro cesso. Para fazer isto em um aplicativo Delphi, siga os passos abaixo: - Vamos considerar em nosso exemplo que o processamento ocorre na unit do Form1. - Declare, na seo public do Form1, uma varivel boolean. public; Cancelar: boolean; - Crie um novo form (vou cham -lo de Form2); - Coloque um boto neste novo form. Programe o OnClick deste boto conforme abaixo: Form1.Cancelar := true; - Na parte onde ocorre o loop do processamento demorado coloque algo como: try { Antes de comear o processamento } Form2.Caption := 'Processamento demorado...'; Form2.Show; { No incio do loop "Cancelar" precisa ser false } Cancelar := false; { Aqui inicia o loop do processamento demorado } while {...} do begin { ... Processa algo aqui... } { Permite que o programa processe mensagens do Windows } Application.ProcessMessages; { Se a varivel "Cancelar" foi alterada para true... } if Cancelar then begin ShowMessage('Operao cancelada pelo usurio.'); Break; { Sai do loop } end; end; finally Form2.Close; end;

Observaes No se esquea de que o Form1 precisa usar Form2 e vice-versa.

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Descobrir se uma data fim do ms


Inclua na seo uses: SysUtils
{ Esta funo retorna true se a data passada como parmetro fim de ms. Retorna false caso contrrio. } function tbFimDoMes(const Data: TDateTime): boolean; var Ano, Mes, Dia: Word; begin DecodeDate(Data +1, Ano, Mes, Dia); Result := Dia = 1; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter o tipo de dado de um valor no Registro do Windows


Inclua na seo uses: Registry, Dialogs
{ - Coloque um boto no form; - Altere o evento OnClick do boto conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); const cRegPath = 'System \CurrentControlSet \control\FileSystem'; cRegValue = 'ACDriveSpinDown'; var Reg: TRegistry; S: string; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_LOCAL_MACHINE; if Reg.OpenKey(cRegPath, false) then begin case Reg.GetDataType(cRegValue) of rdUnknown: S : = 'Tipo Desconhecido'; rdString: S := 'String'; rdExpandString: S := 'ExpandString'; rdInteger: S := 'Inteiro'; rdBinary: S := 'Binrio'; end;

ShowMessage(S); end else ShowMessage('Erro ao abrir chave do Registro'); finally Reg.Free; end; end;

Observaes A unit Dialogs foi acrescentada no uses somente para podermos usar a procedure ShowMessage. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter a clula de um StringGrid que est sob o cursor do mouse


Inclua na seo uses: Windows
{ Esta procedure pega a linha e coluna da clula onde estiver o mouse. Valores negativos para Linha ou Coluna indicam que o mouse est fora da rea cliente do StringGrid } procedure MouseCell(Grid: TStringGrid; var Coluna, Linha: integer); var Pt: TPoint; begin GetCursorPos(Pt); Pt := Grid.ScreenToClient(Pt); if PtInRect(Grid.ClientRect, Pt) then Grid.MouseToCell(Pt.X, Pt.Y, Coluna, Linha) else begin Coluna := -1; Linha := -1; end; end; { Exemplo de uso: - Coloque um boto no form; - Altere o evento OnClick deste boto como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Coluna, Linha: integer; begin MouseCell(StringGrid1, Coluna, Linha); if (Coluna >= 0) and (Linha >= 0) then Caption := 'Coluna: ' + IntToStr(Coluna) + ' 'Linha: ' + IntToStr(Linha); else Caption := 'O mouse no est no StringGrid';

- ' +

end; { Para testar: - Execute o programa; - Posicione o cursor do mouse sobre alguma clula do StringGrid; - Pressione TAB at chegar ao boto e pressione ENTER; - O resultado ser mostrado no Caption do form; }

Observaes Note que a procedure MouseCell usa um valor negativo (-1) para coluna e linha se o mouse no estiver sobre o StringGrid. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Limpar todas as clulas de um StringGrid


Existem trs mtodos que podemos aplicar para limpar um StringGrid. { Limpando uma clula de cada vez: } procedure TForm1.Button1Click(Sender: TObject); var I, J: integer; begin with StringGrid1 do for I := 0 to ColCount -1 do for J := 0 to RowCount -1 do Cells[I,J] := ''; end; { Limpando uma linha de cada vez: } procedure TForm1.Button2Click(Sender: TObject); var I: integer; begin with StringGrid1 do for I := 0 to RowCount -1 do Rows[I].Clear; end; { Limpando uma coluna de cada vez: } procedure TForm1.Button3Click(Sender: TObject); var I: integer; begin with StringGrid1 do for I := 0 to ColCount -1 do

Cols[I].Clear; end;

Observaes Em todos os exemplos estamos limpando o StringGrid completamente, inclusive linhas e colunas fixas. Para preservar linhas ou colunas fixas troque os valores iniciais de I ou J conforme a necessidade. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Programar meu aplicativo para abrir arquivos a partir do Windows Explorer


Inclua na seo uses: Registry
Problema: Criei um editor de textos no Delphi. Agora gostaria que o Windows Explorer usasse este editor para abrir arquivos com a extenso .dpg e .dan. Como fazer? Soluo: Para fazer isto ser necessria a criao de algumas chaves no Registro do Windows. O exemplo abaixo cria todas as chaves necessrias. - Coloque um TButton e no evento OnClick dele coloque o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY _CLASSES_ROOT; Reg.LazyWrite := false; { Define o nome interno (ArquivoDaniel) e uma legenda que aparecer no Windows Explorer (Arquivo do Daniel) } Reg.OpenKey('ArquivoDaniel', true); Reg.WriteString('', 'Arquivo do Daniel'); Reg.CloseKey; { Define o comando a ser executado quando abrir um arquivo pelo Windows Explorer (NomeDoExe %1). O smbolo %1 indica que o arquivo a ser aberto ser passado como primeiro parmetro para o aplicativo - ParamStr(1). } Reg.OpenKey('ArquivoDaniel \shell\open\command', true); Reg.WriteString('', ParamStr(0) + ' %1'); { NomeDoExe %1 } Reg.CloseKey;

{ Define o cone a ser usado no Windows Explorer: 0 - primeiro cone do EXE 1 - segundo cone do EX E, etc } Reg.OpenKey('ArquivoDaniel \DefaultIcon', true); Reg.WriteString('', ParamStr(0) + ',0'); { 0 = primeiro cone } Reg.CloseKey; { Define as extenses de arquivos que sero abertos pelo meu aplicativo } { *.dpg } Reg.OpenKey('.dpg', true); Reg.WriteString('', 'ArquivoDaniel'); Reg.CloseKey; { *.dan } Reg.OpenKey('.dan', true); Reg.WriteString('', 'ArquivoDaniel'); Reg.CloseKey; finally Reg.Free; end; end; - Coloque um TMemo; - No evento OnShow do Form coloque o cdigo abaixo: procedure TForm1.FormShow(Sender: TObject); begin { Se o primeiro parmetro for um nome de arquivo existente... } if FileExists(ParamStr(1)) then { Carrega o contedo do arquivo no memo } Memo1.Lines.Lo adFromFile(ParamStr(1)); end; *** Para testar *** - Execute este programa; - Clique no boto para criar as chaves no Registro do Windows; - Feche o programa; - Crie alguns arquivos com as extenses .dpg e .dan; - V ao Windows Explorer e procure pelos arq uivos criados; - Experimente dar um duplo -clique sobre qualquer dos arquivos com uma das extenses acima.

Observaes Existem outros recursos que podero ser configurados. Porm, para comear, este j um bom exemplo. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Ocultar aplicao da lista de tarefas - CTRL+ALT+DEL

- Declare a funo abaixo antes da palavra implementation: function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL'; - Coloque dois botes no Form; - No evento OnClick do Button1 coloque: RegisterServiceProcess(GetCurrentProcessID, 1); - No evento OnClick do Button2 coloque: RegisterServiceProcess(GetCurrentProcessID, 0); === Para testar === Clique no Button1 e pressione CTRL+ALT+DEL. O seu programa no aparecer na lista. Clique no Button2 e pressione CTRL+ALT+DEL. Agora seu programa aparecer na lista.

Autor: Luiz Carlos Manzolli Incio

Ativar a proteo de tela do Windows


Inclua na seo uses: Windows
{ Ativa a proteo de tela do Windows, se estiver configurada. } SendMessage(Application.Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Desligar/Ligar monitor
Inclua na seo uses: Windows
No Win95 podemos desligar o monitor afim de economizar energia eltrica. Normalmente este recurso controlado pelo prprio Windows. Porm sua aplicao Delphi tambm pode fazer isto. O exemplo abaixo desliga o monitor, aguarde 5 segundos e re-liga monitor. SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0); Sleep(5000); { Aguarde 5 s egundos } SendMessage(Application.Handle, WM_SYSCOMMAND,

SC_MONITORPOWER, -1);

Observaes Este recurso pode no funcionar dependendo da configurao do sistema. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mostrar mensagem mesmo que esteja no Prompt do DOS


Inclua na seo uses: Windows
Problema: Fiz um programa que mostra mensagens de lembrete quando chegada determinada data/hora. Porm quando o usurio vai para o Prompt do MS -DOS em modo tela cheia, a mensagem no aparece. O que devo fazer? Soluo: Antes de mostrar a mensagem, coloque sua aplicao na frente das demais. SetForegroundWindow(Application.Handle); ShowMessage('Teste');

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Ocultar o aplicativo do CTRL+ALT+DEL


Inclua no implementation de seu programa a seguinte linha: function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL'; e depois no OnCreate ponha a seguinte linha: RegisterServiceProcess(GetCurrentProcessID, 1); Isso vai fazer o programa nao aparecer no CTRL+ALT+DEL, mas seu form principal vai continuar aparecendo. Para ocultar tambm o form, basta por no OnCreate antes da linha acima a seguinte linha: Application.ShowMainForm:=False;

Resposta enviada por: dexter07

Observaes Segundo o autor desta resposta, esta soluo foi testada em Win95, mas tambm deve funcionar em Win98. No sabe se funciona em NT. Incio

Personalizar a caixa de mensagem de excees (erro) do Delphi


Problema: Quando ocorre uma exceo no Delphi, ele automaticamente exibe uma mensagem de erro. Gostaria de poder personalizar estas mensagens, acrescentando, por exemplo, o e -mail do suporte tcnico. Isto possvel? Soluo: Sim. Siga os passos abaixo: - Declare um mtodo (procedure) na seo private do form principal conforme abaixo: private procedure ManipulaExcecoes(Sender: TObject; E: Exception); - V at a seo implementation e implemente este mtodo, conforme o exemplo: procedure TForm1.ManipulaExcecoes(Sen der: TObject; E: Exception); begin MessageDlg(E.Message + #13#13 + 'Suporte tcnico:'#13 + 'suporte@servidor.com.br', mtError, [mbOK], 0); end; - No evento OnCreate do Form principal escreva o cdigo abaixo: procedure TForm1.FormCreate(Sender: TObject); begin Application.OnException := ManipulaExcecoes; end; === Para testar === - Coloque um Button no form; - No evento OnClick deste boto coloque o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); begin StrToInt('ABCD'); { Isto provoca uma exception }

end;

Observaes Cuidado! No coloque cdigo que possa gerar exceo na rotina que manipula as excees, pois se ocorrer uma exceo neste rotina, esta ser chamada recursivamente at estourar a pilha. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Implementar procedure Delay do Pascal no Delphi


Inclua na seo uses: Windows, Forms
Problema: O Pascal para DOS possui uma procedure chamada Delay que serve para pausar o processamento atual em "n" milsimos de segundo. Como implemento isto no Delphi? Soluo: Simles. Veja: procedure Delay(MSec: Cardinal); var Start: Cardinal; begin Start := GetTickCount; repeat Application.ProcessMessages; until (GetTickCount - Start) >= MSec; end; === Exemplos de uso: === Delay(1000); { Aguarda 1 segundo } Delay(5000); { Aguarda 5 segundos } Delay(60000); { Aguarda 60 segundos - 1 minuto }

Observaes Alm da procedure Delay criada acima, o programador Delphi pode usar tambm a API do Windows Sleep. H porm uma diferena: Delay permite que que o programa continue a processar as mensagens do Windows (mouse, teclado, etc). Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Criar uma DLL de Bitmaps e us-la


Problema: Gostaria de colocar algums bitmaps em uma DLL e us -los em tempo de execuo. possvel fazer isto em Delphi? Soluo: Sim. Siga os passos abaixo para criar a DLL de bitmaps: - Crie um arquivo de recursos (.RES) contendo os Bitmaps. Use o Image Editor do Delphi para criar este arquivo. Salve-o com o nome BMPS.RES na pasta onde ser salvo o projeto do Delphi; - Crie um novo projeto no Delphi; - Remova todos os forms do projeto; - Salve este projeto com o nome DLLBmp.dpr; - Abra o arquivo de projeto (DLLBmp.dpr) e altere para ficar somente com as linhas abaixo: {$R BMPS.RES} library DLLBmp; end. - Compile o projeto (Ctrl+F9). Ser criado o arquivo DLLBmp.DLL . - Feche o projeto atual e crie um novo projeto; - Salve-o na mesma pasta que salvou o anterior, mas com outro nome qualquer; - Coloque no form um Edit e um Button; - No evento OnClick do Button coloque o cdigo abaixo: procedure TForm1.Button1Click(S ender: TObject); var Bmp: TBitmap; HandleDLL: THandle; begin { Carrega a DLL } HandleDLL := LoadLibrary('DLLBmp.DLL'); if HandleDLL = 0 then ShowMessage('No foi possvel carregar DLLBmp.DLL') else try Bmp := TBitmap.Create; try Bmp.Handle := LoadBitmap(HandleDLL, PChar(Edit1.Text)); if Bmp.Handle = 0 then ShowMessage('No foi possvel carregar o Bitmap.') else { Pinta o Bitmap no form } Canvas.Draw(0, 0, Bmp); finally Bmp.Free; end; finally { Libera a DLL } FreeLibrary(HandleDLL);

end; end; === Para testar === - Execute este projeto; - Digite no Edit1 o nome que foi dado ao Bitmap no arquivo de recursos (.RES); - Clique no boto. O bitmap dever ser pintado no form.

Observaes O arquivo DLL poder ser colocado na pasta onde estiver o EXE, no diretrio do Windows ou ainda no sub-diretrio System do Windows. Alm de bitmaps podemos colocar qualquer outro tipo de recurso em DLL's. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter status da memria do sistema


Inclua na seo uses: Windows, SysUtils
- Coloque um TMemo no form - Coloque um TButton no form e altere seu OnClick conforme abaixo: procedure TForm1.Button1Click(Sender: TObject); const cBytesPorMb = 1024 * 1024; var M: TMemoryStatus; begin M.dwLength := SizeOf(M); GlobalMemoryStatus(M); Memo1.Clear; with Memo1.Lines do begin Add(Format('Memria em uso: %d%%', [M.dwMemoryLoad])); Add(Format('Total de memria fsica: %f MB', [M.dwTotalPhys / cBytesPorMb])); Add(Format('Memria fsica disponvel: %f MB', [M.dwAvailPhys / cBytesPorMb])); Add(Format('Tamanho mximo do arquivo de paginao: %f MB', [M.dwTotalPageFile / cBytesPorMb])); Add(Format('Disponvel no arquivo de paginao: %f MB', [M.dwAvailPageFile / cBytesPorMb])); Add(Format('Total de memria virtual: %f MB', [M.dwTotalVirtual / cBytesPorMb])); Add(Format('Memria virtual disponvel: %f MB', [M.dwAvailVirtual / cBytesPorMb])); end; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mostrar o dilogo About (Sobre) do Windows


Inclua na seo uses: ShellApi
procedure TForm1.Button1Click(Sender: TObject); begin ShellAbout(Handle, 'Sistema Financeiro', 'Marcelo Senger', Application.Icon.Handle); end;

Observaes Dica enviada por: Marcelo Senger Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Converter de Hexadecimal para Inteiro


Inclua na seo uses: SysUtils
Problema: A funo IntToHex do Delphi converte inteiro para hexadecimal. O que preciso, no entanto, fazer o contrrio, ou seja, converter de hexadecimal para inteiro. Existe isto pronto no Delphi ou terei que escrever uma fun o para isto? Soluo: A funo StrToInt pode receber uma string no formato de um nmero decimal ou hexadecimal. Ento podemos us -la assim: var I: integer; begin I := StrToInt('$' + Edit1.Text); {...} end;

Observaes No Delphi, um nmero na notao decimal deve iniciar com o smbolo $.

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Colocar uma ProgressBar na StatusBar


- Coloque uma StatusBar no form. - Adicione dois paineis na StatusBar (propriedade Panels). - Ajuste as propriedades do primeiro painel conforme abaixo: Style = psOwnerDraw Width = 150 - Coloque uma ProgressBar no form e mude sua propriedade Visible para false. - No evento OnDrawPanel da StatusBar digite o cdigo abaixo: procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect); begin { Se for o primeiro painel... } if Panel.Index = 0 then begin { Ajusta a tamanho da ProgressBar de acordo com o tamanho do painel } ProgressBar1.Width := Rect.Right - Rect.Left +1; ProgressBar1.Height := Rect.Bottom - Rect.Top +1; { Pinta a ProgressBar no DC (device -context) da StatusBar } ProgressBar1.PaintTo(StatusBar.Canvas.Handle, Rect.Left, Rect.Top); end; end; - Coloque um Button no form - Digite no evento OnClick do Button o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); var I: integer; begin for I := ProgressBar1.Min to ProgressBar1.Max do begin { Atualiza a posio da ProgressBar } ProgressBar1.Position := I; { Repinta a StatusBar para forar a atualizao visual } StatusBar1.Repaint; { Aguarda 50 milisegundos } Sleep(50); end; { Aguarde 500 milisegundos } Sleep(500); { Reseta (zera) a ProgressBar } ProgressBar1.Position := ProgressBar1.Min; { Repinta a StatusBar para forar a atualizao vi sual }

StatusBar1.Repaint; end; - Execute e clique no boto para ver o resultado.

Observaes Com um pouco de criatividade podemos fazer outras coisas interessantes usando o evento OnDrawPanel da StatusBar. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Configurar linhas de diferentes alturas em StringGrid


- Coloque o StringGrid no form. - No evento OnCreate do form coloque o cdigo abaixo: procedure TForm1.FormCreate(Sender: TObject); begin StringGrid1.RowHeights[0] := 15; StringGrid1.RowHeights[1] := 20; StringGrid1.RowHeights[2] := 50; StringGrid1.RowHeights[3] := 35; end;

Observaes Cuidado para no especificar uma linha inexistente. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Adicionar o evento OnClick do DBGrid


Problema: Meu programa precisa processar algo quando o usurio clicar no DBGrid em um determinado form. O problema que o DBGrid no possui o evento OnClick. possvel adicionar este evento no DBGrid? Soluo: possvel sim. Afinal muito simples. Siga os passos abaixo para resolver seu problema:

- Monte seu form normalmente, colocando o DBGrid e demais componentes; - V na seo "private" da unit e declare a procedure abaixo: private procedure DBGridClick(Sender: TObject); - Logo aps a palavra "implementation", escreva a procedure: implementation {$R *.DFM} procedure TForm1.DBGridClick(Sender: TObject); begin ShowMessage('Clicou no DBGrid.'); end; - Coloque as instrues abaixo no evento OnCreate do Form: procedure TForm1.FormCreate(Sender: TObject); begin DBGrid1.ControlStyle := DBGrid1.ControlStyle + [csClickEvents]; TForm(DBGrid1).OnClick := DBGridClick; end; - E pronto. Execute e teste.

Observaes O segredo principal desta dica est OnCreate do Form. A primeira instruo ativa o evento OnClick. A segunda instruo acessa o manipulador do evento OnClick. Para isto precisamos tratar o DBGrid como se fosse Form, pois o evento OnClick est declarado como protegido (protected) na classe TDBGrid. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Converter a primeira letra de um Edit para maisculo


with Edit2 do if Text <> '' then Text := AnsiUpperCase(Text[1]) + Copy(Text, 2, Length(Text)); Isto pode ser colocado, por exemplo, no OnExit do Edit. Voc pode tambm converter durante a digitao. Para isto coloque o cdigo abaixo no evento OnKeyPress do Edit: if Edit1.SelStart = 0 then Key := AnsiUpperCase(Key)[1] else

Key := AnsiLowerCase(Key)[1];

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Verificar se uma string contm uma hora vlida


- Use a funo abaixo: function StrIsTime(const S: string): boolean; begin try StrToTime(S); Result := true; except Result := false; end; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Verificar se uma string contm um valor numrico vlido


- Use uma das funes abaixo, conforme o tipo de dado que se quer testar: function StrIsInteger(const S: string): boolean; begin try StrToInt(S); Result := true; except Result := false; end; end; function StrIsFloat(const S: string): boolean; begin try StrToFloat(S); Result := true; except Result := false; end; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mostrar uma mensagem durante um processamento


Problema: Um processamento em meu sistema bastante demorado e por isto colocar apenas o cursor de ampulheta continua deixando o usurio confuso, pensando que o sistema travou. possvel exibir uma mensagem enquanto um processamento demorado ocorre? Sim. E fcil. Vejamos: - Crie um form com a mensagem. Um pequeno form com um Label j suficiente. Aqui vou cham -lo de FormMsg. - V em Project|Options e passe o FormMsg de "Auto-create forms " para "Available forms". - Abaixo vou simular um processamento demorado, usando a API Sleep: procedure TForm1.Button1Click(Sender: TObject); var Form: TFormMsg; I: integer; begin Form := TFormMsg.Create(Self); try Form.Label1.Caption := 'Pr ocessamento demorado...'; Form.Show; for I := 1 to 5 do begin Form.UpDate; Sleep(1000); { Aguarda um segundo } end; finally Form.Free; end; end;

Observaes A funo Sleep uma API do Windows e serve para paralisar a aplicao por um determinado dempo. Este tempo em milisegundos. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mostrar um cursor de ampulheta durante um processamento

Salve o cursor atual Defina o novo cursor (crHourGlass ampulheta) Faa o processamento Restaure o cursor.

Vejamos: var PrevCur: TCursor; begin PrevCur := Screen.Cursor; try Screen.Cursor := crHourGlass; { Coloque aqui as instrues do processamento } finally Screen.Cursor := PrevCur; end; end;

Observaes Existem diversos outros cursores pr-definidos no Delphi. D uma olhada na propriedade Cursor de um componente visual para ver uma lista de todos eles. Voc poder tambm criar o seu prprio cursor. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Ler e escrever dados binrios no Registro do Windows


Inclua na seo uses: Registry
Coloque no Form: - trs edits; - dois botes. Logo abaixo da palavra implementation declare: type { Declara um tipo registro } TFicha = record Codigo: integer; Nome: string[40]; DataCadastro: TDateTime; end; - Escreva o evento OnClick do Button1 conforme abaixo: procedure TForm1.Button1Click(Sender: var Reg: TRegistry; Ficha: TFicha; begin TObject);

{ Coloca alguns dados na varivel Ficha } Ficha.Codigo := StrToInt(Edit1.Text); Ficha.Nome := Edit2.Text; Ficha.DataCadastro := StrToDate(Edit3.Text); Reg := TRegistry.Create; try { Define a chave -raiz do registro } Reg.RootKey := HKEY_CURRENT_USER; { Abre uma chave (path). Se no existir cria e abre. } Reg.OpenKey('Cadastro \Pessoas\', true); { Grava os dados (o registro) } Reg.WriteBinaryData('Dados', Ficha, SizeOf(Ficha)); finally Reg.Free; end; end; - Escreva o evento OnClick do Button2 conforme abaixo: procedure TForm1.Button2Click(Sender: TObject); var Reg: TRegistry; Ficha: TFicha; begin Reg := TRegi stry.Create; try { Define a chave -raiz do registro } Reg.RootKey := HKEY_CURRENT_USER; { Se existir a chave (path)... } if Reg.KeyExists('Cadastro \Pessoas') then begin { Abre a chave (path) } Reg.OpenKey('Cadastro \Pessoas', false); { Se existir o valor... } if Reg.ValueExists('Dados') then begin { L os dados } Reg.ReadBinaryData('Dados', Ficha, SizeOf(Ficha)); Edit1.Text := IntToStr(Ficha.Codigo ); Edit2.Text := Ficha.Nome; Edit3.Text := DateToStr(Ficha.DataCadastro); end else ShowMessage('Valor no existe no registro.') end else ShowMessage('Chave (path) no existe no registro.'); finally Reg.Free; end; end;

Observaes Qualquer tipo de dado pode ser gravado e lido de forma binria no registro do Windows. Para isto voc precisa saber o tamanho do dado. Para dados de tamanho fixo,

use SizeOf(). Lembrete: no grave dados muito extensos no Registro do Windows (ex: imagens), pois isto prejudicar o desempenho do sistema. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Mudar a resoluo do vdeo via programao


- Coloque um ListBox no form - Modifique o OnCreate do form assim: procedure TForm1.FormCreate(Sender: TObject); var i : Integer; DevMode : TDevMode; begin i := 0; while EnumDisplaySettings(nil,i,Devmode) do begin with Devmode do ListBox1.Items.Add(Format('%dx%d %d Colors', [dmPelsWidth,dmPelsHeight, 1 shl dmBitsperPel])); Inc(i); end; end; - Coloque um boto no form - Altere o evento OnClick do boto conforme abaixo: procedure TForm1.Button1Click(Sender: TObject); var DevMode : TDevMode; begin EnumDisplaySettings(nil,Listbox1.ItemIndex,Devmode); ChangeDisplaySettings(DevMode,0); end;

Observaes Nos testes que fiz, nem tudo funcionou adequadamente. Mas vale a pena experimentar. Incio

Ler e escrever dados no Registro do Windows


Inclua na seo uses: Registry
- Coloque no form dois edits e dois botes. - No evento OnClick do Button1 escreva o cdigo abaixo: procedure TForm1.Button1Click(Sender: TObject); var

Reg: TRegistry; begin Reg := TRegistry.Create; try { Define a chave -raiz do registro } Reg.RootKey := HKEY_CURRENT_USER; { Abre a chave (path). Se no existir, cria e abre. } Reg.OpenKey('MeuPrograma \Configurao', true); { Escreve um inteiro } Reg.WriteInteger('Numero', StrToInt(Edit1.Text)); { Escreve uma string } Reg.WriteString('Nome', Edit2.Text); finally Reg.Free; end; end; - No evento OnClick do Button2, escreva: procedure TForm1.Button2Click(Sender: TObject); var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.KeyExists('MeuPrograma \Configurao') then begin Reg.OpenKey('MeuPrograma \Configurao', false); if Reg.ValueExists('Numero') then Edit1.Text := IntToStr(Reg.ReadInteger('Numero')) else ShowMessage('No existe valor com o nome "Numero"'); if Reg.ValueExists('Nome') then Edit2.Text := Reg.ReadString('Nome') else ShowMessage('No existe valor com o nome "Nome"'); end else ShowMessage ('No existe a chave no registro'); finally Reg.Free; end; end;

Observaes User o aplicativo RegEdit.exe do windows para ver o registro. Cuidado para no alterar as configuraes do Windows! Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Adicionar barra de rolagem horizontal no ListBox


{ - Coloque um ListBox no form; - Altere o OnCreate do Form conforme abaixo: } procedure TForm1.FormCreate(Sender: TObject); var I, Temp, MaxTextWidth: integer; begin { Adiciona algumas linhas no ListBox } Listbox1.Items.Add('Linha 1'); Listbox1.Items.Add('Linha 2, longa para que seja necessria a barra de rolagem horizontal'); Listbox1.Items.Add('Linha 3'); if Listbox1.Items.Count > 1 then begin { Obtm o comprimento, em pixels, da linha mais longa } MaxTextWidth := 0; for I := 0 to Listbox1.Items.Count - 1 do begin Temp := ListBox1.Canvas.TextWidth(ListBox1.Items[I]); if Temp > MaxTextWidth then MaxTextWidth := Temp; end; { Acrescenta a largura de um "W" } MaxTextWidth := MaxTextWidt h + Listbox1.Canvas.TextWidth('W'); { Envia uma mensagem ao ListBox } SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxTextWidth, 0); end; end; { Para ocultar use a instruo abaixo: } SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT , 0, 0);

Incio

Verificar se uma string uma data vlida


Escreva a funo abaixo: function tbStrIsDate(const S: string): boolean; begin try StrToDate(S); Result := true; except Result := false; end; end; Para testar: - Coloque um Edit no form;

- Coloque um Button; - No evento OnClick do boto coloque o cdigo abaixo: if tbStrIsDate(Edit1.Text) then ShowMessage(Edit1.Text + ' data vlida.') else ShowMessage(Edit1.Text + ' NO data vlida.');

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Adicionar zeros esquerda de um nmero


Existem vrias formas. Vejamos uma: function tbStrZero(const I: integer; const Casas: byte): string; var Ch: Char; begin Result := IntToStr(I); if Length(Result) > Casas then begin Ch := '*'; Result := ''; end else Ch := '0'; while Length(Result) < Casas do Result := Ch + Result; end; { Exemplo de como us -la: } var S: string; Numero: integer; {...} begin {...} S := tbStrZero(Numero, 6); {...} end;

Observaes Se o comprimento desejado (Casas) no for suficiente para conter o nmero, sero colocados asteriscos. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter a verso da biblioteca ComCtl32.DLL (usada na unit ComCtrls do Delphi)


Inclua na seo uses: ComCtrls
{ A verso desta biblioteca determina a aparncia de alguns controles do Delphi, tais como ToolBar e CoolBar. O exemplo abaixo obtm a verso desta biblioteca. Para este exemplo, coloque um TEdit e um TButton no Form. O evento OnClick do boto escreva o cdigo abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Ver: Cardinal; MaiorVer, MenorVer: Word; begin Ver := GetComCtlVersion; MaiorVer := HiWord(Ver); MenorVer := LoWord(Ver); Edit1.Text := IntToStr(MaiorVer) + '.' + IntToStr(MenorVer); end;

Observaes Normalmente, a verso 4.72 est presente quando o Internet Explorer 4 est instalado. Incio

Implementar rotinas assembly em Pascal


{ O Delphi permite a implementao de rotinas assembly mescladas ao cdigo Pascal. No entrarei em detalhes minuciosos, mas darei alguns exemplos bsicos de como implementar rotinas simples que retornam nmeros inteiros. } { Soma dois inteiros de 8 bits } function Soma8(X, Y: byte): byte; asm mov al, &X add al, &Y end; { Soma dois inteiros de 16 bits } function Soma16(X, Y: Word): Word; asm mov ax, &X add ax, &Y end; { Soma dois inteiros de 32 bits } function Soma32(X, Y: DWor d): DWord; asm

mov eax, &X add eax, &Y end; { A chamada a estas funes so feitas da mesma forma que chamamos uma funo Pascal. Exemplo: } var A: byte; begin A := Soma8(30, 25); { A = 55 } end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Exibir o dilogo About do Windows


Inclua na seo uses: Windows
{ About padro do Windows } ShellAbout(Handle, 'Windows', '', 0); { Personalizada } ShellAbout(Handle, 'NomePrograma', 'Direitos autorais reservados a'#13'Fulano de Tal', Application.Icon.Handle);

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter a linha e coluna atual em um TMemo


{ === SOLUO 1 === } { Esta procedure obtm a linha e coluna atual de um TMemo } procedure tbGetMemoLinCol(Memo: TMemo; var Lin, Col: Cardinal); begin with Memo do begin Lin := Perform(EM_LINEFROMCHAR, SelStart, 0); Col := SelStart - Perform(EM_LINEINDEX, Lin, 0); end; end; { Use-a como abaixo: } var Lin, Col: Cardinal; begin tbGetMemoLinCol(Memo1, Lin, Col);

{ ... } end; { === SOLUO 2 === } var Lin, Col: integer; begin Lin := Memo1.CaretPos.y; Col := Memo1.CaretPos.x; {...} end; - A segunda soluo foi apresentada por: Vanderley Pereira Rocha

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Exibir um arquivo de ajuda do Windows


Inclua na seo uses: Windows
{ Voc precisa saber: - Caminho e nome do arquivo; - A estrutura do arquivo de Help. No exemplo abaixo abre o arquivo de ajuda da Calculadora do Windows e vai para o tpico n. 100 } procedure TForm1.Button1Click(Sender: TObject); begin WinHelp(0, 'c: \Win95\Help\Calc.hlp', HELP_CONTEXT, 100); end;

Observaes Para utilizar um arquivo de ajuda em seu programa desenvolvido em Delphi, basta usar os recursos do prprio Delphi. O exemplo acima somente para mostrar o uso de uma API para este fim. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter o valor de uma varivel de ambiente


Inclua na seo uses: Windows

{ Esta funo recebe o nome da varivel de ambiente que queremos acessar e retorna uma string com seu valor, ou uma string vazia se a varivel no existir. } function tbGetEnvVar(const VarName: string): string; var I: integer; begin Result := ''; { Obtm o comprimento da varivel } I := GetEn vironmentVariable('PATH', nil, 0); if I > 0 then begin SetLength(Result, I); GetEnvironmentVariable('PATH', PChar(Result), I); end; end; { Para us -la, faa como neste exemplo: } Edit1.Text := tbGetEnvVar('PATH');

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Fechar um aplicativo com uma mensagem de erro fatal


Inclua na seo uses: Windows
procedure TForm1.Button1Click(Sender: TObject); begin FatalAppExit(0, 'Erro fatal na aplicao.'); end;

Observaes A funo FatalAppExit uma API do Windows. Esta mostra uma caixa de dilogo (normalmente branca) com a mensagem passada no segundo parmetro. Quando a caixa de dilogo fechada a aplicao finalizada. O evento OnCloseQuery dos forms no so chamados quando usamos esta funo. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Criar um EXE que seja executado apenas atravs de outro EXE criado por mim

Inclua na seo uses: Windows


{ Problema: Gostaria que um determinado programa (Prog1.EXE) fosse executado apenas atravs de outro programa (Prog2.EXE). Soluo: Antes da linha "Application.Initialize;" de Prog1.dpr (programa a ser chamado), coloque o cdigo abaixo: } if ParamStr(1) <> 'MinhaSenha' then begin { Para usar ShowMessage, coloque Dialogs no uses } ShowMessage('Execute este programa atravs de Prog2.EXE'); Halt; { Finaliza } end; { No Form1 de Prog2 (programa chamador) coloque um boto e escreva o OnCli ck deste boto como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Erro: Word; begin Erro := WinExec('Pro2.exe MinhaSenha', SW_SHOW); if Erro <= 31 then { Se ocorreu erro... } ShowMessage('Erro ao executar o programa.'); end;

Observaes Aqui o parmetro passado foi 'MinhaSenha'. Voc dever trocar 'MinhaSenha' por algo que apenas voc saiba (uma senha). Caso uma pessoa conhea esta senha, ser possvel chamar este programa passando-a como parmetro. Neste caso sua "trava" estar violada. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Truncar valores reais para n casas decimais


{ s vezes voc precisa considerar apenas duas casas de valores reais, mas o Delphi no oferece algo pronto para isto. Se usarmos funes como Round que vem com o Delphi, o valor ser arredondado (e no truncado). Com Round() o valor abaixo ser 135.55 (e no 135.54) com duas casas decimais. } ValorReal := 135.54658; { Somente a parte inteira - nenhuma casa decimal }

X := Trunc(ValorReal); // X ser 135 { Duas casas } X := Trunc( ValorReal * 100) / 100; // X ser 135.54 { Trs casas } X := Trunc(ValorReal * 1000) / 1000; // X ser 135.5465

Observaes Isto pode no funcionar se ValorReal for muito alto. Isto por causa da multiplicao que poder estourar a capacidade do tipo em uso. Lembre-se: os tipos reais aceitam valores muuuiiiito altos. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Saber se o sistema est usando 4 dgitos para o ano


{ Para no correr o risco de surpresas desagradveis, melhor que seu programa em Delphi verifique se o Windows est ajustado para trabalhar com 4 dgitos para o ano. Assim seu programa pode alertar o usurio quando o ano estiver sendo representado com apenas 2 dgitos. A funo aba ixo retorna true se estiver ajustado para 4 dgitos. } function Is4DigitYear: Boolean; begin result:=(Pos('yyyy',ShortDateFormat)>0); end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Obter o nome do usurio e da empresa informado durante a instalao do Windows


Inclua na seo uses: Registry
{ Coloque um boto no form e altere seu evento OnCkick como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Reg: TRegIniFile; S: string;

begin Reg := TRegIniFile.Create('SOFTWARE \MICROSOFT \MS SETUP (ACME) \'); try S := Reg.ReadString('USE R INFO','DefName',''); S := S + #13; S := S + Reg.ReadString('USER INFO','DefCompany',''); ShowMessage(S); finally Reg.free; end; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Evitar que seu programa aparea na barra de tarefas


Inclua na seo uses: Windows
{ Voc j observou a caixa "Propriedades", aquela que mostra as propriedades de um arquivo no Windows Explorer, no aparece na lista do Alt+Tab e tampouco na barra de tarefas? Isto ocorre porque ela funciona como uma ToolWindow, enquanto os demais aplicativos funcionam como AppWindow. Porm podemos mudar o comportamento de nossos programas feito em Delphi para que se comportem como uma ToolWindow tambm. Para experimentar, crie um novo projeto e altere o Project1.dpr como abaixo (no esquea do uses): } program Project1; uses Forms, Windows, Unit1 in 'Unit1.pas' {Form1}; {$R *.RES} var ExtendedStyle : Integer; begin Application.Initialize; ExtendedStyle := GetWindowLong(Application.Handle, gwl_ExStyle); SetWindowLong(Application.Handle, gwl_ExStyl e, ExtendedStyle or ws_Ex_ToolWindow and not ws_Ex_AppWindow); Application.CreateForm(TForm1, Form1); Application.Run; end.

Observaes

Ao executar observe a barra de tarefas e teste o Alt+Tab (seu programa no estar l!). Incio

Fechar o Windows a partir do seu programa


{ Reinicia o Windows } ExitWindowsEx(EWX_REBOOT, 0); { Desliga o Windows } ExitWindowsEx(EWX_SHUTDOWN, 0); { Fora todos os programa a desligarem -se } ExitWindowsEx(EWX_FORCE, 0);

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Carregar um cursor animado (.ani)


{ Altere o evento OnCreate do Form conforme abaixo: } procedure TForm1.FormCreate(Sender: TObject); begin Screen.Cursors[1] := LoadCursorFromFile('c: \win95\cursors\globe.ani'); Button1.Cursor := 1; end;

Observaes Para este exemplo necessrio ter o arquivo de cursor conforme apontado e tambm ter, no form, um Button1. Para usar este cursor em outros componentes basta atribuir propriedade Cursor do componente em questo o valor 1 (um). Exemplo: Edit1.Cursor := 1; Form1.Cursor := 1;, etc. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Executar um programa DOS e fech-lo em seguida


{ Coloque isto no evento OnClick de um boto: }

WinExec('command.com /c programa.exe',sw_ShowNormal); { Se quizer passar parmetros pasta adicion -los aps o nome do programa. Exemplo: } WinExec('command.com /c programa.exe param1 param2',sw_ShowNormal);

Observaes Se quizer que a janela do programa no aparea, troque sw_ShowNormal por sw_Hide. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Fechar um programa a partir de um programa Delphi


{ - Coloque um boto no form e altere seu evento OnClick conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Janela: HWND; begin Janela := FindWindow('OpusApp'), nil); if Janela = 0 then ShowMessage('Programa no encontrado') else PostMessage(Janela, WM_QUIT, 0, 0); end;

Observaes Este exemplo fecha o MS Word 97 se estiver aberto. A mensagem WM_QUIT fecha o programa da forma "ignorante". Isto significa que se houver dados no salvos, o programa a ser fechado no oportunidade para salv-los. Uma alternativa mais suave trocar a mensagem WM_QUIT por WM_CLOSE. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Colocar Hint's de vrias linhas


{ - Coloque um TButton no Form; - Altere o evento OnCreate do Form como abaixo: }

procedure TForm1.FormCreate(Sender: TObject); begin Button1.Hint := 'Linha 1 da dica' + #13 + 'Linha 2 da dica' + #13 + 'Linha 3 da dica'; Button1.ShowHint := true; end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Separar (filtrar) caracteres de uma string


{ Abaixo da palavra implementation digite: } type TChars = set of Char; function FilterChars(const S: string; string; var I: integer; begin Result := ''; for I := 1 to Length(S) do if S[I] in ValidChars then Result := Result + S[I]; end; const ValidChars: TChars):

{ Para usar a funo: - Coloque um boto no Form; - Altere o evento OnClick deste boto conforme abaixo: } procedure TForm1.Button4Click(Sender: TObject); begin { Pega s letras } ShowMessage(FilterChars('D63an*%i+/e68l13', ['A'..'Z', 'a'..'z'])); { Pega s nmeros } ShowMessage(FilterChar s('D63an*%i+/e68l13', ['0'..'9'])); end;

Observaes Se quizer usar este funo em outras unit's, coloque a declarao do tipo TChars na seo interface. Coloque a tambm uma declarao da funo FilterChars. E no se esquea da clusula uses. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br

Incio

Colocar zeros esquerda de nmeros


{ Isto coloca zeros esquerda do nmero at completar 6 casas } S := FormatFloat('000000', 5);

Observaes "S" precisa ser uma varivel string. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Trabalhar com cores no formato string


procedure TForm1.Button3Click(Sender: TObject); begin { Exibe as cores atuais dos Edit's } ShowMessage(ColorToString(Edit1.Color)); ShowMessage(ColorToString(Edit2.Color)); { Altera as cores dos Edit's } Edit1.Color := StringToColor('clBlue'); Edit2.Color := StringToColor('$0080FF80'); end;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Verificar se determinado programa est em execuo (Word, Delphi, etc)


{ Coloque um Button no Form e altere o evento OnClick deste como abaixo: } procedure TForm1.Button1Click(Sender: TObject); begin { Verifica o Delphi } if FindWindow('TAppBuilder', nil) > 0 then ShowMessage('O Delphi est aberto') else

ShowMessage('O Delphi NO est aberto'); { Verifica o Word } if FindWindow('OpusApp', nil) > 0 then ShowMessage('O Word est aberto') else ShowMessage('O Word NO est aberto'); { Verifica o Excell } if FindWindow('XLMAIN', nil) > 0 then ShowMessage('O Excell est aberto') else ShowMessage('O Excell NO est aberto'); end;

Observaes H uma margem de erro nesta verificao: pode haver outros programas que possuam uma janela com os mesmos nomes. Voc mesmo pode criar aplicativos em Delphi e, propositadamente, criar uma janela com um destes nomes. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Gerar uma tabela no Word atravs do Delphi


Inclua na seo uses: ComObj
{ - Coloque um boto no Form; - Altere o evento OnClick do boto conforme abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Word: Variant; begin { Abre o Word } Word := CreateOleObject('Word.Application'); try { Novo documento } Word.Documents.Add; try { Adiciona tabela de 2 linhas e 3 colunas Word.ActiveDocument.Tables.Add( Range := Word.Selection.Range, NumRows := 2, NumColumns := 3); { Escreve na primeira clula } Word.Selection.TypeText(Text := 'Linha 1, { Prxima clula } Word.Selection.MoveRight(12); { Escreve } Word.Selection.TypeText(Text := 'Linha 1, Word.Selection.MoveRight(12); Word.Selection.TypeText(Text := 'Linha 1,

Coluna 1');

Coluna 2'); Coluna 3');

Word.Selection.MoveRight(12); Word.Selectio n.TypeText(Text := 'Linha 2, Coluna 1'); Word.Selection.MoveRight(12); Word.Selection.TypeText(Text := 'Linha 2, Coluna 2'); Word.Selection.MoveRight(12); Word.Selection.TypeText(Text := 'Linha 2, Coluna 3'); { Auto-Formata } Word.Selection.Tables.Item(1).Select; { Seleciona a 1 tabela } Word.Selection.Cells.AutoFit; { auto -formata } { Imprime 1 cpia } Word.ActiveDocument.PrintOut(Copies := 1); ShowMessage('Aguarde o trmino da impresso...'); { Para salvar... } Word.ActiveDocument.SaveAs(FileName := 'c: \Tabela.doc'); finally { Fecha documento } Word.ActiveDocument.Close(SaveChanges := 0); end; finally { Fecha o Word } Word.Quit; end; end;

Observaes Foram usados neste exemplo o Delphi4 e MS-Word97. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Evitar que um programa seja executado mais de uma vez


{ Muitos programas Windows permitem apenas uma cpia em execuo de cada vez. Isto interessante principalmente quando um grande aplicativo, pois duas cpias ao mesmo tempo usuaria muito mais memria. Em aplicativos desenvolvidos em Delphi podemos ter esta caracterstica. Vejamos: - Crie um novo projeto; - Mude o "Name" do Form1 para DPGFormPrinc; - Altere o cdigo -fonte do arquivo Project1.dpr conforme abaixo: } program Project1; uses Forms, Windows, Unit1 in 'Unit1.pas' {DPGFormPrinc}; {$R *.RES} var

Handle: THandle; begin Handle := FindWindow('TDPGFormPrinc', nil); if Handle <> 0 then begin { J est aberto } Application.MessageBox('Este programa j est aberto. A cpia ' + 'anterior ser ativada.', 'Programa j aberto', MB_OK); if not IsWindowVisible(Handle) then ShowWindow(Handle, SW_RESTORE); SetForegr oundWindow(Handle); Exit; end; Application.Initialize; Application.CreateForm(TDPGFormPrinc, DPGFormPrinc); Application.Run; end.

Observaes Para testar este programa voc dever compilar o projeto e fechar o Delphi. Depois, procure o Project1.exe (projeto compilado) usando o Windows Explorer e tente executlo mais de uma vez e veja o que acontece. Mas porque alterar o name do form principal para "DPGFormPrinc"? Este poderia ser qualquer outro nome, mas preferi usar as iniciais do meu nome (DPG). Procurei deixar um nome bem pessoal para no correr o risco de colocar um nome que possa ser encontrado em outro aplicativo do Windows. Por exemplo: se deixar Form1, ser bem fcil encontrar outro aplicativo feito em Delphi que possua uma janela com este nome, o que causaria problema. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Saber a resoluo de tela atual


{ Coloque um TButton no Form e altere o evento OnClick deste boto como abaixo: } procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('Largura: ' + IntToStr(Screen.Width) + #13 + 'Altura: ' + IntToStr(Screen.Height)); end;

Observaes O objeto Screen contm vrias informaes importantes: largura e altura da tela, fontes instaladas no Windows, etc. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Onde encontrar tutoriais sobre construo de componentes em Delphi


Pegue apostila no download.

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Para que servem OnGetEditMask, OnGetEditText e OnSetEditText do TStringGrid


O evento OnGetEditMask ocorre quando entramos no modo de edio. Neste momento podemos verificar em qual linha/coluna se encontra o cursor e ento, se quiser, poder especificar uma mscara de edio. Exemplo: procedure TForm1.StringGrid1GetEditMask(Sender: TObject; ACol, ARow: Integer; var Value: String); begin if (ARow = 1) and (ACol = 1) then Value := '(999) 999 -9999;1;_'; // Telefone end; O evento OnGetEditText ocorre tambm quando entramos no modo de edio. Neste momento podemos manipularmos o texto da clula atual (linha/coluna) e ento podemos simular algo tal como uma tabela onde opes podem ser digitadas atravs de nmeros. Exemplo: procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer; var Value: String); begin if (ARow = 1) and (ACol = 2) then begin if StringGrid1.Cells[ACol, ARow] = 'timo' then Value := '1' else if StringGrid1.Cells[ACol, ARow] = 'Regular' then Value := '2' else if StringGrid1.Cells[ACol, ARow] = 'Ruim' then Value := '3'; end; end; O evento evento OnSetEditText ocorre quando samos do modo de edio. Neste momento podemos manipular a entrada e trocar por um texto equivalente. Normalmente usamos e ste evento em conjunto com o evento OnGetEditText. Exemplo: procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String); begin if (ARow = 1) and (ACol = 2) then begin if Value = '1' then

StringGrid1.Cel ls[ACol, ARow] := 'timo' else if Value = '2' then StringGrid1.Cells[ACol, ARow] := 'Regular' else if Value = '3' then StringGrid1.Cells[ACol, ARow] := 'Ruim' end; end;

Observaes Para testar o exemplo anterior crie um novo projeto e coloque no Form1 um TStringGrid. Mude os trs eventos mencionados conforme os exemplos. Execute e experimente digitar nas cluas 1 e 2 da primeira linha (na parte no fixada, claro!). Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Descobrir o nome de classe de uma janela do Windows


Muitas vezes precisamos saber qual o nome de classe de uma determinada janela. Quando so janelas desenvolvidas por ns, voc olha no cdigo -fonte. Mas e se no for, como o caso do Delphi? Por exemplo: Para verificar se o Delphi est sendo executado, procuramos no Windows pela janela cujo nome de classe seja TAppBuilder. Mas como verificar ento se o Internet Explorer est sendo executado? Precisaremos saber o nome de classe da janela deste programa. Ento o que fazer? Use o TBWinName. Pe gue-o no download de www.tecnobyte.com.br

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Ocultar/exibir a barra de tarefas do Windows


Inclua na seo uses: Windows
{ Coloque no Form dois Botes: BotaoOcultar e BotaoExibir. No evento OnClick do BotaoOcultar escreva: } procedure TForm1.BotaoOcultarClick(Sender: TObject); var Janela: HWND;

begin Janela := FindWindow('Shell_TrayWnd', nil); if Janela > 0 then ShowWindow(Janela, SW_HIDE); end; { No evento OnClick do BotaoExibir escreva: }

procedure TForm1.BotaoExibirClick(Sender: TObject); var Janela: HWND; begin Janela := FindWindow('Shell_TrayWnd', nil); if Janela > 0 then ShowWindow(Janela, SW_SHOW); end; { Execute e teste, clicando em ambos os botes }

Observaes A tarefa mais difcil descobrir o nome de classe da janela da barra de tarefa do Windows, mas isto fcil se voc usar o TBWinName. Pegue-o no link download de www.tecnobyte.com.br. O resto usar as APIs do Windows para manipulao de Janelas. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Evitar a proteo de tela durante seu programa


Inclua na seo uses: Windows
{ Na seo "private" do Form principal acrescente: } procedure AppMsg(var Msg: TMsg; var Handled: Boolean); { Na seo "implementation" acrescente (troque TForm1 para o nome do seu form principal): } procedure TForm1.AppMsg(var Msg: TMsg; var Handled: Boolean); begin if (Msg.Message = wm_SysCommand) and (Msg.wParam = sc_ScreenSave) then Handled := true; end; { No evento "OnCreate" do form principal, coloque: } Application.OnMessage := AppMsg;

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Criar cores personalizadas (sistema RGB)


{ Coloque um TButton no form e escreva o evento OnClick deste como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var Vermelho, Verde, Azul: byte; MinhaCor: TColor; begin Vermelho := 0; Verde := 200; Azul := 150; MinhaCor := TColor(RGB(Vermelho, Verde, Azul)); Form1.Color := MinhaCor; end;

Observaes A quantidade de cada cor primria um nmero de 0 a 255. Observe que a cor retornada pela funo RGB() est no formato do Windows (ColorRef); por isto que fiz a converso TColor(RGB(...)). Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Adicionar uma nova fonte no Windows


{ Coloque o cdigo abaixo no OnClick de um boto } AddFontResource(PChar('c: \MyFonts\Monospac.ttf'));

Observaes Troque o nome do arquivo do exemplo anterior pelo nome desejado. Arquivos de fonte possuem uma das seguintes extenses: FON, FNT, TTF, FOT. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Saber se determinada Font est instalada no Windows


{ Coloque este cdigo no OnClick de um boto } with Screen.Fonts do if IndexOf('Courier New') >= 0 then

ShowMessage('A fonte est instalada.') else ShowMessage('A fonte no est instalada.');

Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Acertar a data e hora do sistema atravs do programa


{ Coloque dois TEdit no form. Coloque um TButton no form e altere o evento OnClick deste boto como abaixo: } procedure TForm1.Button1Click(Sender: TObject); var DataHora: TSystemTime; Data, Hora: TDateTime; Ano, Mes, Dia, H, M, S, Mil: word; begin Data := StrToDate(Edit1 .Text); Hora := StrToTime(Edit2.Text); DecodeDate(Data, Ano, Mes, Dia); DecodeTime(Hora, H, M, S, Mil); with DataHora do begin wYear := Ano; wMonth := Mes; wDay := Dia; wHour := H; wMinute := M; wSecond := S; wMilliseconds := Mil; end; SetLocalTime(DataHora); end;

Observaes No Edit1 digite a nova data e no Edit2 digite a nova hora. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Paralizar um programa durante n segundos


Inclua na seo uses: Windows
{ Pausa por 1 segundo }

Sleep(1000); { Pausa por 10 segundos } Sleep(10000);

Observaes Esta pausa no interrompida pelo pressionamento de alguma tecla, como acontecia com InKey() do Clipper. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Criar um Alias atravs do seu programa


Inclua na seo uses: DB
{ se o alias no existir... } if not Session.IsAlias('MeuAlias') then begin { Adiciona o alias } Session.AddStandardAlias('MeuAlias', 'C: \DirProg', 'PARADOX'); { Salva o arquivo de configurao do BDE } Session.SaveConfigFile; end;

Observaes Para criar um alias do dBase troque a string 'PARADOX' por 'DBASE'. No caso acima usei como path o caminho "C:\DirProg", mas se voc quiser poder trocar este caminho por ExtractFilePath(ParamStr(0)) para que o alias seja direcionado para o local onde est seu .EXE. Neste ltimo caso ser necessrio incluir na seo uses: SysUtils, System. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio

Pgina atualizada em 01 de maio de 2007 Todos os direitos reservados www.tecnobyte.com.br