Wie kann ich mit einem Buttonklick eine neue Klasse erstellen, so dass diese unumständlich an ihre Laufvariablen kommt? Volume-Meter

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

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Wie kann ich mit einem Buttonklick eine neue Klasse erstellen, so dass diese unumständlich an ihre Laufvariablen kommt? Volume-Meter

    Hi all,

    Was das Programm macht:
    Es stellt, in Abhängigkeit der Frequenz die Signalqualität dar. Diese ist an der Hauptfrequenz eines Senders am stärksten, links und rechts davon schwächer. Es gibt einen Wasserfall-Effekt, sodass alte Werte immer weiter nach unten wandern. Da ich noch keine Antenne und Elektronik habe, um UKW zu empfangen und zu verwerten, habe ich mir fürs Erste Messwerte ausgedacht. Sie stammen aus einer Excel-Tabelle und hören auf die Funktion
    $$ \frac{13\cdot x^{4}}{14000000000000}-\frac{1073\cdot x^{3}}{84000000000}+\frac{803\cdot x^{2}}{14000000}-\frac{8023\cdot x}{84000} $$
    , falls es jemand wissen will. Die 7080 Werte werden eingelesen. Ich habe die Messwerte absichtlich mit random.next etwas versaut, um Unterschiede besser sehen zu können. Die Signale links und rechts werden mit größerem Abstand zur Hauptfrequenz schwächer. Das sieht man sehr schön. Hier sind aktuell 5 Farben zu sehen.

    1.)
    In einem Timer_Tick werden die Laufindexe der jeweiligen Klassen erhöht. Wir reden derzeit von 5 Klassen. Danach PictureBox1.Invalidate(), aber asynchron. Das Thema hatten wir ja schon. Daher braucht es auch 5 Mal Klassex.Paint() in der Private Sub PictureBox1_Paint!
    Was passiert denn nun, wenn ich noch mehr Frequenzen haben möchte? Am besten per Button-Klick? Es geht mir darum, dass eine elektronische Schaltung ja noch viel, viel mehr Frequenzen bemerkt... Diese müssen auch als Wasserfall sichtbar sein, auch wenn man diese Frequenz aktuell gar nicht hört.

    2.) Könntet ihr bitte einmal drüberschauen, ob ich etwas besser machen kann?

    VB.NET-Quellcode

    1. 'Option Strict On wurde in den Projekteigenschaften aktiviert.
    2. 'Assembly-Sprache ist Deutsch (Deutschland).
    3. Imports System.Drawing.Drawing2D
    4. Public Class Form1
    5. Private Excel1 As New Microsoft.Office.Interop.Excel.Application
    6. Public S1 As New Signalvisualisierung(900)
    7. Public S2 As New Signalvisualisierung(895)
    8. Public S3 As New Signalvisualisierung(905)
    9. Public S4 As New Signalvisualisierung(890)
    10. Public S5 As New Signalvisualisierung(910)
    11. Private Werte_gelesen As Boolean = False
    12. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. PictureBox1.BackColor = Color.FromArgb(0, 0, 50) 'Dunkelblau. ES IST WICHTIG, dass dieser Wert jetzt eine Vereinbarung ist, da später ein Wert draufaddiert wird!
    14. End Sub
    15. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    16. If S1.dBm.Count = 0 OrElse S2.dBm.Count = 0 OrElse S3.dBm.Count = 0 Then Return
    17. Timer1.Start()
    18. End Sub
    19. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    20. Timer1.Stop()
    21. End Sub
    22. Private Sub Button_load_Excel_Click(sender As Object, e As EventArgs) Handles Button_load_Excel.Click
    23. Dim rand As New System.Random()
    24. Dim akt_Wert As Double = -100.0
    25. Dim txt As String
    26. If System.IO.File.Exists("C:\Users\Bartosz\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx") Then
    27. Excel1.Workbooks.Open("C:\Users\Bartosz\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx")
    28. For i As Integer = 2 To 7082 Step 1
    29. txt = Excel1.Range("B" & i.ToString).Value().ToString
    30. Dim Parse_Result = Double.TryParse(txt, akt_Wert)
    31. If Parse_Result Then
    32. akt_Wert += CDbl(rand.Next(0, 3))
    33. S1.dBm.Add(akt_Wert)
    34. S2.dBm.Add(akt_Wert - 2.0) 'Links und rechts von der Mitte wird das Signal schwächer (wie in echt).
    35. S3.dBm.Add(akt_Wert - 2.0)
    36. S4.dBm.Add(akt_Wert - 4.0)
    37. S5.dBm.Add(akt_Wert - 4.0)
    38. Else
    39. Debug.WriteLine("Fehler bei der Umwandlung")
    40. End If
    41. Next
    42. End If
    43. Excel1.Application.Quit()
    44. Werte_gelesen = True
    45. End Sub
    46. Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    47. S1.i += 1
    48. If S1.i > (S1.dBm.Count - 1) Then S1.i = 0
    49. S1.index_fuer_yPosition += 1
    50. If S1.index_fuer_yPosition > (S1.yPosition.Count - 1) Then S1.index_fuer_yPosition = 0
    51. S2.i += 1
    52. If S2.i > (S2.dBm.Count - 1) Then S2.i = 0
    53. S2.index_fuer_yPosition += 1
    54. If S2.index_fuer_yPosition > (S2.yPosition.Count - 1) Then S2.index_fuer_yPosition = 0
    55. S3.i += 1
    56. If S3.i > (S3.dBm.Count - 1) Then S3.i = 0
    57. S3.index_fuer_yPosition += 1
    58. If S3.index_fuer_yPosition > (S3.yPosition.Count - 1) Then S3.index_fuer_yPosition = 0
    59. S4.i += 1
    60. If S4.i > (S4.dBm.Count - 1) Then S4.i = 0
    61. S4.index_fuer_yPosition += 1
    62. If S4.index_fuer_yPosition > (S4.yPosition.Count - 1) Then S4.index_fuer_yPosition = 0
    63. S5.i += 1
    64. If S5.i > (S5.dBm.Count - 1) Then S5.i = 0
    65. S5.index_fuer_yPosition += 1
    66. If S5.index_fuer_yPosition > (S5.yPosition.Count - 1) Then S5.index_fuer_yPosition = 0
    67. Await Task.Run(Sub() PictureBox1.Invalidate())
    68. End Sub
    69. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    70. If Werte_gelesen Then
    71. S1.Paint(e.Graphics)
    72. S2.Paint(e.Graphics)
    73. S3.Paint(e.Graphics)
    74. S4.Paint(e.Graphics)
    75. S5.Paint(e.Graphics)
    76. End If
    77. End Sub
    78. End Class


    und die Klasse (der auskommentierte Block ist vom Probieren, kann auskommentiert bleiben)
    Falls ihr euch wegen HelligkeitA * 1.243 wundert, das kommt deswegen, weil die mathematische, lineare Funktion die Dezibelwerte in Helligkeitswerte umwandeln soll. Nun ist es aber so, dass der PictureBox-Hintergrund dunkelblau sein soll (RGB(0,0,50)) und das Signal nicht dunkler sein soll, als der Hintergrund ist (und somit mindestens 50 sein muss). Daher darf die Funktion maximal 205 ausspucken. Die Rot- und Grün-Werte dürfen aber gerne bis 255 nauf gehen.

    VB.NET-Quellcode

    1. Public Class Signalvisualisierung
    2. Public dBm As New List(Of Double)
    3. Public i As Integer = 0
    4. Public Frequenz_in_Hz As Integer
    5. Public yPosition As New List(Of Integer)
    6. Public index_fuer_yPosition As Integer = 0
    7. Public Sub New(ByVal Fr As Integer)
    8. Me.Frequenz_in_Hz = Fr
    9. For J As Integer = 0 To 1000 Step 10
    10. yPosition.Add(J)
    11. Next
    12. End Sub
    13. Public Sub Paint(ByVal g As Graphics)
    14. g.SmoothingMode = SmoothingMode.AntiAlias
    15. g.CompositingQuality = CompositingQuality.HighQuality
    16. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    17. g.InterpolationMode = InterpolationMode.HighQualityBilinear
    18. 'Dim rect_Streifen As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(index_fuer_yPosition), 5, 10) 'zentral ← →
    19. ''mathematische Funktion g(x) = 2.5625 * x + 205 weil bei -80dBm die 50 sein soll und bei 0dBm die 205 (+50).
    20. ''Selbst bei schwächstem Signal erhalte ich kein Schwarz ;)
    21. 'Dim Helligkeit As Byte = CByte(Math.Round(2.5625 * dBm(i) + 205.0, 0))
    22. ' 'Form1.TextBox_Hell.Text = Helligkeit.ToString() & ", " & i.ToString() 'Kontrolle
    23. ' 'Form1.TextBox_Hell.Update()
    24. ' Dim R As Integer = CInt(Math.Round(Helligkeit * 1.243, 0))
    25. 'If R > 255 Then R = 255
    26. 'Dim Gr As Integer = CInt(Math.Round(Helligkeit * 0.4, 0))
    27. 'If Gr > 255 Then Gr = 255
    28. 'Dim B As Integer = 50 + Helligkeit
    29. 'If B > 255 Then B = 255
    30. '' 255 85 255
    31. 'Dim neue_Farbe As Color = Color.FromArgb(R, Gr, B)
    32. 'Using MyBrush = New SolidBrush(neue_Farbe)
    33. 'g.FillRectangle(MyBrush, rect_Streifen)
    34. 'End Using
    35. 'Je größer A wird, desto tiefer wird in die Vergangenheit geschaut. Weiter oben in PictureBox!
    36. 'Je öfter Invalidate() aufgerufen wird, desto weiter kommt die Schleife.
    37. For A As Integer = 0 To (yPosition.Count - 1) Step 1
    38. If (A) >= 0 AndAlso (A) < (yPosition.Count - 1) AndAlso (i - A) >= 0 Then
    39. Dim rect_StreifenA As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(A), 5, 10)
    40. Dim HelligkeitA As Byte = CByte(Math.Round(2.5625 * dBm(i - A) + 205.0, 0))
    41. 'Form1.TextBox_Hell.Text = HelligkeitA.ToString() & ", " & i.ToString() 'Kontrolle
    42. 'Form1.TextBox_Hell.Update()
    43. Dim Red As Integer = CInt(Math.Round(HelligkeitA * 1.243, 0))
    44. If Red > 255 Then Red = 255
    45. Dim Gre As Integer = CInt(Math.Round(HelligkeitA * 0.4, 0))
    46. If Gre > 255 Then Gre = 255
    47. Dim Bl As Integer = 50 + HelligkeitA
    48. If Bl > 255 Then Bl = 255
    49. Dim neue_FarbeA As Color = Color.FromArgb(Red, Gre, Bl)
    50. Using MyBrush = New SolidBrush(neue_FarbeA)
    51. g.FillRectangle(MyBrush, rect_StreifenA)
    52. End Using
    53. End If
    54. Next
    55. End Sub
    56. End Class
    Bilder
    • Screenshot 2020-11-23 002641.png

      36,4 kB, 900×657, 86 mal angesehen
    • Das meine ich - 5 mal dasselbe.png

      39,13 kB, 1.208×482, 75 mal angesehen
    Spekulatius/Schnellschuss, da zu müde: Statt S1, S2, S3, S4, S5 eine List(Of Signalvisualisierung), dann sollte der Wiederholungskram durch eine For- oder For-Each-Schleife ersetzbar sein.
    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.
    Ok, danke schonmal.
    Aber jetzt nehme ich mal einen Button her und tue so, als käme ein zweites Signal (siehe Button_load_excel_2_Click). Nicht aus Versehen bei Button_load_Excel_Click schauen, ist mir schon passiert

    Ich habe global Blanko-Klassen, die ich später mit New neu zuweise. Wie kann ich die bedienen? Erledigt, bitte bei Post 3 gucken!!!

    VB.NET-Quellcode

    1. 'Option Strict On wurde in den Projekteigenschaften aktiviert.
    2. 'Assembly-Sprache ist Deutsch (Deutschland).
    3. Imports System.Drawing.Drawing2D
    4. Public Class Form1
    5. Private Excel1 As New Microsoft.Office.Interop.Excel.Application
    6. Private meineKlassen As New List(Of Signalvisualisierung)
    7. Public S1 As New Signalvisualisierung(900)
    8. Public S2 As New Signalvisualisierung(895)
    9. Public S3 As New Signalvisualisierung(905)
    10. Public S4 As New Signalvisualisierung(890)
    11. Public S5 As New Signalvisualisierung(910)
    12. Public SB1 As Signalvisualisierung = Nothing
    13. Public SB2 As Signalvisualisierung = Nothing
    14. Public SB3 As Signalvisualisierung = Nothing
    15. Public SB4 As Signalvisualisierung = Nothing
    16. Public SB5 As Signalvisualisierung = Nothing
    17. Public SB6 As Signalvisualisierung = Nothing
    18. Private Werte_gelesen As Boolean = False
    19. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    20. PictureBox1.BackColor = Color.FromArgb(0, 0, 50) 'Dunkelblau. ES IST WICHTIG, dass dieser Wert jetzt eine Vereinbarung ist, da später ein Wert draufaddiert wird!
    21. meineKlassen.Add(S1)
    22. meineKlassen.Add(S2)
    23. meineKlassen.Add(S3)
    24. meineKlassen.Add(S4)
    25. meineKlassen.Add(S5)
    26. End Sub
    27. Private Sub Button_Timer_Start_Click(sender As Object, e As EventArgs) Handles Button_Timer_Start.Click
    28. For M As Integer = 0 To meineKlassen.Count - 1 Step 1
    29. If meineKlassen(M).dBm.Count = 0 Then Return
    30. Next
    31. Timer1.Start()
    32. End Sub
    33. Private Sub Button_Timer_Stopp_Click(sender As Object, e As EventArgs) Handles Button_Timer_Stopp.Click
    34. Timer1.Stop()
    35. End Sub
    36. Private Sub Button_load_Excel_Click(sender As Object, e As EventArgs) Handles Button_load_Excel.Click
    37. Dim rand As New System.Random()
    38. Dim akt_Wert As Double = -100.0
    39. Dim txt As String
    40. If System.IO.File.Exists("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx") Then
    41. Excel1.Workbooks.Open("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx")
    42. For i As Integer = 2 To 7082 Step 1
    43. txt = Excel1.Range("B" & i.ToString).Value().ToString
    44. Dim Parse_Result = Double.TryParse(txt, akt_Wert)
    45. If Parse_Result Then
    46. akt_Wert += CDbl(rand.Next(0, 3))
    47. S1.dBm.Add(akt_Wert)
    48. S2.dBm.Add(akt_Wert - 2.0) 'Links und rechts von der Mitte wird das Signal schwächer.
    49. S3.dBm.Add(akt_Wert - 2.0)
    50. S4.dBm.Add(akt_Wert - 4.0)
    51. S5.dBm.Add(akt_Wert - 4.0)
    52. Else
    53. Debug.WriteLine("Fehler bei der Umwandlung")
    54. End If
    55. Next
    56. End If
    57. Excel1.Application.Quit()
    58. Button_load_Excel.BackColor = Color.FromArgb(0, 200, 0)
    59. Werte_gelesen = True
    60. End Sub
    61. Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    62. For N As Integer = 0 To meineKlassen.Count - 1 Step 1
    63. meineKlassen(N).i += 1
    64. If meineKlassen(N).i > (meineKlassen(N).dBm.Count - 1) Then meineKlassen(N).i = 0
    65. meineKlassen(N).index_fuer_yPosition += 1
    66. If meineKlassen(N).index_fuer_yPosition > (meineKlassen(N).yPosition.Count - 1) Then meineKlassen(N).index_fuer_yPosition = 0
    67. Next
    68. Await Task.Run(Sub() PictureBox1.Invalidate())
    69. End Sub
    70. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    71. If Werte_gelesen Then
    72. For O As Integer = 0 To meineKlassen.Count - 1 Step 1
    73. meineKlassen(O).Paint(e.Graphics)
    74. Next
    75. End If
    76. End Sub
    77. Private Sub Button_load_excel_2_Click(sender As Object, e As EventArgs) Handles Button_load_excel_2.Click
    78. Dim rand As New System.Random()
    79. Dim akt_Wert As Double = -100.0
    80. Dim txt As String
    81. If System.IO.File.Exists("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte Signal2.xlsx") Then
    82. Excel1.Workbooks.Open("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte Signal2.xlsx")
    83. Dim Breite_in_Hertz As Integer = 30
    84. Dim wie_viele_Streifen_brauche_ich As Integer = Breite_in_Hertz \ 5
    85. For P As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    86. Dim Abweichung As Integer
    87. If P < (wie_viele_Streifen_brauche_ich / 2) Then
    88. Abweichung = -5
    89. ElseIf P > (wie_viele_Streifen_brauche_ich / 2) Then
    90. Abweichung = 5
    91. Else
    92. Abweichung = 0
    93. End If
    94. For Q As Integer = 0 To meineKlassen.Count - 1 Step 1
    95. If meineKlassen(Q) Is Nothing Then
    96. meineKlassen(Q) = New Signalvisualisierung(450 + Abweichung)
    97. Else
    98. Exit For
    99. End If
    100. Next
    101. Next
    102. For i As Integer = 2 To 7002 Step 1
    103. txt = Excel1.Range("B" & i.ToString).Value().ToString
    104. Dim Parse_Result = Double.TryParse(txt, akt_Wert)
    105. If Parse_Result Then
    106. akt_Wert -= CDbl(rand.Next(0, 3))
    107. SB1.dBm.Add(akt_Wert - 6.0)
    108. SB2.dBm.Add(akt_Wert - 3.0)
    109. SB3.dBm.Add(akt_Wert + 0.0)
    110. SB4.dBm.Add(akt_Wert + 0.0)
    111. SB5.dBm.Add(akt_Wert - 3.0)
    112. SB6.dBm.Add(akt_Wert - 6.0)
    113. Else
    114. Debug.WriteLine("Fehler bei der Umwandlung")
    115. End If
    116. Next
    117. End If
    118. Excel1.Application.Quit()
    119. Werte_gelesen = True
    120. End Sub
    121. End Class

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

    Dies ist nun mein Programm. Signal 1 ist fest von gestern, Signal 2 wird auf Knopfdruck dazugeschaltet.

    Ich würde mich freuen, wenn ihr eure Meinung dazu sagt. Mich stört es noch ein wenig, dass ich mehrere Klassen global "auf Halde" haben muss. Was mache ich denn für das dritte Signal :|

    VB.NET-Quellcode

    1. 'Option Strict On wurde in den Projekteigenschaften aktiviert.
    2. 'Assembly-Sprache ist Deutsch (Deutschland).
    3. Imports System.Drawing.Drawing2D
    4. Public Class Form1
    5. Private Excel1 As New Microsoft.Office.Interop.Excel.Application
    6. Private meineKlassen As New List(Of Signalvisualisierung)
    7. Public S1 As New Signalvisualisierung(900)
    8. Public S2 As New Signalvisualisierung(895)
    9. Public S3 As New Signalvisualisierung(905)
    10. Public S4 As New Signalvisualisierung(890)
    11. Public S5 As New Signalvisualisierung(910)
    12. Private bereits_verwendete_Klassen As Integer = 5
    13. Public SB1 As Signalvisualisierung = Nothing
    14. Public SB2 As Signalvisualisierung = Nothing
    15. Public SB3 As Signalvisualisierung = Nothing
    16. Public SB4 As Signalvisualisierung = Nothing
    17. Public SB5 As Signalvisualisierung = Nothing
    18. Public SB6 As Signalvisualisierung = Nothing
    19. Private Werte_gelesen As Boolean = False
    20. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    21. PictureBox1.BackColor = Color.FromArgb(0, 0, 50) 'Dunkelblau. ES IST WICHTIG, dass dieser Wert jetzt eine Vereinbarung ist, da später ein Wert draufaddiert wird!
    22. meineKlassen.Add(S1)
    23. meineKlassen.Add(S2)
    24. meineKlassen.Add(S3)
    25. meineKlassen.Add(S4)
    26. meineKlassen.Add(S5)
    27. meineKlassen.Add(SB1)
    28. meineKlassen.Add(SB2)
    29. meineKlassen.Add(SB3)
    30. meineKlassen.Add(SB4)
    31. meineKlassen.Add(SB5)
    32. meineKlassen.Add(SB6)
    33. End Sub
    34. Private Sub Button_Timer_Start_Click(sender As Object, e As EventArgs) Handles Button_Timer_Start.Click
    35. Timer1.Start()
    36. Button_Timer_Start.BackColor = Color.Green
    37. End Sub
    38. Private Sub Button_Timer_Stopp_Click(sender As Object, e As EventArgs) Handles Button_Timer_Stopp.Click
    39. Timer1.Stop()
    40. End Sub
    41. Private Sub Button_load_Excel_Click(sender As Object, e As EventArgs) Handles Button_load_Excel.Click
    42. Dim rand As New System.Random()
    43. Dim akt_Wert As Double = -100.0
    44. Dim txt As String
    45. If System.IO.File.Exists("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx") Then
    46. Excel1.Workbooks.Open("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte.xlsx")
    47. For i As Integer = 2 To 7082 Step 1
    48. txt = Excel1.Range("B" & i.ToString).Value().ToString
    49. Dim Parse_Result = Double.TryParse(txt, akt_Wert)
    50. If Parse_Result Then
    51. akt_Wert += CDbl(rand.Next(0, 3))
    52. S1.dBm.Add(akt_Wert)
    53. S2.dBm.Add(akt_Wert - 2.0) 'Links und rechts von der Mitte wird das Signal schwächer.
    54. S3.dBm.Add(akt_Wert - 2.0)
    55. S4.dBm.Add(akt_Wert - 4.0)
    56. S5.dBm.Add(akt_Wert - 4.0)
    57. Else
    58. Debug.WriteLine("Fehler bei der Umwandlung")
    59. End If
    60. Next
    61. End If
    62. Excel1.Application.Quit()
    63. Button_load_Excel.BackColor = Color.FromArgb(0, 200, 0)
    64. Werte_gelesen = True
    65. bereits_verwendete_Klassen = 5
    66. End Sub
    67. Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    68. For N As Integer = 0 To meineKlassen.Count - 1 Step 1
    69. meineKlassen(N).i += 1
    70. If meineKlassen(N).i > (meineKlassen(N).dBm.Count - 1) Then meineKlassen(N).i = 0
    71. meineKlassen(N).index_fuer_yPosition += 1
    72. If meineKlassen(N).index_fuer_yPosition > (meineKlassen(N).yPosition.Count - 1) Then meineKlassen(N).index_fuer_yPosition = 0
    73. Next
    74. Await Task.Run(Sub() PictureBox1.Invalidate())
    75. End Sub
    76. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    77. If Werte_gelesen Then
    78. For O As Integer = 0 To meineKlassen.Count - 1 Step 1
    79. If meineKlassen(O).dBm.Count > 0 Then
    80. meineKlassen(O).Paint(e.Graphics)
    81. End If
    82. Next
    83. End If
    84. End Sub
    85. Private Sub Button_load_excel_2_Click(sender As Object, e As EventArgs) Handles Button_load_excel_2.Click
    86. Dim rand As New System.Random()
    87. Dim akt_Wert As Double = -100.0
    88. Dim txt As String
    89. If System.IO.File.Exists("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte Signal2.xlsx") Then
    90. Excel1.Workbooks.Open("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte Signal2.xlsx")
    91. Dim Breite_in_Hertz As Integer = 30
    92. Dim wie_viele_Streifen_brauche_ich As Integer = Breite_in_Hertz \ 5
    93. For P As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    94. Dim Abweichung As Integer
    95. If P < (wie_viele_Streifen_brauche_ich / 2) Then
    96. Abweichung = -5
    97. ElseIf P > (wie_viele_Streifen_brauche_ich / 2) Then
    98. Abweichung = 5
    99. Else
    100. Abweichung = 0
    101. End If
    102. For Q As Integer = 0 To meineKlassen.Count - 1 Step 1
    103. If meineKlassen(Q) Is Nothing Then
    104. meineKlassen(Q) = New Signalvisualisierung(450 + Abweichung)
    105. bereits_verwendete_Klassen += 1
    106. Exit For
    107. End If
    108. Next
    109. Next
    110. For i As Integer = 2 To 7002 Step 1
    111. txt = Excel1.Range("B" & i.ToString).Value().ToString
    112. Dim Parse_Result = Double.TryParse(txt, akt_Wert)
    113. If Parse_Result Then
    114. akt_Wert -= CDbl(rand.Next(0, 3))
    115. meineKlassen(bereits_verwendete_Klassen - 5 - 1 + 0).dBm.Add(akt_Wert - 6.0)
    116. meineKlassen(bereits_verwendete_Klassen - 5 - 1 + 1).dBm.Add(akt_Wert - 3.0)
    117. meineKlassen(bereits_verwendete_Klassen - 5 - 1 + 2).dBm.Add(akt_Wert + 0.0)
    118. meineKlassen(bereits_verwendete_Klassen - 5 - 1 + 3).dBm.Add(akt_Wert + 0.0)
    119. meineKlassen(bereits_verwendete_Klassen - 5 - 1 + 4).dBm.Add(akt_Wert - 3.0)
    120. meineKlassen(bereits_verwendete_Klassen - 5 - 1 + 5).dBm.Add(akt_Wert - 6.0)
    121. Else
    122. Debug.WriteLine("Fehler bei der Umwandlung")
    123. End If
    124. Next
    125. End If
    126. Excel1.Application.Quit()
    127. Button_load_excel_2.BackColor = Color.FromArgb(0, 200, 0)
    128. Werte_gelesen = True
    129. End Sub
    130. End Class
    131. Public Class Signalvisualisierung
    132. Public dBm As New List(Of Double)
    133. Public i As Integer = 0
    134. Public Frequenz_in_Hz As Integer
    135. Public yPosition As New List(Of Integer)
    136. Public index_fuer_yPosition As Integer = 0
    137. Public Sub New(ByVal Fr As Integer)
    138. Me.Frequenz_in_Hz = Fr
    139. For J As Integer = 0 To 1000 Step 10
    140. yPosition.Add(J)
    141. Next
    142. End Sub
    143. Public Sub Paint(ByVal g As Graphics)
    144. g.SmoothingMode = SmoothingMode.AntiAlias
    145. g.CompositingQuality = CompositingQuality.HighQuality
    146. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    147. g.InterpolationMode = InterpolationMode.HighQualityBilinear
    148. 'Dim rect_Streifen As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(index_fuer_yPosition), 5, 10) 'zentral ← →
    149. ''mathematische Funktion g(x) = 2.5625 * x + 205 weil bei -80dBm die 50 sein soll und bei 0dBm die 205 (+50).
    150. ''Selbst bei schwächstem Signal erhalte ich kein Schwarz
    151. 'Dim Helligkeit As Byte = CByte(Math.Round(2.5625 * dBm(i) + 205.0, 0))
    152. ' 'Form1.TextBox_Hell.Text = Helligkeit.ToString() & ", " & i.ToString() 'Kontrolle
    153. ' 'Form1.TextBox_Hell.Update()
    154. ' Dim R As Integer = CInt(Math.Round(Helligkeit * 1.243, 0))
    155. 'If R > 255 Then R = 255
    156. 'Dim Gr As Integer = CInt(Math.Round(Helligkeit * 0.4, 0))
    157. 'If Gr > 255 Then Gr = 255
    158. 'Dim B As Integer = 50 + Helligkeit
    159. 'If B > 255 Then B = 255
    160. '' 255 85 255
    161. 'Dim neue_Farbe As Color = Color.FromArgb(R, Gr, B)
    162. 'Using MyBrush = New SolidBrush(neue_Farbe)
    163. 'g.FillRectangle(MyBrush, rect_Streifen)
    164. 'End Using
    165. 'Je größer A, desto tiefer in die Vergangenheit. Weiter oben in PictureBox!
    166. 'Je öfter Invalidate() aufgerufen wird, desto weiter kommt die Schleife.
    167. For A As Integer = 0 To (yPosition.Count - 1) Step 1
    168. If A >= 0 AndAlso (i - A) >= 0 AndAlso Not dBm.Count = 0 Then
    169. Dim rect_StreifenA As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(A), 5, 10) 'zentral ← →
    170. Dim HelligkeitA As Byte
    171. If (2.5625 * dBm(i - A) + 205.0) < 0.0 Then
    172. HelligkeitA = 0
    173. Else
    174. HelligkeitA = CByte(Math.Round(2.5625 * dBm(i - A) + 205.0, 0))
    175. End If
    176. Dim Red As Integer = CInt(Math.Round(HelligkeitA * 1.243, 0))
    177. If Red > 255 Then Red = 255
    178. Dim Gre As Integer = CInt(Math.Round(HelligkeitA * 0.4, 0))
    179. If Gre > 255 Then Gre = 255
    180. Dim Bl As Integer = 50 + HelligkeitA
    181. If Bl > 255 Then Bl = 255
    182. Dim neue_FarbeA As Color = Color.FromArgb(Red, Gre, Bl)
    183. Using MyBrush = New SolidBrush(neue_FarbeA)
    184. g.FillRectangle(MyBrush, rect_StreifenA)
    185. End Using
    186. End If
    187. Next
    188. End Sub
    189. End Class

    Bilder
    • Screenshot 2020-11-23 161708.png

      19,86 kB, 1.919×655, 49 mal angesehen

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

    Bartosz schrieb:

    Ich würde mich freuen, wenn ihr eure Meinung dazu sagt. Mich stört es noch ein wenig, dass ich mehrere Klassen global "auf Halde" haben muss. Was mache ich denn für das dritte Signal

    Im FormLoad instanziieren und Add'en, und meineKlassen vernünftig benamen.
    "meineKlassen" ist so aussagekräftig wie Leberwurst oder Füllfederhalter. :P
    Im FormLoad instanziieren und Add'en
    Ich weiß zur Laufzeit nicht, also nach 1h oder 5h, ob etwas neues dazukommt. Das ist das Problem.
    Welche Benennung schlägst du vor?
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Bartosz schrieb:

    Ich weiß zur Laufzeit nicht, also nach 1h oder 5h, ob etwas neues dazukommt. Das ist das Problem.

    Das verstehe ich nun nicht.

    Bartosz schrieb:

    Welche Benennung schlägst du vor?

    "SinnvolleBennung" wäre doch nett, nicht sehr hilfreich beim Lesen, aber nett. :D
    Im Ernst, keine Ahnung, sinnvoll und hilfreich eben.
    Das ist eine der schwierigsten Disziplinen beim Coden. ;)
    Das verstehe ich nun nicht.
    Ok, ich muss mich besser ausdrücken. Es ist so, dass man nachts mehr Sender empfängt als tagsüber, aufgrund von Überreichweite. Zitat von Wikipedia:
    Die Raumwelle spielt beim Fernempfang eine besondere Rolle. Diese wird in die Erdatmosphäre ausgestrahlt und wird an der Ionosphäre zurück zur Erdoberfläche reflektiert. In den Tagesstunden dämpft die Ionosphäre die
    Mittelwellensignale, weil sie sehr viele ungebundene Elektronen enthält. In den Nachtstunden, wenn die Dämpfung durch die D-Region schwächer wird, steigt die Reichweite bis über tausend Kilometer. Daher kann nachts eine größere Anzahl an Mittelwellensendern empfangen werden als tagsüber. So können in Europa während der Nachtstunden sogar Mittelwellensender vom amerikanischen Kontinent und aus Fernost empfangen werden.


    Das heißt, es kann ja vorkommen, dass der Empfänger (ich)tagsüber nichts / oder nur sehr wenig bemerkt; nachts ist plötzlich ein nennenswertes Signal da, wenn das Programm aber schon ewig läuft... Daher will ich zu beliebigen Zeiten ein Signal hinzufügen können. Später, wenn ich Elektronik gebastelt habe, muss der Detektor dem Programm klarmachen, "Du, ich hab hier 'was Neues!". Andersherum, wenn es Tag wird, muss eine Frequenz herausgenommen werden.

    Edit: "nennenswertes" hinzugefügt
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

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

    @Bartosz
    Hört sich nach einem Konzept Problem an.
    Bau dir erstmal die Elektronik zusammen und überleg dir wie du das am sinnvollsten separierst.
    Da habe ich nun auch keine Lösung parat da ich keinen blassen Schimmer habe was da so rein kommen kann und was du mit den Daten genau vor hast.
    Radio hörten wohl eher nicht.
    Radio hörten wohl eher nicht.
    Doch :D

    Bau dir erstmal die Elektronik zusammen und überleg dir wie du das am sinnvollsten separierst.
    Mache ich!
    Kennst du noch alte Radios, die Langwelle, Mittelwelle und Kurzwelle empfangen können? Wenn du die entsprechende Elektronik hast und du sie entmodulierst, dann kannste das hören. jetzt habe ich mir gedacht, dass man die Lautstärke (zu Signalstärke proportional) visualisiert; also die Signale irgendwie in den Computer kriegt.

    Hört sich nach einem Konzept Problem an.
    Ja :/

    VLC bietet auch Visualisierungen an. Naja, nur dass schon alles auf dem PC läuft aber egal
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Ich hab's jetzt anders gemacht. Das Programm stellt einfach nur eine Tonspur dar.

    Public SB2 As Signalvisualisierung = Nothing
    Public SB3 As Signalvisualisierung = Nothing
    Public SB4 As Signalvisualisierung = Nothing
    Public SB5 As Signalvisualisierung = Nothing
    Public SB6 As Signalvisualisierung = Nothing
    braucht man gar nicht :rolleyes: Dann ist doch alles klar. Ich erstelle so viele Instanzen der Visualisierungsklasse (5er-Streifen), wie die Spur breit ist. Das frage ich ab. So feddich. Ohne Bedenken haben zu müssen, dass ich nicht genug Klassen habe. Ich dachte, die müssen verschiedene sein.

    Der nächste Schritt ist dann – statt die Excel-Werte herzunehmen – richtiger Musik zuzuhören und diese zu visualisieren. siehe Post 12
    Wie kann man die Soundkarte abfragen?
    siehe Post 12

    VB.NET-Quellcode

    1. [/font]'Option Strict On wurde in den Projekteigenschaften aktiviert.
    2. 'Assembly-Sprache ist Deutsch (Deutschland).
    3. Imports System.Drawing.Drawing2D
    4. Public Class Form1
    5. Private Excel1 As New Microsoft.Office.Interop.Excel.Application
    6. Private meineKlassen As New List(Of Signalvisualisierung)
    7. Private bereits_verwendete_Klassen As Integer = 0
    8. Public SB1 As Signalvisualisierung = Nothing
    9. Private Werte_gelesen As Boolean = False
    10. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    11. PictureBox1.BackColor = Color.FromArgb(0, 0, 50) 'Dunkelblau. ES IST WICHTIG, dass dieser Wert jetzt eine Vereinbarung ist, da später ein Wert draufaddiert wird!
    12. Me.BackColor = Color.FromArgb(157, 155, 171)
    13. Button_Timer_Start.BackColor = Color.FromArgb(176, 176, 181)
    14. Button_Timer_Stopp.BackColor = Color.FromArgb(176, 176, 181)
    15. End Sub
    16. Private Sub Button_Timer_Start_Click(sender As Object, e As EventArgs) Handles Button_Timer_Start.Click
    17. Timer1.Start()
    18. Button_Timer_Start.BackColor = Color.FromArgb(0, 200, 0)
    19. End Sub
    20. Private Sub Button_Timer_Stopp_Click(sender As Object, e As EventArgs) Handles Button_Timer_Stopp.Click
    21. Timer1.Stop()
    22. Button_Timer_Start.BackColor = Color.FromArgb(176, 176, 181)
    23. End Sub
    24. Private Async Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    25. For N As Integer = 0 To meineKlassen.Count - 1 Step 1
    26. meineKlassen(N).i += 1
    27. If meineKlassen(N).i > (meineKlassen(N).dBm.Count - 1) Then meineKlassen(N).i = 0
    28. meineKlassen(N).index_fuer_yPosition += 1
    29. If meineKlassen(N).index_fuer_yPosition > (meineKlassen(N).yPosition.Count - 1) Then meineKlassen(N).index_fuer_yPosition = 0
    30. Next
    31. Await Task.Run(Sub() PictureBox1.Invalidate())
    32. End Sub
    33. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    34. If Werte_gelesen Then
    35. For O As Integer = 0 To meineKlassen.Count - 1 Step 1
    36. If meineKlassen(O).dBm.Count > 0 Then
    37. meineKlassen(O).Paint(e.Graphics)
    38. End If
    39. Next
    40. End If
    41. End Sub
    42. Private Sub Button_load_excel_2_Click(sender As Object, e As EventArgs) Handles Button_load_excel_2.Click
    43. Dim rand As New System.Random()
    44. Dim akt_Wert As Double = -100.0
    45. Dim txt As String
    46. If System.IO.File.Exists("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte Signal2.xlsx") Then
    47. Excel1.Workbooks.Open("C:\Users\...\source\repos\VB.NET\Signalstärke visualisieren\Messwerte Signal2.xlsx")
    48. Dim Breite_in_Hertz As Integer = 80
    49. Dim wie_viele_Streifen_brauche_ich As Integer = Breite_in_Hertz \ 5
    50. For R As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    51. meineKlassen.Add(SB1) 'so viele Klassen (5er-Streifen) anlegen, wie die Spur breit ist.
    52. Next
    53. Dim wie_weit_zur_Seite As Integer = CInt(Math.Round(Breite_in_Hertz / 2.0 * (-1.0), 0)) 'z.B. 80/2*(-1)=-40
    54. For P As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    55. wie_weit_zur_Seite += 5 'jede neue Klasse geht um 5 Hz weiter nach rechts rüber.
    56. For Q As Integer = 0 To meineKlassen.Count - 1 Step 1
    57. If meineKlassen(Q) Is Nothing Then
    58. meineKlassen(Q) = New Signalvisualisierung(900 + wie_weit_zur_Seite)
    59. bereits_verwendete_Klassen += 1
    60. Exit For 'Wichtig!
    61. End If
    62. Next
    63. Next
    64. 'Excel-Werte einlesen
    65. For i As Integer = 2 To 7002 Step 1
    66. txt = Excel1.Range("B" & i.ToString).Value().ToString
    67. Dim Parse_Result = Double.TryParse(txt, akt_Wert)
    68. If Parse_Result Then
    69. akt_Wert -= CDbl(rand.Next(0, 2))
    70. For S As Integer = 0 To meineKlassen.Count - 1 Step 1
    71. If S = 0 OrElse S = meineKlassen.Count - 1 Then 'nach links und rechts farblich abschwächen
    72. meineKlassen(S).dBm.Add(akt_Wert - 14.0)
    73. ElseIf S = 1 OrElse S = meineKlassen.Count - 2 Then
    74. meineKlassen(S).dBm.Add(akt_Wert - 12.0)
    75. ElseIf S = 2 OrElse S = meineKlassen.Count - 3 Then
    76. meineKlassen(S).dBm.Add(akt_Wert - 10.0)
    77. ElseIf S = 3 OrElse S = meineKlassen.Count - 4 Then
    78. meineKlassen(S).dBm.Add(akt_Wert - 8.0)
    79. ElseIf S = 4 OrElse S = meineKlassen.Count - 5 Then
    80. meineKlassen(S).dBm.Add(akt_Wert - 6.0)
    81. ElseIf S = 5 OrElse S = meineKlassen.Count - 6 Then
    82. meineKlassen(S).dBm.Add(akt_Wert - 4.0)
    83. ElseIf S = 6 OrElse S = meineKlassen.Count - 7 Then
    84. meineKlassen(S).dBm.Add(akt_Wert - 2.0)
    85. Else
    86. meineKlassen(S).dBm.Add(akt_Wert)
    87. End If
    88. Next
    89. Else
    90. Debug.WriteLine("Fehler bei der Umwandlung")
    91. End If
    92. Next
    93. Excel1.Application.Quit()
    94. Button_load_excel_2.BackColor = Color.FromArgb(0, 200, 0)
    95. Werte_gelesen = True
    96. End If
    97. End Sub
    98. End Class
    99. Public Class Signalvisualisierung
    100. Public dBm As New List(Of Double)
    101. Public i As Integer = 0
    102. Public Frequenz_in_Hz As Integer
    103. Public yPosition As New List(Of Integer)
    104. Public index_fuer_yPosition As Integer = 0
    105. Public Sub New(ByVal Fr As Integer)
    106. Me.Frequenz_in_Hz = Fr
    107. For J As Integer = 0 To 1000 Step 10
    108. yPosition.Add(J)
    109. Next
    110. End Sub
    111. Public Sub Paint(ByVal g As Graphics)
    112. g.SmoothingMode = SmoothingMode.AntiAlias
    113. g.CompositingQuality = CompositingQuality.HighQuality
    114. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    115. g.InterpolationMode = InterpolationMode.HighQualityBilinear
    116. 'Dim rect_Streifen As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(index_fuer_yPosition), 5, 10) 'zentral ← →
    117. ''mathematische Funktion g(x) = 2.5625 * x + 205 weil bei -80dBm die 50 sein soll und bei 0dBm die 205 (+50).
    118. ''Selbst bei schwächstem Signal erhalte ich kein Schwarz ;)
    119. 'Dim Helligkeit As Byte = CByte(Math.Round(2.5625 * dBm(i) + 205.0, 0))
    120. ' 'Form1.TextBox_Hell.Text = Helligkeit.ToString() & ", " & i.ToString() 'Kontrolle
    121. ' 'Form1.TextBox_Hell.Update()
    122. ' Dim R As Integer = CInt(Math.Round(Helligkeit * 1.243, 0))
    123. 'If R > 255 Then R = 255
    124. 'Dim Gr As Integer = CInt(Math.Round(Helligkeit * 0.4, 0))
    125. 'If Gr > 255 Then Gr = 255
    126. 'Dim B As Integer = 50 + Helligkeit
    127. 'If B > 255 Then B = 255
    128. '' 255 85 255
    129. 'Dim neue_Farbe As Color = Color.FromArgb(R, Gr, B)
    130. 'Using MyBrush = New SolidBrush(neue_Farbe)
    131. 'g.FillRectangle(MyBrush, rect_Streifen)
    132. 'End Using
    133. 'Je größer A, desto tiefer in die Vergangenheit. Oben sind immer die ältesten Werte, wenn die anderen schon unten sind.
    134. 'Je öfter Invalidate() aufgerufen wird, desto weiter kommt die Schleife (und desto größer wird der Wasserfall).
    135. For A As Integer = 0 To (yPosition.Count - 1) Step 1
    136. If A >= 0 AndAlso (i - A) >= 0 AndAlso Not dBm.Count = 0 Then
    137. Dim rect_StreifenA As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(A), 5, 10) 'zentral ← →
    138. Dim HelligkeitA As Byte
    139. If (2.5625 * dBm(i - A) + 205.0) < 0.0 Then
    140. HelligkeitA = 0
    141. Else
    142. HelligkeitA = CByte(Math.Round(2.5625 * dBm(i - A) + 205.0, 0))
    143. End If
    144. Dim Red As Integer = CInt(Math.Round(HelligkeitA * 1.243, 0))
    145. If Red > 255 Then Red = 255
    146. Dim Gre As Integer = CInt(Math.Round(HelligkeitA * 0.4, 0))
    147. If Gre > 255 Then Gre = 255
    148. Dim Bl As Integer = 50 + HelligkeitA
    149. If Bl > 255 Then Bl = 255
    150. Dim neue_FarbeA As Color = Color.FromArgb(Red, Gre, Bl)
    151. Using MyBrush = New SolidBrush(neue_FarbeA)
    152. g.FillRectangle(MyBrush, rect_StreifenA)
    153. End Using
    154. End If
    155. Next
    156. End Sub
    157. End Class
    158. [font='arial,helvetica,sans-serif']


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

    Ok, habe es geschafft. Ich habe aus dem Programm erstmal „nur“ ein Volume-Meter gemacht. Jede Millisekunde wird der Pegel der Soundkarte abgefragt und das wird in dem Wasserfall dargestellt.
    Eigentlich wollte ich ja verschiedene Farben haben, aber da ich mich vorerst nur auf ein Signal (das von der Soundkarte) fokussiere, habe ich es sein gelassen. Somit gibt es nur einen Streifen und eine verwendete Instanz der Klasse Signalvisualisierung. Ich habe den Code aber dringelassen, um mir die Möglichkeit offen zu halten, später wieder mehr zu benutzen.

    Zur Info:
    • Meine PictureBox ist 500 Pixel hoch und mit einer jeweiligen Rechteckhöhe von 3 Pixeln ergeben sich 167 Daten, die im Wasserfall zu sehen sind. (Btw ich hatte vorhin einen Thread aufgemacht, worin ich gefragt habe, wie ich es schaffe, nur die aktuellsten Werte in der List zu haben, aber das ging dann ^^ )
    • Es wird nur der Streifen invalidatet statt die komplette PictureBox
    Ich setze diesen Thread erstmal auf erledigt. Wenn ich den Empfänger gebautund die Daten in den PC bekomme, muss halt der Mikrophon-Eingang abgefragt werden. So weit erstmal. Dann mache ich hier wieder auf.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.
    Kann ich deinem Post iwie nicht entnehmen.
    Polemik mag ich nicht! Zumal ich jemand bin, der immer alles reinstellt :D Ich wollte den Code erst aufräumen, beor ich ihn reinstelle, jedoch kam mir gestern etwas dazwischen.
    wie kommst du nun an die Soundkarte ran
    Man geht in den NuGet-Paket-Manager und lädt sich NAudio herunter.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Option Strict On wurde in den Projekteigenschaften aktiviert.
    2. 'Das Programm arbeitet ohne VB6.
    3. 'Assembly-Sprache ist Deutsch (Deutschland).
    4. Imports System.Drawing.Drawing2D
    5. Imports NAudio.CoreAudioApi
    6. Public Class Form1
    7. #Disable Warning IDE0044 ' Modifizierer "readonly" hinzufügen
    8. Private MMDE As NAudio.CoreAudioApi.MMDeviceEnumerator = New NAudio.CoreAudioApi.MMDeviceEnumerator()
    9. Private DevCol As NAudio.CoreAudioApi.MMDeviceCollection = MMDE.EnumerateAudioEndPoints(NAudio.CoreAudioApi.DataFlow.All, NAudio.CoreAudioApi.DeviceState.Active)
    10. Private meineKlassen As New List(Of Signalvisualisierung)
    11. #Enable Warning IDE0044 ' Modifizierer "readonly" hinzufügen
    12. 'Private bereits_verwendete_Klassen As Integer = 0
    13. Public SB1 As Signalvisualisierung = Nothing
    14. Private fertig As Boolean = False
    15. Dim rc As System.Drawing.Rectangle = Nothing
    16. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    17. PictureBox1.BackColor = Color.FromArgb(0, 0, 50) 'Dunkelblau. ES IST WICHTIG, dass dieser Wert jetzt eine Vereinbarung ist, da später ein Wert draufaddiert wird!
    18. Me.BackColor = Color.FromArgb(157, 155, 171)
    19. Button_Timer_Start.BackColor = Color.FromArgb(176, 176, 181)
    20. Button_Timer_Stopp.BackColor = Color.FromArgb(176, 176, 181)
    21. End Sub
    22. Private Sub Button_Timer_Start_Click(sender As Object, e As EventArgs) Handles Button_Timer_Start.Click
    23. Timer_zeichnen.Start()
    24. Button_Timer_Start.BackColor = Color.FromArgb(0, 200, 0)
    25. End Sub
    26. Private Sub Button_Timer_Stopp_Click(sender As Object, e As EventArgs) Handles Button_Timer_Stopp.Click
    27. Timer_zeichnen.Stop()
    28. Button_Timer_Start.BackColor = Color.FromArgb(176, 176, 181)
    29. End Sub
    30. Private Async Sub Timer_zeichnen_Tick(sender As Object, e As EventArgs) Handles Timer_zeichnen.Tick
    31. 'DevCol(1) ist meine Soundblaster Z. Ihr müsst schauen, wie's bei euch ist. :-)
    32. Dim Pegel As Single = DevCol(1).AudioMeterInformation.MasterPeakValue * 100.0F
    33. For S As Integer = 0 To meineKlassen.Count - 1 Step 1
    34. meineKlassen(S).dBm.Add(Pegel)
    35. If meineKlassen(S).dBm.Count > 167 Then 'nur die ... aktuellsten Werte in der Liste → also den letzten Wert löschen
    36. meineKlassen(S).dBm.Remove(167)
    37. End If
    38. Next
    39. For N As Integer = 0 To meineKlassen.Count - 1 Step 1
    40. meineKlassen(N).i += 1
    41. If meineKlassen(N).i > (meineKlassen(N).dBm.Count - 1) Then meineKlassen(N).i = 0
    42. meineKlassen(N).index_fuer_yPosition += 1
    43. If meineKlassen(N).index_fuer_yPosition > (meineKlassen(N).yPosition.Count - 1) Then meineKlassen(N).index_fuer_yPosition = 0
    44. Next
    45. Await Task.Run(Sub() PictureBox1.Invalidate(rc)) 'mittels rc nur den Streifen aktualisieren
    46. End Sub
    47. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    48. If fertig Then
    49. For O As Integer = 0 To meineKlassen.Count - 1 Step 1
    50. If meineKlassen(O).dBm.Count > 0 Then
    51. meineKlassen(O).Paint(e.Graphics)
    52. End If
    53. Next
    54. End If
    55. End Sub
    56. Private Sub Button_Streifen_festlegen_Click(sender As Object, e As EventArgs) Handles Button_Streifen_festlegen.Click
    57. Dim Breite_in_Hertz As Integer = 40
    58. Dim wie_viele_Streifen_brauche_ich As Integer = Breite_in_Hertz \ 40 '5 Es waren mal \5, weil ich verschiedene Farben haben wollte, was mehr Streifen bedeutet.
    59. 'Ich will diesen Berechnungs-Code aber drinlassen, um mir die Möglichkeit offen zu halten, es später nochmal zu benutzen.
    60. For R As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    61. meineKlassen.Add(SB1) 'so viele Klassen (5er-Streifen) anlegen, wie die Spur breit ist.
    62. Next
    63. rc = New Rectangle(CInt(900 - Breite_in_Hertz / 2.0), 0, Breite_in_Hertz, 500)
    64. Dim wie_weit_zur_Seite As Integer = CInt(Math.Round(Breite_in_Hertz / 2.0 * (-1.0), 0)) 'z.B. 80÷2*(-1)=-40
    65. For P As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    66. wie_weit_zur_Seite += 5 'jede neue Klasse geht um 5 Hz weiter nach rechts rüber.
    67. For Q As Integer = 0 To meineKlassen.Count - 1 Step 1
    68. If meineKlassen(Q) Is Nothing Then
    69. meineKlassen(Q) = New Signalvisualisierung(900 + wie_weit_zur_Seite)
    70. 'bereits_verwendete_Klassen += 1
    71. Exit For 'Wichtig!
    72. End If
    73. Next
    74. Next
    75. Button_Streifen_festlegen.BackColor = Color.FromArgb(0, 200, 0)
    76. fertig = True
    77. End Sub
    78. End Class
    79. Public Class Signalvisualisierung
    80. Private ReadOnly Rasterung As Integer = 3
    81. Public dBm As New List(Of Double)
    82. Public i As Integer = 0
    83. Private ReadOnly Frequenz_in_Hz As Integer
    84. Public yPosition As New List(Of Integer)
    85. Public index_fuer_yPosition As Integer = 0
    86. Public Sub New(ByVal Fr As Integer)
    87. Me.Frequenz_in_Hz = Fr
    88. For J As Integer = 0 To 500 Step Rasterung 'y-Positionen in der PictureBox.
    89. 'Je feiner, desto mehr Rechtecke sind zu sehen → Programm hakt ab 3 mit Intel® Core™ i5-9600K
    90. yPosition.Add(J)
    91. Next
    92. End Sub
    93. Public Sub Paint(ByVal g As Graphics)
    94. g.SmoothingMode = SmoothingMode.AntiAlias
    95. g.CompositingQuality = CompositingQuality.HighQuality
    96. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    97. g.InterpolationMode = InterpolationMode.HighQualityBilinear
    98. 'Je größer A, desto tiefer in die Vergangenheit. Oben sind immer die ältesten Werte, wenn die anderen schon unten sind.
    99. 'Je öfter Invalidate() aufgerufen wird, desto weiter kommt die Schleife (und desto größer wird der Wasserfall).
    100. For A As Integer = 0 To (yPosition.Count - 1) Step 1
    101. If A >= 0 AndAlso (i - A) >= 0 AndAlso Not dBm.Count = 0 Then
    102. Dim rect_StreifenA As New System.Drawing.Rectangle(Frequenz_in_Hz, yPosition(A), 40, Rasterung) 'zentral ← →
    103. Dim HelligkeitA As Byte
    104. If (2.05 * dBm(i - A)) < 0.0 Then
    105. HelligkeitA = 0
    106. Else
    107. HelligkeitA = CByte(Math.Round(2.05 * dBm(i - A), 0))
    108. End If
    109. Dim Red As Integer = CInt(Math.Round(HelligkeitA * 1.243, 0))
    110. If Red > 255 Then Red = 255
    111. Dim Gre As Integer = CInt(Math.Round(HelligkeitA * 0.4, 0))
    112. If Gre > 255 Then Gre = 255
    113. Dim Bl As Integer = 50 + HelligkeitA
    114. If Bl > 255 Then Bl = 255
    115. Dim neue_FarbeA As Color = Color.FromArgb(Red, Gre, Bl)
    116. Using MyBrush = New SolidBrush(neue_FarbeA)
    117. g.FillRectangle(MyBrush, rect_StreifenA)
    118. End Using
    119. End If
    120. Next
    121. End Sub
    122. End Class

    Bartosz schrieb:

    Kann ich deinem Post iwie nicht entnehmen.
    Polemik mag ich nicht!

    Sorry wenn das falsch rüber gekommen ist.
    Das war ne ernst gemeinte Frage, vielleicht etwas flapsig formuliert.
    Nix für ungut. :saint:

    Update: 1) Helligkeitsregler, 2) List(of Single) wird mal geleert (ich dachte erst, das passiert bereits, aber dem war nicht so) 3) Form aufgeräumt

    Hier ein kleines Update:


    VB.NET-Quellcode

    1. 'Option Strict On wurde in den Projekteigenschaften aktiviert.
    2. 'Das Programm arbeitet ohne VB6.
    3. 'Assembly-Sprache ist Deutsch (Deutschland).
    4. Imports System.Drawing.Drawing2D
    5. Public Class Form1
    6. #Disable Warning IDE0044 ' Modifizierer "readonly" hinzufügen
    7. Private MMDE As NAudio.CoreAudioApi.MMDeviceEnumerator = New NAudio.CoreAudioApi.MMDeviceEnumerator()
    8. Private DevCol As NAudio.CoreAudioApi.MMDeviceCollection = MMDE.EnumerateAudioEndPoints(NAudio.CoreAudioApi.DataFlow.All, NAudio.CoreAudioApi.DeviceState.Active)
    9. Private meineKlassen As New List(Of Signalvisualisierung)
    10. #Enable Warning IDE0044 ' Modifizierer "readonly" hinzufügen
    11. 'Private bereits_verwendete_Klassen As Integer = 0
    12. Public SB1 As Signalvisualisierung = Nothing
    13. Private fertig As Boolean = False
    14. Private rc As System.Drawing.Rectangle = Nothing
    15. Public Extra_Helligkeit As Double = 1.0
    16. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    17. PictureBox1.BackColor = Color.FromArgb(0, 0, 50) 'Dunkelblau. ES IST WICHTIG, dass dieser Wert jetzt eine Vereinbarung ist, da später ein Wert draufaddiert wird!
    18. Me.BackColor = Color.FromArgb(157, 155, 171)
    19. Button_Timer_Start.BackColor = Color.FromArgb(176, 176, 181)
    20. Button_Timer_Stopp.BackColor = Color.FromArgb(176, 176, 181)
    21. Button_Streifen_festlegen.BackColor = Color.FromArgb(176, 176, 181)
    22. TrackBar1.BackColor = Color.FromArgb(176, 176, 181)
    23. End Sub
    24. Private Sub Button_Timer_Start_Click(sender As Object, e As EventArgs) Handles Button_Timer_Start.Click
    25. Timer_zeichnen.Start()
    26. Button_Timer_Start.BackColor = Color.FromArgb(0, 200, 0)
    27. End Sub
    28. Private Sub Button_Timer_Stopp_Click(sender As Object, e As EventArgs) Handles Button_Timer_Stopp.Click
    29. Timer_zeichnen.Stop()
    30. Button_Timer_Start.BackColor = Color.FromArgb(176, 176, 181)
    31. End Sub
    32. Private Async Sub Timer_zeichnen_Tick(sender As Object, e As EventArgs) Handles Timer_zeichnen.Tick
    33. 'DevCol(1) ist meine Soundblaster Z. Ihr müsst schauen, wie's bei euch ist. :-)
    34. 'Dies ist der Pegel, der vor der Soundkarte ankommt. Also z.B. die Lautstärkeregelung bei Youtube.
    35. Dim Pegel As Single = DevCol(1).AudioMeterInformation.MasterPeakValue * 100.0F
    36. For S As Integer = 0 To meineKlassen.Count - 1 Step 1
    37. meineKlassen(S).dBm.Add(Pegel)
    38. Next
    39. For N As Integer = 0 To meineKlassen.Count - 1 Step 1
    40. meineKlassen(N).index_dBm_Liste += 1
    41. If meineKlassen(N).index_dBm_Liste > (meineKlassen(N).dBm.Count - 1) Then
    42. meineKlassen(N).index_dBm_Liste = 0
    43. End If
    44. Next
    45. Await Task.Run(Sub() PictureBox1.Invalidate(rc)) 'mittels rc nur den Streifen aktualisieren
    46. End Sub
    47. Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
    48. If fertig Then
    49. For O As Integer = 0 To meineKlassen.Count - 1 Step 1
    50. If meineKlassen(O).dBm.Count > 0 Then
    51. meineKlassen(O).Paint(e.Graphics)
    52. End If
    53. Next
    54. End If
    55. End Sub
    56. Private Sub Button_Streifen_festlegen_Click(sender As Object, e As EventArgs) Handles Button_Streifen_festlegen.Click
    57. Dim Breite_in_Hertz As Integer = 40
    58. Dim wie_viele_Streifen_brauche_ich As Integer = Breite_in_Hertz \ 40 '5 Es waren mal \5, weil ich verschiedene Farben haben wollte, was mehr Streifen bedeutet.
    59. 'Ich will diesen Berechnungs-Code aber drinlassen, um mir die Möglichkeit offen zu halten, es später nochmal zu benutzen.
    60. For R As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    61. meineKlassen.Add(SB1) 'so viele Klassen (5er-Streifen) anlegen, wie die Spur breit ist.
    62. Next
    63. rc = New Rectangle(CInt(900 - Breite_in_Hertz / 2.0), 0, Breite_in_Hertz, 500)
    64. Dim wie_weit_zur_Seite As Integer = CInt(Math.Round(Breite_in_Hertz / 2.0 * (-1.0), 0)) 'z.B. 80÷2*(-1)=-40
    65. For P As Integer = 0 To wie_viele_Streifen_brauche_ich - 1 Step 1
    66. For Q As Integer = 0 To meineKlassen.Count - 1 Step 1
    67. If meineKlassen(Q) Is Nothing Then
    68. meineKlassen(Q) = New Signalvisualisierung(900 + wie_weit_zur_Seite)
    69. 'bereits_verwendete_Klassen += 1
    70. Exit For 'Wichtig!
    71. End If
    72. Next
    73. wie_weit_zur_Seite += 5 'jede neue Klasse geht um 5 Hz weiter nach rechts rüber.
    74. Next
    75. Button_Streifen_festlegen.BackColor = Color.FromArgb(0, 200, 0)
    76. fertig = True
    77. End Sub
    78. Private Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar1.ValueChanged
    79. Extra_Helligkeit = 0.05 * TrackBar1.Value + 1.0
    80. End Sub
    81. End Class
    82. Public Class Signalvisualisierung
    83. Private ReadOnly Rasterung As Integer = 3
    84. Public dBm As New List(Of Single)
    85. Public index_dBm_Liste As Integer = 0
    86. Private ReadOnly Frequenz_in_Hz As Integer
    87. Public yPositionen_Liste As New List(Of Integer)
    88. Public Sub New(ByVal Fr As Integer)
    89. Me.Frequenz_in_Hz = Fr
    90. For J As Integer = 0 To 500 Step Rasterung 'y-Positionen in der PictureBox.
    91. 'Je feiner, desto mehr Rechtecke sind zu sehen
    92. yPositionen_Liste.Add(J)
    93. Next
    94. End Sub
    95. Public Sub Paint(ByVal g As Graphics)
    96. g.SmoothingMode = SmoothingMode.HighQuality
    97. g.CompositingQuality = CompositingQuality.HighQuality
    98. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    99. g.InterpolationMode = InterpolationMode.HighQualityBilinear
    100. 'Je größer A, desto tiefer in die Vergangenheit. Oben sind immer die ältesten Werte, wenn die anderen schon unten sind.
    101. 'Je öfter Invalidate() aufgerufen wird, desto weiter kommt die Schleife (und desto größer wird der Wasserfall).
    102. For index_Pos_Liste As Integer = 0 To yPositionen_Liste.Count - 1 Step 1 '0 - bis inkl 166
    103. 'Die For-Schleife erhöht stetig den Index der Positionsliste. Das geht aber nur,
    104. 'wenn es bereits genug Werte in der dBm-Liste gibt. Idealerweise funktioniert es über den kompletten
    105. 'Bildschirm ab 167 Werten (logisch!).
    106. If (index_dBm_Liste - index_Pos_Liste) >= 0 AndAlso Not dBm.Count = 0 Then
    107. Dim rect_StreifenA As New System.Drawing.Rectangle(Frequenz_in_Hz, yPositionen_Liste(index_Pos_Liste), 40, Rasterung) 'zentral ← →
    108. Dim HelligkeitA As Byte
    109. If (2.05 * dBm(index_dBm_Liste - index_Pos_Liste)) < 0.0 Then
    110. HelligkeitA = 0
    111. Else
    112. HelligkeitA = CByte(Math.Round(2.05 * dBm(index_dBm_Liste - index_Pos_Liste), 0)) 'Helligkeit_allgemein ist max 205
    113. End If
    114. Dim Red As Integer = CInt(Math.Round(CDbl(HelligkeitA) * 51.0 / 41.0, 0) * Form1.Extra_Helligkeit) ' = max 255
    115. If Red > 255 Then Red = 255
    116. Dim Green As Integer = 0
    117. If Green > 255 Then Green = 255
    118. Dim Bl As Integer = 50 + CInt(HelligkeitA * Form1.Extra_Helligkeit) '= max 205 (mit den + 50 = 255)
    119. If Bl > 255 Then Bl = 255
    120. Dim neue_FarbeA As Color = Color.FromArgb(Red, Green, Bl)
    121. Using MyBrush = New SolidBrush(neue_FarbeA)
    122. g.FillRectangle(MyBrush, rect_StreifenA)
    123. End Using
    124. Else
    125. 'Debug.WriteLine("A = " & $"{index_Pos_Liste}" & " " & "(i - A) = " & (index_dBm_Liste - index_Pos_Liste).ToString & " " & "dBm.Count = " & $"{dBm.Count}")
    126. Exit For
    127. End If
    128. Next
    129. If dBm.Count = 2 * 167 + 1 Then
    130. dBm.RemoveRange(0, 167)
    131. index_dBm_Liste = dBm.Count - 1
    132. End If
    133. End Sub
    134. End Class


    PS: das

    VB.NET-Quellcode

    1. If meineKlassen(S).dBm.Count > 167 Then
    2. meineKlassen(S).dBm.Remove(167)
    3. End If
    im Timer_Tick brachte gar nix. Habe ich geändert.