Определить не изменился ли файл...

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

AlienK
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.12.2008 (Чт) 9:10

Определить не изменился ли файл...

Сообщение AlienK » 04.12.2008 (Чт) 9:25

Есть такая проблема, помогите, пожалуйста, если кто знает что делать.

Нужно сделать класс, который кроме всего прочего должен определять не изменился ли
определенный файл и выводить сообщение в Form1.TextBox1. Написал так:
Код: Выделить всё
Public Class calc
    ....
   
    Public FileName As String
    Private WithEvents File_watcher As New System.IO.FileSystemWatcher
   
    ....

    File_watcher.Filter = GetName(Me.FileName)
    File_watcher.Path = GetDir(Me.FileName)
    File_watcher.NotifyFilter = IO.NotifyFilters.LastWrite
    File_watcher.EnableRaisingEvents = True

    ....

    Public Sub File_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles File_watcher.Changed
        Form1.TextBox1.AppendText(Me.FileName & " was changed" & vbCrLf)
    End Sub

    ...
End Class


Объекты calc создаю в Form1 и складываю в Collection.

Так вот, когда в calc выполняется File_Changed происходит ошибка:
"An error occurred creating the form.
See Exception.InnerException for details.
The error is: ActiveX control
'cee14395-1196-4b60-8251-e8eb840658c2'
cannot be instantiated because the current
thread is not in a single-threaded apartment."

То есть прямо в Form1.TextBox1 текст добавить не получается, однако если в
File_Changed написать "MsgBox(Me.FileName & " was changed!")" вместо
"Form1.TextBox1.AppendText(Me.FileName & " was changed" & vbCrLf) " - то все ОК, никакой ошибки,
показывается MsgBox. Но MsgBox нафиг не нужен.
В других местах calc "Form1.TextBox1.AppendText...." катит без проблем.

Или может кто знает как обойтись без System.IO.FileSystemWatcher?
Заранее благодарен.
-------------------------------
Win XP SP2, Visual Studio 2005.

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Определить не изменился ли файл...

Сообщение Joo » 04.12.2008 (Чт) 10:05

AlienK писал(а):Есть такая проблема, помогите, пожалуйста, если кто знает что делать.

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

Public Sub File_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles File_watcher.Changed
Form1.TextBox1.AppendText(Me.FileName & " was changed" & vbCrLf)
End Sub
...


Правильнее, тогда уж, генерировать событие в File_Changed

Опиши в классе событие:
Public Event FileChanged(e as object, e As EventArgs)

и вызывай его
RaiseEvent FileChanged(me, EventArgs.Empty)

А в форме уже обробатывай его.
sub CalcVar_FileChanged() Handles CalcVar.FileChanged
textbox.text +=CalcVar.FileName & " was changed"+vbnewline
end sub
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Определить не изменился ли файл...

Сообщение Sebas » 04.12.2008 (Чт) 12:19

Поток, вызывающий событие изменения файла, не есть поток создавший форму.
Для обращений к форме используй Form.Invoke
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

AlienK
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.12.2008 (Чт) 9:10

Re: Определить не изменился ли файл...

Сообщение AlienK » 04.12.2008 (Чт) 14:38

Поток, вызывающий событие изменения файла, не есть поток создавший форму.
Для обращений к форме используй Form.Invoke



Я сделал в форме процедуру, выводящую сообщения:
Код: Выделить всё
Sub ToLog(ByVal MessageString As String, ByVal NewLine As Boolean)
        If NewLine Then
            Log.AppendText(vbCrLf & "[" & Format(System.DateTime.Now, "HH:mm:ss") & "] " & MessageString)
        Else
            Log.AppendText(MessageString)
        End If
End Sub



А в классе:
Код: Выделить всё
Delegate Sub DelegateToLog(ByVal MessageString As String, ByVal NewLine As Boolean)

