Criação de Instâncias - VB.NET

Dark_Webster

Power Member
Boas,

Queria perguntar se é possível declarar uma instância como publica:

Public novainst as JanelaPontuação ou Public novainst as New JanelaPontuação.

E se depois é possivel destrui-las e cria-las definidas à mesma no campo Public.
Por exemplo declara-las no General e depois com um Sub fazer dispose dela e criar uma nova instância.
 
sim é.

Exemplo:
Código:
Public Class Teste

Public OMG as new PictureBox

Public Sub Eliminar()
     OMG.Dispose()
End Sub

Public sub VoltarAActivarVariavel()
     OMG = New PictureBox
End Sub

End Class

Depois de correres o Eliminar, para voltar a activar a picturebox bastava correr a sub "VoltarAActivarVariavel".

Pus em subs diferentes para mais facil compreensão.
 
sim é.

Exemplo:
Código:
Public Class Teste

Public OMG as new PictureBox

Public Sub Eliminar()
     OMG.Dispose()
End Sub

Public sub VoltarAActivarVariavel()
     OMG = New PictureBox
End Sub

End Class
Depois de correres o Eliminar, para voltar a activar a picturebox bastava correr a sub "VoltarAActivarVariavel".

Pus em subs diferentes para mais facil compreensão.

Muitissimo obrigado :D. Só mais uma coisa, como consigo verificar com código se uma instância já foi criada?

EDIT: Atenção, a instância a chamar é outro form igual ao de startup.
 
Última edição:
Como isso é um objecto, quando está "Eliminado" ou "Desactivado" fica igual a nothing. Para isso basta verificares de uma destas 2 formas:

Código:
If Objecto IsNot Nothing Then
     'Entra aqui se o objecto já estiver eliminado. Também podes trocar
     'o IsNot para apenas Is que verifica o oposto, ou seja so entrava 
     'dentro do If se o objecto ainda não estivesse eliminado.
End IF
 
ou
 
If IsNothing(Objecto) = True then
     'Entra no If se o objecto estiver eliminado. Se for igual
     'a false entra no If apenas se o objecto não estiver eliminado.
End If

Existem estas duas formas porque hà alguns objectos que não podem ser igualados a "nothing" directamente, e quando isso acontece so consegues verificar usando a segunda forma. Com todos os objectos que possam ser directamente igualados podes usar qualquer uma das formas. É uma pequena questão de escolha.
 
Então se não te importas verifica se estou a fazer bem:

Código:
If novainstancia Is Nothing Then
        novainstancia = New JanelaPontuação
        novainstancia.Show()
        novainstancia.Text = novainstancia.Text & " - Instância #" & nrinstancias
        Me.Text = Me.Text & " - Instância Principal"
        novainstancia.CriarNovaInstância.Enabled = False
        novainstancia.CriarNovaInstância.Visible = False
        novainstancia.ReniciarOPrograma.Text = "Reniciar a Instância"
        MsgBox("Nova instância criada! Lembre-se que não poderá criar mais nenhuma instância mesmo que feche a que criou, devido a uma limitação actual! Feche e reabra o programa para poder criar uma nova instância.", MsgBoxStyle.Information, "Instância...")
    Else
        MsgBox("Uma instância está ou esteve aberta! Feche e reabra o programa para voltar a usar esta função!", MsgBoxStyle.Exclamation, "Instâncias...")
    End If
Tipo é suposto só ser possível criar uma instância, e só ser possível criar uma nova instância se a anterior já tiver sido fechada.

Mas ainda não consegui fazer isso (Não ligues as MsgBox, isso vai ser mudado se trabalhar...)
 
Última edição:
É assim, esse código está correcto, apenas se a variável "novainstancia" for igual a nothing é que ele corre o If.

Pelo que percebi, supostamente queres verificar se o programa já está a correr ao tentares abrir o programa uma segunda vez, e se estiver não deixar abrir a segunda vez certo?

É que se é isso que queres fazer, isso não pode ser feito dessa forma porque uma variável não é igualada a um programa que já esteja a correr. Para isso era necessário verificares os processos a correr na máquina no momento em que tentas arrancar o programa.
 
É assim, esse código está correcto, apenas se a variável "novainstancia" for igual a nothing é que ele corre o If.

Pelo que percebi, supostamente queres verificar se o programa já está a correr ao tentares abrir o programa uma segunda vez, e se estiver não deixar abrir a segunda vez certo?

É que se é isso que queres fazer, isso não pode ser feito dessa forma porque uma variável não é igualada a um programa que já esteja a correr. Para isso era necessário verificares os processos a correr na máquina no momento em que tentas arrancar o programa.

É tecnicamente isso, mas por mais instancias que crie ele nunca vai fazer mais do que um processo, e eu quero verificar se o novo objecto criado dentro desse processo ainda existe.
 
Eu ia-te meter aqui um código que fazia isso mas lembrei-me que o Vb já tem uma opção para isso.

Vai as Propriedades da tua aplicação e hás-de ter uma opção com o nome "Make single instance application" e activa essa opção.

Sempre que se tentar abrir a mesma aplicação 2 vezes, o windows simplesmente foca a aplicação que já esteja a correr.
 
Eu ia-te meter aqui um código que fazia isso mas lembrei-me que o Vb já tem uma opção para isso.

Vai as Propriedades da tua aplicação e hás-de ter uma opção com o nome "Make single instance application" e activa essa opção.

Sempre que se tentar abrir a mesma aplicação 2 vezes, o windows simplesmente foca a aplicação que já esteja a correr.

Acho que fui eu que não me fiz entender, talvez por não se chamarem instancias, porque estou a invocar o mesmo form:

http://darkwebster.no.sapo.pt/Yu Gi Oh.zip

Faz o download do exe, vais a opçoes do jogo, crias nova instancia e depois fechas a instancia que criaste. Depois vais a instancia principal e logo ves que nao consegues criar outra.
 
Já vi. Tu queres poder ter várias instancias daquela janela, mas apenas com uma declaração certo?

EDIT: Se queres ter várias janelas não precisas de uma declaração pública. Testa isto:

Código:
Public Sub AbrirInstancia()

   Dim A as new FormPontuacao
   A.Show()

End Sub

Desta forma consegues criar forms elimitados desse genero sem problemas. Não tens é controlo sobre eles a partir do principal, que se quiseres basta-te adicionar algo que possa ser usado como unico em cada um, tipo uma propridade que recebe um valor, e depois adiciona-los a uma ArrayList ou uma List(of) no formulário principal e tens acesso a cada "instancia" do form atraves dessa lista.
 
Última edição:
Já vi. Tu queres poder ter várias instancias daquela janela, mas apenas com uma declaração certo?

EDIT: Se queres ter várias janelas não precisas de uma declaração pública. Testa isto:

Código:
Public Sub AbrirInstancia()

   Dim A as new FormPontuacao
   A.Show()

End Sub
Desta forma consegues criar forms elimitados desse genero sem problemas. Não tens é controlo sobre eles a partir do principal, que se quiseres basta-te adicionar algo que possa ser usado como unico em cada um, tipo uma propridade que recebe um valor, e depois adiciona-los a uma ArrayList ou uma List(of) no formulário principal e tens acesso a cada "instancia" do form atraves dessa lista.

OK obrigadão :D. Sempre consegui fazer o que queria.
 
Back
Topo