none
Como transformar código em um componente dll? RRS feed

  • Pergunta

  • Bom Dia

    Gente, o seguinte, tenho um código vb.net, onde ele verifica a ID em um php online e retorna valores.

      Dim wc As New WebClient()
                Dim data = wc.DownloadString("http://mysite.com/file.php?%=" & "IDaqui")
                Dim Linha As String() = data.ToString.Split(Chr(10))
    
    Dim Nome = Linha(1).Trim
    Dim CEP = Linha(2).Trim
    Dim Cidade = Linha(3).Trim

    Isso eu incluo em todos os meus projetos, e depois controlo o php alterando os valores.

    Funciona perfeitamente, mas minha dúvida é, posso transformar isso em uma dll onde pode ser incluído em meu projeto (usado como uso um componente como label, combobox, etx), gerando uma id automática onde eu posso copiá-la? E como faço isso?

    Desde já agradeço.

    sexta-feira, 21 de outubro de 2016 11:01

Respostas

  • Essa parte:

    Public Nome As String
    Public CEP As String
    Public Cidade As String

    Está declarando variáveis da classe. Para trocar por propriedades basta:

    Private interno_Nome As String 'ou "Protected"
    Private interno_CEP As String
    Private interno_Cidade As String
    
    Public Property Nome As String
        Get
            Return Me.interno_Nome;
        End Get
        Set (ByVal value As String)
            Me.interno_Nome = value;
        End Set
    End Property
    
    Public Property CEP As String
        Get
            Return Me.interno_CEP;
        End Get
        Set (ByVal value As String)
            Me.interno_CEP = value;
        End Set
    End Property
    
    Public Property Cidade As String
        Get
            Return Me.interno_Cidade;
        End Get
        Set (ByVal value As String)
            Me.interno_Cidade = value;
        End Set
    End Property

    Assim passam a ser propriedades.

    • Marcado como Resposta Eliseu5 segunda-feira, 24 de outubro de 2016 15:54
    sexta-feira, 21 de outubro de 2016 18:24

