Código
procedure WMDropFiles(var Msg: TMessage); message wm_DropFiles;
Eu descobri este recurso valioso quando procurava uma maneira mais rápida de pegar o caminho de arquivos, para uma aplicação multimídia que estou desenvolvendo. Ai voc não tem que ficar colocando OpenDialog(hehehe...) pra ficar abrindo arquivos, até porque a maioria dos usuários já conhecem esse recurso.
bom proveito!!
}
procedure TForm1.WMDropFiles(var Msg: TMessage);
var
I, FileCount, BufferSize: word;
Drop: HDROP;
FileName: string;
Pt: TPoint;
RctListBox, RctMemo: TRect;
begin
{ Pega o manipulador (handle) da operação
"arrastar e soltar" (drag-and-drop) }
Drop := Msg.wParam;
{ Pega a quantidade de arquivos soltos (dropped) }
FileCount := DragQueryFile(Drop, $FFFFFFFF, nil, 0);
{ Se nenhum arquivo... }
if FileCount = 0 then begin
ShowMessage('Nenhum arquivo.');
Exit;
end;
{ Pega o retângulo do ListBox }
RctListBox := ListBox1.BoundsRect;
{ Pega o retângulo do Memo }
RctMemo := Memo1.BoundsRect;
{ Se soltou fora da área cliente do form... }
if not DragQueryPoint(Drop, Pt) then
ShowMessage('Arquivos soltos fora da área cliente do form')
{ Se soltou na área do ListBox... }
else if PtInRect(RctListBox, Pt) then begin
{ Pega todos os nomes de arquivos e coloca no ListBox }
for I := 0 to FileCount -1 do begin
{ Obtém o comprimento necessário para o nome do arquivo,
sem contar o caractere nulo do fim da string. }
BufferSize := DragQueryFile(Drop, I, nil, 0);
SetLength(FileName, BufferSize +1); { O +1 é p/ nulo do fim da string }
if DragQueryFile(Drop, I, PChar(FileName), BufferSize+1) = BufferSize then
ListBox1.Items.Add(string(PChar(FileName)))
else
ShowMessage('Erro ao obter nome do arquivo.');
end;
{ Se soltou na área do Memo... }
end else if PtInRect(RctMemo, Pt) then begin
if FileCount > 1 then
ShowMessage('Será mostrado apenas o conteúdo do primeiro arquivo.');
{ Obtém o comprimento necessário para o nome do arquivo,
sem contar o caractere nulo do fim da string.
O segundo parâmetro (zero) indica o primeiro arquivo da lista }
BufferSize := DragQueryFile(Drop, 0, nil, 0);
SetLength(FileName, BufferSize +1); { O +1 é p/ nulo do fim da string }
if DragQueryFile(Drop, 0, PChar(FileName), BufferSize+1) = BufferSize then
Memo1.Lines.LoadFromFile(string(PChar(FileName)))
else
ShowMessage('Erro ao obter nome do arquivo.');
end;
Msg.Result := 0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//A função abaixo ativa o recurso de arrastar e soltar arquivos sobre
//seu aplicativo
DragAcceptFiles(Handle, true);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(Handle, false);
end;
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009