No
OI: Events
OnCloseQuery
(close Query)
No
EC: IF MESSAGEDLG
('DESEJA SAIR?',
MTCONFIRMATION,
MYES,MBNO],0)=MRNO
THEN
CANCLOSE := FALSE;
ENVIANDO UM ARQUIVO PARA A LIXEIRA

Para enviar um arquivo para a lixeira do Windows 9x e não deleta-lo
definitivamente utilize esta função que deve ser utilizada em um arquivo que contenha a
unit ShellAPI na seção USES.
Function DeleteFileWithUndo
(sFileName : string ) : boolean;
var
fos : TSHFileOpStruct;
begin
FillChart( fos, SizeOF( fos ), 0 );
whit fos do
begin
wFunc :=
FO_DELETE;
pFrom := PChar (
sFileName );
fFlags :=
FOF_ALLOWUNDO ou FOF_NOCONFIRMATION ou FOF_SILENT;
end;
Result := ( 0 = ShFileOperation( fos ) );
end;
DICAS DE DELPHI - Para melhorar
o desempenho e tirar duvidas dos delphistas.
UMA FUNÇÃO PARA O ANO 2000
Rotina para estender a vida útil de
aplicações de 16 bits

EM DELPHI 3.0
function Ano2000
(umaData:String):
String;
var i, Anoini, iCompAno, iCompData : integer;
var NovaData, VelhaData: TDateTime;
var auxd, auxy : word;
begin
if ((umaData='29/2/00') or (umaData= '29/02/00') or
(umaData = '29/2/0') or (umaData = '29/02/0'))
then begin
Ano2000 := '29/2/2000';
exit;
end;
iCompData := Length (umaData);
VelhaData := StrToDate(umaData);
DecodeDate (VelhaData, auxy, auxm, auxd);
Anolni := auxy;
for i:=iCompdata downto 1 do begin
If (CompareStr (Copy(umadata, i, 1),
'I') =0)then
break;
end;
iCompAno := iCompData - i;
if ((Anolni >= 1900) And (Anolni <1930)) then
if iCompAno <=2 then
NovaData := EncodeDate (auxy+100, auxm, auxd)
else NovaData := VelhaData
else NovaData := VelhaData;
Ano2000 := DatetoStr(NovaData);
end;
Como mover
o conteúdo da calculadora do Windows para um Edit? (delphi 3)
Neste exemplo deve ser incluído um componente Timer.
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
private
Hour, Minute, Second: Word; {hora corrente}
XCenter, YCenter, Radius: Integer; {tamanho atual do formulário}
public
procedure DrawHand (XCenter, YCenter, Radius,
BackRadius: Integer; Angle: Real);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Evento OnTimer do componente Timer
procedure TForm1.Timer1Timer(Sender: TObject);
var
HSec: Word; {valor temporário, não utilizado}
begin
{obtém a hora do sistema}
DecodeTime (Time, Hour, Minute, Second, HSec);
Refresh;
end;
// Evento OnPaint do componente Form
procedure TForm1.FormPaint(Sender: TObject);
var
Angle: Real;
I, X, Y, Size: Integer;
begin
{calcula o centro do formulário}
XCenter := ClientWidth div 2;
YCenter := ClientHeight div 2;
if XCenter > YCenter then
Radius := YCenter - 10
else
Radius := XCenter - 10;
{0. Desenha o marcador de horas}
Canvas.Pen.Color := clYellow;
Canvas.Brush.Color := clYellow;
Size := Radius div 50 + 1;
for I := 0 to 11 do
begin
Angle := 2 * Pi * I / 12;
X := XCenter - Round (Radius * Cos (Angle));
Y := YCenter - Round (Radius * Sin (Angle));
Canvas.Ellipse (X - Size, Y - Size, X +
Size, Y + Size);
end;
{1. Desenha o ponteiro dos minutos}
Canvas.Pen.Width := 2;
Canvas.Pen.Color := clBlue;
Angle := 2 * Pi * Minute / 60;
DrawHand (XCenter, YCenter, Radius * 90 div 100, 0, Angle);
{2. Desenha o ponteiro das horas: percentual dos minutos adicionado
à hora para mover o ponteiro suavemente}
Angle := 2 * Pi * (Hour + Minute / 60) / 12;
DrawHand (XCenter, YCenter,
Radius * 70 div 100, 0, Angle);
{3. Desenha o ponteiro dos segundos}
Canvas.Pen.Width := 1;
Canvas.Pen.Color := clRed;
Angle := 2 * Pi * Second / 60;
DrawHand (XCenter, YCenter, Radius,
Radius * 30 div 100, Angle);
end;
procedure TForm1.DrawHand (XCenter, YCenter,
Radius, BackRadius: Integer; Angle: Real);
begin
Angle := (Angle + 3*Pi/2);
Canvas.MoveTo (
XCenter - Round (BackRadius * Cos (Angle)),
YCenter - Round (BackRadius * Sin (Angle)));
Canvas.LineTo (
XCenter + Round (Radius * Cos (Angle)),
YCenter + Round (Radius * Sin (Angle)));
end;
// Evento OnCreate do Form
procedure TForm1.FormCreate(Sender: TObject);
begin
{lê as horas antes do formulário ser exibido}
Timer1Timer (self);
end;
// Evento OnResize do Form
procedure TForm1.FormResize(Sender: TObject);
begin
Refresh;
end;
Abrir e fechar o drive de CD-ROM

