Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2012, 11:19   #1
Galstuk1
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 16
Вопрос Перетащить файл из проводника на форму

Привет.
Появилась необходимость перетащить файл из проводника на форму приложения (например, для копирования или определения его свойств). Игры со свойствами и методами самой формы, а также TLabel, TImage не привели к результату: при наведении указателя мыши, несущего файл из проводника, на форму, появляется знак запрета. Что нужно сделать для решения задачи?
Galstuk1 вне форума Ответить с цитированием
Старый 21.05.2012, 12:39   #2
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

"Drag and Drop файлов на форму/компоненту

добавляем в [Unit1.h] в секции несколько строчек
Код:
class TForm1 : public TForm
{
private:	// User declarations
	void virtual __fastcall WMDropFiles(TWMDropFiles &message);
public:		// User declarations
	BEGIN_MESSAGE_MAP
		MESSAGE_HANDLER(WM_DROPFILES,TWMDropFiles,WMDropFiles)
	END_MESSAGE_MAP(TForm);
};
[Unit1.cpp]
Код:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	DragAcceptFiles(Form1->Handle, true); 
//вместо Form1 может быть любой компонент, например, ListBox или Memo, тогда файлы будут дропаться только над этим компонентом"

Последний раз редактировалось Stilet; 22.05.2012 в 21:52.
nick42 вне форума Ответить с цитированием
Старый 21.05.2012, 17:47   #3
Galstuk1
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 16
По умолчанию

Что-нибудь в #include надо добавлять?
Galstuk1 вне форума Ответить с цитированием
Старый 21.05.2012, 18:27   #4
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

в инклуды - нет, а вот в unit1.cpp мне пришлось добавлять пустую функцию, иначе линкер ругался...
Код:
void __fastcall TForm1::WMDropFiles(TWMDropFiles &message)
{
 ;
}
nick42 вне форума Ответить с цитированием
Старый 21.05.2012, 19:18   #5
Galstuk1
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 16
По умолчанию

Спасибо, попробую
Galstuk1 вне форума Ответить с цитированием
Старый 21.05.2012, 20:30   #6
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Код:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    DragAcceptFiles(Form1->Handle, true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMDropFiles(TWMDropFiles &message)
{
   char chName[MAX_PATH];
   HDROP hdropHandle=(HDROP)message.Drop;
   //  get numbers of dragging files
   // int viNumber=DragQueryFile(hdropHandle,-1,NULL,NULL);
   DragQueryFile(hdropHandle,0,chName,MAX_PATH);
   Memo1->Lines->Add(chName);  //  path of dragging file
}
такой код выводит на мэмо полный путь перемещенного файла. Дальше по этим данным можно его уже использовать (в зависимости от типа).
nick42 вне форума Ответить с цитированием
Старый 22.05.2012, 12:28   #7
Galstuk1
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 16
По умолчанию

Я так понимаю, что для работы такого кода принимающий объект должен иметь Handle. У формы он есть, а у TLabel, TMemo, TImage или других есть? Хочу сделать на одной форме несколько областей для сброса файлов, каждая из которых будет задавать конкретное действие с файлом. Пока удалось реализовать только сброс файлов на саму форму, без разбора куда именно файл упал. Реально ли такое?
Galstuk1 вне форума Ответить с цитированием
Старый 22.05.2012, 14:34   #8
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Для меня это тоже загадка, потому что этим свойством обладает только ListBox, - ни TPanel, ни TMemo, ни TGroupBox, ни TRichEdit... . То-есть файл они якобы принимают, но никакой реакции на код в функции WMDropFiles.
nick42 вне форума Ответить с цитированием
Старый 22.05.2012, 19:43   #9
Galstuk1
Пользователь
 
Регистрация: 16.04.2012
Сообщений: 16
По умолчанию

Так, отлично. TImage->Canvas имеет Handle. Я написал в unit1.h
Код:
class TImage1 : public TImage
{
  private: // User declarations
	void virtual __fastcall WMDropFiles(TWMDropFiles &message);
  public: // User declarations
  BEGIN_MESSAGE_MAP
	MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
  END_MESSAGE_MAP(TImage);
 };
...
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TImage1 *Image1;
...
};
а в unit1.cpp
Код:
void __fastcall TImage1::WMDropFiles(TWMDropFiles &message)
{
 ;
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  DragAcceptFiles(Form1->Image1->Canvas->Handle,true);
}
Но компилятор дает ошибку
"Project raised exception class EClassNotFound with message 'Class TImage not found'"
Galstuk1 вне форума Ответить с цитированием
Старый 22.05.2012, 22:03   #10
nick42
Форумчанин
 
Аватар для nick42
 
Регистрация: 14.10.2011
Сообщений: 267
По умолчанию

Цитата:
компилятор дает ошибку
"Project raised exception class EClassNotFound with message 'Class TImage not found'"
... ну и ??!
nick42 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перетащить файл из программы? Кольша Мультимедиа в Delphi 2 23.09.2011 04:53
Полностью сохранить форму в файл как .dfm anton14 Общие вопросы Delphi 5 16.10.2010 18:42
Как создать бат файл для перезагрузки Проводника в Windows7? idealist Помощь студентам 0 27.05.2010 18:04
Программно перетащить файл на форму FelixKoT Общие вопросы Delphi 2 13.02.2010 20:58
Как перетащить файл в свою программу SoftKoc Общие вопросы Delphi 5 14.11.2009 21:28