Programação (Delphi):


BannerVisualBooks.gif (29196 bytes)
Compre livros de Programação de alta qualidade, tudo que você precisa em Delphi, VISITE, Visual Books!!

Apostila em PDF Banco de Dados - Baixe aqui

DICAS DE DELPHI PARTE II
Grande pacote de dicas de delphi - aproveite

Para vincular Executáveis Para emitir Mensagem na Saída ENVIANDO UM ARQUIVO PARA A  LIXEIRA UMA FUNÇÃO PARA O ANO 2000

Como mover o conteudo da calculadora do Windows para um Edit? (delphi 3)

 Abrir e fechar o drive de CD-ROM
Veja como criar um contador de página para um relatório desenvolvido no QuickReport 2.0 (delphi 3) Veja como alterar a data e hora do sistema
(delphi 3)

Desligar/Ligar monitor
Veja como jogar uma imagem direto para um campo da tabela.(delphi 3) Como adquirir a data e hora de um arquivo. (delphi 3)
Writeln - imprimindo em coluna (delphi 3)
Mostrar uma mensagem durante um processamento
Como selecionar uma impressora no QuickReport 2.0i
(delphi 3)
Veja como carregar um cursor animado em sua aplicação.
(delphi 3)

Como definir seu próprio hotkey (Tecla Quente)
( delphi 3)

Veja abaixo como criar um alias dinamicamente na memória (delphi 3)

Obter o endereço IP do Dial-Up

SAINDO DO WINDOWS

TOCANDO SONS *.WAV (delphi3)

COMO FAZER PARA O PROGRAMA FUNCIONAR EM REDE?
(delphi 3)

Bloquear um Arquivo em ambiente de rede é  uma dica simples mais importante !  (delph 3)

O QUE SIGNIFICA "KEY VIOLATION"?
(delph3)

Lendo o Volume do HD
(delphi 3)
Como abrir um banco de dados estilo Access(.mdb) (delphi 2.0) BORLAND DELPHI 5.0 ENTERPRISE DICAS

Controle o Registro do Windows usando o Delphi

Controle os hints de sua aplicação Delphi

       
       
 

Clube do Delphi
Componentes Gratuitos, Dicas, Suporte para Delphi, Informações, Jornal de Delphi..

Para vincular Executáveis:

    Ex.: CALCULADORA - Winexec ('c:\windows\calc.exe',sw_shownormal);

     

  Para emitir Mensagem na Saída:

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