Ver Mensaje Individual
  #2  
Antiguo 17-09-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
En cuanto a la primera pregunta no sé la respuesta y te recomiendo abrir hilos distintos si las preguntas son de naturaleza distinta.

En lo que se refiere a la segunda pregunta debes usar la función DragAcceptFiles de la unidad ShellApi. Te pongo aquí un breve resumen de lo que necesitas.

DragAcceptFiles le pasas el "handle" del formulario que desees que acepte archivos. El segundo parámetro habilita o inhabilita la opción.

WM_DROPFILES
Windows mandará este mensaje a la ventana que registres en el momento en que el usuario suelte el (o los) archivos en tu formulario. El mensaje lleva un parámetro "Drop" que necesitas para las siguientes funciones, mismas que procesas en el manejador de este mensaje.

DragQueryPoint
Te indica el lugar en donde el usuario suelta el archivo. De esa manera puedes determinar si el archivo se suelta en el control que realmente desees, por ejemplo un Memo.

DragQueryFile
Te indica el o los archivos que se sueltan (o bien el número de archivos). Con esta función puedes entonces saber el nombre del archivo y determinar si es apto para cargarse.

DragQueryFinish
Termina el proceso de arrastrado y libera recursos.

Te pongo aquí un ejemplo completo para poder cargar archivos 'txt' en un memo del formulario. Esto te servirá de punrto de partida; para más información busca en la ayuda de Windows SDK (incluida con Delphi) acerca de la función DragAcceptFiles.

Código Delphi [-]
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);
    procedure FormDestroy(Sender: TObject);

  private
    Drop: HDROP;
    procedure WMDropFiles(var Message: TWMDropFiles); message WM_DROPFILES;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Aceptar archivos
  DragAcceptFiles(Handle, true);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // Dejar de aceptar archivos
  DragAcceptFiles(Handle, false);
end;

procedure TForm1.WMDropFiles(var Message: TWMDropFiles);
var
  Punto: TPoint;
  Archivo: array[0..MAX_PATH - 1] of Char;
  Extension: String;

begin
  // Referencia al archivo arrastrado
  Drop := Message.Drop;

  // Determinar en qué punto de la ventana se soltó
  DragQueryPoint(Drop, Punto);

  // Y procesarlo si quedó dentro del memo
  if PtInRect(Memo1.BoundsRect, Punto) then
  begin
    // Obtener el nombre del archivo arrastrado
    // * Consultar la ayuda para el segundo parámetro *
    DragQueryFile(Drop, 0, Archivo, MAX_PATH);

    // Determinar si es del tipo adecuado
    // y en su caso cargar el archivo
    Extension := ExtractFileExt(Archivo);
    if Extension = '.txt' then
      Memo1.Lines.LoadFromFile(Archivo);
  end;

  // Liberar recursos
  DragFinish(Drop);

  // Necesario para que la aplicación no quede detrás
  // del origen del archivo (p. ej. el Explorador)
  Application.BringToFront;
end;

end.


// Saludos
Responder Con Cita