Форум: "Начинающим";
Текущий архив: 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