Angepinnt [Sammelthread] Code-Korrektur

  • VB.NET

Es gibt 123 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Eigentlich ist es das Richtige projekt, erstellt in VS express 2013 und framework 4.5 .

    Es erstellt eine TXT datei in dei man dann programmpfade eintragen kann und öffnet sie dann. :)

    Edit Dadtei nochmal gezip. BEi mir hat es nachddem entpacken geklappt
    Dateien
    • OnStart2.0.zip

      (49,52 kB, 103 mal heruntergeladen, zuletzt: )
    Shit den fehler hab ich noch vergessen. Die Testdaten werden bei erstenlauf erstellt. Da bekommst du ein paar abfragen. Entferne die zuweisung hinter srPathToOpen;

    So ich hab kurz den Fehler den EDR bemängelt hat ausgebaut:
    Dateien
    • OnStart2.0.zip

      (49,52 kB, 117 mal heruntergeladen, zuletzt: )

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

    Als nächstes funzt das hier nicht:

    C#-Quellcode

    1. StreamWriter swWriteLog = new StreamWriter(fiPathToLog.FullName);
    2. using (swWriteLog) {
    3. if (fiPathToLog.Exists && !firstStartFile) {
    4. StreamReader srSaveLog = new StreamReader(fiPathToLog.FullName);
    Du kannst nicht gleichzeitig einen Reader und einen Writer auf dieselbe Datei haben.
    Hallo,
    auch ich würde meinen Code gerne einmal von den argwöhnischen Augen der Profis begutachten lassen :rolleyes:
    Ich hoffe er ist nicht zu lang. Falls doch, mach ich es kürzer.

    Info:
    Ich bin eigentlich mehr mit VB6 (ist auch schon über 10 Jahre her, mit vb4 angefangen) vertraut. Das ist ja aber nun outdated und ich versuche mich langsam in vbnet.

    Der folgende Code dient dazu, bei Tastendruck, KeyCodes anzuzeigen oder eben einen KeyCode einzugeben und die dazugehörige Taste anzuzeigen. Mit Hilfe dieses Forums konnte ich es nun zum Abschluss bringen. Alles funktioniert soweit.
    Ich tendiere grundsätzlich immer zu aufgeräumten Code, was mir noch fehlt sind ein paar Tipps zur "Sauberkeit". Es gibt soviel Neues in vbnet..... das erschlägt einen glatt wenn man VB6-"versaut" ist ^^

    Hier also der Code:

    VB.NET-Quellcode

    1. Imports ControlChars = Microsoft.VisualBasic.ControlChars
    2. Public Class Form1
    3. Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByValnVirtKey As Int32) As Int16
    4. Private Const VK_CAPSLOCK = &H14
    5. Dim KeyCharacter As Char
    6. Dim lblShiftBC As Color
    7. Dim lblCtrlBC As Color
    8. Dim lblCapsBC As Color
    9. Dim lblAltBC As Color
    10. Dim keyEingabe As Boolean
    11. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. 'Sichern der ursprünglichen Backgroundfarben
    13. lblShiftBC = lblShift.BackColor
    14. lblCtrlBC = lblCtrl.BackColor
    15. lblCapsBC = lblCaps.BackColor
    16. lblAltBC = lblAlt.BackColor
    17. 'Prüfen ob CapsLock an oder aus
    18. 'und das label entsprechend einfärben
    19. If GetKeyState(VK_CAPSLOCK) = 1 Then
    20. lblCaps.BackColor = Color.LightPink
    21. Else
    22. lblCaps.BackColor = lblCapsBC
    23. End If
    24. 'Flag zum Eingabemodus setzen
    25. keyEingabe = False
    26. End Sub
    27. Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    28. 'Wenn Taste gedrückt wird, anzeigendes Label einfärben
    29. Select Case e.KeyValue
    30. Case 16 : lblShift.BackColor = Color.LightBlue
    31. Case 17 : lblCtrl.BackColor = Color.LightGreen
    32. Case 18 : lblAlt.BackColor = Color.LightCoral
    33. End Select
    34. End Sub
    35. Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    36. 'Wenn keine Eingabe des KeyCodes, dann Taste auswerten
    37. If keyEingabe = False Then
    38. KeyCharacter = e.KeyData.ToString
    39. KeyCodeAuswerten(e.KeyValue, KeyCharacter)
    40. End If
    41. End Sub
    42. Private Sub btnViewKeyCode_Click(sender As Object, e As EventArgs) Handles btnViewKeyCode.Click
    43. 'Code by Quadsoft
    44. '----------------------------------------------------
    45. Dim keyCode As Integer = Integer.Parse(txtNumBox.Text)
    46. Dim key As Keys = keyCode
    47. If lblCaps.BackColor = Color.LightPink Or lblShift.BackColor = Color.LightBlue Then
    48. KeyCodeAuswerten(key, key.ToString())
    49. Else
    50. KeyCodeAuswerten(key, key.ToString().ToLower)
    51. End If
    52. '----------------------------------------------------
    53. 'Label, Textbox und Button wieder de-/aktivieren
    54. 'damit sie beim drücken bestimmter Tasten nicht aktiviert werden.
    55. lblKeyCodeViewInt.Text = txtNumBox.Text
    56. lblTextOnOff.Visible = True
    57. lblTextOnOff.Text = txtNumBox.Text
    58. txtNumBox.Enabled = False
    59. keyEingabe = False
    60. btnViewKeyCode.Enabled = False
    61. End Sub
    62. Private Sub KeyCodeAuswerten(i As Integer, iChar As String)
    63. 'Tastenbeschreibungen anzeigen die nicht oder schlecht
    64. 'von der Funktion übermittelt wird
    65. Select Case i
    66. Case 8 : lblKeyCodeViewStr.Text = "Back" & ControlChars.NewLine & "Space"
    67. Case 9 : lblKeyCodeViewStr.Text = "Tab"
    68. Case 13 : lblKeyCodeViewStr.Text = "Enter"
    69. Case 16 : lblKeyCodeViewStr.Text = "Shift" : lblShift.BackColor = lblShiftBC
    70. Case 17 : lblKeyCodeViewStr.Text = "Ctrl" : lblCtrl.BackColor = lblCtrlBC
    71. Case 18 : lblKeyCodeViewStr.Text = "Alt" : lblAlt.BackColor = lblCtrlBC
    72. Case 19 : lblKeyCodeViewStr.Text = "Break"
    73. Case 20 : lblKeyCodeViewStr.Text = "Caps"
    74. If GetKeyState(VK_CAPSLOCK) = 1 Then
    75. lblCaps.BackColor = Color.LightPink
    76. Else
    77. lblCaps.BackColor = lblCapsBC
    78. End If
    79. Case 32 : lblKeyCodeViewStr.Text = "Space"
    80. Case 33 : lblKeyCodeViewStr.Text = "PgUp"
    81. Case 34 : lblKeyCodeViewStr.Text = "PgDown"
    82. Case 35 : lblKeyCodeViewStr.Text = "End"
    83. Case 36 : lblKeyCodeViewStr.Text = "Pos1"
    84. Case 37 : lblKeyCodeViewStr.Text = "Left"
    85. Case 38 : lblKeyCodeViewStr.Text = "Up"
    86. Case 39 : lblKeyCodeViewStr.Text = "Right"
    87. Case 40 : lblKeyCodeViewStr.Text = "Down"
    88. Case 44 : lblKeyCodeViewStr.Text = "Print"
    89. Case 45 : lblKeyCodeViewStr.Text = "Ins"
    90. Case 46 : lblKeyCodeViewStr.Text = "Del"
    91. Case 112 : lblKeyCodeViewStr.Text = "F1"
    92. Case 113 : lblKeyCodeViewStr.Text = "F2"
    93. Case 114 : lblKeyCodeViewStr.Text = "F3"
    94. Case 115 : lblKeyCodeViewStr.Text = "F4"
    95. Case 116 : lblKeyCodeViewStr.Text = "F5"
    96. Case 117 : lblKeyCodeViewStr.Text = "F6"
    97. Case 118 : lblKeyCodeViewStr.Text = "F7"
    98. Case 119 : lblKeyCodeViewStr.Text = "F8"
    99. Case 120 : lblKeyCodeViewStr.Text = "F9"
    100. Case 121 : lblKeyCodeViewStr.Text = "F10"
    101. Case 122 : lblKeyCodeViewStr.Text = "F11"
    102. Case 123 : lblKeyCodeViewStr.Text = "F12"
    103. Case 145 : lblKeyCodeViewStr.Text = "Roll"
    104. Case 220 : lblKeyCodeViewStr.Text = "^"
    105. Case Else : lblKeyCodeViewStr.Text = iChar
    106. End Select
    107. 'TastenCode als Zahl anzeigen
    108. lblKeyCodeViewInt.Text = CStr(i)
    109. End Sub
    110. Private Sub lblTextOnOff_Click(sender As Object, e As EventArgs) Handles lblTextOnOff.Click
    111. 'Label, Textbox und Button wieder de-/aktivieren
    112. 'damit sie beim drücken bestimmter Tasten nicht aktiviert werden.
    113. txtNumBox.Enabled = True
    114. btnViewKeyCode.Enabled = True
    115. lblTextOnOff.Visible = False
    116. keyEingabe = True
    117. End Sub
    118. Private Sub txtNumBox_TextChanged(sender As Object, e As EventArgs) Handles txtNumBox.TextChanged
    119. On Error Resume Next
    120. 'Nur falls es Fehler bei der Eingabe gibt
    121. 'Evtl auch überflüssiges Relikt aus VB6-Zeiten???
    122. End Sub
    123. End Class
    Je höher man vor Freude springt,
    desto tiefer fällt man um auf den Boden der Tatsachen zu landen.

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

    mich stört, dass du den KeyCode als Integer behandelst, und nicht als das, was er ist: ein Keys

    Also besser wäre:

    VB.NET-Quellcode

    1. Private Sub KeyCodeAuswerten(code As Keys, iChar As String)
    2. 'Tastenbeschreibungen anzeigen die nicht oder schlecht
    3. 'von der Funktion übermittelt wird
    4. Select Case code
    5. Case Keys.Back : lblKeyCodeViewStr.Text = "Back" & ControlChars.NewLine & "Space"
    6. Case Keys.Tab : lblKeyCodeViewStr.Text = "Tab"
    7. Case Keys.Enter : lblKeyCodeViewStr.Text = "Enter"
    8. Case Keys.ShiftKey : lblKeyCodeViewStr.Text = "Shift" : lblShift.BackColor = lblShiftBC
    9. Case Keys.ControlKey : lblKeyCodeViewStr.Text = "Ctrl" : lblCtrl.BackColor = lblCtrlBC
    10. Case Keys.Menu : lblKeyCodeViewStr.Text = "Alt" : lblAlt.BackColor = lblCtrlBC
    11. Case Keys.Pause : lblKeyCodeViewStr.Text = "Break"
    12. Case Keys.CapsLock : lblKeyCodeViewStr.Text = "Caps"
    13. If GetKeyState(VK_CAPSLOCK) = 1 Then
    14. lblCaps.BackColor = Color.LightPink
    15. Else
    16. lblCaps.BackColor = lblCapsBC
    17. End If
    18. '...
    Ähnliches Thema wie im anderen Thread: Datentypen erkennen (hier: Keys), und für sich arbeiten lassen.
    Um deinen Code auf VB.NET-Stand zu heben:

    Was ich dir auch empfehlen kann, ist die WinAPI-Funktionn nicht über Private Declare sondern über <DllImport()> einzubinden. Das mit dem Private Declar ist VB6.
    Hierzu einfach mal auf pinvoke.net nachschlagen: pinvoke.net/default.aspx/user32.getkeystate :D

    Du verwendest immer noch den VB-Namespace...nicht gut. Wenn du eine "Neue Zeile" brauchst, kannst du das auch über System.Environment.NewLine lösen.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @'ErfinderDesRades
    Danke! :)

    @'Radinator
    Auch Dir danke ich, aber leider kann ich mit dem Tipp so nichts anfangen. Dafür fehlt mir wohl etwas mehr Hintergrundwissen.
    Wenn ich den Beispielcode von pinvoke einfüge bekomme ich die verschiedensten Fehlermeldungen:

    Ein Bild sagt mehr als 1000 Worte ^^

    So stehts auf der pinvoke-Seite. Im Netz habe ich dann nach kurzer Suche einen Hinweis gefunden dass der Namespace "System.Runtimes.InteropServices" eingebunden werden muss.


    Gesagt getan:


    Danach verschwanden ein paar der Fehler und übrig blieb das hier:


    Aus der Fehlermeldung schloss ich, dass die Funktion darunter irgendwie fehl am Platz ist und entfernte sie.


    Und jetzt wird es etwas strange (für mich^^). Ich hänge hinten also ein "_" inklusive Leerzeichen davor an was sich anscheinend
    positiv auswirkt aber sich auch gleich wieder in Luft auflöst. !höÖ! Ö_Ö?


    Und ab hier habe ich die Raterei aufgegeben, denn die hier bemänglte Konstante wird auf der pinvoke-Seite angegeben.

    Mir fehlt zuviel Grundwissen zu diesen ganzen Vorgängen um solche Beispiele korrekt einzusetzen. Ich brauche funktionierenden
    Beispielcode. Alles andere ist nur raten.

    Wenn Du diesbezüglich noch ein Tipp hast der mir weiterhilft....
    Sonst warte ich, bis ich es begriffen habe ^^

    Deinen Hinweis zu NewLine habe ich dankend umgesetzt.
    Je höher man vor Freude springt,
    desto tiefer fällt man um auf den Boden der Tatsachen zu landen.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „HHRonny“ ()

    <p>Um das DllImport-Attribut verwenden zu k&ouml;nnen, musst du es voll qualifizieren (sprich: den Namspace-Pfad System.Interop.RuntimeService entweder mit Imports einbinden oder vor das DllImport schreiben)</p>

    <p>Aus dem zweiten Bild lese ich mal (obwohl ich nicht die ganze Signatur sehe), dass du hier das Schl&uuml;sselwort &quot;Shared&quot; nicht dabei hast.</p>

    <p>Um das DllImport-Attribut verwenden zu k&ouml;nne, musst du die Methode Shared (also Static) machen. Das&nbsp; hat zur Folge, dass du von der Klasse, in der du die Methode defniertst, keine Instanz, also kein Objekt erzeugen musst, um die Methode verwenden zu k&ouml;nnen.</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>

    <p>&nbsp;</p>
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    @'Radinator
    Also so ganz schlau werde ich aus Deinem letzten Beitrag nicht. Dennoch habe ich es mit etwas Rate-Glück hinbekommen.
    Nun funktioniert es!

    So sieht das jetzt bei mir aus: Bitte sag dass alles richtig ist 8o

    VB.NET-Quellcode

    1. Public Class Form1
    2. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    3. Shared Function GetKeyState(ByVal nVirtKey As CheckState) As Short
    4. End Function
    5. Private Const VK_CAPSLOCK = &H14
    6. Private Const VK_RMENU = &HA5


    Den Typ "KeyStates" mochte meine IDE nicht und schlug mir stattdessen "CheckState" vor. Ich nehme mal an, da gibt es keinen gravierenden Unterschied, oder doch?
    Je höher man vor Freude springt,
    desto tiefer fällt man um auf den Boden der Tatsachen zu landen.
    Lustiger Vergleich :)
    Und in Bezug auf meinen Code oben?
    Ich mein, CheckState, KeyStates, klingt für mich wie Mario und Luigi. Beides Italiener, nur die Namen sind unterschiedlich.

    Da der Typ von der IDE vorgeschlagen wurde dachte ich dass er vielleicht Ersatz für KeyStates ist. Also neuer.

    ?
    Je höher man vor Freude springt,
    desto tiefer fällt man um auf den Boden der Tatsachen zu landen.
    Dann schauen wir mal nach, wofür CheckState in .Net steht:
    msdn.microsoft.com/de-de/libra…cs-lang=vb#code-snippet-1

    Nicht gerade beeindruckend, oder?

    Nun nochmal zu Pinvoke:
    pinvoke.net/default.aspx/user32.GetKeyState

    Nun, da is ein gewaltiger Block namens VirtualKeyStates, wobei es sich um ein Enum handelt.
    Man könnte nun dazu über gehen und das kopieren, wäre da nicht ein kleiner Satz drunter:

    Pinvoke schrieb:

    The Enum Keys in System.Windows.Forms has the key code used for this function, so you don't need to define const​


    Wie du also siehst ist CheckState nicht mal annähernd mit KeyStates verwandt. Selbst sie als "false friends" zu bezeichnen wäre noch zu viel, denn hier ist (Virtual)KeyStates lediglich ein Beispiel, wohingegen CheckState eine feste Enumeration im .Net Framework ist, die noch nicht einmal was mit Keys zu tun hat.
    Hi,

    denke mal das gehört am ehesten hierhin. Und zwar sollen die Items einer CheckedListBox anhand dem Inhalt eines Arrays (split) gechecked werden. Jedoch glaube ich, dass man diesen Code, den ich gebastelt hab noch optimieren kann, da er eigentlich viel zu lange durch läuft und prüft, selbst wenn das Item schon längst gefunden wurde.

    VB.NET-Quellcode

    1. If Not split(0) = "" Then
    2. For Each elem As String In split
    3. For i As Integer = 0 To split.Length - 1
    4. For x As Integer = 0 To clbBewerbungsart.Items.Count - 1
    5. If clbBewerbungsart.Items(x).ToString.Replace(" ", "") = elem Then
    6. clbBewerbungsart.SetItemChecked(x, True)
    7. End If
    8. Next
    9. Next
    10. Next
    11. End If


    Vielleicht kann mir jemand zeigen, wies effizienter geht :)

    Liebe Grüße
    rory
    "Es ist sehr einfach, ein Programm zu schreiben, das innerhalb kürzester Zeit und mit wenig Speicherplatzbedarf ein vorgegebenes Problem NICHT löst." - H.A. Klaeren
    @rory Wenn gesichert ist, dass das Array split mit den Items von clbBewerbungsart synchron läuft, brauchst Du nur eine einzige Schleife:

    VB.NET-Quellcode

    1. For i As Integer = 0 To Math.Min(split.Length, clbBewerbungsart.Items.Count) - 1
    2. If clbBewerbungsart.Items(i).ToString.Replace(" ", "") = split(i) Then
    3. clbBewerbungsart.SetItemChecked(i, True)
    4. End If
    5. Next
    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!