Sub's von während der Laufzeit erstellten Objekten

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von System32.

    Sub's von während der Laufzeit erstellten Objekten

    Hallo zusammen!

    Ich programmiere schon seit längerem VB und habe ein eigentlich simples Problem:
    Ich möchte ein MouseClick_Event Sub von einem Panel erstellen, welches während der Laufzeit erstellt wurde.


    VB.NET-Quellcode

    1. WithEvents Panel1 As Panel = New Panel()
    2. Controls.Add(New Panel() With {.Name= "Panel1"})
    3. Private Sub Panel1_MouseClickClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Panel1.MouseClick
    4. 'Aktion
    5. End Sub


    In diesem Code wird von VisualStudio kein Fehler erkannt. Allerdings löst das MouseClick_Event nicht aus :wacko:
    Da Ähnliches schon öfters in anderen Projeketen funktioniert hat, frage ich mich ob der Fehler evtl. bei dem anderen Panel liegt, welches unter Panel1 liegt.
    Ich habe auch schon mit dem AddHandler rumprobiert, komme aber zu keinem Ergebnis!

    Wäre nett, wenn mir jemand einen Tipp geben könnte :thumbsup:

    LG
    System32

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „System32“ ()

    das ist ja auch blödsinn - der name sagt in dem fall garnichts aus. Du erstellst quasie zwei verschiedene Panels - einer der die gewnünschten subs "auslösen" kann und einer, der grafisch dargestellt wird.

    Controls.Add(Panel1) sollte hlfen.

    Alternativ google mal nach AddHandler^^

    lg
    Hab es wie gesagt schon mit mehrenen Methoden (unteranderem AddHandler) versucht...
    Würde nicht auch eine Fehlermeldung kommen, wenn zwei Panels dieselben Namen haben?

    Ich verstehe, was du meinst, aber wie kann ich verhindern, dass ein neues Panel erstellt wird?
    Ich kann ja nicht einfach das "New" weglassen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „System32“ ()

    schon mal an Controls.Add(panel1) gedacht?

    Außerdem: VORSICHT!
    Die .Name Eigenschaft entspricht in keinster Weise dem "programmatischen Namen", den du einmalig bei der Deklaration festlegst.
    Der Programmatische Name kann nicht zur Laufzeit festgelegt werden.
    Es wäre ja sonst auch unsicherer Code, da der Compiler zur Kompilierzeit nicht in allen Fällen überprüfen kann, ob das Panel1 überhaupt deklariert wurde.

    Stell dir mal folgendes vor (wenn .Name dem Programmatischen Namen entspräche):

    VB.NET-Quellcode

    1. Dim p as Panel = New Panel()
    2. Dim pname as String
    3. 'Hier pname über Usereingabe manipulieren
    4. Controls.Add(New Panel() with {.Name = pname})

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „markus.obi“ ()

    VB.NET-Quellcode

    1. Controls.Add(New Panel() With {.BackColor = Color.White, _
    2. .Size = New Size(75, 75), _
    3. .Margin = New Padding(0), _
    4. .Name = "Test"})


    Wenn ich hier das "New" weglasse gibt es eine Fehlermeldung.

    Die Controls-Eigenschaft nutze ich schon von Anfang an.

    Das ist mir schon klar! Aber wie spreche ich das Panel dann im Sub an, wenn ich den programatischen Namen nicht kenne?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „System32“ ()

    Jaja das klappt so. Danke!
    Ich würde aber gerne die Panels in einer Schleife generieren lassen, in der ihnen gleich ein Name zugewiesen wird, mit dem ich sie auch ansprechen kann...

    vereinfachtes Beispiel:

    VB.NET-Quellcode

    1. For i = 1 to 3
    2. Dim "Panel" & i as new Panel with{blablabla}
    3. AddHandler "Panel" & i, AdressOf "Panel" & i & "_MouseClick"
    4. Next
    5. Sub Panel1_MouseClick
    6. 'Aktion
    7. End Sub
    8. Sub Panel2_MouseClick
    9. 'Aktion
    10. End Sub
    11. Sub Panel3_MouseClick
    12. 'Aktion
    13. End Sub

    (Dieser Code funktioniert natürlich nicht! ^^ Ich bräuchte einen Tipp, wie er in der Art funktioieren könnte.)
    Sowas geht niemals in Vb.net:

    VB.NET-Quellcode

    1. Dim "Panel" & i as new Panel
    2. AddHandler "Panel" & i, AdressOf "Panel" & i & "_MouseClick"
    Wirklich NIEMALS!

    Du könntest eine List(Of Panel) verwenden und das gewünschte Panel per Index ansprechen.
    Schau dir mal folgendes Beispiel an (button1 auf Form vorrausgesetzt):

    VB.NET-Quellcode

    1. Private Property btnliste As List(Of Button)
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. For i = 0 To 4
    4. Dim btn1 As New Button()
    5. btn1.Location = New Point(40, btnliste.Count * 45)
    6. btn1.Size = New Size(40, 40)
    7. btn1.Text = i.ToString
    8. btn1.Name = i.ToString
    9. btnliste.Add(btn1)
    10. Controls.Add(btn1)
    11. AddHandler btn1.Click, AddressOf ButtonListe_Click
    12. Next
    13. End Sub
    14. Private Sub ButtonListe_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    15. Debug.WriteLine("Button mit Name """ & DirectCast(sender, Button).Name & """ wurde geklickt")
    16. End Sub
    17. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    18. btnliste = New List(Of Button)
    19. End Sub