Inclua na seção uses: MMSystem
{ Para abrir }
mciSendString('Set cdaudio door open wait', nil, 0, handle);
{ Para fechar }
mciSendString('Set cdaudio door closed wait', nil, 0, handle);
Veja como criar um
contador de página para um relatório desenvolvido
no QuickReport 2.0 (delphi 3)

var
Form1: TForm1;
i : integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
i := 0 ;
QuickRep1.Prepare;
QrLabel2.Caption := IntToStr(i);
QuickRep1.Preview;
end;
procedure TForm1.QuickRep1StartPage(Sender: TQuickRep);
begin
i := i + 1;
Form2.Label1.caption := IntToStr(i);
end;
Veja como alterar a data e
hora do sistema (delphi 3)

procedure TForm1.Button1Click(Sender: TObject);
begin
SetNewTime(1998,2,10,18,07);
end;
function SetNewTime(Ano, Mes, Dia, hour, minutes: word):
Boolean;
var
st:TSYSTEMTIME;
begin
GetLocalTime(st);
st.wYear := Ano;
st.wMonth := Mes;
st.wDay := Dia;
st.wHour := hour;
st.wMinute := minutes;
if not SetLocalTime(st) then
Result := False
else
Result := True;
end;
Desligar/Ligar
monitor

Inclua na seção uses: Windows
No Win95 podemos desligar o monitor afim de economizar
energia elétrica. Normalmente este recurso é controlado pelo
próprio Windows. Porém sua aplicação Delphi também 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 segundos }
SendMessage(Application.Handle, WM_SYSCOMMAND,
SC_MONITORPOWER, -1);
Observações
Este recurso pode não funcionar dependendo da configuração do sistema.
Veja como jogar uma
imagem direto para um campo da tabela.(delphi 3)

procedure TForm1.Button1Click(Sender: TObject);
var
BMP: TBitMap;
begin
BMP := TBitMap.Create;
if OpenPictureDialog1.Execute then
begin
if Table1.State in [dsInsert, dsEdit] then
begin
BMP.LoadFromFile(OpenPictureDialog1.FileName);
Table1Graphic.Assign( BMP );
end;
end
end;
Como adquirir a data e hora de um arquivo. (delphi 3)

function GetFileDate(Arquivo: String): String;
var
FHandle: integer;
begin
FHandle := FileOpen(Arquivo, 0);
try
Result :=
DateTimeToStr(FileDateToDateTime(FileGetDate(FHandle)));
finally
FileClose(FHandle);
end;
end;
Writeln - imprimindo em
coluna (delphi 3)

