Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: hw.t-k.ru
 Профиль | | #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 = ";Data (*.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, модуль в принципе работающий, но...
Dim tempFiles(1 To 200) As String
!
Попробывал добавить более двухсот файлов - вышибло
Да ну? Шо серёзно? Что ж там может быть такое... ;) :)

Надо учитывать еще один момент:
Если выбран один файл, то будет возвращена одна строка, состоящая из полного пути к файлу.


та надо ж... кому? мне что-ли? :)
ну я разве что могу на скорую ногу посоветовать
List1.AddItem Replace(SelFile.sLastDirectory & "\" & SelFile.sFiles(i), "\\", "\";)


почему надо писать FileDialog.sFileTitle = Space$(2048) и FileDialog.sFileTitle = " "

Потому что 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 файлов...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам