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 15-04-2014
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
Drag Drop

Hola , tengo pensado tener un form comun en delphi xe donde pueda arrastrar un archivo (mas bien una imagen) del escritorio al formulario delphi xe y dejar la ruta de la imagen en un edit del formulario , lo eh visto en varios programas y por ahi lei que era drag drop pero no encuentro ejemplos claros de lo que quiero hacer ¿ es realmente drag drop ? ¿ alguien me podria dar documentacion o links de lo que quiero hacer ?
Responder Con Cita
  #2  
Antiguo 15-04-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por favor, recuerda poner títulos descriptivos a tus preguntas, gracias
Responder Con Cita
  #3  
Antiguo 15-04-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Lepuke.

Ejemplo para versiones anteriores a Windows 7:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
     procedure DragDropFile(var Msg: TMessage ); message WM_DROPFILES;
  public
  end;
...
implementation 

uses ShellApi;

procedure TForm1.DragDropFile(var Msg: TMessage);
var
  Cont, i : integer;
  FName : array [0..MAX_COMPUTERNAME_LENGTH+MAX_PATH] of char;
begin
  Cont := DragQueryFile(Msg.WParam, $FFFFFFFF, FName, 255)-1;
  for i := 0 to Cont do
  begin
    DragQueryFile(Msg.WParam, i, FName, 255);
    ListBox1.Items.Add(FName);
  end;
  DragFinish(msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DragAcceptFiles(Handle, True );
  ListBox1.Items.Clear;
end;

A partir de Windows 7,por motivos de seguridad, se filtran los mensajes enviados de una aplicación a otra (entre los que está Drag&Drop), por lo que previamente hay que elevar el privilegio mediante la función ChangeWindowMessageFilter
Código Delphi [-]
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
  private
    procedure DragDropFiles(var Msg: TMessage ); message WM_DROPFILES;
  public
  end;

...

implementation

uses ShellApi;

const
  MSGFLT_ADD = 1;

var
 ChangeWindowMessageFilter: function (msg: Cardinal; dwFlag : Word):BOOL; stdcall;

procedure TForm1.DragDropFiles(var Msg: TMessage);

var
  Cont,i : integer;
  FName : array [0..MAX_COMPUTERNAME_LENGTH+MAX_PATH] of char;
begin
  Cont:= DragQueryFile(Msg.WParam, $FFFFFFFF, FName, 255)-1;
  for i:= 0 to Cont do
    ChangeWindowMessageFilter (i, MSGFLT_ADD);
  for i := 0 to Cont do
  begin
    DragQueryFile(Msg.WParam, i, FName, 255);
    ListBox1.Items.Add(FName);
  end;
  DragFinish(msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  @ChangeWindowMessageFilter:= GetProcAddress(LoadLibrary('user32.dll'),'ChangeWindowMessageFilter');
  if Assigned (ChangeWindowMessageFilter) then
  begin
    ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
    ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
    ChangeWindowMessageFilter($0049, MSGFLT_ADD);
  end;
  DragAcceptFiles(Handle, True);
  ListBox1.Items.Clear;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 15-04-2014
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
gracias por la ayuda ecfisa , una pregunta ¿ si ejecuto como admin en windows seven evito el problema ?
Responder Con Cita
  #5  
Antiguo 15-04-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Lepuke.
Cita:
Empezado por Lepuke Ver Mensaje
...¿ si ejecuto como admin en windows seven evito el problema ?
No, tenes que usar el segundo código.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 16-04-2014
JuanOrtega JuanOrtega is offline
Miembro
NULL
 
Registrado: sep 2011
Posts: 130
Poder: 13
JuanOrtega Va por buen camino
ahora mismo estoy en XP lo probe , no tira ningun error de compilacion pero cuando arrastro el archivo me tira un error de denegacion por parte de windows , despues lo pruebo en mi maquina virtual donde tengo seven , pero ¿ es normal que el segundo codigo me tire ese error en XP ?
Responder Con Cita
  #7  
Antiguo 16-04-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Lepuke,

Cita:
Empezado por ecfisa
...A partir de Windows 7,por motivos de seguridad, se filtran los mensajes enviados de una aplicación a otra (entre los que está Drag&Drop), por lo que previamente hay que elevar el privilegio mediante la función ChangeWindowMessageFilter...
Probé el código sugerido en el Msg #3 en Delphi 7 bajo Windows 7 Professional x32 en una Máquina Virtual con VMWare, tanto el que usa la función ChangeWindowMessageFilter, como el que no la utiliza y en ambos casos funciono correctamente tanto con un usuario con privilegios de administrador, como con un usuario con privilegios estándar.

Cita:
Empezado por Lepuke
...¿es normal que el segundo código me tire ese error en XP?...
Si es lo que debe suceder, esto se debe a que la función ChangeWindowMessageFilter esta disponible a partir de Windows Vista y Windows Server 2008 en adelante, para Windows XP te sugiero el código que no utiliza la función ChangeWindowMessageFilter del Msg #3.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 16-04-2014 a las 02:11:07.
Responder Con Cita
  #8  
Antiguo 16-04-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Lepuke.

No dispongo de Windows XP para probarlo, pero podrías intentar de este modo:
Código Delphi [-]
...
uses ShellApi;

const
  MSGFLT_ADD = 1;

var
 ChangeWindowMessageFilter: function (msg: Cardinal; dwFlag : Word):BOOL; stdcall;

procedure TForm1.DragDropFiles(var Msg: TMessage);
var
  Cont,i : integer;
  FName : array [0..MAX_COMPUTERNAME_LENGTH+MAX_PATH] of char;
begin
  Cont:= DragQueryFile(Msg.WParam, $FFFFFFFF, FName, 255)-1;
  if (Win32MajorVersion = 6)and(Win32MinorVersion > 0) then
    for i:= 0 to Cont do ChangeWindowMessageFilter (i, MSGFLT_ADD);
  for i := 0 to Cont do
  begin
    DragQueryFile(Msg.WParam, i, FName, 255);
    ListBox1.Items.Add(FName);
  end;
  DragFinish(msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if (Win32MajorVersion = 6)and(Win32MinorVersion > 0) then
  begin
    @ChangeWindowMessageFilter:= GetProcAddress(LoadLibrary('user32.dll'),'ChangeWindowMessageFilter');
    if Assigned (ChangeWindowMessageFilter) then
    begin
      ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
      ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
      ChangeWindowMessageFilter ($0049, MSGFLT_ADD);
    end;
  end;
  DragAcceptFiles(Handle, True);
  ListBox1.Items.Clear;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 16-04-2014 a las 03:31:44.
Responder Con Cita
  #9  
Antiguo 16-04-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Lepuke,

Cita:
Empezado por ecfisa
...No dispongo de Windows XP para probarlo...
El código del Msg #3 que no utiliza la función ChangeWindowMessageFilter y el código del Msg #8 que verifica si la versión de Windows es superior a XP para aplicar la función ChangeWindowMessageFilter, fueron probados en Delphi 7 bajo Windows XP Professional x32 en una Máquina Virtual con VMWare y funcionaron ambos correctamente según lo esperado.

Espero sea útil

Nelson.
Responder Con Cita
  #10  
Antiguo 16-04-2014
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
Thumbs up

Muchas gracias por el aporte, maestros...

Funciona perfectamente
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
Drag and Drop... dvlt .NET 0 07-02-2008 09:42:59
Drag & Drop DanForever Varios 2 01-06-2006 14:24:25
Drag&Drop !!! rafstyle OOP 6 27-07-2004 04:39:41
Drag&Drop xflo Lazarus, FreePascal, Kylix, etc. 0 13-10-2003 19:31:22
Drag & Drop cone220 Varios 1 26-05-2003 19:06:34


La franja horaria es GMT +2. Ahora son las 22:33: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
Copyright 1996-2007 Club Delphi