Todas as Respostas

  • Bom dia,

    Veja este passo a passo: https://www.youtube.com/watch?v=zo9cFbuTaF8


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".

    sexta-feira, 21 de outubro de 2016 11:16
  • Não entendi muito bem a sua dúvida, mas você pode colocar o seu código em uma classe:

    Public Class Service
        Private Const Site As String = "http://mysite.com/file.php?%=";
        Public Nome As String
        Public CEP As String
        Public Cidade As String
    
        Public Sub Coletar(ByVal ID As String)
    Dim wc As New WebClient() Dim data = wc.DownloadString(Service.Site) Dim Linha As String() = data.ToString.Split(Chr(10)) Me.Nome = Linha(1).Trim Me.CEP = Linha(2).Trim Me.Cidade = Linha(3).Trim End Sub End Class

    E em seguida coloque essa classe em um outro projeto (para DLL) e adicione esse projeto a sua solução (e referência). Assim o seu EXE chama a DLL que tem essa classe. Se você quiser pode até derivar ela ("Inherits") de System.Windows.Forms.Control e usar como controle (que aparece no Toolbox do Visual Studio).

    sexta-feira, 21 de outubro de 2016 11:48
  • Bom Dia Juliano, vou dar uma olhada no vídeo depois comento.

    Muito obrigado.

    sexta-feira, 21 de outubro de 2016 13:00
  • Olá Sammuel

    Obrigado pela ajuda, acho que é isso que procuro. Como nunca fiz então não tenho certeza.

    1. Então eu adiciono a classe em um novo projeto e compilo como dll;

    2. Como adiciono ao controle propriedades como tem em outros controles (preciso adicionar tempo, site, )

    Desde já agradeço.


    • Editado Eliseu5 sexta-feira, 21 de outubro de 2016 13:51
    sexta-feira, 21 de outubro de 2016 13:14
  • Essa parte:

    Public Nome As String
    Public CEP As String
    Public Cidade As String

    Está declarando variáveis da classe. Para trocar por propriedades basta:

    Private interno_Nome As String 'ou "Protected"
    Private interno_CEP As String
    Private interno_Cidade As String
    
    Public Property Nome As String
        Get
            Return Me.interno_Nome;
        End Get
        Set (ByVal value As String)
            Me.interno_Nome = value;
        End Set
    End Property
    
    Public Property CEP As String
        Get
            Return Me.interno_CEP;
        End Get
        Set (ByVal value As String)
            Me.interno_CEP = value;
        End Set
    End Property
    
    Public Property Cidade As String
        Get
            Return Me.interno_Cidade;
        End Get
        Set (ByVal value As String)
            Me.interno_Cidade = value;
        End Set
    End Property

    Assim passam a ser propriedades.

    • Marcado como Resposta Eliseu5 segunda-feira, 24 de outubro de 2016 15:54
    sexta-feira, 21 de outubro de 2016 18:24
  • Mais uma coisa; esse componente é para ser visual? Ou só executa trabalho?
    sexta-feira, 21 de outubro de 2016 18:31
  • Olá Sammuel, show de bola, obrigado!

    Na verdade é pra ser um updaterchecker, vai verificar se possui uma nova versão e caso tiver exibir uma mensagembox pedindo se quer atualizar.

    1. Eu gostaria de só arrastar o componente para meu form e as funções fossem executadas automaticamente, sem precisar fazer referencia no meu projeto. É possível?

    2. Como posso iniciar uma função automática? Exemplo exibir uma mensagem?

    3. Vou colocar uma propriedade "Tempo". Como posso chamar uma função automaticamente após esse tempo zerar?

    sexta-feira, 21 de outubro de 2016 19:05
  • Entendi ... mais ou menos.

    Bom vamos lá; tem várias coisas, primeiro você vai derivar ("Inherits") da classe Control. Isso vai dar um "corpo" ao controle imediatamente, e com isso ele já vai aparecer para você arrastar para o Form. Mas o corpo dele vai ser um quadrado cinza, sem texto sem nada; o que você quer exibir nele?

    Outra coisa é trabalhar com Threads. A função automática vai ter que ter uma Thread; Threads tem "Start" e "Wait", é mais simples do que parece, mas vou procurar algum tópico que te mostre como faz porque a primeira vez pode ser meio estranho. Basicamente você cria uma nova Thread, com o ThreadStart ligando ao método a usar, da Start para chamar esse processo, depois, nele mesmo, faz um Wait de X tempo que você quer (isso cobre o 2 e 3).

    sexta-feira, 21 de outubro de 2016 22:08
  • Ok Sammuel

    1. Na verdade eu estou usando "Inherits Timer", porque tem o mínimo de propriedades possíveis, ficando um visual mais limpo, já que vou adicionar e usar apenas a propriedade "LinkUpdate";

    2. Não vou precisar de corpo, então a propriedade Timer cai bem (não sei se teria outra melhor);

    3. Tenho que chamar atualmente em meu form no evento Load, a função para verificar a atualização:

            mycontrol.LinkUpdate = "http://mysite.com/version"
            mycontrol.CheckUpdate()

    Mas a ideia seria apenas arrastar o controle para o form, em propriedades em "LinkUpdate" inserir o link e pronto.

    Ao executar meu form/projeto o CheckUpdate já seria chamado, sem precisar definir no load ou outro lugar em meu form. Seria mais simples e fácil, mas não estou conseguindo.

    sexta-feira, 21 de outubro de 2016 22:37
  • Isso (MSDN Timer) é um Timer. Da para derivar dele sim.

    Quando você diz que não está conseguindo, porque?

    Eu estou usando mais C# do que VB atualmente, mas isso não muda nada. No Dot Net é tudo a mesma coisa (mais ou menos) e no final das contas as funções, métodos e classes tem a mesma valia. Eu comecei com Delphi, depois migrei para o VB e fiquei com ele por um bom tempo. Tenho usado mais C# por conveniência.

    O que quero dizer com isso; você vai achar muitos exemplos em C# e que você pode usar no VB quase que diretamente, mudando algumas pequenas coisas, tem inclusive site que converte o código do C# para o VB. Digo isso pois tem um exemplo simples no MSDN (na própria página do Timer) de como usa-lo. Derivar ele é super simples, então diga o que está havendo de errado que eu ajudo.

    segunda-feira, 24 de outubro de 2016 11:09
  • Exemplo:

    Public Class Timer
        Inherits Global.System.Timers.Timer
    
        Private Sub WhenElapsed(source As Object, e As Global.System.Timers.ElapsedEventArgs)
            'aqui a ação em si
        End Sub
    
        Public Sub New()
            MyBase.New()
    	Me.AutoReset = True
    	'para ele repetir a ação continuamente.
    	AddHandler Me.Elapsed, AddressOf Me.WhenElapsed
        End Sub
    End Class

    Complementando: veja a definição da classe Timer e seu código fonte.
    • Editado SammuelMiranda segunda-feira, 24 de outubro de 2016 11:35 complemento
    segunda-feira, 24 de outubro de 2016 11:22
  • Olá Sammuel

    Na verdade meu controle tá funcionando corretamente graças a você, obrigado, mas eu tenho que chamar ele:

            mycontrol.CheckUpdate()

    Dentro do controle/classe:

    Sub CheckUpdate()
    'Meu código
    End Sub

    A questão agora é o seguinte, é possível chamar a função automaticamente (apenas arrastando e soltando no form), sem precisar chamá-la? Ou seja, arrastei e soltei o controle em meu form, pronto, ao iniciar meu aplicativo a função já é chamada? 

    segunda-feira, 24 de outubro de 2016 16:09
  • Sempre e automaticamente? Fácil, coloque a chamada do método no contrutor ("Public Sub New()").

    O controle criará e já estará rodando.

    terça-feira, 25 de outubro de 2016 11:54
  • Olá Sammuel

    Entendi, obrigado, funcionou, mas ta causando um erro.

    Fiz um teste assim:

        Private interno_LinkChecker As String
        Public Property LinkChecker As String
            Get
                Return interno_LinkChecker
            End Get
            Set(ByVal value As String)
                interno_LinkChecker = value
            End Set
        End Property
        Public Sub New()
            MsgBox(LinkChecker)
        End Sub

    Em propriedades (em LinkChecker) eu coloco o link desejado, mas o msgbox aparece vazio, ou seja, parece que a função é chamada antes de verificar o conteúdo do LinkChecker.

    Oque pode estar acontecendo? Desde já agradeço.


    • Editado Eliseu5 terça-feira, 25 de outubro de 2016 23:25
    terça-feira, 25 de outubro de 2016 23:19
  • Tá, se você colocou a chamada no "New()" vai dar erro porque o "LinkChecker" que você definiu como String estará vazio; você tem que inicializar o "LinkChecker" (no "New()" mesmo) antes de chamar a função, ou trabalhar a propriedade de forma que:

        Private interno_LinkChecker As String
    
        Private Sub StopUpdate()
            'PARE A FUNÇÃO, caso esteja rodando
        End Sub
    
        Public Property LinkChecker As String
            Get
                Return Me.interno_LinkChecker
            End Get
            Set(ByVal value As String)
                Me.interno_LinkChecker = value
                Me.StopUpdate()
                If (Not Me.interno_LinkChecker = "") Then
                    Me.CheckUpdate()
                End If
            End Set
        End Property

    Entendeu? Assim quando a propriedade receber um valor não nulo, a função é chamada. Se for nulo ela para a função pois o link ficou vazio.

    quarta-feira, 26 de outubro de 2016 10:27
  • Olá Sammuel

    Show de bola. Funcionou perfeitamente. 

    Muito obrigado, obrigado mesmo, você resolveu meu problema. :)

    Abç, fcD

    quarta-feira, 26 de outubro de 2016 11:09