Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / "Run time error '13':Type mismatch / 5 сообщений из 5, страница 1 из 1
04.03.2009, 19:44
    #35851797
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Run time error '13':Type mismatch
"Run time error '13':Type mismatch
Исходный вариант моего кода такой.
Код: plaintext
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.
Function FindNewDriverFile(FileToFind As String, PathForSearch As String) As String
    Dim SearchPath As String, findstr As String
    Dim NumFiles As Integer, NumDirs As Integer
    Dim NumFiles1 As Integer, NumDirs1 As Integer
    Dim i As Integer
    Dim tempDate As String, tempPath As String
        Screen.MousePointer = vbHourglass
        List1.Clear
        FindFilesAPIMy PathForSearch, FileToFind, NumFiles, NumDirs
        FindFilesAPIinCAB PathForSearch, FileToFind, NumFiles1, NumDirs1
        AddLog "  " & NumFiles + NumFiles1 & " Files found"
        Screen.MousePointer = vbDefault
        'поиск самого нового файла
        tempDate =  0 
        tempPath = ""
        If List1.ListCount >  0  Then
            For i =  0  To List1.ListCount -  1 
                If (CDate(FindFieldValue(List1.List(i), "DateTime")) > CDate(tempDate)) Then
                    tempDate = FindFieldValue(List1.List(i), "DateTime")
                    tempPath = FindFieldValue(List1.List(i), "Path")
                End If
            Next i
        End If
        If Len(tempPath) >  0  Then
            AddLog "  " & FileToFind & " found in " & tempPath
        End If
        List1.Clear
        FindNewDriverFile = tempPath
End Function
Function FindFieldValue(str As String, field As String) As String
    Dim temp As String
    If InStr(str, field & "=") >  0  Then
        temp = Right(str, Len(str) - InStr(str, field & "=") - Len(field))
        If InStr(temp, ";") >  0  Then
            temp = Left(temp, InStr(temp, ";") -  1 )
            FindFieldValue = temp
        End If
    Else
        FindFieldValue = ""
    End If
End Function
Ошибка возникает между строчками
AddLog " " & NumFiles + NumFiles1 & " Files found"
и
AddLog " " & FileToFind & " found in " & tempPath

и уже проявилась на двух PC, после первой записи оба лога обрываются. причем на моих 3-х и еще 2-х PC ничего такого не было, и выловить пока не могу.
Сейчас убрал tempDate = 0, м.б.неаккуратно написал, беру сначала дату-время первого файла, добавил вывод в лог после каждой строчки, жду логов, но уже бесит.
Грешил на то что м.б. нет msvbvm60.dll, но понял, что ее не может не быть-без нее не запускается вообще ничего.
Или с Listbox какая-нибудь фигня может получиться?
Вообще надо бы API какие-нибудь поискать для сравнения дат файлов, но сейчас хочу понять что не так именно тут.
...
Рейтинг: 0 / 0
04.03.2009, 22:30
    #35851967
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Run time error '13':Type mismatch
Косяк виден невооруженным взглядом. Ошибка при конвертации строки в дату либо в CDate(FindFieldValue(List1.List(i), "DateTime")), либо в CDate(tempDate).
Код: plaintext
1.
Else
        FindFieldValue = ""
Пустая строка никак не может быть приведена к дате. Ну и не факт, что в верхней части условия получится срока, похожая на дату.
...
Рейтинг: 0 / 0
05.03.2009, 11:46
    #35852830
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Run time error '13':Type mismatch
Antonariy,

Код: plaintext
1.
2.
3.
4.
5.
6.
'В первом случае
FileName=unidrv.dll;Path=C:\WINDOWS\DriverCache\i386\sp2.cab;DateTime= 17 . 02 . 2007   04 : 07 : 18 ;
   1  Files found
