Jump to content

[Resolvido] Lock Controls


umbelino

Recommended Posts

Estou a tentar bloquear controlos que estão num formulário mas embora o método com as instruções seja chamado os controlos não são bloqueados, a propriedade Enabled é alterada mas o controlo não é alterado (VB.NET 2005).

Agradeço qualquer ajuda.

'Ficheiro PopupForm.vb (Form)
Imports System.IO
Imports System.Windows.Forms

Public Class PopupForm

'...Diversos controlos

Private Sub PopupForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'....
End Sub

Public Sub LockControls(ByVal lock As Boolean)
Me.cmdImportar.Enabled = Not lock
Me.cmdCancelar.Enabled = lock
End Sub

End Class


'Ficheiro FTPclient.vb
Imports System.IO
Imports System.Net
Imports System.ComponentModel
Imports system.Threading

Public Class FTPclient

Private _worker As BackgroundWorker

'Evento
Public Event LockControls(ByVal lock As Boolean)

Sub New()
_worker = New BackgroundWorker()
_worker.WorkerReportsProgress = True
_worker.WorkerSupportsCancellation = True
_resetEvent = New AutoResetEvent(False)
AddHandler _worker.DoWork, New DoWorkEventHandler(AddressOf OnWork)
AddHandler _worker.ProgressChanged, New ProgressChangedEventHandler(AddressOf onprogressChanged)
AddHandler _worker.RunWorkerCompleted, New RunWorkerCompletedEventHandler(AddressOf OnRunWorkerCompleted)
End Sub

Private Sub OnWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
_worker.ReportProgress(0, Nothing)
End Sub

Private Sub onprogressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
RaiseEvent LockControls(True)
End Sub

Private Sub OnRunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
RaiseEvent LockControls(False)
End Sub

End Class

'em outro ficheiro
d = New FTPclient()
AddHandler d.LockControls, AddressOf PopupForm.LockControls
Edited by Caça
Link to comment
Share on other sites

Tentei colocar somente o código com algum interesse para dar uma ideia do que tenho feito. Basicamente tenho um Form (classe PopupForm) com alguns controlos, tenho alguns objetos que são instâncias da classe FTPclient onde tenho um BackgroundWorker e a ideia é bloquear/desbloquear botões no formulário a partir desses objetos (a classe FTPclient não faz parte da classe PopupForm). O Evento LockControls está definido na classe FTPclient e o Handle ao método LockControls(ByVal lock As Boolean) definido na classe do Form é feito logo que o objeto é criado (última linha do código apresentado)

O Handle funciona, coloquei um Breakpoint no método, verifiquei que o valor da Propriedade Enabled dos botões é alterado mas os botões não são atualizados, dá ideia que o botão não recebe a "notificação" de que a propriedade foi alterada para que volte a desenhar o botão.

Quando o método é chamado dentro do próprio Form tudo funciona bem.

Link to comment
Share on other sites

Já percibi o que estava acontecer… Bom, trata-se de uma aplicação sem janela (ApplicationContext) e a instância da classe PopupForm (o Form) só é criada quando se escolhe a opção apropriada num menu de contexto do icone da aplicação no system tray. Mas os objectos FTPcliente são criados logo que aplicação inicia e o Handle que estava a fazer não refenciava a instância do Form (passei o nome da classe... 😞), o estranho é que não dava erro e no Debug passava pelo Breakpoint... Para corrigir, como o utilizador tem que escolhe no Form o objecto FTPclient que vai realizar a operação, nessa altura faço o Handle passando uma referência do Form correcta para o evento do objecto, e assim funciona. O tempo que perdi com isto... 😞 Caça, obrigado, tinhas razão. 👍

Imports Microsoft.Win32

Public Class AppContext
Inherits ApplicationContext

'.....

Private Sub mnuDisplayForm_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuDisplayForm.Click
Try
If PF IsNot Nothing AndAlso Not PF.IsDisposed Then
PF.BringToFront()
Exit Sub
End If
PF = New PopupForm
PF.ShowDialog()
PF.Dispose()
PF = Nothing

Catch ex As Exception
End Try
End Sub

'...
End Class


'Ficheiro PopupForm.vb (Form)
Imports System.IO
Imports System.Windows.Forms

Public Class PopupForm

'...Diversos controlos

Private Sub PopupForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'....
End Sub

Public Sub LockControls(ByVal lock As Boolean)
Me.cmdImportar.Enabled = Not lock
Me.cmdCancelar.Enabled = lock
End Sub


Private Sub cmdImportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdImportar.Click
Try
Dim itm As NameAndHost = CType(Me.cboDispositivos.SelectedItem, NameAndHost)
Dim d As FTPclient = GetDevice(itm.Name)
If d Is Nothing Then
Exit Sub
Else
If d.WorkerIsBusy = True Then
'...
Else
AddHandler d.LockControls, AddressOf Me.LockControls
d.DoWork(FTPclient.TipoOperacao.ManualDownload)
End If
End If
Catch ex As Exception
End Try
End Sub

End Class
Edited by Caça
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.