Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму / 7 сообщений из 7, страница 1 из 1
29.03.2017, 20:20
    #39429533
Николай II
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму
Задача: на форме есть Memo1 и Memo2. Нужно обрабатывать сообщение Windows перетаскивание файлов из проводника на эти Memo.

У меня получается перехватить и обработать перетаскивание файлов из проводника на форму моей программы.
Для этого:
1. в Unit.h нужно наисать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
private:	// User declarations
void virtual __fastcall WMDropFiles(TWMDropFiles &message);
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
	BEGIN_MESSAGE_MAP
		MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,WMDropFiles)
	END_MESSAGE_MAP(TForm);


2. в обработкик формы OnCreate написать
Код: plaintext
1.
DragAcceptFiles(Handle, true);


3. и написать саму функцию обработки сообщения:
Код: plaintext
1.
2.
3.
4.
void __fastcall TForm1::WMDropFiles(TWMDropFiles &message)
{
Beep();
}



А как переделать с формы на Memo не пойму. Попробовал в OnCreate формы написать:
Код: plaintext
1.
2.
DragAcceptFiles(Memo1->Handle, true);
DragAcceptFiles(Memo2->Handle, true);


Перетаскивание есть (по курсору вижу), но функция WMDropFiles не срабатывает.
Подскажите, что еще нужно изменить?
-------------------------
C++ Builder 2010
Самоучка
...
Рейтинг: 0 / 0
29.03.2017, 21:13
    #39429561
Николай II
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму
Магический форум: как только написал вопрос, сразу же нашел ответ:

1. в Unit1.h перед строкой "class TForm1 : public TForm" написать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
namespace Drop_Memo
{
	class TMemo : public Stdctrls::TMemo
    {
    protected:
		MESSAGE void __fastcall WMDropFiles(TWMDropFiles &message)
		{
			wchar_t chName[MAX_PATH];
			HDROP hdropHandle=(HDROP)message.Drop;
			int FileCount=DragQueryFileW(hdropHandle, -1, NULL, NULL); // кол-во перетаскиваемых файлов
			for (int i=0; i<FileCount; i++)
				{
				DragQueryFileW(hdropHandle, i, chName, MAX_PATH);
				Lines->Add(chName); // добавляем в Memo строку; chName это полный путь к файлу
				}
        }
    public:
		__fastcall virtual TMemo(Classes::TComponent* AOwner)
			: Stdctrls::TMemo(AOwner) {}

        BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles);
		END_MESSAGE_MAP(Stdctrls::TMemo);
    };
}
#define TMemo Drop_Memo::TMemo


2. в обработкик формы OnCreate написать:
Код: plaintext
1.
2.
DragAcceptFiles(Memo1->Handle, true);
DragAcceptFiles(Memo2->Handle, true);


3. в обработкик формы OnDestroy написать:
Код: plaintext
1.
2.
DragAcceptFiles(Memo1->Handle, false);
DragAcceptFiles(Memo2->Handle, false);
...
Рейтинг: 0 / 0
29.03.2017, 22:00
    #39429573
Николай II
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму
Все таки помощь нужна:
как из функции WMDropFiles, обрабатывающей сообщение перетаскивания, обратится к Form1->Edit1->Text?
...
Рейтинг: 0 / 0
29.03.2017, 22:12
    #39429580
Николай II
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму
Реально магический форум! Нужно переделать так:
1. в Unit.h нужно наgисать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
namespace Drop_Memo
{
	class TMemo : public Stdctrls::TMemo
    {
    private:        // User declarations
void virtual __fastcall WMDropFiles (TWMDropFiles &message);
    public:
		__fastcall virtual TMemo(Classes::TComponent* AOwner)
			: Stdctrls::TMemo(AOwner) {}

        BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles);
		END_MESSAGE_MAP(Stdctrls::TMemo);
    };
}
#define TMemo Drop_Memo::TMemo


2. в Unit1.cpp написать саму функцию обрабатывающую сообщение, из которой обращаться куда нужно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void __fastcall TMemo::WMDropFiles (TWMDropFiles &message)
{
Form1->Edit1->Text="Ура!";
wchar_t chName[MAX_PATH];
HDROP hdropHandle=(HDROP)message.Drop;
int FileCount=DragQueryFileW(hdropHandle, -1, NULL, NULL); // кол-во перетаскиваемых файлов
for (int i=0; i<FileCount; i++)
	{
	DragQueryFileW(hdropHandle, i, chName, MAX_PATH);
	Lines->Add(chName); // добавляем в Memo строку; chName это полный путь к файлу
	}

}
...
Рейтинг: 0 / 0
30.03.2017, 08:00
    #39429650
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму
Николай II,
мне нравится ход твоих мыслей!
...
Рейтинг: 0 / 0
30.03.2017, 21:09
    #39430487
Николай II
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму
В догонку:
Этот код будет обрабатывать сообщение Windows перетаскивания файлов на все Memo, для которых будут заданы DragAcceptFiles в true.
Когда в функции-обработчике этого сообщения нужно узнать, на какой конкретно компонент было осуществлено перетаскивание, на всех форумах, которые мне попадались в процессе решения этой задачи, мудрят с определением координат курсора в момент отпускания мыши. Но, все намного проще, можно обратиться к имени компонента Name: Memo1 или Memo2.
Добавьте в самое начало функции-обработчика сообщения такую строчку ShowMessage(Name); и увидите на какой конкретно компонент было осуществлено перетаскивание.
...
Рейтинг: 0 / 0
03.04.2017, 05:44
    #39431754
CEMb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму
Вдогонку: ещё есть IDragSource и IDropTarget, как более общий механизм.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перетаскивание файлов из проводника на КОМПОНЕНТ, а не на форму / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]