Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Nombres de archivos seleccionados (https://www.clubdelphi.com/foros/showthread.php?t=95037)

ArtPortEsp 28-01-2021 21:05:49

Nombres de archivos seleccionados
 
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 :

Código:

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

Saludos :)

ArtPortEsp 29-01-2021 01:29:18

Cita:

Empezado por ecfisa (Mensaje 539816)
Hola.

Revisa si te sirve este enlace: Delphi arrastrar varios ficheros en una aplicación

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

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 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,

Cita:

Empezado por ArtPortEsp (Mensaje 539828)
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:

Código Delphi [-]
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

Cita:

Empezado por dec (Mensaje 539830)
Hola a todos,



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

Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 16:46:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi