powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как сделать слайд-шоу? Перебор файлов в папке.
18 сообщений из 18, страница 1 из 1
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573299
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну т.е. хочу менять картинку в PictureBox.
Задал folder с "картинками" -понятно.
Меняем по таймеру - понятно.
Там какие-то файлы.
Ну например про каждый файл (годится/не годится) по каким-то критериям я сделаю (быстрый анализ на предмет картинка/не картинка, и какой у нее размер).

Т.е. как мне зная текущий "picture1.jpg", вычислить следующий "picture2.jpg" -чтоб бегал "по кругу"? Без составления ручных списков файлов или программного списка?

И какие ф-ции использовать для этого? Scripting.File или как там его я не перевариваю.

Дайте идею.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573340
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dir.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573470
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyDir.
Судя по документации и паре тестов, согласен.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Dim cur_file As String

Private Sub CommandFirst_Click()
  cur_file = Dir("C:\Documents and Settings\All Users\Application Data\MyProga\Image\*.jpg", vbNormal)
  Debug.Print cur_file
End Sub

Private Sub CommandNext_Click()
  cur_file = Dir()
  If cur_file = "" Then
    CommandFirst_Click
  Else
    Debug.Print cur_file
  End If
End Sub



*.jpg - только jpg
*.* -все файлы

А как задать маску, чтоб находил *.jpg, *.bmp, *.gif
а все остальное *.txt *.pdf и т.д. игнорировал?

Вариант ...\*.jpg|*.bmp|*.gif не прокатил.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573503
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через запятую.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573513
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyЧерез запятую.

Код: vbnet
1.
"C:\Documents and Settings\All Users\Application Data\MyProga\Image\*.jpg"



Не понимаю, не получается
...\(*.jpg, *.bmp) не работает

Напиши как переделать.
Боюсь придется *.* и анализировать расширения ручками, если нет - переход к след. файлу.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573555
Volodbka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a$ = "bmp"
a$ = "jpg"
a$ = "gif"
cur_file = Dir("C:\Documents and Settings\All Users\Application Data\MyProga\Image\*." & a$ , vbNormal)
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573643
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Volodbka,

Что-то я не понимаю. Ну и найдет он gif только, а надо
все *.jpg, все *.bmp и все *.gif
Похоже одной маской никак.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573657
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Либо 2 вложенных цикла - по расширениям и по файлам, либо перебор всех файлов (*.*) и проверка расширения.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573676
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77AntonariyЧерез запятую.

Код: vbnet
1.
"C:\Documents and Settings\All Users\Application Data\MyProga\Image\*.jpg"



Не понимаю, не получается
...\(*.jpg, *.bmp) не работает

Напиши как переделать.
Боюсь придется *.* и анализировать расширения ручками, если нет - переход к след. файлу.ммм, это в консоли через запятую:
dir *.jpg,*.bmp

Попробуй установить текущей директорией C:\Documents and Settings\All Users\Application Data\MyProga\Image\ (не помню функцию) и сделать Dir("*.jpg,*.bmp")

Если не сработает, то *.*, а расширения проверять кодом:
Код: vbnet
1.
2.
ext = Mid(file, InstrRev(file, ".")+1)
If ext = "jpg" ...
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573678
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПопробуй установить текущей директорией C:\Documents and Settings\All Users\Application Data\MyProga\Image\ (не помню функцию) и сделать Dir("*.jpg,*.bmp")
Не, с ChDir и ChDrive лучше без необходимости не играться.

Сделал "по-простому". Но голова разболелась.
Там с логикой и так напряжно, пути, имена файлов, 2 цикла.
И потом я все равно делаю более сложную проверку через GDI+.
Плясать думаю от статически заданной картинки (т.е. задан не folder, а конкретный валидный файл, где он лежит, в той folder и роемся), ну как вариант запоминать cur_file в настройках, чтоб при перезапуске проги с нее и начиналось (а не с первой).
Код: vbnet
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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
Option Explicit

Dim cur_file As String
'

Private Sub Timer1_Timer()
  cur_file = GetNextFile(GetFileDir("C:\Documents and Settings\All Users\Application Data\Proga\Image\proga_1.JPG"), _
   GetFileName(cur_file))
  Debug.Print cur_file
  Picture1.Picture = LoadPicture(cur_file)
End Sub

Public Function GetNextFile(ByVal folder_path As String, _
 Optional ByVal file_before As String = "") As String
 
  Dim file_first_name As String 'первый файл
  Dim file_cur_name As String 'тек. файл
  Dim cur_dir As String
  Dim use_next As Boolean 'если true,то следующий прошедший проверку наш
  Dim i As Long
    
  cur_dir = CorrectDir(folder_path)
  If file_before = "" Then use_next = True
  
  For i = 0 To 1
    file_first_name = Dir(cur_dir & "*.*", vbNormal)
    If file_first_name = "" Then 'нет файлов
      GetNextFile = ""
      Exit Function
    ElseIf use_next Then
      If IsValidFile(cur_dir & file_first_name) Then
        GetNextFile = cur_dir & file_first_name
        Exit Function
      End If
    ElseIf file_first_name = file_before Then
      use_next = True
    End If
      
    Do
      'цикл по-любому выйдет, когда файлы закончатся
      file_cur_name = Dir()
      If file_cur_name = "" Then 'больше нет файлов
        'при неправильно заданном file_before, или если file_before-последний,
        'то ставим флаг use_next и проходимся по файлам еще раз с начала
        'если валидных файлов вообще нет, то здесь будет выход из ф-ции
        'и возврат пустой строки
        use_next = True
        Exit Do
      ElseIf use_next Then
        If IsValidFile(cur_dir & file_cur_name) Then
          GetNextFile = cur_dir & file_cur_name
          Exit Function
        End If
      ElseIf file_cur_name = file_before Then
        use_next = True
      End If
    Loop
  Next i
  GetNextFile = ""
End Function

Public Function IsValidFile(ByVal file_path As String) As Boolean
  Dim file_ext As String
  IsValidFile = True
  file_ext = GetFileExtensionU(file_path)
  If (file_ext <> "JPG") And (file_ext <> "BMP") And (file_ext <> "GIF") Then
    IsValidFile = False
    Exit Function
  End If
  
  Dim m_mfi_picture As New cMultiFrameImage
  Dim X_size As Long, Y_size As Long
  m_mfi_picture.LoadFromFile file_path
  X_size = m_mfi_picture.FrameWidth
  Y_size = m_mfi_picture.FrameHeight
  Set m_mfi_picture = Nothing
  'если это не валидная GDI-картинка, то размеры будут нулевые
  'отсеиваем, чтоб размер картинки был не меньше заданной
  If (X_size < 440) Or (Y_size < 400) Then
    IsValidFile = False
    Exit Function
  End If
End Function
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573679
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Че-то ты перемудрил. Говоря про dir, я имел ввиду следующее.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Timer1_Timer()
Dim bValid As Boolean
Dim sPath As String
  
  If cur_file = "" then sPath = cur_dir & "*.*" 'пуляем по кругу
  Do
    cur_file = Dir(sPath)
    bValid = IsValidFile(cur_file)
    sPath = ""
  Loop Until bValid or cur_file = ""
  If bValid Then Picture1.Picture = LoadPicture(cur_file)
End Sub

И всё. Чудовище GetNextFile вообще не нужно.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573680
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Плясать думаю от статически заданной картинкиНи одна галерея так не делает, только музыкальные плей-листы. А они хранят списки воспроизведения в файле.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573708
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

чет я не догоняю
или ты забыл описание Dir (хотя я если честно только вчера прочел и осмыслил)

http://kbyte.ru/ru/Programming/Guides.aspx?id=94&mode=show
Код: vbnet
1.
cur_file = Dir(sPath)


Ни фига тут круга не получится, это всегда будет возвращать один и тот же ПЕРВЫЙ файл

Чтобы получить СЛЕДУЮЩИЙ, надо вызвать
Dir() без параметров.

Перемудрил я только в том, что моя GetNextFile не рассчитывает на то, что Dir уже вызывался до этого (где гарантия, что я не вызову этот Dir в другом месте программы между тиками слайд-таймера?).

