Страница: 1 | 2 |
Вопрос: Помогите, плиз, разобраться с кодом.
Добавлено: 18.02.06 22:28
Автор вопроса: Android
Ответы
Всего ответов: 28
Номер ответа: 16
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #16
Добавлено: 22.02.06 21:39
А вы говорили для Библиотеки классов больше нет кода! HACKER если есть еще давай МНЕ
Номер ответа: 17
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #17
Добавлено: 22.02.06 23:13
гы... если у тебя такого нет, я боюсь представить что же у тебя есть...
Номер ответа: 18
Автор ответа:
Android
Вопросов: 6
Ответов: 23
Профиль | | #18
Добавлено: 23.02.06 22:14
Hackery
После долгих поисков по справочникам определения слова "х.з.", нашёл ответ "х.з. (х.е.з.) означает никогда" ))
Поэтому пришлось самому бродить по коду. Первое - удалил всё не нужное для решения моей задачи (вернее, как мне показалось всё не нужное). Добивал код уже с помощью Aivosto Project Analyzer. Повезло, что у меня было в распоряжении 2 кода модуля: один с сайта, другой взят по твоей ссылке. Ну и подытожил всю эту байду Compare It! Вот итог моих мучений:
Код Модуля:
Option Explicit
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long
Public Const OFN_ALLOWMULTISELECT = &H200
Public Const OFN_CREATEPROMPT = &H2000
Public Const OFN_EXPLORER = &H80000
Public Const OFN_HIDEREADONLY = &H4
Public Const OFN_LONGNAMES = &H200000
Public Const OFN_NODEREFERENCELINKS = &H100000
Public Const OFS_FILE_OPEN_FLAGS = OFN_EXPLORER Or OFN_LONGNAMES Or OFN_CREATEPROMPT Or OFN_NODEREFERENCELINKS Or OFN_HIDEREADONLY Or OFN_ALLOWMULTISELECT
Public Type OPENFILENAME
nStructSize As Long
hwndOwner As Long
hInstance As Long
sFilter As String
sCustomFilter As String
nCustFilterSize As Long
nFilterIndex As Long
sFile As String
nFileSize As Long
sFileTitle As String
nTitleSize As Long
sInitDir As String
sDlgTitle As String
flags As Long
nFileOffset As Integer
nFileExt As Integer
sDefFileExt As String
nCustDataSize As Long
fnHook As Long
sTemplateName As String
End Type
Public Type SelectedFile
nFilesSelected As Integer
sFiles() As String
sLastDirectory As String
bCanceled As Boolean
End Type
Public FileDialog As OPENFILENAME
Public Function ShowOpen(ByVal hwnd As Long) As SelectedFile
Dim ret As Long
Dim count As Integer
Dim LastCharacter As Integer
Dim NewCharacter As Integer
Dim tempFiles(1 To 200) As String
FileDialog.nStructSize = Len(FileDialog)
FileDialog.hwndOwner = hwnd
FileDialog.sFileTitle = Space$(2048)
FileDialog.nTitleSize = Len(FileDialog.sFileTitle)
FileDialog.sFile = FileDialog.sFile & Space$(2047) & Chr$(0)
FileDialog.nFileSize = Len(FileDialog.sFile)
FileDialog.sFileTitle = " "
If FileDialog.flags = 0 Then
FileDialog.flags = OFS_FILE_OPEN_FLAGS
End If
ret = GetOpenFileName(FileDialog)
If ret Then
If Trim$(FileDialog.sFileTitle) = "" Then
LastCharacter = 0
count = 0
While ShowOpen.nFilesSelected = 0
NewCharacter = InStr(LastCharacter + 1, FileDialog.sFile, Chr$(0), vbTextCompare)
If count > 0 Then
tempFiles(count) = Mid(FileDialog.sFile, LastCharacter + 1, NewCharacter - LastCharacter - 1)
Else
ShowOpen.sLastDirectory = Mid(FileDialog.sFile, LastCharacter + 1, NewCharacter - LastCharacter - 1)
End If
count = count + 1
If InStr(NewCharacter + 1, FileDialog.sFile, Chr$(0), vbTextCompare) = InStr(NewCharacter + 1, FileDialog.sFile, Chr$(0) & Chr$(0), vbTextCompare) Then
tempFiles(count) = Mid(FileDialog.sFile, NewCharacter + 1, InStr(NewCharacter + 1, FileDialog.sFile, Chr$(0) & Chr$(0), vbTextCompare) - NewCharacter - 1)
ShowOpen.nFilesSelected = count
End If
LastCharacter = NewCharacter
Wend
ReDim ShowOpen.sFiles(1 To ShowOpen.nFilesSelected)
For count = 1 To ShowOpen.nFilesSelected
ShowOpen.sFiles(count) = tempFiles(count)
Next
Else
ReDim ShowOpen.sFiles(1 To 1)
ShowOpen.sLastDirectory = Left$(FileDialog.sFile, FileDialog.nFileOffset - 1)
ShowOpen.nFilesSelected = 1
ShowOpen.sFiles(1) = Mid(FileDialog.sFile, FileDialog.nFileOffset + 1, InStr(1, FileDialog.sFile, Chr$(0), vbTextCompare) - FileDialog.nFileOffset - 1)
End If
ShowOpen.bCanceled = False
Exit Function
Else
ShowOpen.sLastDirectory = ""
ShowOpen.nFilesSelected = 0
ShowOpen.bCanceled = True
Erase ShowOpen.sFiles
Exit Function
End If
End Function
Код формы:
Option Explicit
Private Sub Command1_Click()
Dim SelFile As SelectedFile
Dim i As Integer
FileDialog.sDlgTitle = "Open Files"
FileDialog.sFilter = "ata (*.dat, *.cfg)" & Chr$(0) & "*.dat; *.cfg"
SelFile = ShowOpen(Me.hwnd)
For i = 1 To SelFile.nFilesSelected
List1.AddItem SelFile.sLastDirectory & "\" & SelFile.sFiles(i)
Next i
End Sub
З.Ы. Ты бы хоть скинул, какие ты нашёл глюки в модуле....
Номер ответа: 19
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #19
Добавлено: 23.02.06 23:19
Я непомню уже, глючило что-то... ті как в анекдоте, работает - ничего
не трогай! ))
Номер ответа: 20
Автор ответа:
Android
Вопросов: 6
Ответов: 23
Профиль | | #20
Добавлено: 24.02.06 21:43
Всё равно глючит, зараза!!!! Попробывал добавить более двухсот файлов - вышибло. И с этого всё и началося. То просто, молча выгружается, то "память не может быть writen", то ещё какое-нить г.
Номер ответа: 21
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #21
Добавлено: 24.02.06 23:02
ок, я седня гляну...
Номер ответа: 22
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #22
Добавлено: 24.02.06 23:07
Кстати Fever это всё фигня, этот же модуль не мой же, я точно так же скопипестил его с инета где-то когда-то на каком-то сайте... С таким же успехом и ты пошариш по сайтам и найдёшь столько кода для Библы кодов что тебе и не снилось Одни яйца, копипестить содержимое других сайтов не есть хорошо... а на вбнете никто ничего своего не пишет, а если пишет то мало... это объясняет почему для библы кодов нет больше (или на текущий момент) примеров...
Номер ответа: 23
Автор ответа:
Android
Вопросов: 6
Ответов: 23
Профиль | | #23
Добавлено: 26.02.06 15:56
Нашел среди кучи когда-то скачанных примеров нужный код! Но есть новые заморочки. О них выше....
На форму кидаем CommonDialog, CommandButton, ListBox
Private Const cdlOFNAllowMultiselect = &H200
Private Const cdlOFNCreatePrompt = &H2000
Private Const cdlOFNExplorer = &H80000
Private Const cdlOFNExtensionDifferent = &H400
Private Const cdlOFNFileMustExist = &H1000
Private Const cdlOFNHelpButton = &H10
Private Const cdlOFNHideReadOnly = &H4
Private Const cdlOFNLongNames = &H200000
Private Const cdlOFNNoChangeDir = &H8
Private Const cdlOFNNoDereferenceLinks = &H100000
Private Const cdlOFNNoLongNames = &H40000
Private Const cdlOFNNoReadOnlyReturn = &H8000
Private Const cdlOFNNoValidate = &H100
Private Const cdlOFNOverwritePrompt = &H2
Private Const cdlOFNPathMustExist = &H800
Private Const cdlOFNReadOnly = &H1
Private Const cdlOFNShareAware = &H4000
Private Const CD_FLAGS = cdlOFNAllowMultiselect + cdlOFNExplorer + cdlOFNLongNames
Private Sub Command1_Click()
With CommonDialog1
.CancelError = True
.MaxFileSize = 32000
.Filter = "All Files *.*/*.*"
.Flags = CD_FLAGS
.ShowOpen
myFiles = Split(.FileName, vbNullChar)
Select Case UBound(myFiles)
Case 0
List1.AddItem myFiles(0)
Case Is > 0
For i = 1 To UBound(myFiles)
myPath = myFiles(0) & IIf(Right(myFiles(0), 1) <> "\", "\", "" & myFiles(i)
List1.AddItem myPath
Next i
End Select
End With
End Sub
Номер ответа: 24
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #24
Добавлено: 26.02.06 16:43
Страдания по комон диалогу продолжаются
Надо учитывать еще один момент:
Если выбран один файл, то будет возвращена одна строка, состоящая из полного пути к файлу.
Если выбрано много файлов, то будет возвращен массив строк, в котором первая строка - имя папки в которй сидят файлы, остальные строки - имена файлов (без пути к файлу).
Номер ответа: 25
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #25
Добавлено: 26.02.06 16:46
И ещё вспомнил: о вышибании при большом количестве файлов: нужно ведь размер принимающего буфера ссответствующий делать
Не влезают все имена в буфер - поэтому и вылетает прога.
Передирать код надо с творческим подходом.
Номер ответа: 26
Автор ответа:
Android
Вопросов: 6
Ответов: 23
Профиль | | #26
Добавлено: 26.02.06 17:20
Насчет первого замечания ничего не могу сказать. Главное, что код работает ( ну ладно, ладно, пока работает).
А на счет второго - я и один файл выбирал, а мя в "out of memory" вышибал. Просто там непонятно для меня : почему надо писать FileDialog.sFileTitle = Space$(2048) и FileDialog.sFileTitle = " " ? Без этого не открывался один файл. Вообщем, если когда -нить разберёшься с модулем, скинь. Чисто любопытно узнать как он должен работать - то?
Номер ответа: 27
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #27
Добавлено: 27.02.06 22:27
мда
Ответ № 18, модуль в принципе работающий, но...
Если выбран один файл, то будет возвращена одна строка, состоящая из полного пути к файлу.
та надо ж... кому? мне что-ли?
ну я разве что могу на скорую ногу посоветовать
Потому что FileDialog.sFileTitle = Space$(2048) было "до меня", а после меня sFileTitle стал " " Конечно FileDialog.sFileTitle = Space$(2048) я должен был закоментировать, но видать не судьба ))
Номер ответа: 28
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #28
Добавлено: 27.02.06 22:30
а ну и ещё, tempFiles динамический сделай... и count убрать можно... потом просто Redim Preserve tempFiles (Ubound(tempFiles)+1) хотя это медленно конечно, зато пофиг сколько добавил... Или ещё лучше просто огранич пользователя выбором до 200 файлов...