umbelino Posted August 21, 2012 at 12:35 AM Report Share #472975 Posted August 21, 2012 at 12:35 AM (edited) 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 August 21, 2012 at 01:05 PM by Caça Link to comment Share on other sites More sharing options...
Caça Posted August 21, 2012 at 08:01 AM Report Share #472982 Posted August 21, 2012 at 08:01 AM Não estás a atribuir o Handled Tenta assim Public Sub LockControls(ByVal lock As Boolean) Handles Me.LockControls Pedro Martins Não respondo a duvidas por PM Link to comment Share on other sites More sharing options...
umbelino Posted August 21, 2012 at 12:34 PM Author Report Share #473012 Posted August 21, 2012 at 12:34 PM 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 More sharing options...
umbelino Posted August 21, 2012 at 09:44 PM Author Report Share #473089 Posted August 21, 2012 at 09:44 PM (edited) 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 August 22, 2012 at 07:58 AM by Caça Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now