Komponente durch Code - Kontroverse

    • VB.NET

    Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Komponente durch Code - Kontroverse

      Ich habe gehört es gibt Probleme eine Sub für eine Kompontente die durch Code erstellt wurde zu schreiben. Das Problem ist einfach zu lösen. Der Fehler liegt schon bei der Vereinbarung:

      VB.NET-Quellcode

      1. Dim Button1 As Button


      In die Form_Load schreibt man dann in etw sowas:

      VB.NET-Quellcode

      1. Button1.Text = "Drück mich!"
      2. Button1.Size = New Size(120,120)
      3. Button1.Location = New Point(50,50)
      4. Button1.BackColor = Color.Blue
      5. Button1.Visible = True
      6. Me.Controls.Add(Button1)


      Nun ist der Button zu sehen und man kann auf ihn klicken. Aber es würde nichts passieren. Außer man vereinbart den Button anders:

      VB.NET-Quellcode

      1. Public WithEvents Button1 As Button


      Dann könnte man eine Sub schreiben:

      VB.NET-Quellcode

      1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      2. End Sub


      In die Sub schreibt man dann einfach als Beispiel:

      VB.NET-Quellcode

      1. MessageBox.Show("Funktioniert!")


      Eigentlich ganz simple, aber ich hatte am Anfang meine Probleme als ich in VB eingestiegen bin. :D

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TheVBTutorialsVB“ () aus folgendem Grund: Titel geändert: "Komponente durch Code" --> "Komponente durch Code - Kontroverse"

      Ich rate ja von dieser Vorgehensweise ab.
      Damit nimmt man dem Designer seinen Job weg - dabei kann der das besser ;). Und der Designer erstellt seinen Code in der separaten .Designer.vb - Datei, um den UserCode-Bereich des Forms von derlei trivialCode freizuhalten.
      Und der Designer bietet Wysiwyg - also man sieht gleich, wie ungefähr das Form aussehen wird.

      Üblicherweise liegt ein Fehler des AnwendungsDesigns vor, wenn man in Versuchung gerät, Controls derartig codeseitig zu generieren.
      Das kann sein, dass einem bestimmte Design-Techniken unbekannt sind (Docking, Anchoring), oder man hat keinen Plan von den ContainerControls (Panel, Groupbox, FlowLayoutPanel, TableLayoutPanel, SplitContainer).
      Oder man kann geistig Daten und Controls nicht ausreichend unterscheiden.
      Oder man kennt die ListenControls nicht (Listbox, Treeview, DatagridView), welche eigentlich dazu da sind, viele Daten anzuzeigen.

      Also wenn man in Versuchung gerät, Controls codeseitig zu erzeugen: Erstmal umhören und nachfragen, ob jmd. nicht einen geeigneteren Ansatz aufzeigen kann.
      Zum Warmwerden mag dies eine gute Übung sein. In einer professionell erstellten Software hat dies nichts zu suchen.
      Wenn ein Control derart im Code implementiert ist, stellt sich die Frage: Was soll das.
      Da kann man ihn natürlich genausogut, wie @ErfinderDesRades schreibt, im Designer erstellen.
      Wenn das Control nicht benötigt wird, kann man es mit Visible = False einfach unsichtbar machen, da nimmt es auch keine Klicks usw. entgegen.
      Das Hauptproblem eines durch Code erstellten Controls besteht in der Testung.
      Wenn bei einem mit dem Designer erstellten Control etwas fehlt, genügen 2 Klicks und es geht weiter. Eventhandler werden ebenfalls vom Designer automatisch generiert.
      Ein im Code erstelltes Control bedarf da schon etwas mehr Aufwand, der dann an einer anderer Stelle fehlt.
      Also:
      Nutzt den Designer.
      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!
      Er enthält keine Fehler, toll, dafür brauch man ihn ja auch nicht, warum programmieren wir denn mit VB und dem tollen Microsoft Visual Studio? Um letztendlich doch alles im Code zu generieren und den Designer der wie ,@ErfinderDesRades sowieso schon gesagt hat, viel effektiver ist und den unnötigen Button Patziercode auslagert um so Platz zu sparen, ausser acht lassen? Alos ich halte es nur für ne Übung, aber dafür ist sie leider zu un ausreichend erklärt.
      mfg paulkoch95
      "yippieh! it compiles - ship it!"
      Wenn ich mich nicht täusche geht es darum Handler, Events für
      ein durch Code erstelltes Steuerelement zu erstellen.
      Wenn dies gemeint ist müsste es mit:

      VB.NET-Quellcode

      1. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      2. Dim btnNew As New Button
      3. btnNew.Location = New Point(Me.Size.Width / 2, Me.Size.Height / 2)
      4. btnNew.Size = New Size(100,50)
      5. btnNew.Text = "Button1"
      6. AddHandler btnNew.Click(), AddressOf btnNew_Click
      7. Me.Controls.Add(btnNew)
      8. End Sub
      9. Private Sub btnNew_Click()
      10. MsgBox("Hallo Welt")
      11. End Sub


      funktionieren oder!?
      code ausm kopf raus, desshalb keine formatierungen.

      mfg Tim ;D
      Ich hab mal den Code von @TG22997 lauffähig gemacht:

      VB.NET-Quellcode

      1. Private WithEvents btnNew As Button
      2. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      3. btnNew = New Button
      4. btnNew.Location = New Point(Me.Size.Width \ 2, Me.Size.Height \ 2)
      5. btnNew.Size = New Size(100, 50)
      6. btnNew.Text = "Button1"
      7. AddHandler Click, AddressOf btnNew_Click
      8. Me.Controls.Add(btnNew)
      9. End Sub
      10. Private Sub btnNew_Click(sender As System.Object, e As System.EventArgs) Handles btnNew.Click
      11. MsgBox("Hallo Welt")
      12. 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!