unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
OldWndProc: TWndMethod;
procedure EditWndProc(var Message: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
ShellAPI;
procedure TForm1.EditWndProc(var Message: TMessage);
var
S: String;
begin
if Message.Msg = WM_DROPFILES then
begin
SetLength(S, MAX_PATH);
SetLength(S, DragQueryFile(Message.WParam, 0, PChar(S), MAX_PATH));
Edit1.Text := S;
Message.Result := 0;
end
else
OldWndProc(Message);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DragAcceptFiles(Edit1.Handle, True);
OldWndProc := Edit1.WindowProc;
Edit1.WindowProc := EditWndProc;
end;
end.
Da bi kontrola uopste mogla da primi WM_DROPFILES poruku mora se registrovati pozivom funkcije DragAcceptFiles. Ova funkcija uzima handle prozora koji treba da sluzi za prihvatanje pustenih fajlova i jednu boolean vrednost koja ako je True registruje, a ako je False brise prozor iz liste onih koji mogu da prime fajl.
Najlaksi nacin da se izmeni procedura koja obradjuje poruke za kontrole je da im se promeni vrednost property-a WindowProc. Ta procedura se poziva kad god postoji neka poruka za kontrolu. Pre promene, bitno je sacuvati staru vrednost tako da se kasnije moze pozvati i default WindowProc za tu kontrolu.
Da bi ovaj kod radio potrebno je na formu postaviti jednu TEdit kontrolu i ako se fajl prevuce i pusti na nju Text property ce uzeti putanju tog fajla. Uzima se putanja samo prvog fajla ako se prevuce vise fajlova odjednom.
@beshtija
Dobrodosla na MyCity
|