Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
9 / 9 / 5
Регистрация: 03.07.2012
Сообщений: 60

Нет пути файла при использовании Drar & Drop в с++ builder

13.06.2013, 19:23. Показов 1275. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите решить проблему. После многочасового поиска по форумам я все же смог как-то реализовать функцию Drag&Drop что не может не радовать. Я остановился на таком варианте обработки сообщения WM_DROPFILES:

Unit1.h
C++
1
2
3
4
5
6
7
private:    // User declarations
    void __fastcall WmDropFiles(TWMDropFiles& Message);
public:     // User declarations
    __fastcall TForm4(TComponent* Owner);
    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WmDropFiles)
    END_MESSAGE_MAP(TForm);
Unit1.cpp
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
   HDROP drop_handle = (HDROP)Message.Drop;
   UnicodeString fName;
   int filenum = DragQueryFileW(drop_handle, -1, NULL, NULL);
   for(int i = 0; i < filenum; i++){
      DragQueryFile(drop_handle, i, fName.c_str(), MAXPATH);
      RichEdit1->Text = fName;
     }
 }
Проблема заключается в том что RichEdit1 остается пустым, т.е. никакого пути и имени файла ему не передается после перетаскивания файла на форму.

Добавлено через 20 часов 2 минуты
Вообщем тема частично решена!
C++
1
2
3
4
5
6
7
   HDROP drop_handle = (HDROP)Message.Drop;
   UnicodeString fName;
   DWORD a;
   //int filenum = DragQueryFileW(drop_handle, -1, NULL, NULL);
   //for(int i = 0; i < filenum; i++){
   a =  DragQueryFile(drop_handle, 0, fName.c_str(), MAXPATH);
   RichEdit1->Text = a
;

Выводить нужно через ДВОРД. Но текст выводится без первых символов.

Добавлено через 22 часа 42 минуты
Все работает по этой схеме! Осталось решить одну проблему с выводом данных!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
wchar_t *chFileName;
int Count;
Count = DragQueryFile(HDROP (Message.Drop), 0xFFFFFFFF,chFileName,MAXPATH); // число перетащенных файлов
for (int i=0;i<Count;i++)//цикл по файлам
  {
   DragQueryFile(HDROP (Message.Drop),i,chFileName,MAXPATH); // запрос имени файла
   RichEdit1->Lines->Add(chFileName);
  }
DragFinish(HDROP (Message.Drop)); // завершение перетаскивания
 
  }
Выскакивает ошибка при выводе на RichEdit1, хоть с этим может ко поможет?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2013, 19:23
Ответы с готовыми решениями:

Drag & Drop в datagridview при использовании datatable
Здравствуйте! Нужно реализовать Drag &amp; Drop в datagridview при использовании datatable. Есть такой недосконалый код, который частично...

Определение целевого местоположения (пути) при drag&drop из win form в explorer
Всем привет! Прошу подсказать по следующему вопросу: Имеется приложение win form, например с listBox. Я перетаскиваю: цепляю мышкой элемент...

Drag&Drop С++ Builder
подскажите как с ListBox передать текст в Edit?

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
14.06.2013, 02:59
Цитата Сообщение от incrome Посмотреть сообщение
DragQueryFile(HDROP (Message.Drop),i,chFileName,MAXPATH); // запрос имени файла
Прелестно. И куда это имя пишется? Буфер где? У тебя пока есть только четырехбайтовый wchar_t*. Может, лучше сделать как положено:

C++
1
2
3
DWORD size = DragQueryFile((HDROP)Message.Drop, i, 0, 0); // сначала запросить размер имени файла
chFileName = new wchar_t[size + 1]; // потом выделить буфер
DragQueryFile((HDROP)Message.Drop, i, chFileName, size + 1); // и только потом пытаться прочесть имя файла
?
0
9 / 9 / 5
Регистрация: 03.07.2012
Сообщений: 60
15.06.2013, 14:09  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Прелестно. И куда это имя пишется? Буфер где? У тебя пока есть только четырехбайтовый wchar_t*. Может, лучше сделать как положено:

