Тема: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Всем добрый день
Функция

(getfiled)

дает возможность выбора одного файла для открытия, а как можно сделать чтобы была возможность выбора несольких файлов с Shift или Ctrl как в обычной Windows?

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Посмотрите описание функции (dos_getfilenav ...) из библиотеки DosLib версии 7 или большей.

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

А через AutoLisp я так понял никак? Просто всю прогу на LISP и DCL накатал ..... нехочется втыкать чтото постароннее для одной команды

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

feodul пишет:

А через AutoLisp я так понял никак?

Почему же никак? Посмотри отличную функцию:
Написал Тони Тонзило - начало было положено на форуме
http://discussion.autodesk.com/forum.jspa?forumID=130
Извини, сейчас нет времени искать точную ссылку, тем более, что я ее уже приводил и на этом форуме.

(defun BrowseFolder ( / ShlObj Folder FldObj OutVal)
  (vl-load-com)
  (setq
    ShlObj (vla-getInterfaceObject
       (vlax-get-acad-object)
       "Shell.Application"
     )
    Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "" 0)
  )
  (vlax-release-object ShlObj)
  (if Folder
    (progn
      (setq
  FldObj (vlax-get-property Folder 'Self)
  OutVal (vlax-get-property FldObj 'Path)
      )
      (vlax-release-object Folder)
      (vlax-release-object FldObj)
      OutVal
    )
  )
)

Если используешь экспрессы, можно еще проще:

(acet-ui-pickdir)

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Да это я уже умею но это возвращает совсем не то. Мне нужно чтобы из 10 файлов формата dwg выбрать 5 тыкая мышкой держа на клавише Ctrl.
Отлично подходит (dos_getfilenav ...) из библиотеки DosLib но посторонний файлы втыкать нехочется

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

> feodul
Можно сделать используя Vlisp и DCL. Но это будет не стндартный диалог выбора файлов, а твой собственный - сам считываешь все имена файлов из каталога и заполняешь ими listbox.

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

> Александр Ривилис
Гы точно. Что-то я об этом неподумал :)
Спасибо.
Александр я к вам в ICQ постучался но вы в невидимости чтоли или в привате?

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

> feodul
Ваш UIN? Постучитесь еще раз.

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

В XP для открытия диалога выбора нескольких файлов пользовался функцией, которая использовала cmdlgd.dll.

В Windows 7 эта dll не регистрируется даже для администратора (пишет dll загружен, но не удалось выполнить DllRegisterServer).

Здесь DwgRuLispLib есть функция, которая использует Allosys.dll.
В Windows 7 это работает, но окно диалога небольшое по размерам, и его нельзя растянуть.

Может есть полноценная замена для cmdlgd.dll?

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Дополнение
Windows 7 Professional 32 bit

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

feodul пишет:

Всем добрый день
Функция



Код   


(getfiled)дает возможность выбора одного файла для открытия, а как можно сделать чтобы была возможность выбора несольких файлов с Shift или Ctrl как в обычной Windows?

Попробуй такую шнягу

;;; fixo () 2006. All Rights Releaseed.
(defun    build_alert (lst / text)
   (alert
     (substr
       (setq text
          (apply 'strcat
             (mapcar
               '(lambda    (x)
              (strcat x "\n")
            )
               lst
             )
          )
       )
       1
       (1- (strlen text))
     )
   )
 )

;; ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;;
;; **                                                                              ;;
;; ** getfiledex                                                                   ;;
;; **                                                                              ;;
;; ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;;
;; **                                                                              ;;
;; ** Author:                                                                      ;;
;; **                                                                              ;;
;; ** Copyright © fixo, January 2010. All Rights Reserved.                         ;;
;; **                                                                              ;;
;; * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;;
;; ** Action : Select multiple files                                               ;;
;; ** Arguments : 'extens'  - String, file extension without dot                   ;;
;; **            'filter'  - String, usual filter for file types                   ;;
;; **            'folder'  - String, initial folder                                ;;
;; **            'title'   - String, dialog title                                  ;;
;; ** Return   : The list of selected files                                        ;;
;; ** Updated  : March 11, 2009                                                    ;;
;; ** Updated  : january 23, 2010                                                  ;;
;; ** e-mail : (apply 'strcat (list "fatty" "hallex" "@" "gmail." "com"))          ;;
;; ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;;

(defun getfiledex  (extens filter  folder title / cdlg files fname fstr intr pos)
  (vl-load-com)
  (defun str->lst  (str sep / pos)
    (if    (setq pos (vl-string-search sep str))
      (cons (substr str 1 pos)
        (str->lst (substr str (+ (strlen sep) pos 1)) sep)
        )
      (list str)
      )
    )
  (setq cdlg (vlax-get-or-create-object "MSComDlg.CommonDialog")) ;Win 7 <--- Win 7 ("UserAccounts.CommonDialog" for Win XP)
  
  (vlax-put-property cdlg 'InitDir folder)

  (vlax-put-property
    cdlg
    'Filter
    (vlax-make-variant (strcat filter extens))
    )
  (vlax-put-property cdlg 'Filterindex 1)

  (vlax-put-property cdlg 'Flags 145935) ;<-- summ of bytes (option settings)

  (vlax-put-property cdlg 'MaxFileSize (+ 1024 4096)) ;<-- may have a problem with op's user accounts 
  (vlax-put-property cdlg 'Max 20)
  (vlax-put-property cdlg 'DialogTitle title)
  (vlax-put-property cdlg 'DefaultExt extens)
  (if
    (not (vl-catch-all-error-p
       (vl-catch-all-apply
         '(lambda ()
        (vlax-invoke-method cdlg 'ShowOpen))
         )
       )
     )
     (progn
       (setq fname (vlax-get-property cdlg 'FileName))
       (vlax-release-object cdlg)          ; < ---do not miss
       (if (vl-string-position 32 fname)
     (progn
       (setq files (str->lst fname " ")
         path  (car files)
         files (mapcar '(lambda (x) (strcat path x))
                   (cdr files)
                   )
         )
       )
     (setq files fname)
     )
       )
     (setq files nil)
     )
  files
  )
;;; End of function
;; ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;;

;possible calling:
(build_alert(setq lst (getfiledex "dwg" "AutoCAD Files| *." "C:\\PROGRAMMING FOLDER\\" "\t***  Select Drawing(s)  ***")))
(build_alert(setq lst (getfiledex "lsp" "AutoLisp Files| *." "C:\\PROGRAMMING FOLDER\\" "\t***  Select Lisp Source File(s)  ***")))
(build_alert(setq lst (getfiledex "*" "All Files| *." "C:\\PROGRAMMING FOLDER\\" "\t***  Select Any File(s)  ***")))
;; ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;;

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

функция getfiledex в Windows7 (в отличие от ХР) не работает.

(изменено: Владимир Азарко, 27 декабря 2010г. 18:10:08)

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Anatoly пишет:

функция getfiledex в Windows7 (в отличие от ХР) не работает.

А у меня в XP нужно было заменить

(vlax-put-property cdlg 'InitDir folder) 

на
 

(vlax-put-property cdlg 'InitialDir folder) 

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Anatoly пишет:

функция getfiledex в Windows7 (в отличие от ХР) не работает.

У меня установлен только Windows 7 (для информации) и почему-то все работает,
может у тебя нелицензионный.

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Владимир Азарко пишет:


Цитата   


Anatoly пишет:
функция getfiledex в Windows7 (в отличие от ХР) не работает.
А у меня в XP нужно было заменить




Код   


(vlax-put-property cdlg 'InitDir folder)
на




Код   


(vlax-put-property cdlg 'InitialDir folder)

Согласен
Я просто не приводил код для ХР , да там есть разница
в наименовании свойств и значений флагов, но поскольку
проверить не могу то без проверки, стараюсь пример не
приводить(у меня только Win7 на данный момент)

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Windows 7 Professional Rus лицензионный.

А MSComDlg.CommonDialog - это из COMDLG32.OCX?

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

fixo пишет:

Попробуй такую шнягу

:o  :( Очень "печальный диалог"... Лучше уж самому сделать... ;)

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

gomer пишет:


Цитата   


fixo пишет:
Попробуй такую шнягу
    Очень "печальный диалог"... Лучше уж самому сделать...

Просвети нас неучей, может веселенький напишешь, обхохочемся тогда

(изменено: gomer, 11 января 2011г. 00:33:52)

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

fixo пишет:

Просвети нас неучей, может веселенький напишешь, обхохочемся тогда

:oops:

AY пишет:

Посмотрите описание функции (dos_getfilenav ...) из библиотеки DosLib версии 7 или большей.

Времена меняются...
Если и создавать такой диалог, то с Treview и Listbox с возможностью перетаскивания файлов из дерева в список (из разных папок) :idea:

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Александр Ривилис пишет:

Можно сделать используя Vlisp и DCL. Но это будет не стндартный диалог выбора файлов, а твой собственный - сам считываешь все имена файлов из каталога и заполняешь ими listbox.

А подскажи(намекни) пожалуйста, как можно выбор\смену каталога организовать для этого дела.
Как-то не очень красиво, если плюс к DCL, для выбора папки просить пользователя выбрать любой файл через getfiled

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Ну например организовать два элемента управления:
1. Диски и каталоги
2. Файлы внутри выбранного каталога.

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Александр Ривилис,
Ну да, вроде всё просто, в обоих случаях нам всё нужное выдаст vl-directory-files.
Осталось только как-то узнать имена всех дисков?

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Disney пишет:

Осталось только как-то узнать имена всех дисков?

На чистом VisualLisp? Ну, например, прочитать ветку реестра: HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
Выбрать из неё только строки вида: \DosDevices\имя диска:

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Александр, спасибо большое!

А имя диска уже не от куда не выудить?
типа:
С [Sys]
D [Work]
E [DVD RW дисковод]
...

И если не сложно, пару слов про реестр, я просто впервые к ним обратился, раньше знал что они есть, но как-то нужды не было. Почему HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices - ветка, а HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevices - не ветка, или ветка, но почему тогда по ней не выводиться список подразделов или параметров, чем тогда для неё является \имя диска

Re: Как вызвать диалог открытия файла с позвожностью выбора более одного файла

Disney пишет:

Почему HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices - ветка, а HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices\DosDevice­s - не ветка

Это к Microsoft. smile