Buscar

Arrastar e soltar arquivos sobre sua aplicação

Código

{Inicie um novo projeto no delphi, coloque um componente Memo e um ListBox no formulário e, declare a procedure abaixo na área private da Unit do seu formulário, ela é um manipulador para mensagem da operação de drag-and-drop(arrastar-e-soltar) de arquivos:

 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;

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Windows
Adicionada dia: 04/05/07
Por: B0ssy Ne0
Visualizada: 13260 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009