Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Arrastrar y soltar un archivo sobre la aplicación (https://www.clubdelphi.com/foros/showthread.php?t=54696)

escafandra 27-03-2008 19:15:03

Arrastrar y soltar un archivo sobre la aplicación
 
Estoy intentando pasar parámetros a mi aplicacion arrastrando un archivo y soltándolo sobre ésta. He investigado los eventos OnDrag___ pero no consigo ni siquiera que el icono de "arrastre" cambie de "Prohibido" a otro al pasar por encima de la aplicación. Tampoco se dispara ningun evento.

Con controles VCL si funciona pero con archivos externos arrastrados desde el explorador, no.

Seguro que alguien puede ayudarme.

Saludos.

keyboy 27-03-2008 19:33:04

Debes registrar tu aplicación con la función DragAcceptFiles de la API de Windows para así poder procesar el mensaje WM_DROPFILES.

Bye

santus 27-03-2008 19:36:46

yo lo hice para abrir un archivo rtf y arrastrarlo a un richview.

En la seccion de "private" agrega este procedimiento.

Código:

  private
    procedure WMDropFiles(var Msg: TWMDropFiles); message M_DROPFILES;
 
  ...
 
procedure TfMain.WMDropFiles(var Msg: TWMDropFiles);
var
  CFileName: array[0..MAX_PATH] of Char;
  RutaArchivoTemp : String;
begin
  try
    if DragQueryFile(Msg.Drop, 0, CFileName, MAX_PATH) > 0 then
    begin
      sbDocumento.Panels[0].Text := 'Archivo '+CFileName;
      if extraerTextoWord(CFileName,RutaArchivoTemp) then begin // aca convierte de word a RTF.
        reDocumento.lines.LoadFromFile(rutaArchivoTemp);
        btnIniciarProceso.Enabled := True;
      end;
      Msg.Result := 0;
    end;
  finally
    DragFinish(Msg.Drop);
  end;
end;

fijate si esto te sirve. Muchos saludos.

santus 27-03-2008 19:39:35

ahh

falto esto de registrarlo.
Código:


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


escafandra 27-03-2008 19:45:49

Muchas gracias por vuestras rápidas respuestas. La solución en C++Builder es esta:

Código:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  // Para aceptar arrastrar archivos.
  DragAcceptFiles(Handle,true);

  // Asignación del procesador de mensajes para la aplicación y sus ventanas
  Application->OnMessage  = AppMessage;
}

Código:

// Procesar los mensajes de la aplicación
void __fastcall TForm1::AppMessage(tagMSG &Msg, bool &Handled)
{
  // Procesar el mensaje  WM_DROPFILES, aquí o en otra función a parte...
  if(Msg.message == WM_DROPFILES){
      char archivo[MAX_PATH];
      int n = DragQueryFile((HDROP)Msg.wParam, 0, archivo, sizeof(archivo));
      if(n>0) Procesar(archivo); // Funcion que procesa el archivo
      DragFinish((HDROP)Msg.wParam);
      Handled = true;
  }
}


Saludos.:D

Negriz 01-04-2008 19:02:55

oye encontre un componente, aunque ya solucionaste tu problema depronte te ayude en el futuro:

http://cc.codegear.com/Item/23823

escafandra 01-04-2008 21:58:40

Muchas gracias Negriz. Voy a mirarlo, nunca está de mas el exceso de información y de herramientas.

Saludos:)

escafandra 05-04-2008 16:30:46

He encontrado otra forma de hacer lo mismo, aquí tenemos un ejemplo: http://cc.codegear.com/item/15716


La franja horaria es GMT +2. Ahora son las 06:24:28.

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