Не срабатывает событие в классе

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Не срабатывает событие в классе

Сообщение Niko » 26.05.2009 (Вт) 15:12

Нужно узнать когда будет закрыт файл. файл может быть Word, AutoCad, ... теоретически любой.
IsFileAlreadyOpen эту функцию нашел тут на форуме, она работает, а программка в целом нет.
не срабатывает событие eFile, хотя RaiseEvent eFile(bVal) выполняется.
подскажите пожайлуста что тут не так. вроде все должно работать, а не работает. ((

Форма:

Код: Выделить всё
Option Explicit
Dim WithEvents cF As Cad.FSO1

Private Sub cF_eFile(bValue As Boolean)
Me.Caption = bValue
End Sub

Private Sub Form_Load()
Set cF = New Cad.FSO1
cF.FileName = "c:\файл.dwg"
cF.GoWatch Me.hWnd, 500
End Sub


Класс: название - FSO1

Код: Выделить всё
Option Explicit
Dim ihwnd1 As Double
Public Event eFile(bValue As Boolean)

Public Sub GoWatch(ihwnd As Double, dTime As Integer)
ihwnd1 = ihwnd
SetTimer ihwnd1, 0, dTime, AddressOf aaa
End Sub

Public Sub StopWatch(ihwnd As Variant)
KillTimer ihwnd1, 0
End Sub

Public Property Get FileName() As Variant
FileName = sFileName
End Property

Public Property Let FileName(ByVal vNewValue As Variant)
sFileName = vNewValue
End Property

Friend Sub createEventFile(bVal As Boolean)
RaiseEvent eFile(bVal)
End Sub


Модуль:

Код: Выделить всё
Public Declare Function lOpen Lib "kernel32" Alias "_lopen" (ByVal lpPathName As String, ByVal iReadWrite As Long) As Long
Public Declare Function lClose Lib "kernel32" Alias "_lclose" (ByVal hFile As Long) As Long

Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
Public FSO11 As New FSO1

Public Function IsFileAlreadyOpen() As Boolean
Dim hFile As Long
Dim lastErr As Long
hFile = -1
lastErr = 0
hFile = lOpen(sFileName, &H10)

If hFile = -1 Then
    lastErr = Err.LastDllError
Else
lClose (hFile)
End If
IsFileAlreadyOpen = (hFile = -1) And (lastErr = 32)
End Function

Public Sub aaa()
    FSO11.createEventFile IsFileAlreadyOpen
End Sub
Последний раз редактировалось Niko 27.05.2009 (Ср) 8:18, всего редактировалось 1 раз.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Не срабатывает событие в классе

Сообщение alibek » 26.05.2009 (Вт) 18:53

Это что за кадавр? Нужен CreateFile и обработка ошибок, если они будут.
Lasciate ogni speranza, voi ch'entrate.

Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Re: Не срабатывает событие в классе

Сообщение Niko » 26.05.2009 (Вт) 21:05

alibek писал(а):Это что за кадавр? Нужен CreateFile и обработка ошибок, если они будут.

я не понял что за кадавр.
наверно я плохо объяснил.
нужно отловить момент когда файл не будет открыт в другой программе и реализовать это нужно в DLL.
1. я нашел как проверить открыт файл или нет это делает IsFileAlreadyOpen
2. таймер генерирует событие eFile и передает парамерт открыт файл или нет.
3. программа ждет это событие но никак не дождется, хотя до строчки RaiseEvent eFile(bVal) доходит и программа идет дальше, но событие не генерируется. ВОПРОС: почему?
P.S.
1. сорри за сумбурные объяснения.
2. возможно все делаю не так как надо, но мне показалось что так должно работать ))

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Не срабатывает событие в классе

Сообщение alibek » 26.05.2009 (Вт) 22:21

Почему используется _lopen/_lclose? Они устарели, причем давно, еще во времена VB4.
Используй CreateFile с флагом на нужный доступ. Если вернется ошибка, что файл уже открыт, значит файл уже открыт. Если сработает без ошибок, значит не открыт.
Lasciate ogni speranza, voi ch'entrate.

Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Re: Не срабатывает событие в классе

Сообщение Niko » 27.05.2009 (Ср) 6:24

что нашел то и использовал ) попробую сделать как Вы сказали, но на сколько я понимаю в данном случае проблема не в этом, а в том что событие которое генерирует класс почему то не работает.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Не срабатывает событие в классе

Сообщение alibek » 27.05.2009 (Ср) 7:14

Не работает, потому что нужно понимать, что ты используешь, а не тупо копировать.
Что значит FSO11 в модуле? Почему процедура с названием aaa нигде не вызывается?
Ну и наконец, зачем тебе вообще нужен класс, если для нужной проверки достаточно двух строчек кода, которые можно оформить в функцию?
Lasciate ogni speranza, voi ch'entrate.

Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Re: Не срабатывает событие в классе

Сообщение Niko » 27.05.2009 (Ср) 8:33

alibek писал(а):Не работает, потому что нужно понимать, что ты используешь, а не тупо копировать.

тупо скопировал функцию IsFileAlreadyOpen и она работает.
alibek писал(а):Что значит FSO11 в модуле? Почему процедура с названием aaa нигде не вызывается?

в модуле действительно забыл на форум добавить строчку в программе она есть. сверху исправил.
Код: Выделить всё
Public FSO11 As New FSO1

FSO1 так называется класс.
функция ааа вызывается тут (код класса FSO1):
Код: Выделить всё
Public Sub GoWatch(ihwnd As Double, dTime As Integer)
ihwnd1 = ihwnd
SetTimer ihwnd1, 0, dTime, AddressOf aaa
End Sub

alibek писал(а):Ну и наконец, зачем тебе вообще нужен класс, если для нужной проверки достаточно двух строчек кода, которые можно оформить в функцию?

Хочу чтобы функция проверки файла была в DLL и чтобы в момент когда файл "свободен" я получал событие. Зачем это мне ответить не могу ) сам не знаю, но ведь суть не в этом, а в том что не работает.
---
в первом проекте AxtiveX DLL который называется CAD есть класс (FSO1) и модуль (Module1) код которых я тут и написал.
во втором проекте Standart EXE есть окно (Form1) код тоже написал.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Не срабатывает событие в классе

Сообщение alibek » 27.05.2009 (Ср) 8:39

Понятно, SetTimer проглядел.
Но что тебя удивляет? Событие вызывается. Все работает именно так, как ты указал — оно вызывается для экземляра FSO11, а не для того экземпляра, из которого ты его ожидаешь получить.
Поставь брекпойнт на Class_Initialize класса FSO1 и проследи пошагово, как все работает. Особенно обращая внимание на кнопку Call Stack (Ctrl+L).
Lasciate ogni speranza, voi ch'entrate.

Niko
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 102
Зарегистрирован: 16.03.2006 (Чт) 14:43

Re: Не срабатывает событие в классе

Сообщение Niko » 27.05.2009 (Ср) 10:36

спасибо за подсказку.
забыл добавить Set FSO11 = Me

Код: Выделить всё
Public Sub GoWatch(ihwnd As Double, dTime As Integer)
ihwnd1 = ihwnd
Set FSO11 = Me
SetTimer ihwnd1, 0, dTime, AddressOf aaa
End Sub


теперь все работает )

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Не срабатывает событие в классе

Сообщение alibek » 27.05.2009 (Ср) 12:20

Тогда еще New убери из модуля.
Чтобы исключить в будущем подобные баги.
Но способ все равно кривой.
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 50

    TopList  
cron