Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Drag n Drop для Edit   Найти похожие ветки 

 
Dr. Genius   (2006-08-28 15:25) [0]

Здравствуйте!

------------------------------

protected
 procedure WMDropFiles(var Msg: TMessage); message WM_DROPFILES;

procedure TForm1.WMDropFiles(var Msg: TMessage);
Var
 Filename: array[0..256] of char;
begin
 DragQueryFile(THandle(Msg.WParam),0,Filename,SizeOf(Filename));
 …
 DragFinish(THandle(Msg.WParam));
end;

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


------------------------------

Пользуюсь данным кодом для организации Drag’n’Drop’а в своем приложении. Этот код позволяет принять любые файлы (и папки), перетащенные и брошенные на форму. Но я хочу сделать поддержку Drag’n’Drop’а не для всей формы, а для одного Edit’а. Я пробовал заменить строку

DragAcceptFiles (Form1.Handle, True)

на строку

DragAcceptFiles (Edit1.Handle, True),

но ничего не получается. Может, кто-нибудь поделится своими соображениями.


 
MBo ©   (2006-08-28 15:37) [1]

обработчик события WM_DROPFILES нужно к оконной процедуре Edit, а не формы привязать. Или через WindowProc, или через ApplicationEvents.OnMessage


 
DprYg ©   (2006-08-28 15:54) [2]

Вот пример кода:
type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Edit1: TEdit;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   OldEditsWindowProc: Pointer;
 end;

var
 Form1: TForm1;
 FileName: array [0..256] of Char;

implementation

{$R *.dfm}

uses ShellAPI;

type
 WParameter = LongInt;
 lParameter = LongInt;

function NewWindowProc(WindowHandle: HWND; TheMessage: WParameter;
 ParamW: WParameter; ParamL: LParameter): LongInt; stdcall;
begin
 NewWindowProc := CallWindowProc(Form1.OldEditsWindowProc, WindowHandle,
      TheMessage, ParamW, ParamL);
 if TheMessage = WM_DROPFILES then begin
   DragQueryFile(ParamW, 0, FileName, SizeOf(FileName));
   Form1.Memo1.Lines.LoadFromFile(FileName);
   DragFinish(ParamW);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 OldEditsWindowProc := Pointer(SetWindowLong(Edit1.Handle,
   GWL_WNDPROC, LongInt(@NewWindowProc)));
 DragAcceptFiles(Edit1.Handle, true);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 DragAcceptFiles(Edit1.Handle, false);
 SetWindowLong(Edit1.Handle, GWL_WNDPROC, LongInt(OldEditsWindowProc));
end;

ApplicationEvents лучше не использовать - снижает производительность.


 
Dr. Genius   (2006-08-28 19:05) [3]

Спасибо за код.
Но у меня возник еще один попутный вопрос.
Если перетаскивать файл или папку на тот Edit, то рядом с указателем мыши при этом появляется значок с плюсиком. Это означает, что данный элемент управления поддерживает Drag’n’Drop и что перетаскиваемый объект можно бросить на этот элемент.
А можно ли сделать, чтобы этот значок с плюсиком появлялся только при перетаскивании файла с указанным расширением (например, .txt).


 
MBo ©   (2006-08-28 19:07) [4]

Да, можно, только придется реализовывать интерфейсы OLE-перетаскивания IDropTarger и IDataObject


 
Fay ©   (2006-08-28 19:25) [5]

2 MBo ©   (28.08.06 19:07) [4]
А WS_EX_ACCEPTFILES и WM_DROPFILES не спасут отца русской демократии?


 
Fay ©   (2006-08-28 19:29) [6]

Всё, молчу...


 
DprYg ©   (2006-08-28 19:38) [7]


> Dr. Genius   (28.08.06 19:05) [3]
Просто проверяй расширение, и если оно не то, выводи что поддерживается только такое-то. Облегчи себе жизнь.


 
Dr. Genius   (2006-08-29 09:16) [8]


> Просто проверяй расширение, и если оно не то, выводи что
> поддерживается только такое-то. Облегчи себе жизнь.


Это слишком примитивно.


 
DprYg ©   (2006-08-29 09:22) [9]


> Это слишком примитивно.
Согласен, что для программирования примитивно, как будет удобней пользователю - не знаю. Тогда смотри [4]


 
Dr. Genius   (2006-08-29 16:53) [10]


> Да, можно, только придется реализовывать интерфейсы OLE-
> перетаскивания IDropTarger и IDataObject


Если честно, то я не понимаю...


 
Loginov Dmitry ©   (2006-08-29 18:14) [11]

>
> Если честно, то я не понимаю...


Даже не пытайся.



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
2-1156308815
graf
2006-08-23 08:53
2006.09.17
AVI из нескольких bmp или jpg


3-1152093224
term1t
2006-07-05 13:53
2006.09.17
Oracle to FoxPro


2-1157025359
Neket
2006-08-31 15:55
2006.09.17
Скрытие программы от посторонних глаз


2-1156772003
zdm
2006-08-28 17:33
2006.09.17
ShowModal


6-1146301242
Novice
2006-04-29 13:00
2006.09.17
Доступ к настройкам по средствам WEB-браузера. Delphi