Strict on - Die ersten Versuche.

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

Es gibt 67 Antworten in diesem Thema. Der letzte Beitrag () ist von woeh.

    einen fehlerabbruch habe ich ja nicht....ich poste mal den code aus ner sub...

    VB.NET-Quellcode

    1. Private Sub butConvertScanSource_Click(sender As Object, e As EventArgs) Handles butConvertScanSource.Click
    2. Dim lfInfo As New List(Of IO.FileInfo)
    3. Dim frmPro As New frmProgress
    4. Dim searchFor As String
    5. Dim dCount As Integer
    6. 'encoderEdit
    7. searchFor = "*.mp3,*.flac,*.wav,*.mp4,*.avi,*.mpg,*.mpeg,*.mkv," &
    8. "*.ape,*.m4a,*.mpc,*.ogg,*.wma,*.wmv,*.aac,*.ac3,*.aiff," &
    9. "*.aif,*.aifc,*.mov,*.flv,*.rm,*.vob,*.asf,*.swf,*.3gp"
    10. Me.Enabled = False
    11. lvConvert.Items.Clear()
    12. Scan(cbDir.Text, chkSubDirs.Checked, "", False, False)
    13. If cancelRead = False Then
    14. frmPro.Show()
    15. For Each sDir In dirList
    16. If cancelRead = True Then
    17. Exit For
    18. End If
    19. dCount += 1
    20. frmPro.SetInfo("Suche Dateien", sDir.FullName, 1, dirList.Length, dCount,
    21. "Verzeichnis", True, True, True)
    22. GetFilesExt(sDir.FullName, searchFor, lfInfo)
    23. Next
    24. End If
    25. CloseForm(frmPro)
    26. If cancelRead = False Then
    27. lvConvertAddFiles(lvConvert, lfInfo.ToArray)
    28. ShowFileResult(Nothing, False, lvConvert)
    29. End If
    30. Quit:
    31. QuitSub(Nothing) <-- hier meckert der compiler....habe jetzt gemerkt ob mit oder ohne strict on.
    32. End Sub


    hier der QuitSub

    VB.NET-Quellcode

    1. Public Sub QuitSub(Of TForm As Form)(ByRef frm As TForm)
    2. If frm IsNot Nothing Then
    3. CloseForm(frm)
    4. End If
    5. If cancelRead = True Then
    6. Log(LogColor.errorInfo, "Der Prozess wurde von dem Benutzer abgebrochen!")
    7. Message("Der Prozess wurde von dem Benutzer abgebrochen.")
    8. End If
    9. ShowMe(mainform)
    10. End Sub



    fehlermeldung:
    Die Datentypen der Typparameter in der Public Sub QuitSub(Of TForm As Form)(ByRef frm As TForm)-Methode können nicht von diesen Argumenten abgeleitet werden. Sie können diesen Fehler möglicherweise beheben, indem Sie die Datentypen explizit angeben.

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

    Du könntest (ohne Of TForm As Form) mit Public Sub QuitSub(Optional frm As Form = Nothing) arbeiten. Oder Du umschließt z.B. das ganze Brimborium mit einem Try-Catch-Block und wirfst bei Abbruchwunsch des Benutzers eine eigene Exception => kein Goto, keine Vermischung von Aufgaben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    woeh schrieb:

    also
    Falls Du mal zwischendurch etwas mehr Zeit hast, beantworte doch bitte mal meine Frage, aber nur, falls Du mal zwischendurch etwas mehr Zeit hast.

    RodFromGermany schrieb:

    Was macht das / wozu brauchst Du hier das ByRef?
    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!

    woeh schrieb:

    oder verstehe ich da was falsch ?
    Geht in die richtige Richtung.
    Was musst Du denn rein geben, damit da ne Variable vom Typ Form erkannt wird?
    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!
    naja....ne form übergebe ich normalerweise....nur in 7 fällen kommt es vor, das es nothing ist...

    also: ist es so, das wenn ich ne form ByVal übergebe, diese dann schließe und mit Dispose abschließe der fisch gegessen ist und das bei der rückgabe die form nicht unbedingt nothing sein muß ?

    wenn dem so wäre, würde mir das sehr helfen :)
    @woeh Du denkst falsch. ;)
    Du hast eine Funktion mit einem ByRef Parameter.
    Du willst dort einen Wert Nothing reingeben.
    Was musst Du in diese Funktion reingeben, dass drinne das ankommt, was ankommen soll?
    Was ist hier an dieser Stelle der Unterschied zu ByVal?
    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!
    VB.Net macht bei ByRef mit Nicht-Variablen, etwas sinnvolles daraus zu machen. Du kannst ja theoretisch einer Konstante keinen neuen Wert zuweisen, insofern auch Nothing nicht. Die bessere Lösung wäre, das über zwei Überladungen zu machen: Eine ohne Parameter, eine mit dem ByRef. Die kannst du dann ggf. auch einander aufrufen lassen, sodass keine Redundanz entsteht.

    Ich halte das ByRef übrigens für sinnvoll platziert.

    Viele Grüße
    ~blaze~
    meine jetztige überlegung:
    wenn ich eine referenz bekommen will, muß ich auch ne referenz reingeben...da aber nothing keine referenz ist, bekomme ich eben diesen fehler....richtig ?

    ByVal verarbeitet die daten nur auf prozedurebene...das heißt die referenz bleibt bestehen beim rückgabewert.

    aber was müßte ich denn statt nothing übergeben um diesen fehler zu umgehen ?

    ich könnte ne funktion schreiben, in der ich per ByVal angebe und sie als wert wieder zurückbekomme....hört sich komisch an....aber was besseres fällt mir gerade nicht ein :(

    hey....gute idee...ich mache ne überladung....das geht ja in .net :) danke

    problem gelöst...ich melde mich aber bestimmt heute nochmal .)

    habes es jetzt so gelöst:

    VB.NET-Quellcode

    1. Public Sub QuitSub(Of TForm As Form)(ByRef frm As TForm)
    2. If frm IsNot Nothing Then
    3. CloseForm(frm)
    4. End If
    5. QuitSub()
    6. End Sub
    7. Public Sub QuitSub()
    8. If cancelRead = True Then
    9. Log(LogColor.errorInfo, "Der Prozess wurde von dem Benutzer abgebrochen!")
    10. Message("Der Prozess wurde von dem Benutzer abgebrochen.")
    11. End If
    12. ShowMe(mainform)
    13. End Sub

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

    ~blaze~ schrieb:

    Ich halte das ByRef übrigens für sinnvoll platziert.
    Er hat es nur nicht verstanden, und lesen kann er auch nicht:

    Jetzt gibt es mehrere Möglichkeiten:

    VB.NET-Quellcode

    1. Public Sub QuitSub(ByRef frm As TForm)
    2. '...
    3. End Sub
    oder

    VB.NET-Quellcode

    1. Public Sub QuitSub(ByRef frm As Form)
    2. '...
    3. End Sub
    oder

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim frm As TForm = Nothing
    3. QuitSub(frm)
    4. End Sub
    5. Public Sub QuitSub(Of TForm As Form)(ByRef frm As TForm)
    6. '...
    7. End Sub
    Letztrere war das, worauf ich zielte.
    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
    Achso, ich hatte verstanden, dass das worauf du hinauswolltest, war, dass woeh ByVal verwenden solle.

    @woeh
    ByRef übergibt die Referenz auf das Objekt, das du hineingibst, d.h. die Referenz auf eine Variablen. Der Wert wird dann aus dieser Referenz geladen, sobald er verwendet wird bzw. an die Referenz gespeichert, wenn du einen Wert zuweist. ByVal übergibt das übergebene Objekt direkt als Wert, nicht als Referenz. Eine Änderung des Paramreters mit ByVal bewirkt deswegen auch keine Änderung einer übergebenenen Variablen.
    Nicht zu verwechseln: Wenn du Referenztypen (d.h. Klassen, Interfaces) übergibst, so werden Änderungen an ihnen schon durchgeführt. Bei ByRef wird eine Referenz auf die Variablen übergeben, d.h. du hast dann quasi eine Referenz auf die Referenz zur Instanz des Referenztypen.

    Viele Grüße
    ~blaze~
    Bei so vielen Fehlern scheint mir eine Häppchen-Strategie unerlässlich.
    Weil ohne Testläufe machen zu können ists glaub unmöglich, alle Fehler in einem Rutsch zu beheben, ohne neue einzubauen.
    Und Testläufe kannst du nur machen, wenn der Compiler die Füsse stille hält.

    Wesentlich zu solchen Mammut-Refactorings gehört auch die Möglichkeit, jederzeit lauffähige Backups machen zu können, um erreichte, erfolgreich getestete Stände festzuhalten.

    Meine Strategie-Empfehlung: Zwei Fragen: Aufteilung eines Programms und VB 2017
    ja....ich mache zwischendurch backups & teste immer wieder mal...

    jetzt habe ich ein problem bei dem ich nicht weiterkomme....und zwar bei folgenden 2 subs:

    VB.NET-Quellcode

    1. Private Sub InsertMenu()
    2. Dim txt, tag As String
    3. Dim p As Integer
    4. For p = 0 To tc.TabPages.Count - 1
    5. tag = tc.TabPages(p).Tag.ToString
    6. txt = tc.TabPages(p).Text
    7. If tag IsNot Nothing Then
    8. If FindMenuItem(tag) Is Nothing Then
    9. Dim item As New ToolStripMenuItem
    10. item.Tag = tag
    11. item.Text = tag
    12. AddHandler(item.MouseEnter), AddressOf mnuItem_MouseEnter '<-- Hier
    13. mnu.Items.Add(item)
    14. End If
    15. Else
    16. Dim item As New ToolStripMenuItem
    17. item.Text = txt
    18. AddHandler(item.Click), AddressOf mnuItem_Click
    19. mnu.Items.Add(item)
    20. End If
    21. Next p


    und diesem hier:

    VB.NET-Quellcode

    1. Private Sub mnuItem_MouseEnter(sender As Object, e As EventArgs)
    2. sender.ShowDropDown
    3. End Sub



    spätes binden nicht möglich.
    schreibe ich

    VB.NET-Quellcode

    1. Private Sub mnuItem_MouseEnter(sender As ToolStripMenuItem, e As EventArgs)
    2. sender.ShowDropDown()
    3. End Sub


    meckert er wieder oben im ersten sub weil es nicht zusammenpaßt.

    das ganze bewirkt ohne strict of, dass die menus beim drüberfahren mit der mouse über ein menu automatisch aufklappen.

    was mache ich da am besten ?
    danke....hat geklappt.....mußte nur wie folgt heißen:

    VB.NET-Quellcode

    1. Private Sub mnuItem_MouseEnter(sender As Object, e As EventArgs)
    2. Directcast(sender, ToolStripMenuItem).ShowDropDown()
    3. End Sub


    im moment lerne ich viel über typenkonvertierung...das meiste bekomme ich ja alleine gelöst, was mir vor nem monat noch kopfzerbrechen bereitet hätte.

    hey, das mit dem DirectCast ist je wirklich genial :)

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

    CType dürfte auch gehen:
    CType(sender, ToolStripMenuItem).ShowDropDown()
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Aha, sehr Interessant @us4711, hab ich wieder was dazu gelernt, vielen Dank :)
    -> DirectCast bei Referenz-Typen (wie im Beispiel hier) und CType bei Wert-Typen
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    komme mir gerade mächtig blöd vor, weil ich nichts drauf geschrieben habe...
    aber mein dank gilt an alle, die mir iwie weiterhelfen :)
    ich bin nur so im mom mit fehler ausmerzen beschäftigt...

    also: vielen lieben dank an alle, die mir weitergeholfen haben :)

    bin bei 250 fehler angekommen....

    und danke, das ihr mich aufgenommen habt...


    ich habe da noch ne frage...
    auch wenn ich bemüht bin alles auf .net schreibweise umzustellen...
    also:
    wo liegt genau der unterschied ob ich nun "InStr" & "Mid" benutze oder ".IndexOf" und ".Substring" ?
    mal davon abgesehen das eines 1-basierend und das andere 0-basierend ist.

    (jetzt kriege ich sie gleich wieder auf den sack ;))

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „woeh“ ()