PDA

Ver la Versión Completa : Nombres de archivos seleccionados


ArtPortEsp
28-01-2021, 21:05:49
Buen dia

quisiera implementar la funcionalidad de que el usuario pueda seleccionar varios archivos desde el explorador de windows y "capturar" los nombres de esos archivos (incluyendo la ubicacion), para agregarlos a una base de datos.

No se ni como empezar.

Supongo que algo tiene que ver con DRAG and DROP, pero tengo un ejemplo (abajo), pero no hace nada :


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
public
{ Public declarations }
protected
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;

end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Self.Handle, true);
end;

procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var
DropH: HDROP; // drop handle
DroppedFileCount: Integer; // number of files dropped
FileNameLength: Integer; // length of a dropped file name
FileName: string; // a dropped file name
I: Integer; // loops thru all dropped files
DropPoint: TPoint; // point where files dropped
begin
inherited;
// Store drop handle from the message
DropH := Msg.Drop;
try
// Get count of files dropped
DroppedFileCount := DragQueryFile(DropH, $FFFFFFFF, nil, 0);
// Get name of each file dropped and process it
for I := 0 to Pred(DroppedFileCount) do
begin
// get length of file name
FileNameLength := DragQueryFile(DropH, I, nil, 0);
// create string large enough to store file
SetLength(FileName, FileNameLength);
// get the file name
DragQueryFile(DropH, I, PChar(FileName), FileNameLength + 1);
ShowMessage(FileName);
Memo1.Lines.Add(Filename);
// process file name (application specific)
// ... processing code here
end;
// Optional: Get point at which files were dropped
DragQueryPoint(DropH, DropPoint);
// ... do something with drop point here
finally
// Tidy up - release the drop handle
// don't use DropH again after this
DragFinish(DropH);
end;
// Note we handled message
Msg.Result := 0;
end;


Estoy usando Delphi 7 y Windows 10

ecfisa
29-01-2021, 00:18:18
Hola.

Revisa si te sirve este enlace: Delphi arrastrar varios ficheros en una aplicación (http://www.clubdelphi.com/foros/showthread.php?t=87589)

Saludos :)

ArtPortEsp
29-01-2021, 01:29:18
Hola.

Revisa si te sirve este enlace: Delphi arrastrar varios ficheros en una aplicación (http://www.clubdelphi.com/foros/showthread.php?t=87589)

Saludos :)


Amigo, antes que nada, muchas gracias por la aportación, sin embargo, el código referido tampoco funciona... simplemente no hace nada al arrastrar un archivo, ni al listbox ni a la forma. Estaré pasando alguna propiedad por alto?

Neftali [Germán.Estévez]
29-01-2021, 14:38:10
Revisa el código completo.
Hay que capturar el mensaje(1), asignarlo al componente que recibe los ficheros(2) y configurar en el OnCreate la redirección del mensaje(3).
Revisa que tienes las tres cosas.

ArtPortEsp
29-01-2021, 17:26:33
;539827']Revisa el código completo.
Hay que capturar el mensaje(1), asignarlo al componente que recibe los ficheros(2) y configurar en el OnCreate la redirección del mensaje(3).
Revisa que tienes las tres cosas.

Tengo duda en el punto (2)... como lo asigno al componente?

en algun evento?

dec
29-01-2021, 17:26:34
Hola a todos,

Revisa también que tu aplicación no esté corriendo con "derechos de administrador": esto también se puede dar si corres la app desde Delphi y has ejecutado este con esos derechos. El caso es que si es así (si tu aplicación tiene "derechos de administrador") no podrás arrastrar archivos desde el Explorador de Windows, al menos si este corre sin dichos derechos, que, me parece que es lo normal, por decirlo así.

dec
29-01-2021, 17:28:29
Hola a todos,

Tengo duda en el punto (2)... como lo asigno al componente?

en algun evento?

Si no me equivoco, con el punto 2 Neftalí se refiere a esto:


procedure TformMenuPrincipal.FormCreate(Sender: TObject);
begin
//permitimos arrastrar y soltar
DragAcceptFiles(Handle, True);
end;


Es decir, "DragAcceptFiles" usa el "Handle" del formulario "TformMenuPrincipal", en este caso.

ArtPortEsp
29-01-2021, 17:53:46
Hola a todos,



Si no me equivoco, con el punto 2 Neftalí se refiere a esto:


procedure TformMenuPrincipal.FormCreate(Sender: TObject);
begin
//permitimos arrastrar y soltar
DragAcceptFiles(Handle, True);
end;


Es decir, "DragAcceptFiles" usa el "Handle" del formulario "TformMenuPrincipal", en este caso.

ah ok, entonces con respecto al punto 2, si esta cubierto, probare lo de los derechos

ArtPortEsp
29-01-2021, 17:59:26
Tal cual... funciono sin problema al ejecutar la aplicación fuera del IDE (sin permisos de administrador)

Agradezco a todos su ayuda, excelente día, éxito siempre