Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

CDialog

435
07 апреля 2004 года
avatara
188 / / 07.07.2003
Никто не знает как сделать выбор не одного, а нескольких файлов в окне диалога открыть. И как запомнить все выбранные файлы.

PS - может какие-то флаги надо ставить??
Спасибо.
461
07 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by avatara
Никто не знает как сделать выбор не одного, а нескольких файлов в окне диалога открыть. И как запомнить все выбранные файлы.

PS - может какие-то флаги надо ставить??
Спасибо.



Если вы имеете в виду CFileDialog, то при его создании нужно в четвертом параметре добавить флаг OFN_ALLOWMULTISELECT. Тогда можно будет выбрать несколько файлов. Получить их имена можно примерно так:

Код:
// Создаем диалог с множественным выбором
CFileDialog FileDialog(true, NULL, "*.*", OFN_ALLOWMULTISELECT|OFN_EXPLORER);
// Если был сделан выбор
 if (FileDialog.DoModal()==IDOK)
 {
// получаем ссылку на имя первого файла
 POSITION pos = FileDialog.GetStartPosition();
// Пока эта ссылка не NULL
  while (pos)
  {
// получаем ПОЛНОЕ имя очередного файла
  CString Name = FileDialog.GetNextPathName(pos);
// и делаем с ним все что нужно
  ...
  }
 }

Метод GetNextPathName возвращает имя файла с полным путем и переставляет ссылку на следующий файл или присваивает ей NULL, если больше файлов нет.

Имена всех выбранных файлов помещаются в буфер по адресу CFileDialog.m_ofn.lpstrFile, так что можно обращаться и напрямую к нему. В начале буфера расположено имя папки, в которой выбирались файлы(с полным путем), затем символ-разделитель, имя первого выбранного файла, символ-разделитель, имя второго файла ... имя последнего файла, два символа-разделителя.

В качестве символа-разделителя используется либо пробел (если диалог в старом стиле), либо нуль-байт (если диалог - в стиле Explorer, это задается добавлением флага OFN_EXPLORER). Если был выбран только один файл, то в буфере будет просто имя файла с полным путем (без разделителя).

Буфер должен быть достаточно большим, чтобы в него поместились все имена. Его размер содержится в переменной CFileDialog.m_ofn.nMaxFile (по умолчанию - 256 байт).
1.8K
07 апреля 2004 года
scanf
72 / / 10.12.2003
Цитата:
Originally posted by avatara
Никто не знает как сделать выбор не одного, а нескольких файлов в окне диалога открыть. И как запомнить все выбранные файлы.

PS - может какие-то флаги надо ставить??
Спасибо.



Зайди сюда :
http://www.firststeps.ru/mfc/steps/r.php?15
Тема очень не плохо изложена.

461
08 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by scanf


Зайди сюда :
http://www.firststeps.ru/mfc/steps/r.php?15
Тема очень не плохо изложена.



А еще можно посмотреть r.php?139 и r.php?140 по тому же адресу.

435
08 апреля 2004 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by gerard


А еще можно посмотреть r.php?139 и r.php?140 по тому же адресу.


Огромное спасибо всем!!!!!

435
09 апреля 2004 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by gerard


А еще можно посмотреть r.php?139 и r.php?140 по тому же адресу.



Товарищи посмотрите пожалуйста проект. С множественным выбором файлов теперь все в порядке. Может посоветуете как-то улучшить работу прогресс-бара.

461
09 апреля 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by avatara


Товарищи посмотрите пожалуйста проект. С множественным выбором файлов теперь все в порядке. Может посоветуете как-то улучшить работу прогресс-бара.



У вас в CDom2Dlg::OnFind объявлены две переменных i: одна в команде for, а другая - внутри цикла. При этом m_progress.SetPos(i) использует вторую из них (номер строки), хотя по логике программы должен использовать первую (номер файла), поэтому прогресс-бар отображает не то, что нужно. Так что переименуйте одну из переменных, и все будет хорошо.

Кстати, о выборе файлов. Если общая длина имен выбранных файлов превысит 256 байт, то они не поместятся в буфер (я об этом упоминал и на firststeps.ru об этом тоже говорится). Рекомендую добавить в CDom2Dlg::OnOpen перед вызовом fd.DoModal следующий код:

 
Код:
fd.m_ofn.nMaxFile = 65535; // длина буфера
fd.m_ofn.lpstrFile = new char[fd.m_ofn.nMaxFile];
fd.m_ofn.lpstrFile[0] = NULL;

и тогда 64 килобайт хватит практически на любое число файлов. Только не забудьте потом сделать delete [] fd.m_ofn.lpstrFile.
435
12 апреля 2004 года
avatara
188 / / 07.07.2003
Цитата:
Originally posted by gerard


 
Код:
fd.m_ofn.nMaxFile = 65535; // длина буфера
fd.m_ofn.lpstrFile = new char[fd.m_ofn.nMaxFile];
fd.m_ofn.lpstrFile[0] = NULL;

и тогда 64 килобайт хватит практически на любое число файлов. Только не забудьте потом сделать delete [] fd.m_ofn.lpstrFile.



Спасибо большое. Про переменные - просто не заметил. Всех с праздником.
Христос воскрес!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог