Ver Mensaje Individual
  #6  
Antiguo 02-04-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Reputación: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por MAXIUM Ver Mensaje
Hola. Nunca he realizado esto y no logro entenderlo
Quisiera arrastrar un archivo cualquiera, sea texto, video o imagen a un TImage y que la ruta de este, aparezca en un TEdit.

No es complicado.
Entendiendo los pasos, con unas pocas líneas se puede conseguir.
Necesitas un componente que reciba los ficheros; En este ejemplo he usado un panel, pero puede ser un TImage, el formulario completo,...
En este caso admite varios ficheros; En ese caso llamará varias veces al procedimiento AddFiles.

Añado el ejemplo completo al FTP del Club.

He colocado un panel en el formulario y le he llamado pnlArrastrar.




Y te adjunto el código necesario con los comentarios necesarios.

Código Delphi [-]
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TForm3 = class(TForm)
    pnlArrastrar: TPanel;  // componente que recibirá los ficheros
    procedure FormCreate(Sender: TObject);
  private
    // Mi procedimiento a ejecutar cuando llegue un mensaje al componente (panel)
    procedure LBWindowProc(var Message: TMessage);
    // Procedimiento cuando se reciba un fichero arrastrado
    procedure WMDROPFILES(var Msg: TMessage);
    // Procedimiento para definir qué quiero hacer con el fichero que se arrastre...
    procedure AddFile(AFileName:String);
  end;

var
  Form3: TForm3;
  OldLBWindowProc: TWndMethod; // apuntador para el procedimiento original

implementation

{$R *.dfm}

uses
    ShellAPI;

procedure TForm3.AddFile(AFileName: String);
begin
  Caption := 'Fichero: ' + AFileName;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  // Nos quedamnos con la referencia al procedimniento original
  OldLBWindowProc := pnlArrastrar.WindowProc;
  // Asignamos nuestro procedimiento personalizado para el panel
  pnlArrastrar.WindowProc := LBWindowProc;
  // Marcamos que queremos que el panel acepte ficheros (los que vamos a arrastrar)
  DragAcceptFiles(pnlArrastrar.Handle, True);
end;

procedure TForm3.LBWindowProc(var Message: TMessage);
begin
  // sólo queremor "redefinir" el procedimiento de "arrastrar fichreos..."
  if Message.Msg = WM_DROPFILES then
    WMDROPFILES(Message); // ejecutamos el nuestro
  // Ejecutamos siempre lo que hubiera antes...
  OldLBWindowProc(Message);
end;

procedure TForm3.WMDROPFILES(var Msg: TMessage);
var
  pcFileName: PChar;
  i, iSize, iFileCount: integer;
begin
  pcFileName := '';
  // número de ficheros arrastrados
  iFileCount := DragQueryFile(Msg.wParam, $FFFFFFFF, pcFileName, 255);
  for i := 0 to iFileCount - 1 do  begin
    iSize := DragQueryFile(Msg.wParam, i, nil, 0) + 1;
    pcFileName := StrAlloc(iSize);
    DragQueryFile(Msg.wParam, i, pcFileName, iSize);
    if FileExists(pcFileName) then begin
      AddFile(pcFileName); // Llamada a AddFile (lo que queramos hacer con el fichero)
    end;
    StrDispose(pcFileName);
  end;
  DragFinish(Msg.wParam);
end;

end.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 02-04-2024 a las 10:44:35.
Responder Con Cita