Главная страница
    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.048 c
2-1157022643
kotbazilio
2006-08-31 15:10
2006.09.17
Помогите решить задачу про запрос


1-1154708929
ancot
2006-08-04 20:28
2006.09.17
TFrame TAction и ShorCut


15-1156336634
fishka
2006-08-23 16:37
2006.09.17
Проблемы при работе с сетью (папка с DBF открыта для доступа)


2-1157088777
Константин_
2006-09-01 09:32
2006.09.17
FastReport 3


2-1157071553
Noxi
2006-09-01 04:45
2006.09.17
LPT порты в Делфи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский