Strict und seine Auswirkungen

  • VB.NET

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

    Strict und seine Auswirkungen

    Hallo Leute

    Ich bin neu hier und mache gerade erste Erfahrungen mit VB.
    In diesem Forum habe ich gelesen, dass es gut wäre die Option Strict auf on zu stellen.
    Das erscheint mir auch logisch und wurde gleich als Vorgabe eingestellt.
    Bisher konnte ich bei allen Test und allen Beispielprogrammen die ich aus Büchern hatte, durch cstr, cint usw. bzw. durch Angabe des Datentyps bei den Zuweisungen die Fehlermeldungen die durch Strict erscheinen wegbekommen. Nun habe ich ein kleines Programm aus einem Buch und da wird ein Handler übergeben.
    Hier weiss ich nicht wie ich die zueinander kompatibel machen kann.

    VB.NET-Quellcode

    1. AddHandler rbNormal.CheckedChanged, AddressOf PrioAuswahl


    Würde mich freuen wenn mir hier jemand weiterhelfen könnte.

    Damned
    Bei Events muss die Aufgerufene Methode genau die zwei Argumente sender As Object und e As EventArgs besitzen.
    Manche Events wie zum Beispiel MouseMove, MouseEnter usw. spezifizieren das zweite Argument mit einer vererbten Klasse wie z.B MouseEventArgs, aber die obige Lösung sollte im Zweifelsfall immer funktionieren.
    Da das rb höchst wahrscheinlich für einen Radiobutton in Winforms steht willst du wohl einen Eventhandler für dieses Event erstellen: msdn.microsoft.com/de-de/libra…cs-lang=vb#code-snippet-2

    Unten hast du ein Beispiel wie dieser EventHandler auszusehen hat: Sub radioButton1_CheckedChanged(sender As Object, e As EventArgs).
    Dabei ist eben wichtig, dass dieser als ersten Parameter ein Object bekommt und als zweiten Parameter ein EventArgs.

    Wenn du dies hast kannst du in diesem Fall einen Eventhandler so erstellen:


    AddHandler rbNormal.CheckedChanged, AddressOf radioButton1_CheckedChanged



    bzw. in deinem Fall nennst du die Sub halt PrioAuswahl.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @Damned: Willkommen im Forum. :thumbup:
    Die beschriebene Syntax wird von Option Strict On nicht berührt.
    Ist Dein Problem inzwischen gelöst?
    Ansonsten

    Damned schrieb:

    Nun habe ich ein kleines Programm aus einem Buch und da wird ein Handler übergeben.
    Was verstehst Du unter Handler übergeben?
    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 Leute

    Ihr habt mir sehr geholfen.

    Der Fehler ist hier:

    VB.NET-Quellcode

    1. Sub PrioAuswahl(ByVal Sender As RadioButton, ByVal e As EventArgs)


    Sobald ich aus RadioButton Object mache, hat Strict kein Problem mehr:

    VB.NET-Quellcode

    1. Sub PrioAuswahl(ByVal Sender As Object, ByVal e As EventArgs)


    Damned

    Damned schrieb:

    Der Fehler ist hier:
    Besser ist es, wenn Du die Eventhandler vom Designer anlegen lässt, der macht das alles richtig.
    Sinn der Sache ist, dass Du mehrere Event-Handler in einer Routine zusammenfassen kannst, dann brauchst Du das sender As Object zur Unterscheidung.
    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!

    RodFromGermany schrieb:

    Damned schrieb:

    Der Fehler ist hier:
    Besser ist es, wenn Du die Eventhandler vom Designer anlegen lässt, der macht das alles richtig.
    Sinn der Sache ist, dass Du mehrere Event-Handler in einer Routine zusammenfassen kannst, dann brauchst Du das sender As Object zur Unterscheidung.
    Ich habs vom Buch abgeschrieben.
    Wie lasse ich das den Designer machen ?
    Ich dachte der macht das nur für seine Objekte.

    Damned

    Damned schrieb:

    Wie lasse ich das den Designer machen ?
    Beim Doppelklick wird der Handler vom Default-Event generiert. Eine vollständige Liste kannst Du Dir im Property-Tab des Controls ansehen, wenn Du oben auf den kleinen Blitz klickst:
    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!
    @TE: Eine Menge Trickse im Umgang mitte IDE kannste dir auch aus "Datenbank in 10 Minuten" auf Movie-Tuts abgucken. Musst ja nicht verstehen, was da gemacht wird, aber wie Events anschließen, Intellisense nutzen, bisserl Code-Konventionen, sowas.

    Ein weiteres Tool von bedrückender Unbekanntheit ist der ObjectBrowser - guck dir den auch mal an.
    Vmtl. werden dir zum vollen Verständnis des OBs die Grundlagen fehlen - dieses Buch lesen (hingegen das Galileio-Openbook ist Mist)
    Ok, dass mit dem Doppelklick auf das Objekt im Designer ist mir bekannt, auch dass ich im Editor oben das Objekt links wählen kann und rechts den Event.
    Ich dachte nur es gäbe noch eine Variante die mir noch verborgen ist. Ich habe da ja per Hand einen EventHandler (ab)geschrieben und hab halt auf das Posting von RodFromGermany gedacht, vielleicht gibts einen Weg wie ich meine Handgeschriebene die in diesem Fall schon da steht da reinlinken kann. Egal, ich habe das Problem verstanden und danke nochmals recht herzlich für die freundliche und kompetente Hilfe.

    Damned

    Damned schrieb:

    Sobald ich aus RadioButton Object mache, hat Strict kein Problem mehr:
    Der Grund ist dir aber bekannt? Ansonsten solltest du dir die Grundlagen besser nochmal genau durchlesen :).
    Was das Problem mit dem RadioButton angeht: Es ist so gedacht, dass das Object in deinem Fall eh ein Radiobutton ist. Nur musst du dies halt im Event an sich zu einem Radiobutton casten. Dies funktioniert, da alles von Object erbt und du somit theoretisch ein Object in alles casten kannst solange denn nun auch wirklich das im Speicher ist in das du es casten möchtest.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ja, danke. Objekt ist der kleinste gemeinsame Nenner in der Objekthierarchie und wird dann in der aufgerufenen Routine dorthin gecastet wo ich ihn brauche und was er natürlich auch einmal gewesen sein muss.

    VB.NET-Quellcode

    1. Sub PrioAuswahl(ByVal Sender As Object, ByVal e As EventArgs)
    2. Dim RbGewaehlt As RadioButton = DirectCast(Sender, RadioButton)


    Trotz des Casts wurde aber der Sender vom Typ RadioButton übergeben, wozu ich dann ja eigendlich keinen Cast gebraucht hätte :)
    Das war das Problem, warum unter der Einstellung Strict der Fehler auftrat. Leider gibt es Buchautoren die ihren Code mit Strict off schreiben.
    Naja, ich sage immer, am meisten lernt man beim Fehler beseitigen :)

    Danke für eure Mühe,
    Damned

    Damned schrieb:

    Objekt ist der kleinste gemeinsame Nenner in der Objekthierarchie
    So isses, allerdings ist das auch die Basisklasse von Allem und Jedem in .NET, insbesondere auch von abgeleiteten Klassen und Interfaces.
    Hier wirkt das "späte Binden", erst zur Laufzeit wird überprüft, ob die Funktionalität vorhanden ist.
    Um da ein wenig strukturierter ranzugehen, ist es sinnvoll, wenn Du weißt, dass Du auf diese oder jene Funktionalität zugreifen willst, eine Basisklasse zu wählen, die die erforderliche Funktionalität aufweist.
    Und dabei unterstützt Dich Option Strict On. Probier mal diese Zeilen und tausche in der 1. Zeile die Deklarationen aus.

    VB.NET-Quellcode

    1. Dim dlg As Form 'Form2 'Object '
    2. dlg = New Form2
    3. dlg.Show()
    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!

    Damned schrieb:

    Naja, ich sage immer, am meisten lernt man beim Fehler beseitigen :)
    Aber ist doch ärgerlich, die Fehler dummer Buchautoren beseitigen zu müssen.
    lieber dieses Buch lesen (hingegen das Galileio-Openbook ist Mist).
    Fehler macht man immer, nur unter vernünftiger Leitlinie macht und lernt man auf viel höherem Niveau.

    ErfinderDesRades schrieb:

    Damned schrieb:

    Naja, ich sage immer, am meisten lernt man beim Fehler beseitigen :)
    Aber ist doch ärgerlich, die Fehler dummer Buchautoren beseitigen zu müssen.
    lieber dieses Buch lesen (hingegen das Galileio-Openbook ist Mist).
    Fehler macht man immer, nur unter vernünftiger Leitlinie macht und lernt man auf viel höherem Niveau.

    Der Lerneffekt ist aber sehr gross. So viel hätte ich mich mit diesem Thema niemals beschäftigt :-)))))))
    So habe ich etwas wichtiges gelernt, was Herr von Strict Off (der Buchator) mir sicherlich in vollster Absicht zu Aufgabe gemacht hat.

    PS: Zu Deinem Buchtip: ich hätte gerne was zu 2012, gibts da etwas, das man kaufen kann ?

    @RodFromGermany
    Form2 gibts das, bzw. muss ich das erst includen importen oder wie das in VB heisst ?
    Oder setzt das voraus, dass ich Form2 von Form abgeleitet habe ?
    Ansonsten erzählt mir die IDE das Strict On das "späte Binden" nicht unterstützt.
    War das die Info die Du mir geben wolltest ?

    VB.NET-Quellcode

    1. Dim dlg As Object 'Form2 'Object '
    2. dlg = New Form
    3. dlg.Show()


    Jetzt müsste man dlg auf Form casten. In Java würde ich das so machen:

    Quellcode

    1. ((Form)dlg).show()

    in VB geht das so, oder ?!?!?!?:

    VB.NET-Quellcode

    1. DirectCast(dlg, Form).Show()


    Damit habe ich es aber nun FRÜH gebunden :)

    Damned

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

    Damned schrieb:

    Damit habe ich es aber nun FRÜH gebunden :)
    :thumbsup:
    So isses.

    VB.NET-Quellcode

    1. Using dlg As New Form2
    2. dlg.ShowDialog()
    3. End Using
    ist ein modaler Dialog. Den im Gegenasatz dazu nicht modalen Dialog findest Du im Forum.
    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!

    Damned schrieb:

    PS: Zu Deinem Buchtip: ich hätte gerne was zu 2012, gibts da etwas, das man kaufen kann ?
    Jo, da gibts 2008er, 2010er, und bestimmt auch 2012er Version.

    Aber die neueren Versionen sind glaub ühaupt nicht besser. Weil die Grundlagen werden im 2005er durchgenommen, und die braucht man.

    Mein Eindruck ist, dass in den neueren Auflagen die Grundlagen-Behandlung zu kurz kommt, zugunsten von allerlei "Schnickschnack" (Linq, Wpf, Workflow, tolles neues Threading,...).

    Aber das ist nur ein vergleichsweise flüchtiger Eindruck, ich hab nur mal das 2008er Inhaltsverzeichnis durchgeguckt, und fands viel weniger folgerichtig aufgebaut, wies 2005er Buch.

    Nochmal: Den 2005er Stoff brauchst du einfach, das schadet nix, den aus dem 2005er buch sich anzueignen. Danach kannst du immer noch das 2008er Buch lesen für genauso umsonst, und das liest sich dann natürlich wesentlich schneller, weil man eine Menge überblättern kann.