Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
15-1156408690
KygECHuK
2006-08-24 12:38
2006.09.17
StarTeam


15-1156834263
passlight
2006-08-29 10:51
2006.09.17
Не были они на Луне!!!


15-1156766876
TUser
2006-08-28 16:07
2006.09.17
Мул vs Осел


2-1156785114
Crazy monkey
2006-08-28 21:11
2006.09.17
Перерисовка в ttreeview


6-1146035911
yury
2006-04-26 11:18
2006.09.17
Посылка сообщения по сети





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский