Documente Academic
Documente Profesional
Documente Cultură
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
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
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;
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. }
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.
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;
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.
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
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
Observaes Um procedimento semelhante pode ser usado com o TreeView. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
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
Observaes Outros componentes, tais como TMemo, possuem tambm este mtodo. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
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
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
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
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
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
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
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 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;
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
- ' +
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
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
{ 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
- 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.
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
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
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
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
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
Observaes Dica enviada por: Marcelo Senger Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
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
Observaes Cuidado para no especificar uma linha inexistente. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
- 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
Key := AnsiLowerCase(Key)[1];
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
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
{ 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
Observaes Nos testes que fiz, nem tudo funcionou adequadamente. Mas vale a pena experimentar. Incio
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
Incio
- 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.');
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
Observaes Normalmente, a verso 4.72 est presente quando o Internet Explorer 4 est instalado. Incio
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;
{ ... } 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
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
{ 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');
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
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
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
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;
Observaes
Ao executar observe a barra de tarefas e teste o Alt+Tab (seu programa no estar l!). Incio
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
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
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
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;
{ 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
Observaes "S" precisa ser uma varivel string. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
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
Coluna 1');
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
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
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
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
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
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
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
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
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
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