Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 4 Semanas
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Drag & Drop para obtenr nombre y ruta de archivo

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.

Ayuuuuuuda!!!
Responder Con Cita
  #2  
Antiguo Hace 4 Semanas
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Arrastrar texto o "lo que sea" a un TImage?
Responder Con Cita
  #3  
Antiguo Hace 4 Semanas
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Arrastrar texto o "lo que sea" a un TImage?
Quise decir archivo de texto... es decir, cualquier archivo de cualquier extensión. No necesariamente a un TImage. Puede ser a un TPanel.
Responder Con Cita
  #4  
Antiguo Hace 4 Semanas
Avatar de MAXIUM
MAXIUM MAXIUM is offline
Miembro
 
Registrado: may 2005
Posts: 1.488
Poder: 20
MAXIUM Va camino a la fama
Add ShellAPI and Messages to your project's uses:
Código Delphi [-]
uses
    ShellAPI, Messages;
Add a method to your form that handles the WM_DROPFILES message.

For example, the following would be placed in the TForm1 declaration in the protected section:
Código Delphi [-]
protected
    procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
Drag 'n' drop are activated by calling:
Código Delphi [-]
DragAcceptFiles(Handle, true);
and deactivated by calling:

Código Delphi [-]
DragAcceptFiles(Handle, false);
It is normal to activate drag 'n' drop in the OnCreate event, and deactivate it in the OnClose or OnDestroy events:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, true);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DragAcceptFiles(Handle, false);
end;
This first procedure will enable you to drop files one at a time:
Código Delphi [-]
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles);
var filename: PChar;
    length: LongWord;
begin
  length:= DragQueryFile(Msg.Drop, 0, NIL, 0);
  filename:= StrAlloc(length+1);
  DragQueryFile(Msg.Drop,0,filename,length+1);
  {do something with filename}
  Msg.Result:=0;
  inherited;
end;
Responder Con Cita
  #5  
Antiguo Hace 4 Semanas
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Antes de usar DragAcceptFiles y DragQueryFile deberías deshabilitar el filtro para los mensajes WM_DROPFILES y WM_COPYGLOBALDATA con la API ChangeWindowMessageFilterEx.


Saludos.
Responder Con Cita
  #6  
Antiguo Hace 3 Semanas
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.275
Poder: 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: Hace 3 Semanas a las 09:44:35.
Responder Con Cita
  #7  
Antiguo Hace 3 Semanas
javipes javipes is offline
Miembro
 
Registrado: jul 2007
Posts: 14
Poder: 0
javipes Va por buen camino
Exclamation

Aunque ya se ha respondido, te amplio algo que yo utilizo, por si te esclarece más, que yo la primera vez me costó un poco:

Por ejemplo, para que el receptor del drag-and-drop sea un tmemo en tu form, puedes ampliar la clase TMemo con
Código Delphi [-]
type   
  //la clase TMemo sera receptora del drag-and-drop   
  TMemo = class(Vcl.StdCtrls.TMemo)   protected     
    procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES;     
    procedure    CreateWnd; override;     
    procedure DestroyWnd; override;   
  end;

y estos metodos escribirlos:
Código Delphi [-]
{$REGION 'Memo'}  
procedure TMemo.CreateWnd; 
begin   
  inherited;   
  DragAcceptFiles(Handle, true); 
end;  

procedure TMemo.DestroyWnd; 
begin   
  DragAcceptFiles(Handle, false);   
  inherited; 
end;  

procedure TMemo.WMDropFiles(var Message: TWMDropFiles); 
var   
  numfichs: integer;   
  fn: array[0..MAX_PATH-1] of char;   
  nomfichero,extension:string; 
begin    
  numfichs := DragQueryFile(Message.Drop, $FFFFFFFF, fn, MAX_PATH);   
  if numfichs <> 1 then   
  begin     
    MessageBox(Handle, 'Solo un fichero.', 'Error descarga', MB_ICONERROR);     
    Exit;   
  end;    
  if DragQueryFile(Message.Drop, 0, fn, MAX_PATH) = 0 then 
    Exit;    
  nomfichero := fn;   //contiene el path completo    
 //hacer lo que se quiera con el fichero o con el nombre   
end; 
{$ENDREGION 'Memo'}

con esto, cualquier tmemo que incluyas en tu form podra ser receptor de drag and drop, por ejemplo para cargar en el el contenido del fichero si es de tipo texto.
Tambien podrías cambiarlo para aplicarlo sobre un tedit y que el receptor fuera el tedit....

Última edición por Neftali [Germán.Estévez] fecha: Hace 3 Semanas a las 09:49:14. Razón: Corregir la visualización del código
Responder Con Cita
  #8  
Antiguo Hace 3 Semanas
javipes javipes is offline
Miembro
 
Registrado: jul 2007
Posts: 14
Poder: 0
javipes Va por buen camino
Neftali, hemos 'chocado'.
Pero ¿porque no se ve mi codigo bien? cuando he previsualizado lo veía bien antes de enviarlo.....
Responder Con Cita
  #9  
Antiguo Hace 3 Semanas
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.275
Poder: 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 javipes Ver Mensaje
Neftali, hemos 'chocado'.
Si, nos hemos pisado los mensajes..

Cita:
Empezado por javipes Ver Mensaje
Pero ¿porque no se ve mi codigo bien? cuando he previsualizado lo veía bien antes de enviarlo.....
Ya está corregido.
Es un error antiguo de vBulletin. A veces cuando se usa la vista previa, se hace un lío con las etiquetas...
__________________
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.
Responder Con Cita
  #10  
Antiguo Hace 3 Semanas
javipes javipes is offline
Miembro
 
Registrado: jul 2007
Posts: 14
Poder: 0
javipes Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Si, nos hemos pisado los mensajes..

Ya está corregido.
Es un error antiguo de vBulletin. A veces cuando se usa la vista previa, se hace un lío con las etiquetas...
gracias, maestro.

Última edición por Neftali [Germán.Estévez] fecha: Hace 3 Semanas a las 10:06:02.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comprobar el nombre de la imagen en un drag and drop. jjuguera Varios 7 16-01-2020 22:36:23
Drag and Drop con archivo adjunto de outlook izia Varios 7 24-02-2010 08:29:28
Drag&Drop para clasificar Imagenes gcaffe OOP 2 22-04-2007 21:43:16
Drag&Drop de un archivo a mi aplicacion... Ascii1457 Varios 6 15-10-2006 16:10:09
Ruta y nombre de archivo INI jfranco Varios 2 27-02-2004 16:44:23


La franja horaria es GMT +2. Ahora son las 21:17:35.


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
Copyright 1996-2007 Club Delphi