1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por Dark_Webster, 11 de Fevereiro de 2009. (Respostas: 11; Visualizações: 2252)

  1. Dark_Webster

    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.
     
  2. Dark_Webster

    Dark_Webster Power Member

    Alguém? É que dava jeito conseguir fazer isso para um programa que estou a desenvolver.
     
  3. PNDmartins

    PNDmartins Power Member

    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.
     
  4. Dark_Webster

    Dark_Webster Power Member

    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: 13 de Fevereiro de 2009
  5. PNDmartins

    PNDmartins Power Member

    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.
     
  6. Dark_Webster

    Dark_Webster Power Member

    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: 14 de Fevereiro de 2009
  7. PNDmartins

    PNDmartins Power Member

    É 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.
     
  8. Dark_Webster

    Dark_Webster Power Member

    É 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.
     
  9. PNDmartins

    PNDmartins Power Member

    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.
     
  10. Dark_Webster

    Dark_Webster Power Member

    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.
     
  11. PNDmartins

    PNDmartins Power Member

    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: 14 de Fevereiro de 2009
  12. Dark_Webster

    Dark_Webster Power Member

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

Partilhar esta Página