erik87
Goto Top

Dynamische Objekte während der Laufzeit abfragen

Hallo mal wieder,

ich habe heut den ganzen tag daran gesessen um meine dynamisch erstellten Labels, Textboxen und Checkboxen auf ein Click abzufragen. Habe dann nach 4 stunden Probieren rausgefunden das es wohl kein addhandler im VBA von Excel 2007 gibt. Ich muss dazu sagen das ich mich heute erstmals mit Klassen beschäfftigt habe und rein garnicht durch sehe.

ich habe das Beispiel auf dieser Seite Probiert und soweit verstanden:

http://www.online-excel.de/excel/singsel_vba.php?f=57


Allerdings brauche ich keine Buttons abzufragen und wenn ich versuche es auf andere Objecte zu übertragen bekomme ich nur fehlermeldungen..

Beispiel Checkboxen:


'Userform---------------

[...]
Dim oCheckBox1 As clsCheckBox
Dim oCheckBox2 As clsCheckBox
Dim checkbox100
Dim CHkBx As MSForms.CheckBox
'---
Set oCheckBox1 = New clsCheckBox
Set oCheckBox2 = New clsCheckBox
Set oCheckBox1.DieChkBxs = CheckBox1 ' Hier kommt der Fehler: Objekt erforderlich
Set CHkBx = Frame3.controls.Add("Forms.CheckBox.1") 'Positionsbeschreibung
With CHkBx
.Name = "chkbx" & VisPos
.Width = 450
.Height = 15
.Left = 23
.Top = DynTOP
.Caption = TreeView1.SelectedItem
.Value = 1
End With
Set oCheckBox2.DieChkBxs = CHkBx
Set CHkBx = Nothing

[...]
'Modul: clsCheckBox------------------------

Option Explicit
Public WithEvents DieChkBxs As MSForms.CheckBox

Private Sub DieChkBxs_Click()
DieChkBxs.ControlTipText = "Geklickt"
MsgBox "test"
DieChkBxs.BackColor = vbGreen
DieChkBxs.Font.Bold = True
End Sub
Private Sub DerChkBxs_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
MsgBox "Double"
End Sub


Mag jemand mit mir das mal langsam durchkauen und alles schritt für Schritt erklären. Ich weiß nicht ob es wichtig ist aber noch ein wenig zum Programmablauf:


ich habe am linken rand ein treeview, in welchem verschiedene Funktionen stehen. nach dem auswählen einer solchen funktion werden, für jede Auswahl eine Checkbox, 1 Label und eine Textbox nebeneinander, aber pro auswahl untereinander (quasi zeilen weise) in einem Frame erstellt. es sollen bis zu 256 "Zeilen" möglich sein. nun muss ich diese auf ein Click event abfragen um die entsprechenden Berechnungsfunktionen zu starten mit den eingabeparametern der in laufzeit erstellten Objecte. Diese besitzen Standartwerte, welche aber vom benutzer geändert werden können. Das Auslesen der objecte sollte kein Problem darstellen, ich will nur wissen, auf welches geclickt wurde.

Ich hatte auch schon überlegt ein Timer einzubauen und alle 500 ms die erstellten Objecte auf änderung zu überprüfen, das würde das programm aber zusätzlich verlangsamen, es brauch so schon sehr lange für die berechnungen.


Schönen Abend noch
Mit freundlichen Grüßen

Content-Key: 143992

Url: https://administrator.de/contentid/143992

Printed on: April 23, 2024 at 19:04 o'clock

Member: erik87
erik87 Jun 01, 2010 at 17:08:56 (UTC)
Goto Top
puh, kaum saß ich im auto...

es geht jetzt. face-smile Danke, an alle die sich versucht haben zu bemühen face-smile
Member: dog
dog Jun 02, 2010 at 00:47:37 (UTC)
Goto Top
Dann bitte für andere noch erklären woran es lag...
Member: erik87
erik87 Jun 02, 2010 at 06:00:51 (UTC)
Goto Top
Moin,

ja, da habe ich Gestern wohl vor "Freude" garnicht mehr dran gedacht. Problem war, das in der oben genannten Internet Präsenz ein Beispiel gegeben war, in dem auch gezeigt wird, das nicht während runtime erstellte Objekte damit identifiziert werden können.

hier nochmal der funktionierende Code für Label´s:

'Klassenmodul -- clsLabel  

'Option Explicit  
Public WithEvents LBL As MSForms.Label
    
Private Sub LBL_Click()
x = UserForm1.aufruf(LBL.Name)
End Sub
    
Private Sub LBL_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    MsgBox "Double"  
End Sub

'-- userForm  

Option Explicit
Dim oLBLn(20) As clsLabel
    
Private Sub UserForm_Initialize()
Dim i As Integer
 For i = 0 To 20
    Dim LBL As MSForms.Label
    Set oLBLn(i) = New clsLabel
    Set LBL = Me.Controls.Add("Forms.Label.1", "LBL" & i, True)  
    With LBL
        .Left = 10
        .Top = i * 25
        .Height = 20
        .Width = 50
        .Caption = .Name
    End With
    Set oLBLn(i).LBL = LBL
    Set LBL = Nothing
 Next i
End Sub

Function aufruf(Lname As String)
MsgBox Lname
End Function

Viel Spaß damit face-wink

[Edit Biber] Codetaxx. [/Edit]