Вы находитесь на странице: 1из 24

Codigo Fontes e Truques Ultilitrios para o Delphi 7

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 funo para verificar se o ano bissexto a IsLeapYear ( year : Word) : Boolean; Que retornar TRUE se o ano informado no parmetro for bissexto.

Impedir que o usurio mude de pgina no TabbedNotebook

No evento OnChange do TabbedNotebook coloque : AllowChange := False;

Criar janela redonda

No OnCreate do Form coloque Var Hr : Thandle; Begin { Cria uma Regio elptica } Hr := CreateEllipticRgn(0,0,100,200); SetWindowRgn(Handle, hr, true); End;

Detectar finalizao 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 Dgitos

No evento OnCreate do Formulrio Principal coloque a clsula 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 parmetros, um Handle para a janela e um ponteiro. Voce pode us-la com um cdigo semelhante a este (Este lista as janelas abertas, mesmo invisveis, 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 informaes 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} // Funo 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 funo que ir alterar o formato do Hint Application.OnShowHint := MyShowHint; end;

Mostrar Hint independente para cada clula 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 varivel Row : integer; // Declarar esta varivel 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 Ttulo

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 Ttulo. } 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 botes 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 memria, digite aps o ltimo CreateForm: frmSplash.Free; Nota: no se esquea 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 salrio maior que R$ 10.000,00 ficaro com cor vermelha e em negrito. Nota: No necessrio mover o ponteiro da tabela para colorir os registros.

Trocar ponto por Vrgula

A maioria dos teclados possui apenas o ponto no teclado numrico. Mas se voc precisar utilizar a vrgula como separador decimal, utilize a seguinte rotina no evento OnKeyPress do Edit: (lembre-se que DecimalSeparator contm o separador decimal (que no necessariamente est em portugus). Veja em Internacional no Painel de Controle). begin if key = '.' then key:= DecimalSeparator; end;

Descobrir posio 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 operao em outro tipo de objeto, s trocar TEdit pelo tipo de componente que voc quer manipular.

Trocar cursor do mouse

Existem vrios cursores no Delphi (crDefault o cursor padro, crHourGlass a ampulheta, crHandPoint a "mozinha", 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 seo interface da unit que contm 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 funo: 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 rtulo (o texto que fica abaixo do cone), troque Index por Caption, assim: Rotulo := ListView.Selected.Caption;

Criar atalho no Desktop

Coloque essas units na seo implementation : uses ShlObj, ActiveX,ComObj, Registry; Por ltimo, crie uma procedure que faa 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 seo implementation de seu form: uses ShlObj, ActiveX, ComObj, Registry; Por ltimo, crie uma procedure que faa 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 espao 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 tambm vale para evento OnValidate.

Encolhendo o executvel

Em Delphi 1.0, marcando a checkbox Optimize for size and load time, em Options/Project/Linker no funciona (aparece uma mensagem de disco cheio, mesmo com muito espao). 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 executvel 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 operaes padro de um Ole Container

Para executar aes padro de um Ole Container (abrir um documento Word ou Excel ou rodar uma apresentao Powerpoint), pode-se usar este cdigo: 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 cdigo: {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 extenso .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 nopadro (os padres so bitmaps, cones e cursores) e ""MyPic.jpg"" o nome do arquivo. Salve e execute o programa BRCC32.EXE que fica no subdiretrio Bin do Delphi (BRCC32 arquivo.rc). Ser criado um arquivo .res (arquivo.res) cujo contedo ter o prprio JPG. Nota: Voc pode colocar mais de um arquivo no arquivo .res, desde que os ndices sejam diferentes. Para coloc-lo no executvel, coloque a linha: {$R arquivo.res} aps a linha: {$R *.DFM} Ok, ele j vai ficar no executvel. 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 Pscoa

Para calcular o feriado da Pscoa, 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 clusula 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 reduo 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, faa 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 diretrio do alias para o nome do servidor (tambm no formato de rede).

Descobrir nome do usurio 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; No se esquea de colocar clusula 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 mquina } 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 no so compatveis.'); ERROR_BAD_DEVICE : ShowMessage ('Letra de unidade invlida.'); ERROR_BAD_NET_NAME : ShowMessage ('O nome da mquina no vlida ou no pode ser localizada.' ); ERROR_BAD_PROFILE : ShowMessage ('Formato incorreto de parmetros.'); ERROR_CANNOT_OPEN_PROFILE : ShowMessage ('Conexo permanente no disponvel.'); ERROR_DEVICE_ALREADY_REMEMBERED : ShowMessage ('Uma entrada para o dispositivo especificado j est no perfil do usurio.'); ERROR_EXTENDED_ERROR : ShowMessage ('Erro de rede.'); ERROR_NO_NETWORK : ShowMessage ('A rede no est presente.');

else if Erro > 0 then ShowMessage ('Erro nmero ' + IntToStr (Erro) + '.'); end; end;