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

VB6 - destroir 1 objecto(UC)

Discussão em 'Programação' iniciada por Cambalinho, 17 de Janeiro de 2009. (Respostas: 29; Visualizações: 1529)

  1. Cambalinho

    Cambalinho Power Member

    o meu objectivo é destroir 1 objecto em run-mode, que foi construido em project-mode.
    parece que consegui destroir o objecto, ou 1 parte dele:
    Código:
    DestroyWindow UserControl.hWnd
    mas tenho 1 problema:
    -parece que o bjecto ainda esta em memoria. eu digo isso porque ainda tenho acesso ás propriedades.
    a minha ques tão é a seguinte:
    será que posso destroir/"congelhar" todas as propriedades e methodos?(eu n falei em eventos, porque parece que a função os "destroy".
    obrigado
     
  2. ribeiro55

    ribeiro55 Power Member

    Ainda com o VB6 ? :005:

    Tenta:
    Código:
    Set ObjectoCoisoETal = Nothing
    Ainda que tenha ideia de não poderes alterar a coleção de objectos construída em design-time.

    EDIT: Exprimenta também o Unload. Lembro-me de o usar para limpar o sebo a forms ( Unload Me )
     
    Última edição: 17 de Janeiro de 2009
  3. Cambalinho

    Cambalinho Power Member

    Ainda com o VB6 ? :005:
    (mas só por enquanto ;))

    "invalide use of property"- da-me esta mensagem de erro :(
    ja tentei com a função API destroywindow(), mas o objecto continua em meoria.
    porque se fizer:
    Código:
    msgbox nomedoobjecto.width
    continuo a receber 1 valor, o que eu n queria... eu queria que desse erro...
    o unload só dá quando se usa load.
     
  4. ribeiro55

    ribeiro55 Power Member

    Sinceramente já não me lembro do VB6 o suficiente para te poder sugerir mais daquilo que te sugeri.

    Exprimenta verificar se o form não tem uma propriedade, que é uma coleção de objectos, chamada "Controls".
    Vê o que podes, ou não, fazer com os valores de ssa propriedade pois representa a coleção de objectos existentes nessa instância da form.
    Isto se tiver... como te disse, sinceramente já não me lembro.

    De que interface? Devem haver milhares de API com esse nome em algum dos seus métodos. (não é relevante para aqui, mas para a próxima indicas o interface :P )
     
    Última edição: 17 de Janeiro de 2009
  5. Cambalinho

    Cambalinho Power Member

    tambem ja tentei... mas nd
     
  6. Cambalinho

    Cambalinho Power Member

    até mesmo o VB2008 n destroi 1 objecto...
    Código:
    button1.disposed
    msgbox button1.name
    eu continuo a receber o nome do objecto
     
  7. ribeiro55

    ribeiro55 Power Member

    Penso que Disposed (ou será IsDisposed?) é uma propriedade Boolean que só te indica se o gajo já foi destruído ou não.

    .Dispose é que lhes limpa o sebo.

    Em VB2008 exprimenta um ciclo a correr Me.Controls para encontrar o nome do objecto que precisas e depois usa o Remove e um = Nothing no fim, para o GarbageCollector se divertir a limpá-lo da memória.

    Trigo limpo.

    EDIT:
    BTW, não estou a reforçar com código como costumo fazer, porque não estou na minha máquina e não tenho a IDE disponível.
     
    Última edição: 17 de Janeiro de 2009
  8. Cambalinho

    Cambalinho Power Member

    ya.. é verdade.... obrigado amigo.
    Código:
    [SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]
    Private[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] Button2_Click([/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] sender [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] System.Object, [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] e [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] System.EventArgs) [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Handles[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] Button2.Click[/COLOR]
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].Controls.Remove(Button1)
    Button1 = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Nothing
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]MsgBox(Button1.Name) [/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]'d  erro
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub
    [/COLOR][/SIZE][/COLOR][/SIZE]
     
  9. Cambalinho

    Cambalinho Power Member

    mas em UC?
    on de esta o meu erro?
    Código:
    [SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]
    Public[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] Destroy()[/COLOR]
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]RaiseEvent[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Destroyed()
    Controls.Remove([/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Nothing 'dá-me erro
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub
    [/COLOR][/SIZE][/COLOR][/SIZE]
     
  10. PNDmartins

    PNDmartins Power Member

    Ele da-te erro, porque depois de o removeres estás a tenta-lo igualar a "Nothing" e como ele supostamente ja nao existe da-te o erro. Tira o "me = nothing" e deve d funcionar.

    Um concelho, não facas um objecto destroir-se dessa forma que mais tarde ou mais cedo isso ha-de dar problemas. Implementa o interface IDisposable no objecto que trata disso por ti.
     
  11. Cambalinho

    Cambalinho Power Member

    eu sou novo em VB2008.
    se tirar "me=nothing", n me da erro. mas continuo a ter acesso ás propriedades do objecto.
    desculpa mas cm uso o implements no meu procidimento?
    obrigado
     
  12. PNDmartins

    PNDmartins Power Member

    É normal que continues a ter acesso porque o objecto apenas é destruido em run-time, quando estas a programar tens sempre acesso as propriedades.

    A implementação do IDisposable tem que ser aplicado numa class/objecto que tu uses criado por ti. Se estiveres a utilizar controlos qua ja existem no vb2008 eles em principio já trazem isso por defeito. Tenta ir ao controlo que tu queres e mete .dispose. Exemplo:

    Código:
    Button1.Dispose
    
     
  13. Cambalinho

    Cambalinho Power Member

    desculpa, mas penso que ainda não percebeste o que quero fazer.
    eu estou a fazer 1 objecto(utilizando o UC) que contenha 1 procedimento/metodo Destroy.
    eu n sei utilizar o idisposable, mas podes ajudar-me?
    obrigado
     
  14. PNDmartins

    PNDmartins Power Member

    Para usares o IDisposable basta mesmo abaixo da definição do teu objecto escreveres "Implements IDisposable". Exemplo:

    Código:
    Public Class Class1
        Implements IDisposable
    
    End Class
    
    Após adicionares isto o próprio Vb vai-te adicionar este codigo ao teu objecto:

    Código:
        Private disposedValue As Boolean = False        ' To detect redundant calls
    
        ' IDisposable
        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If Not Me.disposedValue Then
                If disposing Then
                    ' TODO: free other state (managed objects).
                End If
    
                ' TODO: free your own state (unmanaged objects).
                ' TODO: set large fields to null.
            End If
            Me.disposedValue = True
        End Sub
    
    #Region " IDisposable Support "
        ' This code added by Visual Basic to correctly implement the disposable pattern.
        Public Sub Dispose() Implements IDisposable.Dispose
            ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
    #End Region
    
    

    A partir deste momento tens o metodo Dispose a funcionar no teu objecto e sempre que invocares este metodo o teu objecto vai ser destruido.
     
  15. Cambalinho

    Cambalinho Power Member

    mt obrigado
    agora gostava de saber 1 coisa:
    quando faço propriedades, como as meto na janela de lista de propriedades(refiro-me em ambiente de projecto)?
    obrigado
     
  16. PNDmartins

    PNDmartins Power Member

    Todas as propriedades aparecem por defeito no separador "Misc" do IDE. Se quiseres que elas aparecam num separador especifico basta acrescentares o system.componentmodel.Category quando defines a propriedades. Exemplo:

    Código:
    Public Class Class1
    
        Private My_Nome As String = String.Empty
    
        <System.ComponentModel.Category("Teste")> _
        Public Property Nome() As String
            Get
                Return My_Nome
            End Get
            Set(ByVal value As String)
                My_Nome = value
            End Set
        End Property
    
    End Class
    
    Neste exemplo, quando eu fosse ao IDE a propriedade "Nome" iria aparecer no separador "Teste".
     
  17. Cambalinho

    Cambalinho Power Member

    ok mt obrigado.
    desculpa pelo incomodo. mt obrigado amigo
     
  18. PNDmartins

    PNDmartins Power Member

    De nada. Sempre as ordens ;)
     
  19. Cambalinho

    Cambalinho Power Member

    o meu codigo actual:
    Código:
    [SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]
    Public[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Class[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] Sprite2D[/COLOR]
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]      Implements[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] IDisposable
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]      [/COLOR][/SIZE][/COLOR][/SIZE]
    [SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]      Event[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Destroyed([/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] PosX [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Long[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] PosY [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Long[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])[/SIZE]
    [SIZE=2] 
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]      Private[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] disposedValue [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Boolean[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]False[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]' To detect redundant calls
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]                  ' IDisposable
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]     Protected[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Overridable[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Destroy([/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] disposing [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Boolean[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]                 If[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].disposedValue [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]                         If[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] disposing [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Then
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]                              ' TODO: free other state (managed objects).
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]                         End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]                         ' TODO: free your own state (unmanaged objects).
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]                         ' TODO: set large fields to null.
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]                   End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]If
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]                   Me[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].disposedValue = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]True
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]      End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub
    #Region[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#a31515][SIZE=2][COLOR=#a31515]" IDisposable Support "
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]       ' This code added by Visual Basic to correctly implement the disposable pattern.
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]        Public[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] Destroy() [/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]'Implements IDisposable.Dispose
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]              RaiseEvent Destroyed(Me.Left, Me.Top)
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#008000][SIZE=2][COLOR=#008000]              ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]             Dispose([/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]True[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])
                 GC.SuppressFinalize([/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]        End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Sub
    #End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Region
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]       Private[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] strFileName [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] = [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].Empty
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]       Public[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Property[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] FileName() [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]String
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]               Get
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]                      Return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] strFileName
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]               End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Get
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]               Set[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]ByVal[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] value [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]As[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]String[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2])
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]                        Me[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2].BackgroundImage = Image.FromFile(value)
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]               End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Set
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]      End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2] [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Property
    [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]
    [/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff][SIZE=2][COLOR=#0000ff]Class
    [/COLOR][/SIZE][/COLOR][/SIZE]
    ok eu tenho aqui com 1 problema:
    -apos meter o sprite2D no form dá-me erro e para resolver isso tenho que alterar algum codigo(o que é automatico do form). meter global(qualquer coisa do genero). mas continuo com 1 problema no metodo destroy. porque continuo a receber os valores das propriesdades.
    (a propriedade é mostrada, mas tenho que fazer + 1 para receber a imagem, porque quero 1 propriedade para receber o nome do ficheiro e outra para receber a imagem).
    mas onde esta o meu erro no metodo destroy?(este metodo chama o evento Destroyed)
    obrigado
     
  20. PNDmartins

    PNDmartins Power Member

    Tive a ler melhor o que IDisposable faz, e é o seguinte, segundo a definição da microsoft, o que o IDisposable faz é libertar os recursos associados ao objecto para o Garbage Collector eliminar, mas isso não é algo que tu/eu/alguem controle porque o garbage collector é activado por necessidade, ou seja, se existirem falta de recursos no sistema ele é activado e faz limpeza (eliminando assim o objecto), ou de X em X tempo ele tambám faz essa mesma limpeza. Pode acontecer de chamares o .dispose e o garbage collector eliminar logo o objecto, ou levar horas até o eliminar.

    Uma forma de fazeres o que tu queres é depois de executares o .Dispose meteres o objecto = nothing.

    Outra coisa em relação ao teu código, quando se implementa um interface, não se altera o nome das funções para não começar a dar erros como foi no teu caso. São funções que já estão a trabalhar, e que até tem um nome compreensivel, para que mexer? Mas se quiseres alterar os nomes, como no teu caso, ao alterares o nome a função "ProtectedOverridableSub Destroy(ByVal disposing AsBoolean)" não te esqueças que na função

    Código:
     PublicSub Destroy() 'Implements IDisposable.Dispose
                  RaiseEvent Destroyed(Me.Left, Me.Top)
                  ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
                 Dispose(True)
                 GC.SuppressFinalize(Me)
            EndSub
    
    o "Dispose(true)" tem que passar a ser "Destroy(True)".


    Na tua propriedade:

    Código:
    Private strFileName AsString = String.Empty
           PublicProperty FileName() AsString
                   Get
                          Return strFileName
                   EndGet
                   Set(ByVal value AsString)
                            Me.BackgroundImage = Image.FromFile(value)
                   EndSet
          EndProperty
    
    Não deves atribuir logo o valor assim sem antes o guardares o valor na variavel, senão quando tentares obter o caminho da imagem não vais conseguir.

    A maneira correcta seria:

    Código:
        Private MyImagePath As String = String.Empty
        Private MyImage As Image = Nothing
    
        Public Property Image() As Image
            Get
                Return MyImage
            End Get
            Set(ByVal value As Image)
                MyImage = value
            End Set
        End Property
    
        Public Property Name() As String
            Get
                Return MyImagePath
            End Get
            Set(ByVal value As String)
    
                If My.Computer.FileSystem.FileExists(value) = True Then
                    MyImagePath = value
                    Me.Image = Image.FromFile(MyImagePath)
                Else
                    'O código que quiseres para avisar que não deu para carregar a imagem.
                End If
    
            End Set
        End Property
    
    Desta forma, quando lhe das o caminho da imagem guardas o caminho na string para poderes ter acesso ao caminho, mandas correr a propriedade "Image" dando-lhe logo a imagem de acordo com o caminho do ficheiro.

    Também estou a usar um "IF" que executa uma função interna para verificar se o ficheiro existe antes de tentar abrir de forma a não arrebentar nesta propriedade.
     

Partilhar esta Página