Private Sub FC(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles File_watcher.Changed
        Dim s As DelegateToLog = AddressOf Form1.ToLog
        s.Invoke(Me.FileName & " was changed.", True)
End Sub


Ошибка та же самая :(
Или я неправильно делаю?

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Определить не изменился ли файл...

Сообщение Williams » 04.12.2008 (Чт) 15:47

Как-то все шиворот на выворот. Там где выводишь данные, проверяй нужен ли Invoke и действуй соответствующим образом.
И вы думаете, что вас оставят в живых после прочтения этого поста?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Определить не изменился ли файл...

Сообщение Sebas » 04.12.2008 (Чт) 15:50

Invoke у формы!!!!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Определить не изменился ли файл...

Сообщение Joo » 04.12.2008 (Чт) 18:14

Вот блин а....

Код: Выделить всё
Public Class Form1
    Private WithEvents CW As New CCW
    Private Delegate Sub AppendTextDelegate(ByVal Text As String)

    Private Sub CW_WriteLog(ByVal Description As String) Handles CW.WriteLog
        If TextBoxLog.InvokeRequired Then
            Dim d As System.Delegate = New AppendTextDelegate(AddressOf TextBoxLog.AppendText)
            TextBoxLog.Invoke(d, New Object() {Description & vbNewLine})
        Else
            TextBoxLog.AppendText(Description)
        End If
    End Sub
End Class

Public Class CCW
    Public Event WriteLog(ByVal Description As String)
    Private WithEvents FW As New System.IO.FileSystemWatcher("c:\", "*.txt")

    Public Sub New()
        FW.NotifyFilter = IO.NotifyFilters.LastWrite
        FW.EnableRaisingEvents = True
    End Sub

    Private Sub FW_Changed(ByVal sender As Object, ByVal e As System.IO.FileSystemEventArgs) Handles FW.Changed
        RaiseEvent WriteLog(Now & " : Файл: " & e.FullPath & " - изменен")
    End Sub
End Class
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

AlienK
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.12.2008 (Чт) 9:10

Re: Определить не изменился ли файл...

Сообщение AlienK » 04.12.2008 (Чт) 23:25

Scarabey писал(а):Вот блин а....

Это понятно. Но мне надо не совсем так.
Как-нибудь вот так:

Код: Выделить всё
Public Class Form1

    Public CW_col As New Collection

    Private Sub Add_CW()
         Dim CW As New CCW
         CW.name="sfg"
         .....
         CW_col.Add(CW,CW.name)         
    End Sub

     .....
End Class

AlienK
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.12.2008 (Чт) 9:10

Re: Определить не изменился ли файл...

Сообщение AlienK » 04.12.2008 (Чт) 23:31

Sebas писал(а):Invoke у формы!!!!

Не понятно :oops: . Можно подробнее и с кодом?

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Определить не изменился ли файл...

Сообщение Williams » 05.12.2008 (Пт) 0:11

AlienK писал(а):
Sebas писал(а):Invoke у формы!!!!

Не понятно :oops: . Можно подробнее и с кодом?


Тебе же показали пример - с Delegate и Invoke. См. выше
И вы думаете, что вас оставят в живых после прочтения этого поста?

Joo
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 762
Зарегистрирован: 14.08.2008 (Чт) 11:55
Откуда: Казахстан

Re: Определить не изменился ли файл...

Сообщение Joo » 05.12.2008 (Пт) 4:38

AlienK писал(а):
Scarabey писал(а):Вот блин а....

Это понятно. Но мне надо не совсем так.
Как-нибудь вот так:

Код: Выделить всё
Public Class Form1

    Public CW_col As New Collection

    Private Sub Add_CW()
         Dim CW As New CCW
         CW.name="sfg"
         .....
         CW_col.Add(CW,CW.name)         
    End Sub

     .....
End Class


Я не пойму в чем проблема????

Каждый новый объект привязывай к процедуре обработки лога:
AddHandler CW.WriteLog, AddressOf CWs_WriteLog
И будет счастье тебе.
"Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог

AlienK
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 04.12.2008 (Чт) 9:10

Re: Определить не изменился ли файл...

Сообщение AlienK » 05.12.2008 (Пт) 6:09

Все, дошло.
Спасибо всем большое.


Вернуться в Visual Basic .NET

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 86

    TopList