Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 127

Перетаскивание на форму несколько файлов и работа через ListBox1

03.07.2012, 20:07. Показов 1941. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте, у меня на форме есть компонент ListBox1
я дропаю один файл и работаю с ним.
возникла новая задача!! нужно дропнуть пару файлов чтоб они добавились сперва в ListBox1, а потом я выделял мышкой один файл и работал над ним!!
как мне это сделать?
мой код дропа:

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
30
31
  void __fastcall TForm1::WMDropFiles (TWMDropFiles &message)
  {
    HDROP drop = (HDROP)message.Drop;
    // получить колчество файлов
    const int iFiles = DragQueryFile (drop, -1, NULL, NULL);
    for (int i=0; i<iFiles; i++)
     {
      char path [MAX_PATH];
      // получаем полный путь к файлу
      DragQueryFile (drop, i, path, sizeof(path));
      const AnsiString sFullFileName (path);
      // используя стандартные функци VCL, получаем отдельно путь и имя
      const AnsiString sPath = ExtractFilePath (sFullFileName);
      const AnsiString sName = ExtractFileName (sFullFileName);
      //Дальше используем мз в зависимости от назначения
       Memo1->Lines->Add(sPath);
       Memo2->Lines->Add(sName);
       Label2->Caption=sName;
       Label4->Caption=sPath;
 
 
       a = sPath; // путь
       b = sName; // имя
       Label3->Caption=sPath+sName;
 
      S1= ExtractFileExt(sPath+sName); //S1= .txt например(берётся только расширение)
      Label1->Caption=S1;
 
     }
 
  }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2012, 20:07
Ответы с готовыми решениями:

Перетаскивание файлов на форму
Всем привет! Появился вопрос, как перетащить несколько файлов на форму, чтобы пути к этим файлам добавились в comboBox, например? Заранее...

Перетаскивание файлов на форму, где уровень целостности - HIGH
Привет! Подскажите, пожалуйста, как грамотно спроектировать приложение. Оно запускается с повышенными привилегиями (манифест),...

Перетаскивание из listBox1 в listBox2
Здравствуйте. Не понимаю как сделать перетаскивание из listBox1 в listBox2. Помогите пожалуйста. код: using System; using...

13
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.07.2012, 22:01
А где проблема? Пути к скинутым файлам ты получаешь в цикле - чего же боле? Открываешь файлы по этим путям да работаешь с ними.
0
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 127
05.07.2012, 15:02  [ТС]
я имел в виду как это организовать!!! нужно создавать наверное место а именно массив где будут храниться пути конкретных индексов ??? то есть 0 ячейка соответствует mass_pass 0 где (0=С:\test)
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
05.07.2012, 16:32
Просто в этом же цикле
C++
1
2
3
4
      DragQueryFile (drop, i, path, sizeof(path));
      const AnsiString sFullFileName (path);
 
      ListBox1->Items->Add(sFullFileName);
Все, пути в листбоксе - берем, пользуемся.
0
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 127
05.07.2012, 16:55  [ТС]
это всё хорошо, но лист боксе должно отабражаться только имя и расширение , а там же полный путь с именем файла!! как сделать правильно??????
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
05.07.2012, 17:55
Использовать map:
C++
1
2
3
4
5
6
7
8
9
map<AnsiString, AnsiString> named_paths;
// далее в цикле заполняем его и листбокс:
      char path [MAX_PATH];
      DragQueryFile (drop, i, path, sizeof(path));
      const AnsiString sFullFileName (path);
      const AnsiString sPath = ExtractFilePath (sFullFileName);
      const AnsiString sName = ExtractFileName (sFullFileName);
      named_paths[sName] = sPath;
      ListBox1->Items->Add(sName);
