Dynamisch erstellte Controls

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

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

    Dynamisch erstellte Controls

    Hallo :D

    für mein programm schreibe ich einen hexviewer, mit dem man sich die ID3Tags anschauen kann.
    für jeden hexwert werden jeweils 2 textboxen erzeugt (1x hexwert, 1x asciiwert)
    sinn dahinter ist, dass ich bei jeder textbox auf das KeyDown-Event reagieren möchte.

    soweit funktioniert auch alles...

    NUR...die erstellung dauert sehr lange :whistling: . bei dem ID3v1Tag geht das ja noch.
    bei dem ID3v2Tag z.b. mit gespeicherten bild im tag kommen schon mal ein paar 1000 bytes zusammen.

    ich poste mal den code, in der hoffnung das mich jmd in die richtige richtung stubst :thumbsup:

    VB.NET-Quellcode

    1. Private Sub HexWork(ByVal sBytes() As Byte,
    2. lblOffset As Label,
    3. panel As Panel)
    4. Dim pos As Integer = 0, offset As Integer = 0
    5. Dim lineCount As Integer = 0, rowCount As Integer
    6. Dim p, count, x, y, l As Integer
    7. Dim nameHindex As Integer = 0, nameAindex As Integer = 0
    8. Dim ASCII, offsetHex, hex As String
    9. Dim txt As TextBox
    10. Do While pos < sBytes.Length - 1
    11. If pos + 15 <= sBytes.Length Then
    12. l = 15
    13. Else
    14. l = sBytes.Length - 1 - pos
    15. End If
    16. count = pos
    17. rowCount = 0
    18. For p = 0 To l
    19. hex = Conversion.Hex(sBytes(count))
    20. If hex.Length = 1 Then
    21. hex = "0" & hex
    22. End If
    23. txt = New TextBox
    24. With txt
    25. .Parent = panel
    26. .Name = "txtH" & nameHindex.ToString
    27. .Multiline = True
    28. .AcceptsTab = True
    29. .BorderStyle = BorderStyle.None
    30. .TextAlign = HorizontalAlignment.Center
    31. .ReadOnly = True
    32. .BackColor = Color.White
    33. .Font = txtHex.Font
    34. .Text = hex
    35. .Width = 24
    36. .Height = 16
    37. x = 88 + (rowCount * 24)
    38. y = 16 + (lineCount * 16)
    39. .Location = New Point(x, y)
    40. AddHandler .KeyDown, AddressOf txt_KeyDown
    41. End With
    42. nameHindex += 1
    43. rowCount += 1
    44. count += 1
    45. Next p
    46. count = pos
    47. rowCount = 0
    48. For p = 0 To l
    49. x = sBytes(count)
    50. If x = 0 Or x = 1 Or x = 2 Or x = 9 Or x = 10 Or
    51. x = 13 Or x = 28 Or x = 29 Or x = 30 Or x = 31 Or
    52. x = 32 Or x = 129 Or x = 141 Or x = 143 Or x = 144 Or
    53. x = 157 Or x = 160 Then
    54. ASCII = " "
    55. Else
    56. ASCII = Chr(x)
    57. End If
    58. txt = New TextBox
    59. With txt
    60. .Parent = panel
    61. .Name = "txtA" & nameAindex.ToString
    62. .Multiline = True
    63. .AcceptsTab = True
    64. .BorderStyle = BorderStyle.None
    65. .TextAlign = HorizontalAlignment.Center
    66. .ReadOnly = True
    67. .BackColor = Color.White
    68. .Font = txtHex.Font
    69. .Text = ASCII
    70. .Width = 16
    71. .Height = 16
    72. x = 496 + (rowCount * 16)
    73. y = 16 + (lineCount * 16)
    74. .Location = New Point(x, y)
    75. AddHandler .KeyDown, AddressOf txt_KeyDown
    76. End With
    77. nameAindex += 1
    78. rowCount += 1
    79. count += 1
    80. Next p
    81. Dim lbl As New Label
    82. With lbl
    83. .Parent = panel
    84. .BackColor = Color.White
    85. .ForeColor = Color.Black
    86. .BorderStyle = BorderStyle.None
    87. .TextAlign = ContentAlignment.MiddleCenter
    88. .Font = lblSep.Font
    89. .Text = "|"
    90. .Width = 24
    91. .Height = 16
    92. y = 16 + (lineCount * 16)
    93. .Location = New Point(472, y)
    94. End With
    95. offsetHex = Conversion.Hex(offset)
    96. offsetHex = " " & New String("0"c, 8 - offsetHex.Length) & offsetHex & ":"
    97. lblOffset.Text &= offsetHex & vbCrLf
    98. offset += 16
    99. If pos > 0 Then
    100. lblOffset.Height = 16 + (lineCount * 16)
    101. End If
    102. pos += 16
    103. lineCount += 1
    104. Application.DoEvents()
    105. Loop
    106. End Sub
    Bilder
    • Hexviewer.jpg

      116,61 kB, 803×340, 135 mal angesehen
    Warum nimmst du nicht nen DataGrid? Dein Screenshot zeigt ja bereits etwas in Tabellenform an, warum also nicht ein entsprechendes Control nutzen?
    "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
    @woeh Fang an und schmeiß den VB6-Code raus.
    Verstehe, dass der "Hex-Code" lediglich eine spezielle String-Repräsentation eines numerischen Ausdrucks ist.

    VB.NET-Quellcode

    1. Dim i = 42
    2. Dim h = i.ToString("X2")
    Was passiert bei Deinem Monster-If, wenn x = 7 ist?
    Sehe ich das richtig, dass Du da darstellbare von nicht darstellbaren Zeichen trennen willst? Also die Steuerzeichen eliminieren willst?

    VB.NET-Quellcode

    1. If x < 32 OrElse x > 128 Then ' 32 ist das Leerzeichen
    2. Else
    3. End If
    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!
    Wie kommst du jetzt auf ListView? Wir sprachen dich vom DataGridView... Aber schön das es nun tut.
    "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
    Weil das DataGridView viel mehr kann. Ist langfristig besser sich da einzuarbeiten. Zumal.das ListView wohl schon sehr alt ist. Gegenfrage, warum nicht DataGridView?
    "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

    woeh schrieb:

    für RodFromGermany habe ich extra auch die "Nur Text-Funktion" eingebaut....
    Was soll ich damit?
    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!