AntonariyДмитрий77 Плясать думаю от статически заданной картинкиНи одна галерея так не делает, только музыкальные плей-листы. А они хранят списки воспроизведения в файле.

Делает.
Стандартная "Программа просмотра изображений и факсов" (оно же фотогалерея и т.п.).
При нажатии просмотр слайдов тупо пляшет по folder где находится тек. картинка начиная с нее по кругу.
Мне эта идея нравится, т.к. не надо делать лишних настроек.
Задаем фоновую картинку, нажали на кнопку "менять картинку раз в N минут" и поехали.
Пользовательские картинки для таких целей обычно в одной папке лежат.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573799
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 или ты забыл описание Dirтипа того
я понадеялся, что пустая строка проканает как "без параметра"
но невелика беда:
Код: vbnet
1.
2.
3.
4.
5.
If sPath="" Then
    cur_file = Dir()
Else
    cur_file = Dir(sPath)
End If


Дмитрий77 Мне эта идея нравитсяОк, прогони Dir до нужного файла перед запуском таймера.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38573803
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77где гарантия, что я не вызову этот Dir в другом месте программы между тиками слайд-таймера?У меня сложилось впечатление, что до сих пор ты не использовал ее вообще. Ну так и не используй нигде кроме галереи. Это и будет гарантией. А на будущее заведи глобальный флажок, который будет показывать, активна галерея или нет, и соответственно можно или нельзя использовать Dir.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38574715
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyУ меня сложилось впечатление, что до сих пор ты не использовал ее вообще.
Использовал и дольно активно.
1) для проверки существования конкретного файла
2) в цикле для поиска файла по маске, обработке его и удаления - по циклу переход к следующему файлу

Но! Я не знал что Dir() без параметра, вызванный за Dir(маска) с параметром возвращает СЛЕДУЮЩИЙ файл, когда ты мне написал Dir(), я не поленился почитать документацию.

Честно говоря уже думал в направлении
FindFirstFile function

FindNextFile function

Что касается, запоминать/незапоминать, использовался ли Dir "между" - мне проще пробежаться по всем файлам каждый раз (с "гарантией"), это не накладно для ресурсов. Особенно если сравнивать с вычислением "среднего цвета картинки" по пикселям, кот. я делаю каждый раз при смене картинки.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38575053
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77 Использовал и дольно активно.
1) для проверки существования конкретного файла
2) в цикле для поиска файла по маске , обработке его и удаления - по циклу переход к следующему файлу

Но! Я не знал что Dir() без параметра, вызванный за Dir(маска) с параметром возвращает СЛЕДУЮЩИЙ файл , когда ты мне написал Dir(), я не поленился почитать документацию.
Мне страшно представить, как выглядит этот код.

Дмитрий77 Честно говоря уже думал в направленииDir это обертка над этими функциями. Пользоваться ими имеет смысл только если ты используешь файловые дескрипторы или для скорости.

Дмитрий77 мне прощеВ смысле тебе проще написать нечто мозговыносящее типа GetNextFile? Ок, я всеми руками за простоту, только у меня на нее другой взгляд.

Мне вот лень писать, и я делаю все, чтобы писать меньше. Например, пишу программы, пишущие программы за меня. Я пишу маленькую программу, а она большую. Профит.
...
Рейтинг: 0 / 0
А как сделать слайд-шоу? Перебор файлов в папке.
    #38575382
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyВ смысле тебе проще написать нечто мозговыносящее типа GetNextFile?
Не в смысле я уже вынес мозг, написав этот GetNextFile и мне проще прекратить вынос мозга.


AntonariyМне страшно представить, как выглядит этот код.?
не, этот не страшный

1) для проверки существования конкретного файла
Код: vbnet
1.
if len(dir(path_to_file,vbnormal))>0 then



2) в цикле для поиска файла по маске, обработке его и удаления - по циклу переход к следующему файлу

Код: vbnet
1.
2.
3.
4.
5.
6.
  Do
     filename=dir(path/*.ext)>0
     if filename="" then exit do
     read (filename)...
     delete filename
  Loop
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как сделать слайд-шоу? Перебор файлов в папке.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]