Потом путь можно получать так:
C++
1
AnsiString current_path = named_paths.find( ListBox1->Items[ListBox1->ItemIndex] )->second;
0
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 127
05.07.2012, 19:40  [ТС]
никак не могу откомпилировать!!!
орёт на named_paths
[BCC32 Error] Unit1.cpp(67): E2451 Undefined symbol 'named_paths'
[BCC32 Warning] Unit1.cpp(68): W8004 'current_path' is assigned a value that is never used
я же объявил его выше!! ну просит, ещё раз объявляю тогда кричит на find в слове named_paths.find
может глобально нужно чего то объявить???
вот мой код:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//---------------------------------------------------------------------------
#include <vcl.h>
#include <map.h> //для транслита библиотека
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
using namespace std;
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  DragAcceptFiles (Form1->Handle, true); // разрешение на дроп
//обьявил маповую переменную  named_paths
  map<AnsiString, AnsiString> named_paths;
}
//---------------------------------------------------------------------------
 
    void __fastcall TForm1::WMDropFiles (TWMDropFiles &message)
   {
    HDROP drop = (HDROP)message.Drop;
    // получить колчество файлов
    const int iFiles = DragQueryFile (drop, -1, NULL, NULL);
    for (int i=0; i<iFiles; i++)
     {
 
 
map<AnsiString, AnsiString> named_paths;
// далее в цикле заполняем его и листбокс:
      char path [MAX_PATH];
      DragQueryFile (drop, i, path, sizeof(path));
      const AnsiString sFullFileName (path);
      const AnsiString sPath = ExtractFilePath (sFullFileName);
      const AnsiString sName = ExtractFileName (sFullFileName);
      named_paths[sName] = sPath;
      ListBox1->Items->Add(sName);
 
 
       a = sPath; // путь
       b = sName; // имя
       Label3->Caption=sPath+sName;
 
      S1= ExtractFileExt(sPath+sName); //S1= .txt напимер(берётся только расширение)
      Label1->Caption=S1;
 
     }
 
 
  }
//-----------------------------------------------------------------
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ed=Edit1->Text;
 rename ((a+b).c_str(),(a+ed+S1).c_str());
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
 
}
//---------------------------------------------------------------------------
может неправильно что то выставляю???
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
05.07.2012, 20:46
nuSan, даже чтобы копипастить надо маленько думать. Ты объявляешь переменную named_paths в цикле - знаем, что такое циклы? Она создается и уничтожается на каждой итерации цикла и существует исключительно в теле цикла. Это то, что надо? Очевидно, нет - она должна существовать на протяжение времени работы программы и быть видима в любой функции формы.

А где нужно объявлять то, что должно существовать, пока существует форма, и что должно быть доступно любому методу класса формы?

Добавлено через 42 минуты
Цитата Сообщение от nuSan
я эту строку куда только не засовывал!!!
и в привате писал в файле unit1.h
и в файле unit1.cpp
__fastcall TForm1::TForm1(TComponent* Owner)
потом уже выше цыкла от без исходности
void __fastcall TForm1::WMDropFiles (TWMDropFiles &message)
и под заголовками сразу писал!!
все равно не помогает!!!
Объявлять надо один раз, в одном месте в данном случае - в классе формы, в любом разделе, кроме published; я бы предпочел public.

И ошибки лучше впредь описывай в формате: текст ошибки и строка кода, на которой эта ошибка возникла. Иначе бывает крайне затруднительно понять, в чем дело.
0
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 127
05.07.2012, 20:52  [ТС]
я кстате в паблик и добовлял а не в паблишед!!
у меня уже крыша едит! я окончательно запутался
давай в приват пообщаемся!!
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
06.07.2012, 12:25
я помню просто загружал пути в отдельный StringList, а в ListBox отображал только имена.
ну и работал потом соответственно параллельно с обоими, запарок не было.
0
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 127
06.07.2012, 16:27  [ТС]
я примерно так и сделал, я создал второй лист бокс и туда выводил путь параллельно с первым , куда писалось только имя, и тогда нажимал индекс в первом листбоксе, то всё работало как надо!!
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
06.07.2012, 19:19
Цитата Сообщение от nuSan
в общем я доделал но по своему способу и работает не хуже)))
знач добавил второй листбокс, и туда записывал пути, зделал на форме маленьким и невидимым))
дальше при нажати на любой итем лист бокса, в лейбл выводиться тот же индекс который во втором листбоксе)))
int i=ListBox1->ItemIndex;
Label4->Caption=ListBox1->Items->Strings[i];
Label5->Caption=ListBox2->Items->Strings[i];

