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
DragAcceptFiles(Handle, true);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DragAcceptFiles(Handle, false);
end;
procedure TForm1.WMDropFiles(var Message: TWMDropFiles);
var
Punto: TPoint;
Archivo: array[0..MAX_PATH - 1] of Char;
Extension: String;
begin
Drop := Message.Drop;
DragQueryPoint(Drop, Punto);
if PtInRect(Memo1.BoundsRect, Punto) then
begin
DragQueryFile(Drop, 0, Archivo, MAX_PATH);
Extension := ExtractFileExt(Archivo);
if Extension = '.txt' then
Memo1.Lines.LoadFromFile(Archivo);
end;
DragFinish(Drop);
Application.BringToFront;
end;
end.
// Saludos