| 
|  |  |  |  | CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min 48 |  |  |  |  |  | Skalierbare und leistungsstarke Enterprise Visualisierungslösung für die Fertigungsindustrie, eine Pressemitteilung 
 |  
| Autor | Thema:  Per Code erzeugtes Steuerelement - (Klick-)Event erstellen (2582 mal gelesen) |  | geekv5 Mitglied
 Konstrukteur
 
   
 
      Beiträge: 214Registriert: 13.07.2011
 Notebook<P>MSI GX660RIntel Core i5 460M
 8GB DDR3
 1GB Mobility HD5870
 80GB Intel X25-M Postville
 250GB HDD<P>Desktop<P>AMD Phenom II X4 965
 1GB HD4890@ FirePro V8700
 8GB DDR3-1600
 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
 |    erstellt am: 05. Dez. 2011 13:34  <-- editieren / zitieren -->    Unities abgeben:            
  Ich schon wieder      Nach stundenlanger Recherche, bin ich meinem Ziel schon ziemlich nahe gekommen, aber es funktioniert einfach noch nicht.. Ich möchte dynamisch Steuerelemente (z.B. Button oder CheckBox) erstellen und gleichzeitig ein Click Ereignis erstellen.. Verwenden möcte ich den Code z.B. um eine Liste von Parts in einem Produkt oder Körpern in einem Part auszugeben.. Bisheriger Code: Code:
 Private Sub CommandButton1_Click()
 Dim Button2Set Button2 = UserForm1.Controls.Add("Forms.CommandButton.1")
 With Button2     .Name = "CommandButton2".Caption = "Button2"
 
 End With
 Dim oAPC As New MSAPC.Apc Dim VBAEditor As VBIDE.VBEDim VBProj As VBIDE.VBProject
 Dim VBComp As VBIDE.VBComponent
 Dim CodeMod As VBIDE.CodeModule
 Set VBAEditor = oAPC.VBESet VBProj = VBAEditor.ActiveVBProject
 Set VBComp = VBProj.VBComponents("UserForm1")
 Set CodeMod = VBComp.CodeModule
 
 With CodeMod
     LineNum = .CreateEventProc("Click", "CommandButton2")LineNum = LineNum + 1
 .InsertLines LineNum, ""
 
 End With
 End Sub
 
 Also er erstellt den Button mit dem Namen "CommandButton2", doch beim erstellen des Click-Ereignisses kommt immer "Run-time error '57017': Event handler is invalid".. Ändere ich die entsprechende Zeile in  Code:erstellt er das Ereignis für "CommandButton1".. Der "CommandButton2" ist aber definitiv da und heißt auch so..LineNum = .CreateEventProc("Click", "CommandButton1")
 
   Edit: Nach weiterer Recherche scheint das nicht so ohne weiteres möglich zu sein, habe mich jetzt an einer anderen Variante versucht, geht allerdings auch nicht :( Code:
 Private Sub CommandButton1_Click()
 Dim Button2Set Button2 = UserForm1.Controls.Add("Forms.CommandButton.1")
 With Button2     .Caption = "Button2".Name = "CommandButton2"
 .OnClick = "=KlickEvent()"
 
 End With
 End Sub
 
 Hier bringt er mir "Run-time error '438': Object doesn't support this property or method" bei der Zeile, wo ich der Eigenschaft ".OnClick" die Prozedur "KlickEvent()" zuweise.. Ist das denn überhaupt der richtige Ansatz, um so etwas umzusetzen? Bis jetzt hatte ich die Controls alle vorher erstellt und habe sie dann nur sichtbar gemacht, aber das kann doch nicht der beste Weg sein..    [Diese Nachricht wurde von geekv5 am 05. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | gladly Mitglied
 
 
  
 
      Beiträge: 56Registriert: 02.11.2007
 Catia V5R19SP9HF40 64BitWindows XP Pro x64
 |    erstellt am: 05. Dez. 2011 17:25  <-- editieren / zitieren -->    Unities abgeben:           Nur für geekv5   
  Guten Tag, am besten macht man dies mit einer Klasse. Hier ein Beispiel mit einer Kapsel-Klasse für einen CommandButton: Code:
 'Klasse1
 Option Explicit
 Public WithEvents myCmd As MSForms.CommandButton Private Sub myCmd_Click()MsgBox (myCmd.Name & " gedrückt")
 End Sub
 Private Sub Class_Initialize()'Klasse erstellt
 End Sub
 Public Sub Init(Form As UserForm, Name As String)Set myCmd = Form.Controls.Add("Forms.CommandButton.1", Name)
 End Sub
 
 
 Genutzt wird es dann ganz einfach folgend: Code:
 Option Explicit
 Private myColl As New Collection
 'Private bla As Klasse1 'Falls nur ein Objekt benötigt wird, was aber unwahrscheinlich ist, dieses an und Collection aus
 Private Sub CommandButton1_Click()Dim bla As Klasse1
 Set bla = New Klasse1
 Call bla.Init(Me, "cmd_Test")
 bla.myCmd.Caption = "Blablabla"
 myColl.Add bla 'Nur wenn auch Collection oben erstellt.
 
 
 Wichtig ist das die Klasse in einem Global-Object ist. Solltest du die Collection auskommentieren wird der Code zwar druchlaufen, aber keine Events geschlossen.Also entweder das "Dim bla as Klasse1" außerhalb der Sub-Routine (Oben als Private bla as ... vorgemerkt) oder aber zur Globalen Collection hinzufügen!!!!
 mfg
 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | geekv5 Mitglied
 Konstrukteur
 
   
 
      Beiträge: 214Registriert: 13.07.2011
 Notebook<P>MSI GX660RIntel Core i5 460M
 8GB DDR3
 1GB Mobility HD5870
 80GB Intel X25-M Postville
 250GB HDD<P>Desktop<P>AMD Phenom II X4 965
 1GB HD4890@ FirePro V8700
 8GB DDR3-1600
 2,5TB HDD<P>Belinea 2485 S1W 24" MVA
 |    erstellt am: 05. Dez. 2011 18:04  <-- editieren / zitieren -->    Unities abgeben:            
  Hallo gladly, habe mal versucht, deinen Code zu testen und zwar habe ich den ersten Code in ein leeres Klassenmodul kopiert, dann einen Button erstellt und ihm den zweiten Code zugewiesen.. Wenn ich jetzt den Button klicke bricht er bei  Code:Dim bla As Klasse1
 
 mit "User-defined type not defined" ab.. Muss ich "Klasse1" noch irgendwie deklarieren? Edit: Kommando zurück, die erstelle Klasse heißt bei mir "Class1", dementsprechend funktioniert es jetzt.. Danke erstmal, ist der Abend wieder gerettet    [Diese Nachricht wurde von geekv5 am 05. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |  | Anzeige.:
 Anzeige: (Infos zum Werbeplatz >>)
  |