CARREGANDO EM SEGUNDO PLANO
Citação::
me confundi então, evento é tipo, click, MouseHover, Leave....
o que seria um evento desse tipo então?
Observe o código que você mesmo colocou como exemplo. Nele, existe um loop, que percorre todas as linhas do DataReader, certo? Pois é você poderia colocar uma instrução RaiseEvent para cada linha percorrida. Na verdade vai da necessidade, mas você pode colocar eventos para cada coisa: Ao iniciar o método, para cada linha percorrida, ao terminar o método, enfim para qualquer coisa que você queira que um evento ocorra. Isso é útil para acompanhamento de processos por exemplo, assim, você sabe que o processo está em execução. Há quem use eventos até mesmo para tratamento de erros, mas eu desaconselho essa prática, para isso, existe os blocos try...catch, que você deveria usar de maneira diferente. Exceções, não são simplesmente para serem exibidas na tela em uma mensagem, como você está fazendo. Esse seu método, deveria estar dentro de uma classe, os blocos try...catch, deveria apenas lançar a exceção que deveria ser capturada no método que chamou esse, e então tratadas ou somente exibidas na tela. Ter um bloco try...catch simplesmente, não é tratamento de erros, ainda mais da maneira que está fazendo, tratando todas as exceções de modo genérico. Pare o cursor do mouse em cima do método [Ô]ExecuteReader[Ô]. Ele irá mostrar todas as exceções que o método pode lançar e todas elas deveriam estar tratadas com instruções catch apropriadas. Isso sim é algo mais parecido com tratamento de erros. Outra coisa importante que vejo no seu código e é digna de nota, é o uso de concatenação de query ao invés de parametrização. Usar parâmetros para queries ao invés de concatenar é muito mais eficiente, seguro e de fácil manutenção.
Sobre o RaiseEvent +- o que eu entendi
Minha classe;
E pra capturar;
Porém quando eu aperto o o botão, me aparece na tela uma mensagem que, Referência de objeto não definida para uma instância de um objeto.
Minha classe;
Public Event Lista(L As List(Of Clientes))
Public Event AttStatus(At As String)
Public Sub Todos(nick As String)
RaiseEvent AttStatus([Ô]Iniciando Conexão[Ô])
Dim SqlAll As String = [Ô]SELECT c_idcliente, c_nick, c_level, c_vip, c_staff, c_gm, c_criador, c_img, c_imgCapa, trofeu FROM cliente inner join estante on estante.idcliente = cliente.c_idcliente where c_nick LIKE [ô]%[Ô] & nick & [Ô]%[ô] order by c_idcliente desc;[Ô]
Dim result As New List(Of Clientes)
Try
Using conn As New MySqlConnection(server_conf)
Using cmd As New MySqlCommand(SqlAll, conn)
Try
RaiseEvent AttStatus([Ô]Conexão aberta[Ô])
conn.Open()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Try
RaiseEvent AttStatus([Ô]Iniciando Leitura[Ô])
Using rdr As MySqlDataReader = cmd.ExecuteReader()
While rdr.Read()
result.Add(New Clientes(rdr.Item([Ô]c_idcliente[Ô]), rdr.Item([Ô]c_nick[Ô]), rdr.Item([Ô]c_level[Ô]), rdr.Item([Ô]c_vip[Ô]), rdr.Item([Ô]c_staff[Ô]), rdr.Item([Ô]c_gm[Ô]), rdr.Item([Ô]c_criador[Ô]),
rdr.Item([Ô]c_img[Ô]), rdr.Item([Ô]c_imgCapa[Ô]), rdr.Item([Ô]trofeu[Ô])))
End While
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Using
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try
RaiseEvent AttStatus([Ô]Finalizado[Ô])
RaiseEvent Lista(result)
E pra capturar;
Private WithEvents T As Clientes
Private Sub AttStatus(T As String) Handles T.AttStatus
TextBox2.Text = T
End Sub
Private Sub CriaLista(L As List(Of Clientes)) Handles T.Lista
For Each i As Clientes In L
Dim label1 = New Label
label1.Text = i.Nick & i.Level
Next
End Sub
Private Sub Button2_Click() Handles Button2.Click
T.Todos([Ô][Ô])
End Sub
Porém quando eu aperto o o botão, me aparece na tela uma mensagem que, Referência de objeto não definida para uma instância de um objeto.
Provavelmente esse erro está ocorrendo na linha [Ô]T.Todos([Ô][Ô])[Ô], certo?
Sim..
Experimente declarar assim a sua classe:
Private WithEvents T As Clientes = New Clientes
Da erro porque eu fala que eu preciso espeficiar os parametros do construtor da classe, que é;
Public Sub New(_Id As Integer, _Nick As String, _Level As Integer, _Vip As String, _Staff As String, _Gm As String, _Criador As String, _Img As Byte(), _ImgCapa As Byte(), _trofeu As Integer)
Acho que você precisa separar entre a Classe clientes (onde tem o construtor) e a Classe MetodosClientes (onde você coloca o evento)
Sim separei....
Más kerp, a ideia desse processo em segundo plano, é para que quando carregar os dados o programa não trave
Más kerp, a ideia desse processo em segundo plano, é para que quando carregar os dados o programa não trave
Carregamento de dados sempre vai gerar algum travamento. Muitos acreditam que colocar em uma thread separada vai resolver isso, mas não. O caso é que alguma ação está sendo feita, então ao menos um pouquinho disso vai ser notado, à menos que esse processamento esteja sendo feito no server. Existem técnicas para criar esses métodos de modo assÃncrono, ou seja, você dispara o método e em algum momento ele termina, mas a aplicação fica [Ô]livre[Ô]. é possÃvel, mas não muito simples.
E qual seria o caminho?
Faça seu login para responder