Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Drag'n'Drop для Edit [D6, 95/98]


Dr. Genius ©   (2006-08-28 15:25:00) 

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

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

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),

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


Loginov Dmitry   (2006-08-29 18:14:00) [1]

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


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


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


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


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


DprYg   (2006-08-29 09:22:00) [3]


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


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


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


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


DprYg   (2006-08-28 19:38:00) [5]


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


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

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


Fay   (2006-08-28 19:25:00) [7]

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


MBo   (2006-08-28 19:07:00) [8]

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


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

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


DprYg   (2006-08-28 15:54:00) [10]

Вот пример кода:
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 лучше не использовать - снижает производительность.


MBo   (2006-08-28 15:37:00) [11]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо