Professional Documents
Culture Documents
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
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
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 Ler e escrever dados binrios no Registro do Windows Mudar a resoluo do vdeo via pro gramao 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
y y y y y y
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 A funo abaixo retorna o Mac Address do adaptador de rede:
function MacAddress: string; 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
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', 'Atualizar'); 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 separador. } z := Round(y * 1000) / 1000;
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 mo do como o Delphi trata nmeros reais, tais como aparecer 3.9999999... em vez de 4.
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;
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, Dat e)) + ' anos'); 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
- 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
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
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
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
para Bitmap. O arquivo Bitmap ter o mesmo nome do arquivo 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');
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 saber como incluir tais arquivos dentro do prprio EXE. Dentro do EXE podemos colocar qu alquer 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 pala vra 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_RCD ATA); 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 compilamos o script com o compilador de recursos da Borland (BRCC32.EXE). Este processo gerou o arqui vo 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 e m 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 conhecemos os passos, vamos ao exemplo: 1. Coloque um TTable e ligue ao Alias DBDEMOS e t abela 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
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
{ 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 divulguei-a 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
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
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
function tbFimDoMes(const Data: TDateTime): boolean; var Ano, Mes, Dia: Word; begin DecodeDate(Data +1, Ano, Mes, Dia); Result := Dia = 1; end;
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
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
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 EXE, 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 aplicati vo } { *.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.LoadFromFile(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 arquivos 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.
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');
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
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).
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
[M.dwAvailPageFile / cBytesPorMb])); Add(Format('Total de memria virtual: %f M B', [M.dwTotalVirtual / cBytesPorMb])); Add(Format('Memria virtual disponvel: %f MB', [M.dwAvailVirtual / cBytesPorMb])); end; end;
Observaes Dica enviada por: Marcelo Senger Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
Observaes No Delphi, um nmero na notao decimal deve iniciar com o smbolo $. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
{ 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 visu al } 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
Observaes Cuidado para no especificar uma linha inexistente. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
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 := DBGr idClick; 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
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];
end; function StrIsFloat(const S: string): boolean; begin try StrToFloat(S); Result := true; except Result := false; 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
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.
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: TObject); var Reg: TRegistry; Ficha: TFicha; begin { 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
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
{ 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
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
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 OnClick 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
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 alto s. Autor: Daniel P. Guimares Home-page: www.tecnobyte.com.br Incio
{ 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 abaixo retorna true se estiver ajustado para 4 dgitos. } function Is4DigitYear: Boolean; begin result:=(Pos('yyyy',ShortDateFormat)>0); end;
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('USER INFO','DefName',''); S := S + #13; S := S + Reg.ReadString('USER INFO','DefCompany',''); ShowMessage(S); finally Reg.free; end; end;
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 por que 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_ExStyle, 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
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
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 W M_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
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
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
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
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 execut-lo 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
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
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
{ 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.');
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