Converter Path e nome de Arquivos longos para curtos 



procedure TForm1.Button1Click(Sender: TObject);
var
Buffer : array [0..255] of char;
begin
GetShortPathName('C:\Arquivos de programas\Borland\Common Files\BDE\Bde32.hlp',@Buffer,sizeof(Buffer));
Memo1.Lines.Add(Buffer);
end; 





 

 

Como verificar se o ano é Bisexto 





A função para verificar se o ano é bissexto é a IsLeapYear ( year : Word) : Boolean;
Que retornará TRUE se o ano informado no parâmetro for bissexto.




 


Impedir que o usuário mude de página no TabbedNotebook 





No evento OnChange do TabbedNotebook coloque :

AllowChange := False; 





 

 

Criar janela redonda 





No OnCreate do Form coloque

Var
Hr : Thandle;
Begin
{ Cria uma Região elíptica }
Hr := CreateEllipticRgn(0,0,100,200);
SetWindowRgn(Handle, hr, true);
End;





 

 

Detectar finalização do Windows 





Procedure TForm1.WMEndsession ( var Msg : TWMEndSession);
Begin
If Msg.Endsession = True then
Showmessage('O windows está finalizando ' + #13 + 'às' + Formatdatetime('c',Now);
Inherited;
End;





 

 

Exibir ano com 4 Dígitos 





No evento OnCreate do Formulário Principal coloque a clásula

SHORTDATEFORMAT:= 'dd/mm/yyyy'; 




 

 

Listar todas as janelas abertas 





Para listar todas janelas abertas, deve-se usar a funcao da API EnumWindows, que usa uma funcao Callback, com
dois parâmetros, um Handle para a janela e um ponteiro. Voce pode usá-la com um código semelhante a este (Este
lista as janelas abertas, mesmo invisíveis, em uma listbox): 

function EnumWindowsProc(Wnd : HWnd;Form : TForm1) : Boolean; Export; {$ifdef Win32} StdCall; {$endif} 
var 
Buffer : Array[0..99] of char; 
begin 
GetWindowText(Wnd,Buffer,100); 
if StrLen(Buffer) <> 0 then 
Form.ListBox1.Items.Add(StrPas(Buffer)); 
Result := True; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
EnumWindows(@EnumWindowsProc,LongInt(Self)); 
end; 




 


Alterar Fonte do Hint 





Para testar este exemplo inclua no seu form alguns componentes. Nestes componentes coloque informações na
propriedade Hint de cada componente e altere a propriedade ShowHint para True.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure MyShowHint(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

// Função que irá alterar a fonte do Hint
procedure TForm1.MyShowHint(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
var i : integer;
begin
for i := 0 to Application.ComponentCount - 1 do
if Application.Components[i] is THintWindow then
with THintWindow(Application.Components[i]).Canvas do
begin
Font.Name := 'Arial';
Font.Size := 18;
Font.Style := [fsBold];
HintInfo.HintColor := clWhite;
end;
end;

// Evento OnCreate do Form
procedure TForm1.FormCreate(Sender: TObject);
begin
// Ativa a função que irá alterar o formato do Hint
Application.OnShowHint := MyShowHint;
end; 





 

 

Mostrar Hint independente para cada célula da Stringgrid 




Para testar o exemplo abaixo inclua no seu form um componente StringGrid

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
Col : integer; // Declarar esta variável
Row : integer; // Declarar esta variável
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

// Evento OnCreate do Form
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Hint := '0 0';
StringGrid1.ShowHint := True;
end;

// Evento OnMouseMove do componente StringGrid
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
r : integer;
c : integer;
begin
StringGrid1.MouseToCell(X, Y, C, R);
if ((Row <> r) or (Col <> c)) then
begin
Row := r; Col := c;
Application.CancelHint;
StringGrid1.Hint := 'Linha: '+IntToStr(r) + #32 + 'Coluna: '+IntToStr(c);
end;
end; 




 


Arrastar Form sem clicar na Barra de Título 





private
{ Private declarations }
procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM} 

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited; { Chama o manipulador de mensagem herdado }
if M.Result = htClient then { Verifica se está na area cliente do Form }
M.Result := htCaption; { Neste caso faz o Windows pensar que está na barra de Título. }
end; 





 

 

 

Escrevendo texto na Diagonal 





procedure TForm1.Button2Click(Sender: TObject);
var
lf : TLogFont;
tf : TFont;
begin
with Form1.Canvas do
begin
Font.Name := 'Arial';
Font.Size := 15;
tf := TFont.Create;
tf.Assign(Font);
GetObject(tf.Handle, sizeof(lf), @lf);
lf.lfEscapement := 300;
lf.lfOrientation := 300;
tf.Handle := CreateFontIndirect(lf);
Font.Assign(tf);
tf.Free;
TextOut(20, Height div 2,'Exemplo de texto');
end;
end; 





 

 

Fazendo o Enter funcionar como Tab 





Para dar ao Enter a funcionalidade do Tab (ou seja, passar ao componente seguinte), digite a seguinte rotina no
evento OnKeyPress do form: 

procedure TNomeDoForm.NomeDoFormKeyPress(Sender: TObject; var Key: Char); 
begin 
if key = #13 then 
begin 
key := #0; 
perform (WM_NextDlgCtl, 0, 0); 
end; 
end; 

Em seguida coloque a propriedade KeyPriview do Form = TRUE e certifique-se que todos os botões do Form
estejam com a propriedade Default = FALSE.





 

 

Criar tela Splash 





Para criar um form inicial, como o form de entrada do Word, primeiramente vá em Project|Options e remova o nome
do form inicial (clique no nome do form e clique em ">"). Depois, vá em View|Project Source e antes do primeiro
Application.CreateForm (NomeDoForm...), digite: 
frmSplash := TfrmSplash.Create (Application); 
frmSplash.Show; 
frmSplash.Update; 

E para remover o form da memória, digite após o último CreateForm: 

frmSplash.Free; 

Nota: não se esqueça de alterar a propriedade BorderStyle para bsNone, e Position para poScreenCenter



 


 

 

Alterando Fonte de determinado registro no DBGrid 





Para trocar a fonte de um DBGrid, utilize a rotina abaixo no evento OnDrawDataCell: 

if Tabela.FieldByName ('Salario').Value >= 10000 then 
begin 
DbGrid1.Canvas.Font.Color := clRed; 
DbGrid1.Canvas.Font.Style := [fsBold]; 
end; 
DbGrid1.DefaultDrawDataCell(Rect, Field, State); 

No caso, somente os registros com salário maior que R$ 10.000,00 ficarão com cor vermelha e em negrito. 

Nota: Não é necessário mover o ponteiro da tabela para colorir os registros. 





 

 

Trocar ponto por Vírgula 





A maioria dos teclados possui apenas o ponto no teclado numérico. Mas se você precisar utilizar a vírgula como
separador decimal, utilize a seguinte rotina no evento OnKeyPress do Edit: (lembre-se que DecimalSeparator
contém o separador decimal (que não necessariamente está em português). Veja em Internacional no Painel de
Controle). 
begin 
if key = '.' then 
key:= DecimalSeparator; 
end; 





 

 

 

Descobrir posição do cursor em um Memo 





Para descobrir a linha e a coluna atuais de um componente TMemo, utilize a seguinte procedure:

with Memo do 
begin 
Linha := Perform (EM_LINEFROMCHAR, SelStart, 0); 
Coluna := SelStart - Perform (EM_LINEINDEX, Line, 0); 
end; 





 

 

Limpar todos os Edits de um Form 





Para limpar todos os Edits de um form, use a seguinte rotina: 

procedure TNomeDoForm.NomeDoBotaoClick(Sender: TObject); 
var 
I : integer; 
begin 
for I := 0 to ComponentCount - 1 do 
if (Components [I] is TEdit) then 
(Components [I] as TEdit).Clear; 
end; 


Para fazer qualquer operação em outro tipo de objeto, é só trocar TEdit pelo tipo de componente que você quer
manipular. 




 


Trocar cursor do mouse 





Existem vários cursores no Delphi (crDefault é o cursor padrão, crHourGlass é a ampulheta, crHandPoint é a
"mãozinha", etc). Para alterá-lo, basta escolher um na propriedade Cursor do componente em que você quer
mudar o cursor (troque no form para trocar o do form inteiro). Mas, se você quiser colocar um cursor diferente,
siga os procedimentos abaixo: 
Na seção interface da unit que contém o form, coloque as seguintes linhas: 

const 
crSeuCursor = 1; // Tem que ser um valor maior que 0 (zero) 

No evento OnCreate do form, digite as seguintes linhas: 

Screen.Cursors [crSeuCursor] := LoadCursorFromFile ('Cursor.ani'); 
// O cursor pode ser dos tipos comum (*.cur) ou animado (*.ani) 
// Lembre-se: o arquivo tem que estar na mesma pasta do programa 
// ou digite o nome do caminho dele. 

Na hora de trocar de cursor, use o seguinte comando: 

Objeto.Cursor := crSeuCursor; 

onde Objeto é o nome do objeto que vai ter o cursor alterado (o form, por exemplo). 





 

 

 

Extrair primeiro nome de uma pessoa 





Para pegar o primeiro nome de uma pessoa, crie a seguinte função: 

function PrimeiroNome (Nome : String) : String; 
var 
PNome : String; 
begin 
PNome := ''; 
if pos (' ', Nome) <> 0 then 
PNome := copy (Nome, 1, pos (' ', Nome) - 1); 
Result := PNome; 
end; 





 

 

Descobrir qual Ícone foi selecionado no List View 





Indice := ListView.Selected.Index; 

Lembre-se que o primeiro item possui índice igual a 0 (zero), o segundo vale 1, etc. Se quiser descobrir o rótulo (o
texto que fica abaixo do ícone), troque Index por Caption, assim: 

Rotulo := ListView.Selected.Caption; 





 

 

Criar atalho no Desktop 





Coloque essas units na seção implementation : 

uses ShlObj, ActiveX,ComObj, Registry; 
Por último, crie uma procedure que faça o trabalho: 
procedure CreateShortcut (FileName, Parameters, InitialDir, ShortcutName, ShortcutFolder : String); 
var 
MyObject : IUnknown; 
MySLink : IShellLink; 
MyPFile : IPersistFile; 
Directory : String; 
WFileName : WideString; 
MyReg : TRegIniFile; 
begin 
MyObject := CreateComObject(CLSID_ShellLink); 
MySLink := MyObject as IShellLink; 
MyPFile := MyObject as IPersistFile; 
with MySLink do 
begin 
SetArguments(Parameters); 
SetPath(PChar(FileName)); 
SetWorkingDirectory(PChar(InitialDir)); 
end; 
MyReg := TRegIniFile.Create('Software\MicroSoft\Windows\CurrentVersion\Explorer'); 
Directory := MyReg.ReadString ('Shell Folders','Desktop',''); 
WFileName := Directory + '\' + ShortcutName + '.lnk'; 
MyPFile.Save (PWChar (WFileName), False); 
MyReg.Free; 
end;





 

 

Criar atalho no menu Iniciar 





Para criar um atalho para um programa, primeiramente coloque essas units na seção implementation de seu form: 
uses ShlObj, ActiveX, ComObj, Registry; 

Por último, crie uma procedure que faça o trabalho: 

procedure CreateShortcut (FileName, Parameters, InitialDir, ShortcutName, ShortcutFolder : String); 
var 
MyObject : IUnknown; 
MySLink : IShellLink; 
MyPFile : IPersistFile; 
Directory : String; 
WFileName : WideString; 
MyReg : TRegIniFile; 
begin 
MyObject := CreateComObject(CLSID_ShellLink); 
MySLink := MyObject as IShellLink; 
MyPFile := MyObject as IPersistFile; 
with MySLink do 
begin 
SetArguments(Parameters); 
SetPath(PChar(FileName)); 
SetWorkingDirectory(PChar(InitialDir)); 
end; 
MyReg := TRegIniFile.Create ('Software\MicroSoft\Windows\CurrentVersion\Explorer'); 
Directory := MyReg.ReadString('Shell Folders','Start Menu','') + '\' + ShortcutFolder; 
CreateDir(Directory); 
WFileName := Directory + '\' + ShortcutName + '.lnk'; 
MyPFile.Save (PWChar (WFileName), False); 
MyReg.Free; 
end; 





 

 

Mudando texto do TEdit no OnChange 





Se o texto de um TEdit for mudado no seu evento OnChange, este evento será chamado recursivamente até
acabar com o espaço de pilha. Para fazer isso, deve-se setar o evento OnChange para NIL antes de mudar o texto,
voltando ao original depois, desta maneira:

procedure Edit1Change(Sender : TObject); 
begin 
Edit1.OnChange := NIL; 
if Edit1.Text = 'Texto' then 
Edit1.Text := 'Novo Texto'; 
Edit1.OnChange := Edit1Change; 
end;

Esta dica também vale para evento OnValidate. 





 

 

Encolhendo o executável 





Em Delphi 1.0, marcando a checkbox Optimize for size and load time, em Options/Project/Linker não funciona
(aparece uma mensagem de disco cheio, mesmo com muito espaço). Delphi 1.0 vem com um programa DOS,
W8LOSS, que faz o mesmo. Para usá-lo, deve-se teclar o seguinte:

W8LOSS programa.exe

Isto encolherá o executável em aproximadamente 20%, diminuindo o tempo de carga. 





 

 

Posicionando cursor na linha de um Memo ou Richedit 





Para posicionar o cursor em uma linha de um Memo ou RichEdit, deve-se utilizar o seguinte:

With Memo1 do 
SelStart := Perform(EM_LINEINDEX, Linha, 0); 





 

 

 

Escondendo janelas filhas minimizadas 



Para esconder janelas filhas minimizadas, basta capturar a mensagem WM_Size, desta maneira: 

type 
TForm1 = class(TForm) 
public 
procedure WMSize(var M : TWMSIZE);Message WM_Size; 
end; 

implementation 

procedure TForm1.WMSize(var M:TWMSIZE); 
begin 
if M.SizeType=Size_Minimized then 
showwindow(Handle,Sw_Hide); 
end; 





 

 

Executando operações padrão de um Ole Container 





Para executar ações padrão de um Ole Container (abrir um documento Word ou Excel ou rodar uma apresentação
Powerpoint), pode-se usar este código: 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
OleContainer1.DoVerb(ovprimary); 
end; 





 

 

Alinhar Itens do menu principal à direita 





Para alinhar itens do menu principal à direita, deve-se utilizar o seguinte código:


{Isto justifica todos itens à direita do selecionado} 

procedure SetJustify(Menu: TMenu; MenuItem: TMenuItem; Justify: Byte); 
{$IFDEF WIN32} 
var 
ItemInfo: TMenuItemInfo; 
Buffer: array[0..80] of Char; 
{$ENDIF} 
begin 
{$IFDEF VER80} 
MenuItem.Caption := Chr(8) + MenuItem.Caption; 
{$ELSE} 
ItemInfo.cbSize := SizeOf(TMenuItemInfo); 
ItemInfo.fMask := MIIM_TYPE; 
ItemInfo.dwTypeData := Buffer; 
ItemInfo.cch := SizeOf(Buffer); 
GetMenuItemInfo(Menu.Handle, MenuItem.Command, False, ItemInfo); 
if Justify = 1 then 
ItemInfo.fType := ItemInfo.fType or MFT_RIGHTJUSTIFY; 
SetMenuItemInfo(Menu.Handle, MenuItem.Command, False, ItemInfo); 
{$ENDIF} 
end; 




 


Usando JPG no Delphi 3 





Para colocar um arquivo qualquer dentro de um arquivo .exe, primeiramente crie um arquivo
com extensão .rc no Bloco de Notas. O formato de um arquivo .rc é o seguinte: 

1 RCDATA "MyPic.jpg" 

onde "1" é o índice do arquivo, "RCDATA" é significa que é um tipo de arquivo não-padrão (os
padrões são bitmaps, ícones e cursores) e ""MyPic.jpg"" é o nome do arquivo. Salve e execute o
programa BRCC32.EXE que fica no subdiretório Bin do Delphi (BRCC32 arquivo.rc). Será
criado um arquivo .res (arquivo.res) cujo conteúdo terá o próprio JPG. 

Nota: Você pode colocar mais de um arquivo no arquivo .res, desde que os índices sejam diferentes. 

Para colocá-lo no executável, coloque a linha: 

{$R arquivo.res} 

após a linha: 

{$R *.DFM} 

Ok, ele já vai ficar no executável. E como eu rodo esse JPG? Simples: 

procedure LoadJPEGfromEXE; 
var 
MyJPG : TJPEGImage; 
ResStream : TResourceStream; 
Index : Integer; 
begin 
Index := 1; 
try 
MyJPG := TJPEGImage.Create; 
ResStream := TResourceStream.CreateFromID (HInstance, Index,
RT_RCDATA); 
MyJPG.LoadFromStream (ResStream); 
Canvas.Draw (12, 12, MyJPG); 
finally 
MyJPG.Free; 
ResStream.Free; 
end; 
end; 

Troque o valor de Index pelo valor do índice que você criou para o arquivo que deseja abrir. 





 

 

Calculando feriado da Páscoa 





Para calcular o feriado da Páscoa, use a rotina abaixo: 

function CalcEaster : String; 
var 
B,D,E,Q : Integer; 
GF : String; 
begin 
B := 225 - 11 * (Year mod 19); 
D := ((B-21) mod 30) + 21; 
if D > 48 then 
Dec (D); 
E := (Year + (Year div 4) + D + 1) mod 7; 
Q := D + 7 - E; 
if Q < 32 then 
begin 
if ShortDateFormat [1] = 'd' then 
Result := IntToStr(Q) + '/3/' + IntToStr(Year) 
else 
Result := '3/' + IntToStr(Q) + '/' + IntToStr(Year); 
end 
else 
begin 
if ShortDateFormat [1] = 'd' then 
Result := IntToStr (Q - 31) + '/4/' + IntToStr(Year) 
else 
Result := '4/' + IntToStr (Q - 31) + '/' + IntToStr(Year); 
end; 

if Q < 32 then 
begin 
if ShortDateFormat [1] = 'd' then 
GF := IntToStr(Q-2) + '/3/' + IntToStr(Year) 
else 
GF := '3/' + IntToStr(Q-2) + '/' + IntToStr(Year); 
end 
else 
begin 
if ShortDateFormat [1] = 'd' then 
GF := IntToStr (Q - 31 - 2) + '/4/' + IntToStr(Year) 
else 
GF := '4/' + IntToStr (Q - 31 - 2) + '/' + IntToStr(Year); 
end; 
end; 





 

 

Extrair ícones de uma DLL ou de um EXE 





Para tirar um ícone de um arquivo .exe ou .dll, use a procedure abaixo (coloque a unit ShellAPI na cláusula Uses
da sua unit): 

procedure ExtrairIcone; 
var 
IconIndex : Word; 
h : hIcon; 
begin 
IconIndex := 0; 
h := ExtractAssociatedIcon (hInstance, 'C:\Windows\Notepad.exe',
IconIndex); 
DrawIcon (Form1.Canvas.Handle, 10, 10, h); 
end; 




 


Colocar monitor em estado de redução de energia 





//Para reduzir o consumo de energia do monitor, use o seguinte comando: 

SendMessage (Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0); 

//Para voltar ao normal: 

SendMessage (Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1); 





 

 

Acessar tabela Paradox em rede 





Para acessar bancos de dados Paradox em uma rede utilizando Windows, faça o seguinte: 

Abra o BDE Administrator; 
Na aba Configuration, escolha a "pasta" Drivers|Native|PARADOX e altere NetDir para o nome do servidor 
(no formato de rede :\\Servidor\Compartilhamento); 

Na "pasta" System|INIT, altere LocalShare para True; 
Altere o diretório do alias para o nome do servidor (também no formato de rede). 





 

 

Descobrir nome do usuário atual da Rede 





function NetUser : string; 
var 
szNetName: array [0..48] of char; 
iResult: DBIResult; 
begin 
iResult := DBIGetNetUserName (szNetName); 
if iResult <> DBIErr_None then 
DBIError (iResult) 
else 
Result := StrPas (szNetName); 
end; 

Não se esqueça de colocar cláusula Uses do form as units DBIProcs, DBITypes, DB e DBIErrs. 




 


Compartilhar Pastas 





var 
Erro : DWord; 
PServer, PSenha, PLetra : PChar; 
begin 
PServer := '\\NomeDaMaquina\Caminho' + #0; 
{ NomeDaMaquina é o nome da máquina } 
PLetra := 'Z:'; // Z: será a letra da pasta 
PSenha := ''; // Digite uma senha aqui, se quiser 
ERR := WNetAddConnection (PServer , PSenha , PLetra); 
case Erro of 
ERROR_ACCESS_DENIED : ShowMessage ('Acesso negado.'); 
ERROR_ALREADY_ASSIGNED : ShowMessage ('A letra do drive especificada
já está conectada.'); 
ERROR_BAD_DEV_TYPE : ShowMessage ('O tipo de dispositivo e o tipo de
recurso não são compatíveis.'); 
ERROR_BAD_DEVICE : ShowMessage ('Letra de unidade inválida.'); 
ERROR_BAD_NET_NAME : ShowMessage ('O nome da máquina não é válida ou
não pode ser localizada.' ); 
ERROR_BAD_PROFILE : ShowMessage ('Formato incorreto de parâmetros.');
ERROR_CANNOT_OPEN_PROFILE : ShowMessage ('Conexão permanente não
disponível.'); 
ERROR_DEVICE_ALREADY_REMEMBERED : ShowMessage ('Uma entrada para o
dispositivo especificado já está no perfil do usuário.'); 
ERROR_EXTENDED_ERROR : ShowMessage ('Erro de rede.'); 
ERROR_NO_NETWORK : ShowMessage ('A rede não está presente.'); 
else 
if Erro > 0 then 
ShowMessage ('Erro número ' + IntToStr (Erro) + '.'); 
end; 
end;


Home   1 - 2 - 3 - 4 - 5 - 6 Proxima   8 - - 10

                      fontesbrasil.com® Todos os direitos reservados.


Redirecinar:  http://www.fontesbrasil.com       Melhor visualização 800 x 600