procedure TForm1.Button1Click(Sender:
TObject);
var Texto1 : string;
F : TextFile;
Valor : Extended;
t : Integer;
begin
AssignFile(F,/LPT2');
Rewrite(F);
T := 21; { Tamanho total da string, que deverá ser impresso }
Texto1 := RAMOS DA;
Valor := 1.00;
Writeln(F,Format(%s%+IntToStr(T-Length(Texto1))+s%8.2f,
[Texto1, ,Valor])+
Fim da linha);
Texto1 := RAMOS DA INFORM;
Valor := 100.21;
Writeln(F,Format(%s%+IntToStr(T-Length(Texto1))+s%8.2f,
[Texto1, ,Valor])+Fim da linha);
Texto1 := RAMOS;
Valor := 1000.10;
Writeln(F,Format(%s%+IntToStr(T-Length(Texto1))+s%8.2f,
[Texto1, ,Valor])+Fim da linha);
Writeln(F,#12); // Ejeta a página
CloseFile(F);
end;
Mostrar uma mensagem durante um processamento

- 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 := 'Processamento demorado...';
Form.Show;
for I := 1 to 5 do begin
Form.UpDate;
Sleep(1000); { Aguarda um segundo }
end;
finally
Form.Free;
end;
end;
Observações:
A função Sleep é uma API do Windows e serve para paralisar a aplicação por um
determinado tempo. Este tempo é em
milisegundos.
Como selecionar uma impressora no QuickReport 2.0i(delphi 3)

procedure TForm1.Button1Click(Sender: TObject);
begin
QuickRep1.Prepare;
QuickRep1.PrinterSetup;
QuickRep1.Print;
end;
Veja como carregar um cursor
animado em sua aplicação.(delphi 3)

procedure TForm1.Button3Click(Sender: TObject);
const
NovoCursor = 1;
begin
Screen.Cursors[ NovoCursor ] :=
LoadCursorFromFile(c:\windows\cursors\
globe.ani );
Cursor := NovoCursor;
end;
OBS. Para descarregar o cursor animado troque a string
c:\windows\cursors\globe.ani por OCR_NORMAL.
Como definir seu próprio hotkey (Tecla Quente) ( delphi 3)

Primeiro fixe a propriedade KeyPreview do Form para TRUE
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (chr(Key) in [A, a]) then
ShowMessage(Ctrl-A);
end;
Veja abaixo como criar um alias dinamicamente na memória (delphi 3)

procedure TForm1.FormCreate(Sender: TObject);
begin
if not Session.IsAlias(Teste) then
session.AddStandardAlias(Teste,
ExtractFilePath(Application.ExeName),PARADOX);
end;
Obter o endereço
IP do Dial-Up

Inclua na seção uses: WinSock
{ Esta função retorna o endereço IP do Dial-Up. }
function GetLocalIP : string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^[I] <> nil do begin
result:=StrPas(inet_ntoa(pptr^[I]^));
result := StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanup;
end;
Observações:
Se o endereço IP for designado pelo servidor, a cada conexão teremos um endereço IP
diferente e, obviamente, se
não estivermos conectados, não conseguiremos obtê-lo.
SAINDO DO WINDOWS
{ Reinicia o Windows }

ExitWindowsEx(EWX_REBOOT, 0);
{ Desliga o Windows }
ExitWindowsEx(EWX_SHUTDOWN, 0);
{ Força todos os programa a desligarem-se }
ExitWindowsEx(EWX_FORCE, 0);
TOCANDO
SONS *.WAV (delphi3)

Para reproduzir sons no formato WAV em um programa em Delphi é simples, o
usuário deverá colocar na cláusula Uses o MMSystem. E no corpo do programa o comando:
SndPlaySound('C:\Windows\Media\Som.wav',SND_ASYNC);
{ No Delphi 2.0 use a função PLAYSOUND }
COMO FAZER PARA O PROGRAMA
FUNCIONAR EM REDE? (delphi 3)

Não são necessárias grandes mudanças no Delphi e no projeto para
este funcione em rede. No BDE, selecione o drive Paradox, no parâmetro NET DIR informe o
caminho onde está a sua base de dados. Não esqueça que,
se estiver usando Alias este também deve ser apontado para o drive da rede onde estão os
dados. E por último o parâmetro LOCAL SHARE tem que estar configurado para TRUE na
orelha System.
Bloquear um Arquivo em ambiente de rede é uma dica simples mais importante
! (delphi 3)

Quando você programar visando uma rede e quiser bloquear um arquivo é so chamar o
método "edit" da Tabela que estiver usando. ex: Table1.edit;
obs: Se o registro jah estiver bloqueado ocorrerah um erro, então você deve fazer o
seguinte:
try { para verificar o erro }
Table1.edit;
exception on TDBEngineError do { o erro..}
MensageDlg('Registro ja esta sendo usado...!',mtInformation,[ mbOk ],0 );
end;
O QUE SIGNIFICA "KEY
VIOLATION"?(delph3)

Este erro é muito comum, principalmente quando estamos começando a
utilizar o bando de dados Paradox do Delphi. Quando criamos um campo chave (o que vai com
um *) em uma tabela significa que este campo será o
principal - como um código. ELE NÃO PODE TER DOIS REGISTROS COM VALORES IGUAIS. Quando o
programa tenta cadastrar dois registros com valores iguais aparece a mensagem "Key
Violation". Para
arrumar o problema basta entrar o database desktop e ao restruturar a tabela re-criar os
índices.
LENDO O VOLUME DO HD (delphi 3)

Function ExtractDiskSerial(Drive:String):String;
Var Serial:DWord;
DirLen,Flags: DWord;
DLabel : Array[0..11] of Char;
begin
GetVolumeInformation(PChar(Drive+':\'),dLabel,12,@Serial,DirLen,Flags,nil,0);
Result := IntToHex(Serial,8);
end;
como abrir um banco de dados estilo Access(.mdb) (delphi 2.0)

PASSOS:
1. Va no painel de controle e entre em ODBC;
2. Clique em Adicionar e escolha o drive do Microsoft Access e escolha OK;
3. De um nome para a fonte de dados(o q vc quizer), na caixa 'Banco de Dados'
escolha "Selecionar...", e selecione o banco de dados a ser aberto, clique em
OK;
4. Saia da fonte de dados e abra o "BDE Configuration";
5. Na guia "Driver" clique em "New ODBC Driver", de um nome a ele,
deixe a opção "Default ODBC Driver" para Access e "Default Data Source
Name" para o nome do driver de ODBC que vc criou no painel de controle, clique
em OK;
6. Na guia "Alias" clique em "New Alias", de um nome a ele, e
selecione o "Alias type" para o que vc criou no passo 5, clique em OK;
7. Agora salve indo em File|Save e feche o "BDE Configuration";
8. Agora é hora de entrar no seu projeto e fazer o acesso aos dados:
8.1. Coloque um componente TDatabase, de a ele um nome, e defina a propriedade
"Alias Name" para o nome do alias que vc deu no passo 6;
8.2. Coloque um componente TQuery, de a ele um nome, e defina a propriedade
"DatabaseName" para o nome que voce deu ao o componente TDatabase;
8.3. Coloque um componente TDataSource, de a ele um nome, e defina a propriedade
"DataSet" para o nome que você deu ao componente TQuery;
9. Pronto agora configure como você quizer as outras opções e explore ao máximo seu
banco de dados!
BORLAND DELPHI 5.0 ENTERPRISE DICAS

EVENTOS
Os programas feito em Delphi são orientados a
enventos. Um evento nada mais é do que uma ação que foi gerada pelo usuário.
Clicar com o mouse ou pressionar uma tecla são exemplos de eventos.
Confira na lista abaixo alguns dos eventos mais
usados no delphi:
OnClick: Ocorre quando o usuário dá um clique sobre
o objeto.
OnDblClik: Ocorre quando o usuário dá um duplo clique sobre o objeto
OnKeyDown: Ocorre quando o usuário pressiona uma tecla enquanto está
selecionado
OnKeyUp: Ocorre quando o usuário solta uma tecla enquanto o objeto está
selecionado
OnKeyPress: Ocorre quando o usuário pressiona uma tecla.
OnMouseDown: Ocorre quando o usuário pressiona um botão do mouse
OnMouseUp: Ocorre quando o usuário solta o botão do mouse.
OnMouseMove: Ocorre quando o usuário move o ponteiro do mouse
PROPRIEDADES
As propriedades são as características dos
objetos como, por exemplo, cor, tamanho, nome, largura, entre outras.
Estas propriedades podem ser alteradas de
acordo com a necessidade do programador. Para alterar uma propriedade basta clicar na
caixa de propriedades, conhecida como Object Inspector, e
alterar a propriedade desejada. Uma outra forma de alterar propriedades é atraves de
códigos de programação que devem seguir a sintaxe:
<nome-do-objeto>.<propriedade>:= <valor>;
MÉTODOS
São procedimentos ou funções embutidas nos
componentes e formulários previamente definidas pelo Delphi. Veja métodos do Delphi e
sua respectiva função:
Show: Mostra um formulário
Hide: Esconde um formulário
Print: Imprime um objeto
SetFocus: Torna ativo um determinado formulário ou componente
Close: Permite fechar o formulário ou tabela.
FUNÇÕES
Uma função em Delphi,
seja ela pertencente à própria linguagem ou desenvolvida pelo usuário, é como
uma função matemática. Ela opera através de valores que são inseridos como
parâmentros (se houver algum) e devolvem um novo valor.
Cofira abaixo alguns exemplos de
funções do Delphi.
IntToStr- Converte um valor inteiro para string.
FloatToStr- Converte um valor real para string
DayOfWeek- Retorna um número referente ao dia da semana. Exemplo: o dia
da semana Domingo retorna o valor 0.
Date- Retorna a data do sistema
Time- Retorna a hora do sistema
DatetoStr- Converte uma data para string
TimeToStr- Converte um tipo no formato hora para string
FRAMES
O Frame é um recipiente
de objetos. Os Frames são muito parecidos com os templates de componentes da versão 4,
porém possuem uma forma visual mais organizada.
Além disso, os componentes
inserido em um Frame não podem ser arrastados para fora do mesmo.
Para criar um novo Frame,
você clique no Menu File e escolha a opção New Frame.
ASSISTENTES
Novos assistentes permitem que você crie
rapidamente o ambiente de desenvolvimento necessário em sua aplicação. Na versão 5, os
assistentes são muito úteis para ajudá-lo a desenvolver aplicativos para a Internet,
incluindo suporte a ASP, HTML 4 e XML.
FERRAMENTAS INTERNACIONAIS
Essas novas Ferramentas possibilitam
traduzir todas as mensagens de um programa, inclusive a dos captions, para outro
idioma. Isto é feito através de bibliotecas que você pode criar para agilizar o
desenvolvimento, uma vez que não será criar uma aplicação diferente para cada idioma.
BANCO DE DADOS
Até versão 4, o acesso a base de dados era
feita através do Borland Database Engine (BDE). Nesta nova versão, além de acessar
bases de dados utilizando o BDE, você poderá utilizar o ActiveX Data Objects
(ADO).
A ADO é a interface criada pela Microsoft para
acessar todos os tipos de dados. Trata-se de uma versão sofisticada do ODBC (Open
Database Conectivity).
Os novos componentes para utilizar a tecnologia ADO
são os seguintes:
TADODataSet, TADOTable, TADOQuery, TADOStoredProc, TADOConnection e o TADOCommand.
DATA MODULE
Outra ferramenta incorporada à nova versão é o
Data Module Designer. Ela permite a criação e manutenção de data module. O DataModule
é um repositor de objetos. No Delphi 5, ele possui uma área da visualização
hierárquica dos componentes de acesso a dados e um diagrama de dados, possibilitando a
criação de relacionamentos de uma maneira bem simples.
Para colocar um DataModule, clique no menu File,
selecione a opção New em Data Module.
INTERBASE EXPRESS
O Delphi 5 vem com o Interbase Express
(IBX). Ele possibilita o acesso à bases de dados Interbase sem a utilização do
BDE.
Os novos componentes que estão na guia Iterbase são
os seguintes:
TIBTable, TIBQuery, TIBStoredProc, TIBDatabase, TIBTransaction, TIBUpdateSQL, TIBSQL,
TIBDatabaseInfo, TIBSQLMonitor, TIBDataSet e TIBEvents.
ACTIVE X
O Delphi 5 traz uma guia com dezenas
de objetos Active X que permitem uma conexão completa com os aplicativos do Office.
Se você precisar que o seu aplicativo abra uma
planilha do Excel ou uma apresentação do PowerPoint, poderá fazer de uma forma simples
sem precisar usar a conexão via objeto OLE.
Controle
o Registro do Windows usando o
Delphi
Por: Leandro Calçada

|
Usando o Registro é possível
definir desde o papel de parede do sistema, até a velocidade de
abertura dos menus.
Personalizar o Windows é alterar o seu
Registro. Desde a versão 3 do Windows existe o sistema de
Registro, criado para armazenar as configurações do sistema, mas
foi só a partir do Windows 95 que este método passou a ter
importância efetiva na forma como o Windows se comporta. Usando o
Registro é possível definir desde o papel de parede do sistema,
até a velocidade de abertura dos menus. Muitas aplicações da
Microsoft e de outros produtores utilizam este sistema para
armazenar suas configurações, uma vez que o Registro foi
implementado para substituir os arquivos INI, que eram a forma
padrão de se armazenar configurações nas versões anteriores do
Windows.
O tipo TRegistry
O tipo TRegistry está contido na unit
Registry, e permite que programas escritos em Delphi 2 ou superior
tenham acesso ao Registro do Windows. Este objeto tem apenas
quatro propriedades, e todas elas têm importância fundamental em
seu uso. Estas propriedades são:
RootKey - Define qual a chave
raiz a ser editada. Existem diversas chaves raiz que podem ser
consultadas a partir do utilitário RegEdit, contido no próprio
Windows. O valor padrão desta propriedade é HKEY_CURRENT_USER;
LazyWrite - Propriedade booleana que em seu valor
padrão (True), permite que o método CloseKey do TRegistry
retorne antes do valor ter sido efetivamente gravado no registro,
possibilitando à apliação alterar muitas chaves de Registro sem
degradação da performance. Deve ser alterada para False quando
for absolutamente necessário, pois a função CloseKey só
retornará quando o valor tiver sido efetivamente gravado no
Registro, consumindo mais recursos do sistema;
CurrentKey - Armazena um valor do tipo HKEY,
contendo a chave aberta no momento. Esta propriedade é
normalmente usada para consulta, uma vez que todas as operações
efetuadas com o TRegistry afetam apenas a chave aberta;
CurrentPath - Armazena um String contendo o caminho
completo, à partir da chave raiz, até a chave aberta no momento.
Também é normalmente usada para consulta.
Para ler e alterar efetivamente as chaves de
Registro, o TRegistry traz uma série de métodos, dos quais serão
apresentados os mais importantes. Eles são:
Create - Cria o objeto
TRegistry. Este método é necessário, uma vez que o TRegistry não
é um objeto visual;
Free - Fecha o objeto TRegistry e libera a memória
alocada por ele. Deve ser utilizado quando o objeto TRegistry não
for mais necessário;
OpenKey - Abre ou cria uma chave, dependendo de seus
parâmetros. Para criar uma chave, também pode ser usado o método
CreateKey;
CloseKey - Fecha a chave aberta e grava as alterações
executadas, caso tenham sido feitas. O tempo de retorno deste método
depende da propriedade LazyWrite, já citada;
DeleteKey - Apaga uma chave de Registro e todos os
valores associados à ela. No Windows 95, subchaves armazenadas
nela também serão apagadas. No Windows NT, uma chave de Registro
só pode ser apagada quando todas as suas subchaves tiverem sido
apagadas;
KeyExists - Confirma a existência da chave de
registro especificada;
GetValueNames - Retorna uma lista com todos os nomes
dos valores armazenados na chave atual, para que possam ser lidos
ou alterados;
DeleteValue - Apaga um valor da chave atual, a
partir de seu nome;
ReadString - Lê um valor especificado da chave
atual como String. O método equivalente para gravar o valor é
WriteString;
ReadInteger - Lê um valor especificado da chave
atual como Integer. O método equivalente para gravar o valor é
WriteInteger;
ReadBool - Lê um valor especificado da chave atual
como Boolean. O método equivalente para gravar o valor é
WriteBool;
Outros valores podem ser lidos e gravados no Registro. Consulte no
Help do Delphi os métodos ReadDate, ReadDateTime, ReadCurrency e
ReadFloat.
Na prática, ler e alterar chaves de
Registro é mais fácil do que pode parecer: O exemplo a seguir
mostra como ler e alterar a página inicial do Internet Explorer
utilizando o TRegistry:
var
MyReg := TRegistry;
StartPage : String;
begin
MyReg := TRegistry.Create;
{Abre a chave HKEY_CURRENT_USER\Software\Microsoft\Internet
Explorer\Main}
MyReg.OpenKey('Software\Microsoft\Internet Explorer\Main',False);
{Lê a página inicial do Internet Explorer a partir do valor
Start Page}
StartPage := MyReg.ReadString('Start Page');
{Grava uma nova página inicial para o Internet Explorer}
StartPage := 'http://www.europanet.com.br/
MyReg.WriteString('Start Page',StartPage);
{Destrói o objeto TRegistry, pois ele não é mais necessário}
MyReg.Free;
end;
Para criar uma chave, basta trocar o valor
do último parâmetro da função OpenKey para True. Desta forma,
é possível criar uma nova chave de Registro e já abrí-la para
edição. A partir daí, basta gravar ou ler os valores com os métodos
Write ou Read correspondentes. Para completar, ainda há o objeto
TRegIniFile, que permite converter aplicações baseadas em
arquivos INI para aplicações baseadas no Registro com poucas
mudanças no código. Para conhecer melhor em quais chaves de
registro estão as configurações do Windows, pesquise no RegEdit
a chave HKEY_LOCAL_MACHINE\Software\Microsoft\Windows. Com as
chaves certas você certamente assumirá o controle do seu sistema
operacional.
|
Controle
os hints de sua aplicação Delphi

|
É fácil exibir hints com Delphi. Qualquer
controle visual possui uma propriedade Hint, onde deve ser escrito
o texto de ajuda que será exibido, e uma propriedade ShowHint,
que permite ligar ou desligar a exibição deste texto. Ao passar
o mouse sobre um controle nestas condições, um retângulo
amarelo contendo uma linha de texto é exibido por algum tempo e
depois desaparece. Simples e eficaz, mas comum.
O problema é que nem sempre queremos ou
precisamos da solução comum. Aquele retângulo amarelo muitas
vezes não se integra à interface do programa, ou não tem o
destaque necessário. A boa notícia é que os Hints escondem
características muito interessantes que permitem não só
customizá-lo, mas também melhorar muito seu método de ajuda ao
usuário. E ao contrário de muitas outras coisas que já foram
feitas aqui, customizar os hints não requer complicadas chamadas
de API nem a criação de complexas estruturas de dados. É só
conhecer melhor a forma como o Delphi lida com seus componentes.
Alterações básicas
As primeiras alterações e as mais fáceis
de fazer são a cor do Hint, o tempo de inatividade necessário
para que ele seja exibido, e o tempo que ele deve permanecer visível
se o usuário continuar sem mover o mouse. Estas três características
do Hint podem ser alteradas por propriedades no TApplication, a
partir de qualquer ponto do programa, e a partir daí o
comportamento de todos os Hints será alterado. Caso o objetivo
seja alterar todos os hints do programa desde o princípio,
adicione estas linhas de código no evento OnCreate do formulário
principal, ou mesmo diretamente no código do projeto, antes da
instrução Application.Run.
{Altera a cor do Hint}
Application.HintColor := clAqua;
{Altera a pausa para exibição do Hint}
Application.HintPause := 2000;
{Altera o tempo que o Hint fica visível}
Application.HintHidePause := 8000;
Textos de ajuda longos são outro problema.
Exibidos em apenas uma linha, formam um retângulo de Hint muito
longo e isso, além de não ser bonito, dificulta a leitura. Se o
usuário não precisar mais dos hints então, a facilidade de uso
converte-se facilmente em desastre. A resposta para este problema
também é simples: exibir hints em mais de uma linha. E isso é
mais fácil do que parece. É necessário apenas alterar a
propriedade Hint em tempo de execução e, adicionar os caracteres
ASCII 13 e 10 em cada ponto da string que deverá ter a quebra de
linha.
Button1.Hint := 'Ajuda longa
do'+#13+#10+'botão 1 para'+#13+#10+'quem não
sabe'+#13+#10+'mesmo como usá-lo.';
Agora, exibindo textos mais longos, por um
tempo configurável e com o fundo em qualquer cor, os hints
tornam-se uma ferramenta de auxílio bem mais poderosa, mas ainda
há mais por vir.
Ajudando melhor o usuário
Como já foi dito anteriormente, qualquer
controle visual possui as propriedade Hint e ShowHint. O que não
foi dito, é que há um componente não visual que também possui
estas propriedades: o TApplication.
É difícil imaginar o que um TApplication
faz com uma propriedade Hint já que, sendo um componente não
visual, não tem onde exibir hint algum. A propriedade ShowHint,
ao contrário do que é padrão para os outros componentes,
armazena inicialmente o valor True e caso seja alterada para
False, nenhum hint será exibido no programa, independente de
todos os outros componentes. É possível, assim, dar ao usuário
uma chance de configurar o programa, caso ele já saiba a função
de cada botão de cor e não deseje nenhuma ajuda.
A propriedade Hint, por outro lado, não é
alterada diretamente e, caso você faça isso, a operação
simplesmente não surtirá efeito. Para entender o porquê do
TApplication possuir uma propriedade Hint que não pode ser
alterada é preciso entender que o Hint é, na verdade, composto
de duas partes: um hint curto, exibido no retângulo que
discutimos até agora, e um hint longo, que pode ser exibido em
uma barra de status por exemplo, e que é enviado para a
propriedade Hint do TApplication. Para gerar o Hint dividido em
dois, basta inserir um caractere pipe ( | ) entre a primeira e a
segunda parte do hint. Este hint pode ser incluído tanto em tempo
de projeto quanto em tempo de execução.
Button1.Hint := 'Ajuda curta para o botão
1|Explicação mais detalhada sobre o botão 1';
Agora é preciso exibir o hint longo. Para
isso basta copiar o conteúdo da propriedade Hint do TApplication
para o Caption de algum componente visual. No caso atual,
escolhemos um TPanel que foi usado como barra de status. O
primeiro passo é declarar na seção private do formulário uma
procedure que receba um parâmetro Sender, do tipo TObject. Em
seguida, escreva a procedure na seção implementation e com o código
a seguir:
procedure TForm1.AppHint(Sender: TObject);
begin
Panel1.Caption := Application.Hint;
end;
É preciso atribuir esta procedure ao evento
OnHint do TApplication. Para garantir que isso seja feito, é
necessário incluí-la em um evento que seja executado no início
da aplicação, e o melhor evento que se enquadra neste caso é o
OnCreate do formulário principal.
Hints variados
Resta uma limitação. Todos os hints são
iguais. Tal característica, desejável em muitos projetos, pode
ser um problema para outros. Dependendo das cores da interface,
por exemplo, o hint de um botão pode precisar de uma cor
diferente, um texto mais longo pode precisar de um tempo de exibição
maior. Tudo depende da necessidade do programador. É possível
fazer tudo isso utilizando o evento OnShowHint do TApplication.
O evento OnShowHint do TApplication é
disparado imediatamente antes do hint ser exibido e recebe três
parâmetros:
- HintStr, contém uma string com o texto do
Hint curto;
- CanShow, um boolean que pode ser alterado para false e cancelar
a exibição do Hint;
- HintInfo, do tipo THintInfo, contendo várias informações
sobre o Hint, incluindo o controle que o disparou.
Como exemplo, vamos alterar a cor do hint de
um determinado controle. Para isso, é necessário declarar, na seção
private do formulário, uma procedure que receba os três parâmetros
que o evento OnShowHint requer e criá-la na seção
implementation. Feito isso, o código que deve ser incluído nesta
procedure deve se parecer com este:
With HintInfo do if HintControl = Button2
then
begin
HintColor := clLime;
end;
Note que a cor é alterada apenas se o
controle que disparou o hint for o Button2. Caso contrário, o
hint será exibido de acordo com as opções padrão. É possível
alterar, além da cor do Hint, o tempo que o mesmo ficará visível,
sua posição, o tempo de espera até que o hint seja exibido
novamente, se necessário, e é possível até mesmo manipular o
texto e a área que dispara o hint, permitindo que um mesmo
controle exiba vários hints, de acordo com a posição do cursor
do mouse sobre o controle (que também pode ser obtida através da
estrutura THintInfo). Enfim, se alguém falar que hint é aquele
retangulozinho amarelo que dá uma ajudinha pra quem não sabe
usar uma função do programa, você já sabe que ele não conhece
o Delphi tão bem assim. E lembre-se sempre que cada versão nova
de delphi costuma incrementar tanto os componentes visuais quanto
os não visuais, portanto é bom sempre consultar o help, mesmo
para aqueles objetos cujas propriedades você já sabe de cor.
|
Se você deseja publicar sua dica neste espaço, escreva-me:
jvpa@josevalter.com.br