Für jedes Objekt das gleiche (Click-)Event festlegen

  • Allgemein

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von LevelXProject.

    Für jedes Objekt das gleiche (Click-)Event festlegen

    Hallo liebes VB-Paradise Forum,

    Ich habe mich heute zum ersten Mal mit Modulen beschäftigt (nachdem ich auf Visual Studios 2013 geupt habe), und wollte nun gerne die Klasse Label um folgende Eigenschaften erweitern:
    - Einen Wert des Labels der ihm zugewiesen wird als double (so weit kein Problem)
    - Das Event Click, das nun auch schon durch dieses Modul in diese Klasse eingebaut ist und nicht mehr für jedes Label einzelnd deklariert werden muss. Allerdings habe ich bei dieser zweiten Aufgabe, auch teilweise da ich mich nun zum ersten mal mit Modulen beschäftige, einige Schwierigkeiten und bin ratlos wie ich das anstellen soll. Könnt ihr mir helfen?

    Lg, LevelXProject

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

    Ich verstehe den kompletten Zusammenhang nicht. Du willst die Klasse Label in einem Modul mit dem bereits vorhandenen Event 'Click' erweitern? Wieso ein Modul? 1. Sind die schon veraltet und 2. Klassen tuen es genau so. Und wie gesagt, das Event 'Click' hat die Label-Klasse doch schon :?:
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    LevelXProject schrieb:

    Könnt ihr mir helfen?
    Ich verstehe deine Fragen schon garnicht. 8|

    LevelXProject schrieb:

    Einen Wert des Labels der ihm zugewiesen wird als double (so weit kein Problem)
    Häh - was? Schon rein syntaktisch scheint da ein Verb zu fehlen.

    LevelXProject schrieb:

    Das Event Click, das nun auch schon durch dieses Modul in diese Klasse eingebaut ist und nicht mehr für jedes Label einzelnd deklariert werden muss.
    Das Event Click ist durch dieses Modul in diese Klasse eingebaut und nicht mehr für jedes Label deklariert werden muß???
    Mit einem Modul kannst du nix in eine Klasse einbauen, und das Click-Event ist bereits inne Label-Klasse eingebaut, und ich wüsste auch nicht, dass man es für jedes Label deklarieren muß.
    Ich habe es so verstanden dass man mit einem Modul eine Klasse sozusagen erweitern kann, daher dachte ich, ich könnte es auf diesen weg machen. Ich will ungerne eine ganz neue Klasse erzeugen (auch wenn ich dann "inherit Label" benutzen könnte, aber ich möchte nicht den praktischen Nutzen verlieren dass ich die Labels ja auch auf der graphischen Oberfläche direkt hinzufügen kann. Wenn ich eine eigene Klasse erzeuge, dann müsste ich die ja erst im Quellcode noch auf die Form hinzufügen, oder?)

    Was das Click-Event angeht:
    Ich möchte einfach für jedes Label ein bereits vordefiniertes, einheitliches Click-Event festlegen, das in der Klasse "Label" verankert sein soll.

    Edit: Tut mir leid für meine umständliche Formulierung, ich wusst es gerade nicht besser auszudrücken.
    Das einzige was ich möchte ist sozusagen eine neue Property (eine Zahl, double) zu der Klasse Label hinzufügen, und die Folgen des Click-Events auch bereits schon vorher festlegen.
    Mach dir doch einen Sub der automatisch deine Labels per addhandler zu den passenden Click Sub führt :)
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Würdest du uns erstmal aufklären, was überhaupt dein Vorhaben ist? Ich versteh immer noch nicht, was du uns fragen willst. Wieso willst du ein Click-Event festlegen? Es gibt doch schon eins.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Achso und was ist da das Problem? Du kannst ja das Event im Code aufrufen und dann irgendeinen Code reinschreiben, der ausgeführt werden soll. Da muss doch nix an der Klasse 'Label' verändert werden, oder :?:
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ok hier ein Lösungs Ansatz :

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. Addhandleristtoll()
    4. End Sub
    5. Public Sub Addhandleristtoll()
    6. For i = 0 To Me.Controls.Count - 1
    7. If Me.Controls.Item(i).Name.StartsWith("Label") = True Then
    8. AddHandler Me.Controls.Item(i).MouseClick, AddressOf MouseClick_SUB
    9. End If
    10. Next
    11. End Sub
    12. Private Sub MouseClick_SUB(sender As Object, e As System.Windows.Forms.MouseEventArgs)
    13. MessageBox.Show("LOL")
    14. End Sub
    15. End Class
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Das müsste ich dann aber für jedes Label einzeln machen, oder? Wenn sich 100 Labels auf der Form befinden, dann bräuchte ich relativ lange um für jedes das Click-Ereignis zu machen ^^
    Ich verfolge einmal den Vorschlag von BlackNetworkBit und schaue was ich zu Handlern finden kann, und wie ich sie anwende, danke schon einmal dafür :)
    Der obige Code setzt bei allen Labels die mit dem Namen=Label anfangen, das Click Event auf MouseClick_SUB also musst du nicht alle 100 durchgehen :)

    PS es gibt einen Hilfreichbutton falls dir mein Code geholfen hat :)
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Aha, jetzt kommen wir der Sache näher ;)

    Dann gehst du einfach mit ner For Each-Schleife durch und verwendest dann wie gesagt 'AddHandler'.

    Irgendwie so:

    VB.NET-Quellcode

    1. For Each lbl As Control In Me.Controls().OfType(Of Label)()
    2. AddHandler lbl.Click, AddressOf lbl_Clicked
    3. Next


    Dann machste dir halt einfach ne Sub lbl_Clicked und schreibst da den Code für die 'Folgen' rein ;)
    Das wäre die kürzere (und meiner Meinung nach bessere Lösung), als die von @BlackNetworkBit:
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Da muss ich
    @Trade zustimmen :)
    habe vergessen das man auch direkt den Typ abfragen kann ;)
    MFG 0x426c61636b4e6574776f726b426974
    InOffical VB-Paradise IRC-Server
    webchat.freenode.net/
    Channel : ##vbparadise
    Ich habe jetzt die Abfrage des Namens auch noch mit hinein genommen, damit ich später wahlweise auch noch zwischen Labels differenzieren kann welche davon betroffen sein sollen und welche wenige eine Ausnahme bilden sollen.
    Ich bedanke mich herzlich bei euch - ich hätte nicht gedacht dass ich mal wieder in so einer kurzen Zeit solche Antworten bekommen würde, vielen Dank für eure Geduld und eure Mühe :)


    Mein fertiger Code:

    VB.NET-Quellcode

    1. Public Sub LoadHandler()
    2. For Each labelx As Control In Me.Controls().OfType(Of Label)()
    3. AddHandler labelx.Click, AddressOf labelclick
    4. 'If labelx.Name.Contains("Label") = True Then
    5. 'End If
    6. Next
    7. End Sub


    und natürlich noch labelclick als eigenständigen Sub formuliert :)
    Vielen Dank nocheinmal :3
    (jetzt noch schnell den Titel passend zur Frage/Antwort ändern, damit auch andere Leute mit dem Problem das vielleicht finden können, und dann als fertig makieren :) )

    LG, LevelXProject
    Die Abfrage mit '= True' kannst du auch weglassen, da hier in diesem Konditionalausdruck mit der Methode 'Contains' automatisch 'True' zurückgegeben wird, wenn das gesuchte vorhanden ist, sodass du das nicht brauchst, denn das ist ja kein direkter Boolean-Datentyp, der zugewiesen werden muss, sondern es wird ein boolscher Wert zurückgegeben. ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    LevelXProject schrieb:

    nicht mehr für jedes Label einzelnd deklariert werden muss.
    Habe ich das nicht richtig verstanden
    oder
    warum machst Du es nicht so, ein Event für mehrere Controls:

    VB.NET-Quellcode

    1. Private Sub Label_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click, Label2.Click, Label3.Click, Label4.Click
    2. If sender Is Label1 Then
    3. ' was tun
    4. ElseIf sender Is Label2 Then
    5. ' was tun
    6. ElseIf sender Is Label3 Then
    7. ' was tun
    8. ElseIf sender Is Label4 Then
    9. ' was tun
    10. Else
    11. ' was tun
    12. End If
    13. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!