C++
1
2
3
DWORD size = DragQueryFile((HDROP)Message.Drop, i, 0, 0); // сначала запросить размер имени файла
chFileName = new wchar_t[size + 1]; // потом выделить буфер
DragQueryFile((HDROP)Message.Drop, i, chFileName, size + 1); // и только потом пытаться прочесть имя файла
?
Я наверное пока книги читал, всегда пропускал раздел с выделением памяти((

Добавлено через 7 минут
Но я так сделал:
C++
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
27
28
29
void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
char *chFileName = "";
//AnsiString chFileName;
int Count;
Count = DragQueryFileA(HDROP (Message.Drop), 0xFFFFFFFF, chFileName, MAX_PATH);
for (int i=0;i<Count;i++)
  {
   if ( DragQueryFileA(HDROP (Message.Drop), i, chFileName, MAX_PATH) != 0 )
   {
        //MessageBox( Form4->Handle, "Its allright", "good", MB_OK);
   } else
   {
        //MessageBox( Form4->Handle, "Dont good, error", "error", MB_OK);
        chFileName = "Error";
   }
 
 
    for (int j=0; j < strlen( chFileName ); j++){
        RichEdit1->Lines->Strings[i] = RichEdit1->Lines->Strings[i] + chFileName[j];
        //RichEdit1->Lines->Strings[i] = chFileName;
        abc = chFileName;
        IcoGen(abc);
   }
  //Form4->Caption =  chFileName;
  }
DragFinish(HDROP (Message.Drop));
 
  }
Добавлено через 11 минут
Ну так вообще в идеале!
C++
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
27
28
  void __fastcall TForm4::WmDropFiles(TWMDropFiles& Message)
{
char *chFileName = "";
int Count;
Count = DragQueryFileA(HDROP (Message.Drop), 0xFFFFFFFF, chFileName, MAX_PATH);
for (int i=0;i<Count;i++)
  {
   DWORD size = DragQueryFile((HDROP)Message.Drop, i, 0, 0);
   chFileName = new char[size + 1];
   if ( DragQueryFileA(HDROP (Message.Drop), i, chFileName, MAX_PATH) != 0 )
   {
        MessageBox( Form4->Handle, "Its allright", "good", MB_OK);
   } else
   {
        MessageBox( Form4->Handle, "Dont good, error", "error", MB_OK);
        chFileName = "Error";
   }
 
 
    for (int j=0; j < strlen( chFileName ); j++){
        RichEdit1->Lines->Strings[i] = RichEdit1->Lines->Strings[i] + chFileName[j];
        //abc = chFileName;
        //IcoGen(abc);
   }
  }
DragFinish(HDROP (Message.Drop));
 
  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.06.2013, 14:09
Помогаю со студенческими работами здесь

Drag&Drop: отображение в Edit пути к перетянутому файлу
Требуется функция для перетаскивание файла из проводника в Edit с помощью DragDrop и отображения в Edit пути перетаскиваемого файла,...

Drag&Drop - передача файла перетаскиванием
Здравствуйте. Видел такую программу, в которой файл передавался в программу &quot;приятным&quot; способом - перетаскиванием. Берем...

Drag&Drop файла с определенными расширениями на Panel
Подскажите как сделать drag and drop файла? Нашел вот это: Работает хорошо, но нужно сделать что бы принимала не вся форма, а только...

Drag&Drop, перетаскивание мышкой файла на форму
День добрый! С Днем России! Организовал доморощенный Drag&amp;Drop в своей базе: Создал табличку с полем Гиперссылка На форму вывел с неё...

Срабатывание событий при Drag&Drop
Добрый вечер. Имеется 4 колоны. Нужно, чтобы срабатывало событие при drag&amp;drop. Нормально можно реализовать, только если я перевожу карту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru