Label änderung nach Klassenwechsel

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Label änderung nach Klassenwechsel

    Hallo,

    also ich habe das Problem, dass sich der Text des Label nicht mehr ändern lässt, wenn die Sub aus einer anderen Klasse aufgerufen wurde. Woran liegt das?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Label1.Text = "EINS"
    4. MsgBox("erste Überprüfung")
    5. Dim Klasse As New Class1
    6. Klasse.zurueck()
    7. End Sub
    8. Public Sub zweiterSub()
    9. Label1.Text = "ZWEI"
    10. MsgBox("zweite Überprüfung")
    11. End Sub
    12. End Class

    VB.NET-Quellcode

    1. Public Class Class1
    2. Public Sub zurueck()
    3. Dim test As New Form1
    4. test.zweiterSub()
    5. End Sub
    6. End Class

    also hier in vereinfachter Form begreife ich nicht, wieso sich das Label in "EINS" ändert aber nicht in "ZWEI" jedoch bekomme ich die MsgBox mit der zweiten Überprüfung angezeigt

    daniweb.com/programming/softwa…42/detect-variable-change
    Ich habe es auch schon mit einer dritten Klasse (wie in dem Link beschreiben) versucht wo eine Variable mit event handler und set/get geschrieben war. Jedoch das gleiche Phänomen. MsgBox wird richtig angezeigt aber Label lässt sich nicht ändern.
    Welche Möglichkeiten habe ich noch um den Text von einer anderen Klasse aus zu ändern? oder was könnte mein Fehler sein? Ich habe schon überlegt einen Timer immer die Variable abfragen zu lassen und zu hoffen, dass der dan den Text des Labels ändern kann. Aber einen ständig laufenden Timer für diese Aufgabe fände ich total zum <X da muss es doch eine geschmeidige Lösung für geben ?(

    BuessingJunge schrieb:

    VB.NET-Quellcode

    1. New Form1
    Du legst eine neue Instanz von Form1 an, die aber nicht angezeigt wird. Probier mal dies:

    VB.NET-Quellcode

    1. Dim test As New Form1
    2. test.ShowDialog()
    3. test.zweiterSub()
    Ansonsten müsstest Du ein Event senden, wenn Du die vorhandene Instanz erreichen willst, gugst Du hier.
    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!

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

    Es ist doch unnötig von der Klasse 'Form1' eine Methode über eine andere Klasse 'Class1' aufzurufen, wenn sich diese Methode in der selben Klasse 'Form1' befindet.
    Da kannst du doch gleich aus der Form1-Klasse die Methode 'zweiterSub' aufrufen...

    Dies war nur eine Beschreibung meines Problems in vereinfachter Form. Mein eigentliches Projekt wo es gilt dieses Problem zu lösen sieht da schon um einiges Sinnvoller aus. Aber danke ;)
    Du legst eine neue Instanz von Form1 an, die aber nicht angezeigt wird. Probier mal dies:

    VB.NET-Quellcode

    1. Dim test As New Form1
    2. test.ShowDialog()
    3. test.zweiterSub()

    Danke Rod. Das war zwar nicht die Lösung aber du hast mir die Augen geöffnet. Hatte den Wald vor lauter Bäumen nicht gesehen. Tut mir leid.
    Also wenn ich test.ShowDialog() benutze, öffne ich eine neue Form. Da meine Form aber bereits offen ist und ich diese ändern möchte macht dieser Befehlt etwas ganz anderes.
    Aber die paar Worte Du legst eine neue Instanz von "Form1" an, die aber nicht angezeigt wird. haben mich erleuchtet.
    Ich möchte keine NEUE Instanz, die ich dann anzeigen müsste. Ich möchte die alte ändern, die eh schon angezeigt wird. Ergo: Das Object/die Referenz, die ich erstelle, darf nicht New sein.

    LÖSUNG:
    Ein Objekt aus meiner alten Form erstellen.
    Die Zeile Dim test As New Form1 muss jetzt einfach durch Dim test As Object = Form1 ersetzt werden. Voila

    Hätte ich auch selbst drauf kommen müssen || aber vielen vielen Dank für den Stoss in die richtige Richtung

    Edit:
    jetzt da ich ja diese doofe Frage mal wieder erneut gestellt habe und ich jetzt weiss, dass ich einen blöden Fehler gemacht habe. Kannst du mir sagen, was nun der "vernünftig" Programmierte Weg wäre dieses Label zu ändern?
    Ich weiss, dass Form1.Label1.Text = variable ein unschöner Weg ist. Aber ist denn

    VB.NET-Quellcode

    1. Public Sub aenderLabel(variable As String)
    2. NamensLabel.Text =variable
    3. End Sub

    und einen Aufruf aus einer anderen Klasse mit

    VB.NET-Quellcode

    1. Dim test as String = "Hallo"
    2. Dim meineForm As Object = Form1
    3. meineForm.aenderLabel(test)

    bessere Programmierung? oder sollte ich dann doch die Möglichkeit mit einer Variablen in einer extra Klasse und set/get Funktion oder einfach eine Variable und einen eventHandler benutzen? wie wär es "richtiger"?

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

    BuessingJunge schrieb:

    Dim test As Object = Form1
    machst Du

    VB.NET-Quellcode

    1. Dim test As Form = Form1
    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!
    Wenn ich Dim test As Form = Form1 eingebe, bekomme ich die Fehlermeldung BC30456 "aenderLabel" ist kein Member von "Form"..
    Ich habe meinen Sub jetzt gegen eine Property getauscht:

    VB.NET-Quellcode

    1. Private LabelName As String = ""
    2. Public Property aenderLabel As String
    3. Get
    4. Return LabelName
    5. End Get
    6. Set(Wert As String)
    7. LabelName = Wert
    8. NamensLabel.Text = Wert
    9. End Set
    10. End Property

    Persönlich finde ich das besser, da ich mir den LabelNamen jetzt auch auslesen kann, ohne auf das label zuzugreifen. Ich hoffe, das ist eine vernünftige Lösung.
    Den Aufruf kann ich jetzt mit:

    VB.NET-Quellcode

    1. Dim Test As Object = Form1
    2. Test.aenderLabel = "neuer Value"

    Oder direkt mit:

    VB.NET-Quellcode

    1. Form1.aenderLabel = "neuer Value"

    machen. Wäre die zweite Art in Ordnung oder ist es "besser/richtiger" wenn ich das Objekt wie in der erste Art vorher erstelle und dann benutze?

    BuessingJunge schrieb:

    "aenderLabel" ist kein Member von "Form"
    Von Object erst recht nicht.
    Hier kannst Du sofort lernen, wie Du mit Instanzen von Formen umgehen musst, gugst Du hier.
    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!

    BuessingJunge schrieb:

    Wäre die zweite Art in Ordnung oder ist es "besser/richtiger" wenn ich das Objekt wie in der erste Art vorher erstelle und dann benutze?
    Nein, all deine bisherigen Versuche sind Gurke.
    Von einer anderen Klasse sollte niemals in ein bestimmtes Form hineingegrabscht werden - so oder so nicht.
    Derlei Dinge werden besser über selbst-implementierte Events geregelt.

    Aber 2 Sachen:
    1. Beschreib erstmal, was du eiglich machen willst - aber konkret. Wenn man weiß, was eiglich beabsichtigt ist, dann findet man entweder ganz andere Lösungen, oder kann einschätzen, dass die derzeitigen Versuche denn doch der günstigste Weg ist.
    2. ganz wichtig: Empfohlene Einstellungen - so wie deine Entwicklungsumgebung eingestellt ist, kannst du kaum jemals erlernen, Objekte voneinander zu unterscheiden, und Klassen und Objekte auseinanderzuhalten, und überhaupt irgendwie die Mächtigkeit des Frameworks dir nutzbar machen.
      Also dieser Punkt ist der wichtigste, und brauchst dich mit deim aktuellen Problem eiglich garnet weiter zu befassen, solange dieser hier nicht erledigt und umgesetzt ist.

    Von Object erst recht nicht.

    Aber meine Form1 ist doch ein Objekt oder sehe ich das falsch?
    aenderLabel ist also ein Member meiner Form1 aber nicht von dem Objekt. Also erstelle ich eine Instanz mit Dim Test As Form1 wo aenderLabel Member von ist und gebe ihr mit = Form1 meine vorhandene Form/instanz hinzu oder lasse durch = new Form1 eine neue Form/Instanz aufrufen, die ich mit Test.ShowDialog() anzeigen lassen kann.
    Und Dim Test As new Form1 ist nur eine Abkürzung von Dim Test As Form1 = new Form1?
    Kann ich mit Instanzen von Controls genauso umgehen wie mit Instanzen von Formen oder muss ich da was beachten?

    Edit:
    Danke ErfinderDesRades,
    es ist etwas traurig aber gut zu wissen, dass ich komplett auf dem Holzweg bin.
    also sollte ich etwas wie:

    VB.NET-Quellcode

    1. Private WithEvents Klasse As Class1
    2. Private Sub EventHandler(sender As System.Object, e As System.EventArgs) Handles Klasse.MeinEvent
    3. NamensLabel.Text = sender.Name
    4. End Sub

    machen und mit

    VB.NET-Quellcode

    1. Public Event meinEvent(sender As System.Object, e As System.EventArgs)
    2. RaiseEvent einEvent(Me, EventArgs.Empty)

    aufrufen?

    Edit:
    Also.
    ich möchte per klick auf einen button in meiner Form1 ein eigenes Control erstellen:

    VB.NET-Quellcode

    1. Dim Anzahl as integer = 1
    2. Private Sub btnErstell_Click(sender As Object, e As EventArgs) Handles btnErstell.Click
    3. Dim meinC As New meinControl
    4. meinC.Name = "mc" & Anzahl
    5. Me.Controls.Add(mein)
    6. Anzahl = Anzahl + 1
    7. Hintergrund1.SendToBack()
    8. End Sub

    Hintergrund1
    ist eine PictureBox die angedockt ist und in den Hintergrund muss, da
    mein Control sonst hinter der PictureBox landet

    VB.NET-Quellcode

    1. Public Class meinControl : Inherits Control
    2. Dim verschiebPos As Point
    3. Dim MausPosition As Point
    4. Dim verschieben As Boolean = False
    5. Protected Overrides Sub OnMousedown(ByVal e As System.Windows.Forms.MouseEventArgs)
    6. If e.Button = MouseButtons.Left Then
    7. verschiebPos = Location
    8. MausPosition = MousePosition
    9. verschieben = True
    10. ElseIf verschieben = True And e.Button = MouseButtons.Right Then
    11. Location = verschiebPos
    12. verschieben = False
    13. End If
    14. End Sub
    15. Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
    16. If e.Button = MouseButtons.Left Then
    17. verschieben = False
    18. End If
    19. End Sub
    20. Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
    21. If verschieben = True Then
    22. Dim MausEnde As Point = MousePosition
    23. Location = New Point(verschiebPos.X + MausEnde.X - MausPosition.X, verschiebPos.Y + MausEnde.Y - MausPosition.Y)
    24. End If
    25. End Sub
    26. Protected Overrides Sub OnMouseclick(ByVal e As System.Windows.Forms.MouseEventArgs)
    27. If e.Button = MouseButtons.Right Then
    28. MsgBox(Name)
    29. End If
    30. End Sub
    31. Sub Mausenter() Handles Me.MouseEnter
    32. 'hier soll das Label den namen meines Controls anzeigen
    33. End Sub
    34. Sub Mausleave() Handles Me.MouseLeave
    35. 'hier soll das lebel leer werden ("")
    36. End Sub
    37. Sub New()
    38. Name = "newAND"
    39. BackColor = Color.Black
    40. Width = 25
    41. Location = New Point(150, 105)
    42. DoubleBuffered = True
    43. Height = 40
    44. End Sub
    45. Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    46. Dim G As Graphics = e.Graphics
    47. G.Clear(Color.Black)
    48. G.DrawRectangle(New Pen(New SolidBrush(Color.White)), New Rectangle(2, 0, Width - 5, Height - 1))
    49. End Sub
    50. End Class

    da
    ich aber kein Fertigen Code haben wollte, den ich einfach nur einfüge
    und froh bin wenn es funtioniert, habe ich die Frage allgemein gestellt,
    wie es richtig gemacht werden müsste, damit ich das lerne.
    Mit einem
    EventHandler liegt jetzt außerdem die Kunst die Events von allen
    Controls zu erledigen, die ich erstellt habe (beliebig viele) wenn ich
    dann halt nur in meine Form pfuschen würde mit jeden control ist das
    recht einfach. aber einfach ist nicht besser ;) also wenn du mir das
    erklären würdest, wie dies richtig umzusetzen wäre, wär das super nett

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BuessingJunge“ ()

    BuessingJunge schrieb:

    oder sehe ich das falsch
    Ja. Das ist die niedrigste aller Basisklassen.
    Wenn Du die entsprechenden Properties und Methoden ab- bzw. aufrufen willst, brauchst Du eine Instanz dieser Klasse, in diesem Fall Form1.
    ----

    BuessingJunge schrieb:

    also sollte ich etwas wie:
    Nein, das ist die verkehrte Richting.
    Form1 hält die Instanz von Class1, da kannst Du direkt die Methoden und Properties abrufen.
    Form1 stellt für Class1 einen Eventhandler bereit, und wenn Class1 was an Form1 zu melden hat, geht das über ein Event.
    Hier im Tut unterhalten sich 2 Formen, Form2 ist äquivalent zu Deiner Class1.
    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!

    BuessingJunge schrieb:

    Aber meine Form1 ist doch ein Objekt oder sehe ich das falsch?
    Das siehst du eigentlich falsch, aber leider kann das in vb.net auch richtig sein.

    Also zunächstmal ist Form1 eine Klasse, also ein Datentyp, und ist kein Objekt (beachte: Rod spricht von Object, das ist ein Datentyp, aber wenn man Objekt sagt, meint man eine Instanz, also ein Objekt, was einen Datentyp hat).
    Ein Objekt erstellen tust du wie du richtig sagst mit Dim Test As new Form1 oder Dim Test As Form1 = new Form1 - und ja: ist beides dasselbe.
    Nun ist Test ein Objekt, und hat den Datentyp Form1.

    Das hier ist falsch:

    BuessingJunge schrieb:

    Also erstelle ich eine Instanz mit Dim Test As Form1
    denn da wird keine Instanz erstellt - fehlt ja das Schlüsselwort New.
    Es wird nur eine Variable deklariert. Deklarieren heisst: Ihr Datentyp wird festgelegt, nämlich Form1. (Dieser Variablen kannst du dann (nur) Form1 - Objekte zuweisen.)


    BuessingJunge schrieb:

    und gebe ihr mit = Form1 meine vorhandene Form/instanz hinzu oder lasse durch = new Form1 eine neue Form/Instanz aufrufen, die ich mit Test.ShowDialog() anzeigen lassen kann.
    Das ist eiglich wirres Zeug, also man kann sich zusammenreimen was du meinen magst, aber eine Diskussion würde ich darauf nicht aufbauen, zu unklar ist, was du mit "Form/Instanz hinzugeben" meinst - vermutlich "zuweisen", ja?
    Ja, das wirds sein: Du deklarierst die Variable Test (nicht instanzieren - wie gesagt: Instanzieren ist mit New), und weist ihr dein vorhandenes Form1 zu.

    Und das ist eben das blöde an vb.net, dass das tatsächlich geht.
    So kann man natürlich kaum jemals den Unterschied von Objekt und Datentyp verstehen, wenn bei Forms es tatsächlich geht, dass man einen Datentyp an eine Variable zuweist.
    Es geht nur bei Forms, also

    VB.NET-Quellcode

    1. Dim Test = Form1 'geht leider, obwohl Form1 eiglich ein Datentyp ist
    2. 'aber probierma
    3. Dim Test2 = Integer ' da wirste sehen, dass das eiglich Quatsch ist

    Das geht mit Forms, weil VB.net im Hintergrund eine unsichtbare globale Property generiert, die genauso heisst wie der Form-Datentyp (also etwa Form1). Also wirklich ein grauenhafter Hack, mit dem Ziel, Vb-Programmierer dumm zu halten (sodass sie Datentypen und Objekte nicht zu unterscheiden lernen).

    Wie weit bist du mit Visual Studio - Empfohlene Einstellungen ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Wie weit bist du mit Visual Studio - Empfohlene Einstellungen ?

    Das scheint auf dem ersten Blick sehr gut zu sein. Dass muss ich Morgen oder die Tage wenn ich Zeit habe mal komplett durchgehen.
    Jetzt versuch ich grad einiges an Input zu den Instanzen zu verarbeiten...wenn ich zu viel auf einmal mache, vergesse ich einiges davon wieer -.-
    Aber ich glaube, dass ich das mit den Instanzen und den Formen jetzt richtig Verstanden habe. Hoffe ich.

    ErfinderDesRades schrieb:

    Das ist eiglich wirres Zeug, also man kann sich zusammenreimen was du meinen magst, aber eine Diskussion würde ich darauf nicht aufbauen, zu unklar ist, was du mit "Form/Instanz hinzugeben" meinst - vermutlich "zuweisen", ja?
    Ja, das wirds sein: Du deklarierst die Variable Test (nicht instanzieren - wie gesagt: Instanzieren ist mit New), und weist ihr dein vorhandenes Form1 zu.

    genau das meinste ich. hab mich blöd ausgedrückt.

    Edit:
    Ok den ersten Teil habe ich mir jetzt shcon zu gute geführt. Sah nach mehr aus, als es ist :D Frage dazu: ich vergesse My. aus meinem Wortschatz. Muss ich Me. auch vergessen?
    Edit:
    Lässt sich der Form1 Bug auch so leicht beheben? damit ich das nicht ausversehen verwenden kann?
    Edit:
    Der ObjectBrowser wird mir ab jetzt auch oft helfen müssen :P danke.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „BuessingJunge“ ()

    So, habe ich jetzt eine Lösung erarbeitet:

    VB.NET-Quellcode

    1. Public Class meinControl : Inherits Control
    2. Public Event NamensSenderEvent(Name As String)
    3. Sub MausEnter(sender As System.Object, e As System.EventArgs) Handles Me.MouseEnter
    4. RaiseEvent NamensSenderEvent(Me.Name)
    5. End Sub
    6. Sub MausLeave(sender As System.Object, e As System.EventArgs) Handles Me.MouseLeave
    7. RaiseEvent NamensSenderEvent("")
    8. End Sub
    9. Sub New()
    10. DoubleBuffered = True
    11. BackColor = Color.Black
    12. Location = New Point(200, 200)
    13. Width = 25
    14. Height = 40
    15. Name = "meinControlName"
    16. End Sub
    17. End Class
    18. Public Class Form1
    19. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    20. Dim meCo As New meinControl
    21. AddHandler meCo.NamensSenderEvent, AddressOf aenderNamensLabel
    22. TabPage1.Controls.Add(meCo)
    23. End Sub
    24. Private Sub aenderNamensLabel(Name As String)
    25. NamensLabel.Text = Name
    26. End Sub
    27. End Class

    die Variable Name werde ich wohl noch umbenennen, damit es keine Verwechslung geben kann zu den Me.Name
    also vielen vielen Dank für eure Hilfe. Habe dadurch viel gelernt.
    Falls ihr noch weitere Verbesserungsvorschläge habt, bin ich froh, wenn ihr mir diese mitteilt. Ich lerne gerne neues ;)
    @BuessingJunge So isses.
    Du musst einfach lernen, diszipliniert zu programmieren, nicht so arrogant zu sein, anzunehmen, dass Dein Code fehlerfrei sei, insbesondere, wenn Du ihn per C&P ergattert hast.
    Verstehe, was Du programmierst und überprüfe, ob das, was Du programmiert hast, das tut, was Du glaubst, dass es tuen soll, lerne zu debuggen. Gugst Du hier.
    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!
    Danke euch beiden. Ich werde es auf jedenfall versuchen. Mit Sicherheit werde ich niemals ein super Programmierer aber ich mache Dinge lieber richtig als falsch.
    Das mit dem Haltepunkt scheint besser als meine Variante mit der MsgBox bzw. NEU: MessageBox.Show("irgendein Text"). Das werde ich mir angewöhnen müssen.
    Aber woher weiss ich, wie etwas der richtige Weg wäre? z.B. habe ich die MouseEnter und MouseLeave Subs geändert.
    Vorher: Sub MausEnter(sender As System.Object, e As System.EventArgs) Handles Me.MouseEnter
    Nachher: Protected Overrides Sub OnMouseEnter(e As EventArgs)
    jetzt kam aber bei der automatischen erstellung MyBase.OnMouseEnter(e) hinzu. Muss ich MyBase nicht verbannen? oder ist das was völlig anderes als My.
    Brauche ich das oder kann man das löschen? beim Debuggen merke ich keinen Unterschied :S Sollte ein Code eher ausführlich sein oder knapp?

    VB.NET-Quellcode

    1. Dim G As Graphics = e.Graphics
    2. G.DrawRectangle(New Pen(New SolidBrush(Color.White)), New Rectangle(2, 0, Width - 5, Height - 1)) 'so?
    3. e.Graphics.DrawRectangle(Pens.White, 2, 0, Width - 5, Height - 1) ' oder so?

    Wenn ich eine Variable erstelle oder alles New mache, verbrauche ich dann nicht mehr speicher? Oder ist das trotzdem besser?
    Sollte man bei kleineren Zahlen immer ein S hinter schreiben um die Bit Zahl zu halbieren?
    Wo kann man lernen/herausfinden, wie es "richtiger" ist? Wie Rod schon sagt: In manchen Foren steht ja auch einiges an Pfusch :(
    knapp.
    Wenig Code enthält weniger Fehler.
    Und bei wenig Code hast du mehr Code auf einem Bildschirm, musst weniger rum-scrollen und kannst Zusammenhänge besser verstehen.

    Das ist aber nur eine Tendenz-Ansage, weil das mitte Knappheit kann man auch übertreiben, und dann wirds kryptisch, und das ist ja auch nicht wartbar.
    Also Wartbarkeit ist das kriterium, und tendenziell ist weniger Code besser wartbar als viel Code.

    Von deim Beispiel unbedingt zeile#3.

    Nicht nur am leichtesten lesbar, sondern dass du in Zeile#2 mit New neue Objekte erstellst ist nicht ganz unproblematisch.
    Hingegen in Zeile#3 verwendest du den statischen Pens.White, der ist immer da, und ist halt genau dafür da, dass er verwendet wird.

    Das automatische MyBase.OnMouseEnter() musste drin lassen - bei Überschreibungen geht man davon aus, dass die Basisklasse intern aufgerufen wird, und du würdest für Überraschung sorgen, wenn du mit dieser Konvention brächest.

    My ist was komplett anderes als Me oder MyBase. Du solltest diese Sachen aber nicht im Forum fragen, sondern kümmer dich drum, und recherchier, was diese Schlüsselworte bedeuten. Weil MyBase und Me sind Schlüsselworte der Sprache (im Gegensatz zu My, was ist einfach ein Namespace, der ebensogut auch anders heissen könnte).

    NImm das, was man dir sagt, wörtlich. Reim dir nicht iwelchen assoziativen Mist zusammen, wenn dir jemand sagt: "My ist böse", dass dann Me auch böse sei. Wäre dem so, dann hätte man es dir auch so gesagt.
    Der Computer nimmt alle Befehle auch absolut wörtlich, und das färbt ab auf die Programmierer, die sich dann auch angewöhnen, Sprache präziser zu verwenden, als vlt. Otto Normalverbraucher.

    Ich jdfs. hab einen regelrechten Fachbegriff-Fimmel, und glaub 50% von dem was ich poste dreht sich darum, Begriffe zu klären.
    Guggemol den hier: Grundlagen: Fachbegriffe