но мне охота твой способ испробовать!!! , ты можешь рабочий код прислать???
Вот рабочий вариант, изначально я допустил неточность, обратившись за строчками листбокса к ListBox1->Items[i]...

Не по теме:

nuSan, нет совершенно никакой необходимости обсуждать вопросы, которым посвящен форум, в личке - на то это и форум, чтоб все желающие могли почитать.:)


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class TForm1
               : public TForm {
__published: // IDE-managed Components
 
    TListBox *listbox1;
    TMemo *memo1;
 
    void __fastcall listbox1Click( TObject *Sender );
private: // User declarations
public:  // User declarations
 
    map <String, String> named_paths;
 
    __fastcall TForm1( TComponent *Owner );
    void __fastcall wm_drop_files( TWMDropFiles &msg );
    BEGIN_MESSAGE_MAP
                   MESSAGE_HANDLER( WM_DROPFILES, TWMDropFiles, wm_drop_files )
                   END_MESSAGE_MAP( TForm );
};
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
30
31
32
33
#include <vcl.h>
#include <dir.h>
#include <map.h>
#pragma hdrstop
 
#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1( TComponent *Owner )
               : TForm( Owner ) {
    DragAcceptFiles( Handle, true );
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::wm_drop_files( TWMDropFiles &msg ) {
    HDROP drop_handle = ( HDROP )msg.Drop;
    char filename_buffer[MAXPATH];
    String short_name;
    int files_amount = DragQueryFile( drop_handle, -1, NULL, NULL );
    for ( int i = 0; i < files_amount; i++ ) {
        DragQueryFileA( drop_handle, i, filename_buffer, MAXPATH );
        short_name = ExtractFileName( String( filename_buffer ) );
        named_paths[short_name] = String( filename_buffer );
        listbox1->Items->Add( short_name );
    }
    DragFinish( drop_handle );
}
void __fastcall TForm1::listbox1Click( TObject *Sender ) {
    memo1->Lines->LoadFromFile( named_paths.find( listbox1->Items->Strings[listbox1->ItemIndex] )->second );
}
// ---------------------------------------------------------------------------
Вот экзешник:Project1.rar
0
1 / 1 / 0
Регистрация: 24.12.2010
Сообщений: 127
09.07.2012, 11:49  [ТС]
ок!! скажем всё работает!! но я перепроверял 2 раза, что в экзешнике что в коде, в компонент мемо выдаёт кракозябру!!! кодировку прописать надо наверное!!!))
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
09.07.2012, 18:04
Цитата Сообщение от nuSan Посмотреть сообщение
но я перепроверял 2 раза, что в экзешнике что в коде, в компонент мемо выдаёт кракозябру
Конкретнее. Кто, где, когда выдает - и главное, зачем.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2012, 18:04
Помогаю со студенческими работами здесь

Узнать полный путь к файлу, через перетаскивание на форму?
Что-то я не пойму ни как... Как узнать полный путь к файлу, который перетащил на форму. По идее код: Private Sub Form1_DragDrop(ByVal...

Как скачивать несколько файлов через WebClient по очереди, через DownloadFileAsync
Доброй ночи. Столкнулся с проблемой по скачиванию нескольких файлов друг за другом. Фулл код как скачиваю: void DownloadMPQ(Uri u,...

Внесение через форму несколько значений
Попробую объяснить на пальцах. Есть таблица в MS Access c 6-ю столбцами. Первый столбец содержит название изделия, второй столбец...

Загрузка файлов на сервер через форму
Подскажите, в чем ошибка? Только недавно начала осваивать эту тему. echo &quot;&lt;form method='POST' action=''...

Отправка нескольких файлов через форму
Доброго времени суток! Есть форма, в которой есть произвольное кол-во input'ов для отправки файлов: &lt;form action = &quot;&quot;...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru