Skip to content

Instantly share code, notes, and snippets.

@killofwin
Created October 7, 2013 13:09
Show Gist options
  • Save killofwin/6867721 to your computer and use it in GitHub Desktop.
Save killofwin/6867721 to your computer and use it in GitHub Desktop.
' Gambas class file
' FileDialogForm
' Форма запрашивает имя файла у пользователя давая выбор из определённого каталога
' '
Public Sub Form_Open()
End
Public Function AskFileName(Optional Title As String = "Select file", Optional Path As String = "", Optional TextOK As String = "OK", Optional CancelText As String = "Cancel", Optional MaskFiles As String = "*", Optional PictureFiles As Picture = Null, Optional ArrayMaskFiles As String[] = Null, Optional ArrayPictureFiles As Picture[] = Null, Optional HiddenShow As Boolean = False, Optional Paths As String[] = Null) As String
' Функция возвращает имя выбранного файла,
Dim r As String
Dim OK As Boolean
' Установить нужные надписи
Me.Text = Title
ButtonOK.Text = TextOK
ButtonCancel.Text = CancelText
RefrashFileList(Title, Path, TextOK, CancelText, MaskFiles, PictureFiles, ArrayMaskFiles, ArrayPictureFiles, HiddenShow, paths)
OK = Me.ShowModal()
If OK = True Then
r = ListFiles.Key
Endif
Return r
End
Public Sub RefrashFileList(Optional Title As String = "Select file", Optional Path As String = "", Optional TextOK As String = "OK", Optional CancelText As String = "Cancel", Optional MaskFiles As String = "*", Optional PictureFiles As Picture = Null, Optional ArrayMaskFiles As String[] = Null, Optional ArrayPictureFiles As Picture[] = Null, Optional HiddenShow As Boolean = False, Optional Paths As String[] = Null)
' Процедура показывает список файлов, принимает:
' Title заголовок окна, Path каталог , TextOK надпись кнопки выбоа файла , CancelText надпись кнопки отмены
' MaskFiles маска файла, PictureFiles картинка файла
' HiddenShow показывать ли файлы которые начинаються с точки
' ArrayMaskFiles массив масок файлов, не должны пересекаться , ArrayPictureFiles массив картинок для каждой маски
' Если передано значение типов в виде массива, то параметры MaskFiles и PictureFiles игнорируються
Dim FilesList As String[] ' массив для получаемого списка файлов
Dim ArrayM As Integer
Dim ArrayA As Integer ' переменные счётчиков для массивов
Dim ArrayPictureM As Integer
Dim m As Integer
Dim a As Integer
Dim Pic As Picture
Dim h As Boolean ' скрытый файл
' Для того варианта когда переданно множество путей
Dim lMultiPaths As New String[]
Dim MultiA As Integer
Dim MultiM As Integer
If Paths = Null Then
' Если не был передан массив с путями
' Значит его нужно создать
lMultiPaths.Add(Path) ' в качестве 0 элемента массива использовать обычный аргумент Path
Else
' Передан массив путей
lMultiPaths = Null
lMultiPaths = Paths.Copy() ' копировать переданный массив в локальный
Endif
ListFiles.Clear ' очистка списка
MultiM = lMultiPaths.Max ' Вычислить колличество путей
For MultiA = 0 To MultiM
Path = lMultiPaths[MultiA] ' перебор путей по порядку
If PictureFiles = Null Then PictureFiles = PictureFile.Picture ' присвоение значения картинки если не передана
If Not ArrayMaskFiles = Null Then
' передан всё таки массив
Endif
If ArrayMaskFiles = Null Then
' передан не массив
ArrayMaskFiles = New String[] ' таки создать массив
ArrayPictureFiles = New Picture[]
ArrayMaskFiles.Add(MaskFiles) ' присвоение маски
ArrayPictureFiles.Add(PictureFiles) ' присвоение картинки
Endif
If Path = "" Then Path = Application.Path ' путь обычный
If Mid(Path, Len(Path), 1) = "/" Then Path = Mid(Path, 2, Len(Path) - 1) ' Если на конце / то убрать
If ArrayMaskFiles.Count > 0 Then
' В массиве есть маски
ArrayPictureM = ArrayPictureFiles.Max ' максимальный индекс картинки
ArrayM = ArrayMaskFiles.Max ' максимальный индекс маски
For ArrayA = 0 To ArrayM
' перечисление массива масок
' Костыльное решение, но тсправляет баг из за которого "/" трактуется как ""
If Len(Path) > 0 Then FilesList = Dir(Path, ArrayMaskFiles[ArrayA], gb.File)
If Len(Path) = 0 Then FilesList = Dir("/", ArrayMaskFiles[ArrayA], gb.File)
m = FilesList.Max
If FilesList.Count > 0 Then
' в списке есть файлы
If ArrayA <= ArrayPictureM Then
' Массивы совпадают, можно искать
If ArrayPictureFiles[ArrayA] = Null Then Pic = PictureFile.Picture ' картинка на тот случай если нет картинки
'If Not (ArrayPictureFiles[ArrayA] = Null) Then Print "OK"
If Not (ArrayPictureFiles[ArrayA] = Null) Then Pic = ArrayPictureFiles[ArrayA]
Endif
If ArrayA > ArrayPictureM Then
'список картинок меньше. Массивы не совпадают.
Pic = PictureFile.Picture ' картинка на тот случай если нет картинки
Endif
For a = 0 To m
' добавление файлов из массива в список
h = False
If Mid(FilesList[a], 1, 1) = "." Then
' имя файла начинается с точки, значит файл скрытый
h = True
Endif
If HiddenShow Or (h = False) Then
'Если разрешено показывать скрытые файлы или если файл не скрытый
ListFiles.Add(Path & "/" & FilesList[a], FilesList[a], Pic, "")
End If
'Print ArrayA
Next
Endif
Next
Endif
Next
' список заполнен
End
Public Sub ButtonCancel_Click()
Me.Close(False)
End
Public Sub ButtonOK_Click()
Me.Close(True)
End
Public Sub ListFiles_DblClick()
ButtonOK_Click()
End
Public Sub Form_Resize()
' Форма изменяет размеры
FilesSplit.Height = Me.Height - ButtonHSplit.Height - 4
ButtonHSplit.Y = Me.Height - ButtonHSplit.Height
FilesSplit.Width = Me.Width
ButtonHSplit.Width = Me.Width
End
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment