Можно ли в FileDialog разрешить выбор только определённых файлов?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
kreator
✯ Ветеран ✯
Сообщения: 5252
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 27 раз

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение kreator »

Надо бы разрешить выбор только файлов с определёнными расширениями. Можно ли запретить другие в самом FileDialog? или делать отдельную проверку? По факту, в принципе пользователь имеет в Filedialog возможность руками написать свою "маску" и выбрать совсем не то, что нужно.
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8351
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 35 раз
Поблагодарили: 111 раз

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение Игорь Столяров »

ДД !

FileDialog() - это элемент Win API и его ограничения нужно искать в политиках Windows.
У нас есть такой прибамбас, как выбор файла (с пакетом данных) из списка.
При этом сам список - это обычный BROWSE с данными о времени создания файла - создаётся функцией DIRECTORY().
И вот здесь уже можно строго предлагать для выбора именно те файлы, которые прошли фильтрацию по признакам.
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
kreator
✯ Ветеран ✯
Сообщения: 5252
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 27 раз

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение kreator »

Вы же не можете создать список всех нужных файлов во всех доступных каталогах, на всех сетевых ресурсах (да ещё и неизвестных).
Вообще как-то неудобно. Проверку после работы FileDialog можно сделать. Дальше что? Опять вызывать FileDialog? Или ограничиться только сообщением?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8351
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 35 раз
Поблагодарили: 111 раз

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение Игорь Столяров »

kreator писал(а): 14 Январь 2025, 22:35 Вы же не можете создать список всех нужных файлов во всех доступных каталогах
Даже не пробовал. У нас софт строгого режима.
Есть папка обмена и в ней есть файлы. Шаг вправо или шаг влево - выстрел. :)
kreator писал(а): 14 Январь 2025, 22:35 Или ограничиться только сообщением?
Так или иначе при неправильном выборе пользователь не получит желаемое.
А дальше записит от высоты отношений программы с пользователем. Можно и сообщить.
За теми, кто отстал, не возвращаться ! 🏴‍☠️ Кодекс
smmsmrtn
Прохожий
Сообщения: 1
Зарегистрирован: 19 Декабрь 2025, 13:17

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение smmsmrtn »

Фильтр в диалоге — это лишь удобство для пользователя, а не защита. Поэтому отдельная проверка после выбора обязательна. :nr: best sex dolls
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 271
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 23 раза
Поблагодарили: 1 раз

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение SergioRaguzini »

kreator писал(а): 14 Январь 2025, 22:35 Вы же не можете создать список всех нужных файлов во всех доступных каталогах, на всех сетевых ресурсах (да ещё и неизвестных)
Привет Всем!
Можно, используя рекурсивный вызов (идеи взял с каого-то забугорного форума). У меня была необходиость удалить старые файлы со всей метки выделенного для работы диска, во всех папках и подпапках. Все работает корректно (это кусок из cla-приложения медицинской направленности, запись "истории" из кода, конечно надо выкинуть,).

Код: Выделить всё

!*  *  *     M a i n   C o d e   S e c t i o n    *  *  *!

    SETCURSOR(CURSOR:Wait)         ! turn  ON hourglass mouse cursor

    DO PrepareRoutine


! 1. Получить список файлов:

                             DIRECTORY(all_Content, LOC:Source & '*.*', ff_:NORMAL)   ! Get all files and directories
       LOC:content_Counter = RECORDS(all_Content)
    If LOC:content_Counter                     ! значит есть файлы или под-папки внутри анализируемой папки
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
        LOOP LOC:LoopIndex_1 = LOC:content_Counter TO 1 BY -1
!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
           GET(all_Content, LOC:LoopIndex_1)
           DO Animation        ! индикация

           if BAND(A_C:Attrib, ff_:DIRECTORY) AND A_C:ShortName <> '..' AND A_C:ShortName <> '.'
!-    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -!
              CYCLE                                   ! Let sub-directory entries stay
!-    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -!
         else
                      all_Files.name      = all_Content.name
                      all_Files.shortname = all_Content.shortname
                      all_Files.date      = all_Content.date
                      all_Files.time      = all_Content.time
                      all_Files.size      = all_Content.size
                      all_Files.attrib    = all_Content.attrib
                  ADD(all_Files)          ! добавить файл в список
!-    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -!
          end !if
!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
        END !Loop
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
   End !If LOC:content_Counter


! 2. Получить список папок:

    FREE(all_Content)    ! в исходное
                             DIRECTORY(all_Content, LOC:Source & '*.*', ff_:directory)   ! Get all directories
       LOC:content_Counter = RECORDS(all_Content)
    If LOC:content_Counter                     ! значит есть файлы или под-папки внутри анализируемой папки
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
        LOOP LOC:LoopIndex_1 = LOC:content_Counter TO 1 BY -1
!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
           GET(all_Content, LOC:LoopIndex_1)
           DO Animation        ! индикация

           if BAND(A_C:Attrib, ff_:DIRECTORY) AND A_C:ShortName <> '..' AND A_C:ShortName <> '.'
!-    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -!
                      all_Folders.name      = all_Content.name
                      all_Folders.shortname = all_Content.shortname
                      all_Folders.date      = all_Content.date
                      all_Folders.time      = all_Content.time
                      all_Folders.size      = all_Content.size
                      all_Folders.attrib    = all_Content.attrib
                  ADD(all_Folders)          ! добавить папку в список
!-    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -    -!
          end !if
!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
        END !Loop
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -!
   End !If LOC:content_Counter


     DO del_Files:Begin_Transaction    ! начать транзакцию

! проанализировать и удалить файлы с датой меньше заданной:

     LOOP LOC:LoopIndex_2 = 1 TO RECORDS(all_Files)    ! сканирование очереди файлов
!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
      GET(all_Files, LOC:LoopIndex_2)         ! получить данные по номеру
      DO Animation                            ! индикация
                               GLO:Counter1 += 1

         CLEAR(HIS:RECORD)

      If all_Files.Date < GLO:del_Date
!-   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -!
                               GLO:Counter2 += 1
               HIS:id_rec    = GLO:Counter2
               HIS:ord_num   = GLO:Counter2
                               LOC:Target = LOC:Source & CLIP(all_Files.Name)
               HIS:file_name = LOC:Target

                 REMOVE(LOC:Target)
            if ~ ErrorCode()
                 HIS:reuslt_Descr = 'успешно'
          else
                 HIS:result_Code  = ErrorCode()
                 HIS:reuslt_Descr = 'ошибка ' & ErrorCode() & ' -> '& Error()
                 GLO:ErrorsFound  = TRUE      ! глоб.признак наличия ошибок
           end !if ~

               HIS:date_time = FORMAT(all_Files.Date, @D06.) & '  ' & FORMAT(all_Files.Time, @T01)
           ADD(History)      ! добавить запись

!-   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -!
     End !If

         if ~ (GLO:Counter1 % 100) then DISPLAY() .       ! индикация

!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
      End !Loop

     DISPLAY()
     DO del_Files:End_Transaction       ! завершить транзакцию


     LOOP LOC:LoopIndex_3 = 1 TO RECORDS(all_Folders)    ! сканирование очереди под-папок
!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
      GET(all_Folders, LOC:LoopIndex_3)         ! получить данные по номеру

          LOC:New_Source = LOC:Source & CLIP(all_Folders.Name) & '\'

          del_Files:Analyse(LOC:New_Source)             ! рекурсивный вызов этой же процедуры
!-  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -  .  -!
      End !Loop



!.  .  .  .  .  к о н е ц   п р о ц е д у р ы  .  .  .  .  .  .!
Аватара пользователя
SergioRaguzini
Старожил
Сообщения: 271
Зарегистрирован: 08 Декабрь 2009, 19:16
Откуда: Краснодарский край
Благодарил (а): 23 раза
Поблагодарили: 1 раз

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение SergioRaguzini »

kreator писал(а): 14 Январь 2025, 22:35 на всех сетевых ресурсах (да ещё и неизвестных)
носители можно через API, а для сети - где-то встречал в интернете утилиту ком.строки сканирующую все сетевые подключения и сохр.результат в текстовом файле...
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 5671
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 20 раз
Поблагодарили: 82 раза

Можно ли в FileDialog разрешить выбор только определённых файлов?

Сообщение finsoftrz »

У меня тоже в стандартной библиотеке есть функция выбора файла (каталога), основанная на directory. Она подменяет стандартный Filedialog в режиме защищенного доступа, когда пользователю запрещено выходить куда-то за рамки приложения на терминальном сервере. Заодно и не лазить за пределы выше заданного каталога.
Замена через system{PROP:FileDialogHook}.

filedialog.png
C6/C12, ШВС, tps/btrieve.
Ответить