'во втором
 FileName=unidrv.dll;Path=C:\WINDOWS\Driver Cache\i386\sp2.cab;DateTime= 04 . 08 . 2004   00 : 54 : 44 ;
 FileName=unidrv.dll;Path=C:\WINDOWS\Driver Cache\i386\sp3.cab;DateTime= 14 . 04 . 2008   04 : 33 : 48 ;
   2  Files found
FindFieldValue = "" здесь получиться никак не может, by def

Либо в самом начале:
tempDate = 0 -> CDate(tempDate)

Либо, что меня сейчас стукнуло, дата-время в listbox получились как
Код: plaintext
FindFileInCab = "FileName=" & FileInfo.FileName & ";Path=" & Archive & ";DateTime=" & Format(FileInfo.DateTime, "dd.mm.yyyy hh:mm:ss") & ";"
Т.е. форматирование делается всегда как "dd.mm.yyyy hh:mm:ss" отсебятина?
А потом я делаю CDate("dd.mm.yyyy hh:mm:ss")
А в зависимости от региона она не даст ошибки?
Второй PC очевидно в "Belgique"...ха и другой тоже в Бельгии,
попробую сейчас перенастроить свой PC на их региональные настройки.. может и найду ответ...
...
Рейтинг: 0 / 0
05.03.2009, 12:20
    #35852943
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Run time error '13':Type mismatch
Ага, так и есть. Format(FileInfo.DateTime, "dd.mm.yyyy hh:mm:ss") делать нельзя.
Error13 будет для большинства стран.
Только теперь для меня стал вопрос, как грамотно сохранить FileInfo.DateTime в string, чтобы потом CDate(string) точно не ошибалась.
...
Рейтинг: 0 / 0
05.03.2009, 15:11
    #35853523
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Run time error '13':Type mismatch
Ну вроде как извернулся, т. е. конвертирую FILETIME в VBATime (As Date), а при записи в string, string получается в формате даты-времени, корректном для данного PC, что исключает дальнейшую ошибку при вызове CDate(string)

Да уж...
Примерно так...
Код: plaintext
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.
FindFileInCab = "FileName=" & FileInfo.FileName & ";Path=" & Archive & ";DateTime=" & FileInfo.DateTime & ";"
...
Dim WFD As WIN32_FIND_DATA
Form1.List1.AddItem "FileName=" & FileName & ";Path=" & Path & ";DateTime=" & fFileTimeToVBATime(WFD.ftLastWriteTime) & ";"

Public FileInfo As FindFileInfo
Public Type FindFileInfo
    FileName As String
    DateTime As Date
    Size As Variant
    Path As String
End Type
Public Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String *  14 
End Type
Public Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Public Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type


Public Function fFileTimeToVBATime(ftFileTime As FILETIME, _
 Optional fLocal As Boolean = True) As Date

Dim stSystem        As SYSTEMTIME
Dim ftLocalFileTime As FILETIME
    '
    ' Converts Windows FILETIME date/time value to VBA.
    '
    ' If the user wants local time, convert the file
    ' time to local file time.
    '
    If fLocal Then
        Call FileTimeToLocalFileTime(ftFileTime, ftLocalFileTime)
        ftFileTime = ftLocalFileTime
    End If
    '
    ' Convert the file time to system time then
    ' call our own function to convert to VBA time
    '
    If CBool(FileTimeToSystemTime(ftFileTime, stSystem)) Then
        fFileTimeToVBATime = fSysTimeToVBATime(stSystem)
    End If
End Function
Private Function fSysTimeToVBATime(stSysTime As SYSTEMTIME) As Date
    '
    ' Converts Windows SYSTEMTIME to VBA date/time.
    '
    ' Consrtuct a VBA date/time value using the
    ' DateSerial and TimeSerial functions.
    '
    With stSysTime
        fSysTimeToVBATime = DateSerial(.wYear, .wMonth, .wDay) + _
                        TimeSerial(.wHour, .wMinute, .wSecond)
    End With
End Function
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / "Run time error '13':Type mismatch / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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