Notifications
Clear all

Criar Eventos para Objetos em Tempo de Execução

3 Posts
2 Usuários
0 Reactions
504 Visualizações
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Ola Pessoal,

Com a ajuda de um bocado de gente ( Edson, Basole, Mauro, Tomas e alguns fóruns internacionais) consegui fazer uma rotina para criar objetos em tempo de execução.

Porém, as rotinas que são criadas (associadas ao evento do MOUSE) não funcionam.

Ou seja, eu estou criando IMAGENS em tempo de execução, e ao mesmo tempo criando uma rotina para estar associadas a estas imagens. TUDO É CRIADO corretamente, porém a rotina que mudaria as IMAGENS de lugar conforme eu for mexendo o MOUSE não funciona.

Para ilustrar tudo isso coloco em anexo um modelo e abaixo como ficou a rotina:

Private Sub CommandButton80_Click()
Dim x As Integer
Dim TempForm As Object
    
Dim Line As Integer
Dim MyScript(4) As String

  Set TempForm = ThisWorkbook.VBProject.VBComponents("Userform1")
  
x = Frame1.Controls.Count + 1
Set xxx = Frame1.Controls.Add("Forms.Image.1", "NIMAGE" & x)
xxx.Top = 30
xxx.Left = x * 58
xxx.Height = 72
xxx.Width = 54
xxx.BorderStyle = 0
xxx.BackColor = &HFFFFFF

TextBox1 = xxx.Name

'===============================
     For x = 0 To 9
        With TempForm.codemodule
            Line = .countoflines
            MyScript(0) = "Private Sub NIMAGE" & x + 1 & "_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)"
            MyScript(1) = "If Button = 1 Then"
            MyScript(2) = "NIMAGE" & x + 1 & ".left = (NIMAGE" & x + 1 & ".left - xx)+x"
            MyScript(3) = "NIMAGE" & x + 1 & ".top = (NIMAGE" & x + 1 & ".top - yy)+y"
            
            .insertlines Line + 3, MyScript(0)
            .insertlines Line + 4, MyScript(1)
            .insertlines Line + 5, MyScript(2)
            .insertlines Line + 6, MyScript(3)
            .insertlines Line + 7, "End if"
            .insertlines Line + 8, "End Sub"
        End With
    Next
    
    For x = 0 To 9
        With TempForm.codemodule
            Line = .countoflines
            MyScript(0) = "Private Sub NIMAGE" & x + 1 & "_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)"
            MyScript(1) = "If Button = 1 Then"
            MyScript(2) = "xx = x"
            MyScript(3) = "yy = y"
            
            .insertlines Line + 3, MyScript(0)
            .insertlines Line + 4, MyScript(1)
            .insertlines Line + 5, MyScript(2)
            .insertlines Line + 6, MyScript(3)
            .insertlines Line + 7, "End if"
            .insertlines Line + 8, "End Sub"
        End With
    Next
    

End Sub

FONTE: http://www.tek-tips.com/faqs.cfm?fid=5757

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 05/12/2016 12:08 am
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Guima, bom dia

Particularmente não sou muito fã de códigos que alterem a escrita do próprio código em tempo de execução, por isso nem me ative a procurar descobrir o que poderia estar acontecendo de errado.

Ao invés disso, em seu problema, pq vc não cria runtime um array de controles Image (instanciados através de uma classe) que respondam aos eventos desejados? Dá uma olhada no anexo e vê se é por aí o caminho.

Comentário: como vc não dimensionou nem definiu o objetivo das variáveis xx, yy que estavam nas linhas geradas, desprezei ambas e comentei as linhas em que apareciam e em seu lugar coloquei interação com um label e um MsgBox.

 
Postado : 13/12/2016 9:22 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bem mais prático sua forma Edson, e funciona ainda melhor.... :lol:

As variáveis XX e YY, são integer, eu acabei me esquecendo delas. Mas coloquei aqui e ficou show.

Sem palavras Edson. Muito obrigado por doar um pouco de seu tempo.

Abraço

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 14/12/2016 8:32 am