Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Диалог OpenFile

Ответить
Настройки темы
Диалог OpenFile

Пользователь


Сообщения: 86
Благодарности: 0

Профиль | Отправить PM | Цитировать


В VCL есть несколько стандартных диалогов - среди них - диалог OpenDialog. Подскажите, как унаследовать от него (или какой-то другой способ) другой диалог, который может передавать в программу сразу несколько имен файлов для открытия, а не один

Отправлено: 21:26, 18-03-2006

 

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Sir Z
Так у этого диалога есть же свойство ofAllowMultiSelect, разрешающее множественный выбор файлов...

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 23:54, 18-03-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 1647
Благодарности: 146

Профиль | Отправить PM | Цитировать


А вот меня этот вопрос тоже интересует. Сделал я этот MultiSelect, как я понял, по умолчанию выдается диалог устаревшего образца. И даже удалось это побороть. Только я не смог разобраться, в каком формате выдается путь к каталогу и имена файлов. Или я туплю, или у меня где-то это дело режется раньше времени по какому-то нолику-разделителю. Где бы посмотреть подробные разъяснения?

Отправлено: 21:53, 19-03-2006 | #3


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Sir Z
Если что,то я объясняю на основе WinAPI,а не VCL.
Цитата:
И даже удалось это побороть
...с помощью флага OFN_EXPLORER .
Итак,мы выставляем в структуре OPENFILENAME флаг OFN_ALLOWMULTISELECT.
При выборе нескольких файлов в принимающем буфере путь директории отделяется от файловой части нулевым байтом.В свою очередь названия файлов также разделяются между собою нулевыми байтами,и всё это дело,в конце концов,завершается двумя нулевыми байтами.
Если же был выбран только один файл,то принимающий буфер не содержит нулевого байта между директорией и файловой частью.
В структуре OPENFILENAME есть поле nFileOffset,которое является смещением относительно начала принимающего буфера до файловой части.Мы его будем использовать.
Теперь код:
Код: Выделить весь код
var
 OpenDlgBox : TOpenFileName;
 s : String;
 cf : PChar;
 pathFile : array[0..4096] of Char = ' ';
begin
// типа заполняем структуру OPENFILENAME
 OpenDlgBox.lStructSize := SizeOf(OpenDlgBox);
 OpenDlgBox.hWndOwner := Handle;
 OpenDlgBox.lpstrFilter := 'Text Files'#0'*.txt'#0#0;
 OpenDlgBox.lpstrFile := pathFile;
 OpenDlgBox.nMaxFile := SizeOf(pathFile);
 OpenDlgBox.Flags := OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or
         OFN_ALLOWMULTISELECT or OFN_EXPLORER;

if Length(OpenDlgBox.lpstrFile) < OpenDlgBox.nFileOffset then
{ Если выбрано несколько файлов,
   т.к. в данном случае функция Length читает длину строки до ближайшего нулевого байта,а у нас он будет стоять
   сразу за названием директории,и значение поля nFileOffset,которое характеризует байт начала
   файловой части,будет лежать после этого нулевого байта,т.е. значение поля nFileOffset будет больше длины,
   возвращаемой функцией Length в конкретном случае   }
begin
 cf := pathFile;
 inc(cf, OpenDlgBox.nFileOffset);
 s := 'Выбрано несколько файлов в директории: '+pathFile+#13#10;

repeat
 s := s+cf+#13#10;
 inc(cf, Length(cf) + 1);
until Length(cf) = 0; // а тут мы упрёмся во второй нулевой байт той пары,которая стоит в конце буфера

 end else
begin
 s := 'Выбран только один файл: '+pathFile;
end;
 SendMessage(hMemo, WM_SETTEXT, 0, lParam(s));

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 19:37, 20-03-2006 | #4


Ветеран


Сообщения: 1647
Благодарности: 146

Профиль | Отправить PM | Цитировать


Спасибо, попробую применить!

Отправлено: 21:03, 20-03-2006 | #5


Ветеран


Сообщения: 1647
Благодарности: 146

Профиль | Отправить PM | Цитировать


Да, нашел свою ошибку: не использовал nFileOffset, в результате получал только папку, до первого нулевого байта. Спасибо!

Отправлено: 09:28, 21-03-2006 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Диалог OpenFile

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Убрать диалог denis52261 Microsoft Windows 2000/XP 4 20-11-2009 08:16
Диалог при распаковке прог. Cibersoft Prolex Автоматическая установка приложений 12 17-05-2009 09:56
Fresh Copy диалог не появляется. pethead Автоматическая установка Windows 2000/XP/2003 0 17-04-2009 08:32
[решено] Диалог указания папки D_Master AutoIt 5 18-03-2009 22:44
Как создать стандартное меню windowsа OpenFile? Guest Программирование и базы данных 1 06-10-2003 08:49




 
Переход