LED-Matrix (Programmstruktur-Beschleunigen)

  • VB.NET

Es gibt 66 Antworten in diesem Thema. Der letzte Beitrag () ist von kremsy.

    LED-Matrix (Programmstruktur-Beschleunigen)

    Hallo Leute,

    bin noch nicht der Beste VB Programmierer.

    Ich habe einen Programmteil, der mir Daten eines Programmes in eine txt Datei speichern soll.

    Allerdings dauert es immer sehr lange bis fertig gespeichert ist. Das liegt wahrscheinlich an den vielen Schleifen des Programmteils.

    (Die Erste schleife braucht nicht viel Zeit).

    Vielleicht habt ihr ja Tipps wie man das ganze Beschleunigen könnte.

    VB.NET-Quellcode

    1. Private Sub But_Save_C_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Save_C.Click
    2. ' ToolStripStatusLabel1.Text = "Speichervorgang"
    3. Me.Cursor = Cursors.WaitCursor
    4. ' ToolStripProgressBar1.Maximum = FormAnz + 2
    5. 'ToolStripProgressBar1.Value = 0
    6. Dim colorArr(0 To 255) As String
    7. colorArr = savebtncolors(btnArray)
    8. For i = 1 To 256 Step 1
    9. gesArray(FormNumb, i) = colorArr(i)
    10. Next
    11. ' ToolStripProgressBar1.Value = 1
    12. If FileExists(FNAME) Then
    13. My.Computer.FileSystem.DeleteFile(FNAME)
    14. End If
    15. ' ToolStripProgressBar1.Value = 2
    16. For i = 1 To FormAnz 'MAXIMAL 64!!!!
    17. My.Computer.FileSystem.WriteAllText(FNAME, Chr(127), True) ' BILD-Start 0x7F
    18. My.Computer.FileSystem.WriteAllText(FNAME, Chr(i - 1), True) ' BILD-Nummer
    19. For k = 1 To Matrixsize * Matrixsize
    20. Select Case gesArray(i, k)
    21. Case "Red"
    22. code = 1
    23. Case "Green"
    24. code = 2
    25. Case "Blue"
    26. code = 4
    27. Case "White"
    28. code = 7
    29. Case "Black"
    30. code = 0
    31. Case "Yellow"
    32. code = 3
    33. Case "Magenta"
    34. code = 5
    35. Case "Cyan"
    36. code = 6
    37. End Select
    38. My.Computer.FileSystem.WriteAllText(FNAME, Chr(code), True) ' Led Farbe
    39. Next
    40. ' ToolStripProgressBar1.Value = i + 2
    41. If (i = FormAnz) Then
    42. My.Computer.FileSystem.WriteAllText(FNAME, Chr(126), True) ' BILD-Ende 0x7E
    43. Else
    44. My.Computer.FileSystem.WriteAllText(FNAME, Chr(125), True) ' BILD-Ende 0x7D
    45. End If
    46. ' My.Computer.FileSystem.WriteAllText(FNAME, "00000000", True) 'Stop Bild
    47. Next
    48. ' ToolStripStatusLabel1.Text = 2
    49. Me.Cursor = Cursors.Default
    50. MessageBox.Show("Daten erfolgreich in FNAME gesichert", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
    51. End Sub

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

    schreibe den text erst in einen string statt zeilenweise (?) in dei datei.
    Der Schreibvorgang braucht nämlich seine Zeit - und wenn er so oft aufgerufen wird....

    Erst am Schluss den String in einem Rutsch in die Datei schreiben.


    BTW: statt der Sting-vergleiche "Red", "Blue", etc kannst du auch eine enum schreiben - das ist sauberer und bringt vllt ne nanosekunde mehr speed xD

    kremsy schrieb:

    VB.NET-Quellcode

    1. Dim colorArr(0 To 255) As String
    2. colorArr = savebtncolors(btnArray)
    3. For i = 1 To 256 Step 1

    Mach da folfendes draus:

    VB.NET-Quellcode

    1. Dim colorArr(255) As String
    2. colorArr = savebtncolors(btnArray)
    3. For i = 0 To 255
    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!
    Vielen dank für eure schnelle Hilfe.

    VB.NET-Quellcode

    1. Private Sub But_Save_C_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But_Save_C.Click
    2. ' ToolStripStatusLabel1.Text = "Speichervorgang"
    3. Me.Cursor = Cursors.WaitCursor
    4. ' ToolStripProgressBar1.Maximum = FormAnz + 2
    5. 'ToolStripProgressBar1.Value = 0
    6. Dim colorArr(255) As String
    7. colorArr = savebtncolors(btnArray)
    8. For i = 0 To 255
    9. gesArray(FormNumb, i ) = colorArr(i)
    10. Next
    11. ' ToolStripProgressBar1.Value = 1
    12. If FileExists(FNAME) Then
    13. My.Computer.FileSystem.DeleteFile(FNAME)
    14. End If
    15. ' ToolStripProgressBar1.Value = 2
    16. Dim tempstring As String
    17. For i = 1 To FormAnz 'MAXIMAL 64!!!!
    18. tempstring = Chr(127)
    19. ' My.Computer.FileSystem.WriteAllText(FNAME, Chr(127), True) ' BILD-Start 0x7F
    20. tempstring = tempstring & Chr(i - 1)
    21. 'My.Computer.FileSystem.WriteAllText(FNAME, Chr(i - 1), True) ' BILD-Nummer
    22. For k = 1 To Matrixsize * Matrixsize
    23. Select Case gesArray(i, k)
    24. Case "Red"
    25. code = 1
    26. Case "Green"
    27. code = 2
    28. Case "Blue"
    29. code = 4
    30. Case "White"
    31. code = 7
    32. Case "Black"
    33. code = 0
    34. Case "Yellow"
    35. code = 3
    36. Case "Magenta"
    37. code = 5
    38. Case "Cyan"
    39. code = 6
    40. End Select
    41. tempstring = tempstring & Chr(code)
    42. ' My.Computer.FileSystem.WriteAllText(FNAME, Chr(code), True) ' Led Farbe
    43. Next
    44. ' ToolStripProgressBar1.Value = i + 2
    45. If (i = FormAnz) Then
    46. tempstring = tempstring & Chr(126)
    47. ' My.Computer.FileSystem.WriteAllText(FNAME, Chr(126), True) ' BILD-Ende 0x7E
    48. Else
    49. tempstring = tempstring & Chr(125)
    50. ' My.Computer.FileSystem.WriteAllText(FNAME, Chr(125), True) ' BILD-Ende 0x7D
    51. End If
    52. ' My.Computer.FileSystem.WriteAllText(FNAME, "00000000", True) 'Stop Bild
    53. My.Computer.FileSystem.WriteAllText(FNAME, tempstring, True) ' BILD-Ende 0x7D
    54. Next
    55. ' ToolStripStatusLabel1.Text = 2
    56. Me.Cursor = Cursors.Default
    57. MessageBox.Show("Daten erfolgreich in FNAME gesichert", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
    58. End Sub



    Jetzt ist das Ganze gefühlte 5min schneller.


    Ich hätte jetzt noch einen Programmteil der Optimierungsbedürftig ist:

    VB.NET-Quellcode

    1. Private Function loadbtns(ByVal gesArray, ByVal FormNumb)
    2. Akt.Text = FormNumb
    3. Dim col As String
    4. For i As Integer = 1 To Matrixsize * Matrixsize
    5. col = gesArray(FormNumb, i)
    6. ' Neuen Button erzeuge
    7. btnArray(i) = New Button
    8. ' Den erzeugten Button verwenden:
    9. With btnArray(i)
    10. ' Parent festlegen und Controls-Collection erweitern
    11. .Parent = Me
    12. .Parent.Controls.Add(btnArray(i))
    13. ' Verwaltungsinformationen zuweisen
    14. .Name = "Button" & CStr(i)
    15. .TabIndex = i
    16. ' Darstellung: Beschriften und positionieren
    17. ' For iz = 0 To 8 Step 1
    18. ' .Text = "Button(" & CStr(i) & ")"
    19. .Size = New Size(20, 20)
    20. .Visible = True
    21. ' Standartfarbe:
    22. .BackColor = Color.FromName(col)
    23. ' For iz = 0 To 5
    24. ' If i < Matrixsize * iz Then
    25. '.Location = New Point(10 * Matrixsize * iz, 10 + (i - Matrixsize * (iz - 1)) * 2 * .Height)
    26. ' Next iz
    27. Select Case i
    28. Case 0 To Matrixsize
    29. .Location = New Point(10 + Matrixsize * 1 * 2, 10 + (i - Matrixsize * (0)) * .Height)
    30. Case Matrixsize To 2 * Matrixsize
    31. .Location = New Point(10 + Matrixsize * 1.6 * 2, 10 + (i - Matrixsize * (1)) * .Height)
    32. Case Matrixsize To 3 * Matrixsize
    33. .Location = New Point(10 + Matrixsize * 2.2 * 2, 10 + (i - Matrixsize * (2)) * .Height)
    34. Case Matrixsize To 4 * Matrixsize
    35. .Location = New Point(10 + Matrixsize * 2.75 * 2, 10 + (i - Matrixsize * (3)) * .Height)
    36. Case Matrixsize To 5 * Matrixsize
    37. .Location = New Point(10 + Matrixsize * 3.3 * 2, 10 + (i - Matrixsize * (4)) * .Height)
    38. Case Matrixsize To 6 * Matrixsize
    39. .Location = New Point(10 + Matrixsize * 3.9 * 2, 10 + (i - Matrixsize * (5)) * .Height)
    40. Case Matrixsize To 7 * Matrixsize
    41. .Location = New Point(10 + Matrixsize * 4.5 * 2, 10 + (i - Matrixsize * (6)) * .Height)
    42. Case Matrixsize To 8 * Matrixsize
    43. .Location = New Point(10 + Matrixsize * 5.1 * 2, 10 + (i - Matrixsize * (7)) * .Height)
    44. Case Matrixsize To 9 * Matrixsize
    45. .Location = New Point(10 + Matrixsize * 5.7 * 2, 10 + (i - Matrixsize * (8)) * .Height)
    46. Case Matrixsize To 10 * Matrixsize
    47. .Location = New Point(10 + Matrixsize * 6.3 * 2, 10 + (i - Matrixsize * (9)) * .Height)
    48. Case Matrixsize To 11 * Matrixsize
    49. .Location = New Point(10 + Matrixsize * 6.9 * 2, 10 + (i - Matrixsize * (10)) * .Height)
    50. Case Matrixsize To 12 * Matrixsize
    51. .Location = New Point(10 + Matrixsize * 7.5 * 2, 10 + (i - Matrixsize * (11)) * .Height)
    52. Case Matrixsize To 13 * Matrixsize
    53. .Location = New Point(10 + Matrixsize * 8.1 * 2, 10 + (i - Matrixsize * (12)) * .Height)
    54. Case Matrixsize To 14 * Matrixsize
    55. .Location = New Point(10 + Matrixsize * 8.7 * 2, 10 + (i - Matrixsize * (13)) * .Height)
    56. Case Matrixsize To 15 * Matrixsize
    57. .Location = New Point(10 + Matrixsize * 9.28 * 2, 10 + (i - Matrixsize * (14)) * .Height)
    58. Case Matrixsize To 16 * Matrixsize
    59. .Location = New Point(10 + Matrixsize * 9.87 * 2, 10 + (i - Matrixsize * (15)) * .Height)
    60. End Select
    61. ' Auf das Click-Ereignis reagieren können:
    62. AddHandler .Click, AddressOf btnArray_Click
    63. ' AddHandler .MouseHover, AddressOf btnArray_Click
    64. End With
    65. Next i
    66. loadbtns = 1
    67. End Function


    Dieser Teil sieht so aus:

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

    ist mir voll unklar, was der code macht.

    ich empfehle malwieder ein typ.Dataset aufzusetzen, was alle wesentlichen Daten beinhaltet, und was man dann auch auf platte schreiben kann.

    Aber dafür müssteste von vorne anfangen zu konzipieren, insbesondere genau erklären, was das für Daten sind, und was damit gemacht werden soll.
    Also mal zum Projekt.

    Es ist ein Projekt um mehrere 16x16pixel Bilder zu zeichen, die man dann codiert als Asci-Zeichen auf eine SD-Karte speichert, um dieses Hex-File dann per µ-Controller auszulesen. Das ganze funktioniert auch schon, und muss nur etwas geschwindigkeitsoptimiert werden.

    Der 1. Programmteil der Speichvorgang ist jetzt schnell genug.

    Der 2. Programmteil ist nur die Darstellung der einzelnen Pixel auf der Programmoberfläche, und dieses beansprucht schon einiges an Zeit um angezeigt zu werden. Aber denke das wird nicht viel schneller gehn. Hier wär ich über Tipps sehr dankbar.

    Und das entfernen der Buttons dauert auch wieder sehr lang:

    VB.NET-Quellcode

    1. Public Function removebuttons(ByVal btnArray)
    2. For i = 1 To 256
    3. btnArray(i).Parent.Controls.Remove(btnArray(i))
    4. Next
    5. removebuttons = 1
    6. End Function


    Zwischen den Formen lösche ich immer die Buttons und lade sie neu (dies Benötigt 2-3 sekunden was zum vernünftigen Arbeiten fast zulange ist):

    VB.NET-Quellcode

    1. removebuttons(btnArray)
    2. loadbtns(gesArray, FormNumb)

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

    kremsy schrieb:

    VB.NET-Quellcode

    1. [vb]Select Case i
    2. Case 0 To Matrixsize
    3. .Location = New Point(10 + Matrixsize * 1 * 2, 10 + (i - Matrixsize * (0)) * .Height)
    4. Case Matrixsize To 2 * Matrixsize
    5. .Location = New Point(10 + Matrixsize * 1.6 * 2, 10 + (i - Matrixsize * (1)) * .Height)

    '...[/vb]
    Wo soll er denn nun hin, wenn i = Matrixsize ist?
    VB schickt ihn in das 1. Case.
    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!
    Stimmt ist mir jetz auch erst aufgefallen, aber case1 ist korrekt. Da 0 bis Matrixsize-1 die erste Spalte Dargestellt wird und dann im case1 die 2.

    Hier ist etwas einsparungsbedarf.

    VB.NET-Quellcode

    1. Select Case i
    2. Case 0 To Matrixsize - 1
    3. .Location = New Point(10 + Matrixsize * 1 * 2, 10 + (i - Matrixsize * (0)) * .Height)
    4. Case Matrixsize To 2 * Matrixsize - 1


    Hmm hab das überall so geändert funktioniert aber nichtmehr ganz, muss mir das jetz nochmal genauer überlegen. Ist schon paar monate her als ich diesen Programmteil geschrieben habe.
    also 16 * 16 Daten zu speichern oder zu lesen + darzustellen darf nicht eine zehntel sekunde dauern.
    Auch nicht 100 Stück davon - das wären ja auch nur 26kb.

    ich weiß jetzt nicht, wie dein prog arbeiten soll - soll es mehrere solcher Matrizen verfügbar haben, und eine davon bearbeiten, und dann dem µ-Prozessor zum Fraß vorwerfen?


    Also angezeigt wird immer nur eine, wenn man New klickt wird eine Neue erstellt, navigieren kann man mit Next bzw Prev, hier wird auch die erwähnte Removebuttons bzw. loadbuttons funktionen angewendet.


    Die Cases hab ich jetzt so geändert:

    VB.NET-Quellcode

    1. Select Case i - 1
    2. Case 0 To Matrixsize - 1
    3. .Location = New Point(10 + Matrixsize * 1 * 2, 10 + (i - Matrixsize * (0)) * .Height)
    4. Case Matrixsize To 2 * Matrixsize - 1


    Der µ-Prozessor liest dann so aus (Ist nur die Bufferung des 1. Bildes):

    C-Quellcode

    1. if(SDstatus==2)
    2. {
    3. Fread(buffer,5);
    4. if(buffer[3]!=0x7F)
    5. imageR[0][6][0]=0; //Error Pic Start
    6. if(buffer[4]!=0x00)
    7. imageR[0][7][0]=0; //Wrong Pic
    8. }
    9. if(SDstatus==2)
    10. {
    11. for(int sdrow=7;sdrow>=0;sdrow--)
    12. {
    13. Fread(buffer,16);
    14. for(int sdcol=7;sdcol>=0;sdcol--)
    15. {
    16. imageR[0][sdrow][sdcol]=buffer[sdcol];
    17. imageL[0][sdrow][sdcol]=buffer[sdcol+8];
    18. imageR[1][sdrow][sdcol]=buffer[sdcol];
    19. imageL[1][sdrow][sdcol]=buffer[sdcol+8];
    20. }
    21. }
    22. for(int sdrow=15;sdrow>=8;sdrow--)
    23. {
    24. Fread(buffer,16);
    25. for(int sdcol=7;sdcol>=0;sdcol--)
    26. {
    27. imageR[0][sdrow][sdcol]=buffer[sdcol];
    28. imageL[0][sdrow][sdcol]=buffer[sdcol+8];
    29. imageR[1][sdrow][sdcol]=buffer[sdcol];
    30. imageL[1][sdrow][sdcol]=buffer[sdcol+8];
    31. }
    32. }


    Das ganze wird dann auf 16x16 RGB Leds ausgegeben.

    Aber das sollte ja jetzt keine Rolle spielen. Funktionieren tut ja alles. Nur die geschwindigkeit der Buttons laden im VB Programm ist noch das Problem.

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

    oh, da hätte ich einige verbesserungsvorschläge

    zb. könnteste dir eine Tabelle anlegen mit Entwürfen, und jeder Entwurf bekommt einen Namen.
    Dann kann man eine Liste anzeigen und einen Entwurf auswählen, bzw. auch einen neuen entwurf anlegen oder entwürfe löschen.

    dann die Darstellung in einem DGV abhandeln mit .RowCount = .ColumnCount = 16.
    Keinesfalls 256 Buttons generieren!

    den µ-code verstehe ich nicht - ich dachte, er muß eine Datei öffnen?
    Passiert noch davor am Prozessor:

    C-Quellcode

    1. switch(GetDriveInformation())
    2. {
    3. case 1: //ALL is Working
    4. SDstatus=1;
    5. break;
    6. case 2:
    7. imageL[0][1][0]=0; //FAT-Type nicht erkannt
    8. break;
    9. case 3:
    10. imageL[0][2][0]=0; //CF gives no answer
    11. break;
    12. case 4:
    13. imageL[0][3][0]=0; // no response from card return CMD0_TIMEOUT;
    14. break;
    15. default:
    16. imageL[0][4][0]=0; //other errors
    17. }
    18. if(SDstatus==1)
    19. {
    20. // unsigned int readbytes;
    21. switch(Fopen("0", F_READ)) //Datei Öffnen
    22. {
    23. case F_OK: //Öffnen erfolgreich
    24. SDstatus=2;
    25. //readbytes=Fread(buffer,10); // Achte auf das & vor by !
    26. //imageR[0][0][0]=readbytes; //Anzahl von Bytes
    27. break;
    28. case F_ERROR:
    29. imageR[0][5][0]=0; //Datei kann nicht geöffnet werden
    30. break;
    31. }
    32. }


    (Datei heißt 0).

    Wie schon gesagt bin noch nicht der Erfahrenste VB Programmierer, und die Zeit die noch zu verfügung steht für dieses Projekt ist auch sehr Begrenzt. Das Programm kann bis jetzt, akt Bild Kopieren, einfügen. Neues Bild einfügen, Bild Löschen, Bild um 1 nach Rechts oder Links verschieben (Praktisch für Laufschrift und co.).

    Ich werd mal anfangen eine Anleitung zu finden über einen DGV. Habe ehrlich gesagt noch keine Ahnung was das genau sein soll ;).
    Was soll denn dieses 3-Dimensionale Feld imageL[0][1][0]?
    Das sollte doch wesentrlich eleganter gehen.
    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!
    kk :)

    Hab mir das gradschon auf galileobook angeschaut, sieht ja ganz gut aus, aber ist sicher viel Arbeit das so zu ändern dass so aussieht wie die andere, dass man easy die felder mit verschiedenen Farben anmalen kann.

    Zudem hatte ich bei den Buttons auch noch eine funktion, wenn man A drückt eine Farbe behalten kann und man mit der maus übers bild ziehen kann und anmalen:

    VB.NET-Quellcode

    1. If e.KeyCode = Keys.A Then
    2. For i As Integer = 1 To Matrixsize * Matrixsize
    3. AddHandler btnArray(i).MouseMove, AddressOf btnArray_Click
    4. Next i
    5. ToolStripStatusLabel1.Text = "A Aktivated"
    6. End If



    Das 3dimensionale Array ist nur zu buffern da in C, hat ja mit dem VB gar nix zu tun ;).
    [bildnr][row][col]


    So sieht imageL aus (imageR sieht gleich aus):

    C-Quellcode

    1. uint8_t imageL[][16][8]=
    2. {
    3. {{1,1,1,1,1,1,1,1},
    4. {1,0,0,0,0,0,0,1},
    5. {1,0,0,0,0,0,0,1},
    6. {1,0,0,7,7,0,0,1},
    7. {1,0,0,7,7,0,0,1},
    8. {1,0,0,0,0,0,0,1},
    9. {1,0,0,0,0,0,0,1},
    10. {1,1,1,1,1,1,1,1},
    11. {1,1,1,1,1,1,1,1},
    12. {1,0,0,0,0,0,0,1},
    13. {1,0,0,0,0,0,0,1},
    14. {1,0,0,0,0,0,0,1},
    15. {1,0,0,0,0,0,0,1},
    16. {1,0,0,0,0,0,0,1},
    17. {1,0,0,0,0,0,0,1},
    18. {1,1,1,1,1,1,1,1}},
    19. {{2,2,2,2,2,2,2,2},
    20. {2,1,1,1,1,1,1,2},
    21. {2,1,0,0,0,0,1,2},
    22. {2,1,0,0,0,0,1,2},
    23. {2,1,0,0,0,0,1,2},
    24. {2,1,0,0,0,0,1,2},
    25. {2,1,1,1,1,1,1,2},
    26. {2,2,2,2,2,2,2,2},
    27. {1,5,5,5,4,5,5,1},
    28. {5,1,5,5,4,5,1,5},
    29. {5,1,1,5,4,4,5,5},
    30. {4,4,4,1,4,4,4,4},
    31. {5,5,5,1,1,5,5,5},
    32. {5,5,1,5,4,1,5,5},
    33. {5,1,5,5,4,5,1,5},
    34. {1,5,5,5,4,5,5,1}}
    35. };


    Der Inhalt is irelevant, wird eh vom SD Inhalt überschrieben. 0-7 sind die verschieden farben.
    Es wird immer in [0] gebuffert während [1] angezeigt wird und umgekehrt.

    (Die obere Initalisierung schreibt in beide dieses ersten Arrays das 1. Bild von der SD-Karte.

    Bevor ich von SD-Karte gelesen habe, habe ich da einfach mehrere bilder angelegt und die nach der Reihe ausgelesen, jedoch durch den Speicher vom µ-Controller auf etwa 10-15 Bilder beschränkt (Zudem hat das Compillieren jedes mal auch zeit in Anspruch genommen), jetzt SD Karte in PC, daten drauf, rein in Matrix und fertig ;).

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

    Ich habe mir die Lösung vom ErfinderDesRades nicht angesehen, gehe aber davon aus, dass sie wie immer top ist^^
    Habe mir das ganze doch mal angeguckt und muss sagen, dass es richtig klasse aussieht! Lässt sich per GDI genauso machen, ist aber etwas anspruchsvoller.

    Meine Alternative zu dem DGV wäre es, dass ganze selbst per GDI zu zu zeichnen. Hat, wie ich finde, den vorteil, dass man ganz einfach selbst bestimmen kann wie alles auzusehen hat. Nachteil ist, dass man sich selbst um alles kümmern muss. Inwiefern das DGV da Vorteile bringt weiß ich nicht...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Me.DoubleBuffered = True
    5. End Sub
    6. Dim tmp As New LEDMatrix
    7. Dim PixelsPerLED As Integer = 10
    8. Dim AktColor As LEDMatrix.eLEDFarbe = LEDMatrix.eLEDFarbe.Red 'durch klicks auf einen button kann dies geändert werden..
    9. Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    10. Dim lx As Integer = CInt((e.X - PixelsPerLED / 2) / PixelsPerLED)
    11. Dim ly As Integer = CInt((e.Y - PixelsPerLED / 2) / PixelsPerLED)
    12. If lx >= 0 And lx < LEDMatrix.MatrixSize Then
    13. If ly >= 0 And ly < LEDMatrix.MatrixSize Then
    14. tmp.Matrix(lx, ly) = AktColor
    15. TextBox1.Text = tmp.ToFileString 'nur zur verdeutlichung...
    16. Me.Invalidate()
    17. End If
    18. End If
    19. End Sub
    20. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    21. For x = 0 To LEDMatrix.MatrixSize - 1
    22. For y = 0 To LEDMatrix.MatrixSize - 1
    23. Dim lx As Integer = x * PixelsPerLED
    24. Dim ly As Integer = y * PixelsPerLED
    25. e.Graphics.FillRectangle(New SolidBrush(tmp.GetColorFromMatrix(x, y)), lx, ly, PixelsPerLED, PixelsPerLED)
    26. e.Graphics.DrawRectangle(Pens.Gray, lx, ly, PixelsPerLED, PixelsPerLED)
    27. Next
    28. Next
    29. End Sub
    30. End Class
    31. Class LEDMatrix
    32. Public Sub New()
    33. For x = 0 To MatrixSize - 1
    34. For y = 0 To MatrixSize - 1
    35. Matrix(x, y) = eLEDFarbe.Black
    36. Next
    37. Next
    38. End Sub
    39. Public Const MatrixSize As Integer = 16
    40. Public Matrix(MatrixSize - 1, MatrixSize - 1) As eLEDFarbe
    41. Enum eLEDFarbe
    42. Red = 1
    43. Green = 2
    44. Blue = 3
    45. White = 4
    46. Black = 5
    47. Yellow = 6
    48. Magenta = 7
    49. Cyan = 8
    50. End Enum
    51. Public Function GetColor(ByVal LEDFarbe As eLEDFarbe) As Color
    52. Select Case LEDFarbe
    53. Case eLEDFarbe.Red : Return Color.Red
    54. Case eLEDFarbe.Black : Return Color.Black
    55. Case eLEDFarbe.Blue : Return Color.Blue
    56. Case eLEDFarbe.Cyan : Return Color.Cyan
    57. Case eLEDFarbe.Green : Return Color.Green
    58. Case eLEDFarbe.Magenta : Return Color.Magenta
    59. Case eLEDFarbe.White : Return Color.White
    60. Case eLEDFarbe.Yellow : Return Color.Yellow
    61. Case Else
    62. Return Color.Fuchsia
    63. End Select
    64. End Function
    65. Public Function GetColorFromMatrix(ByVal x As Integer, ByVal y As Integer) As Color
    66. Return GetColor(Matrix(x, y))
    67. End Function
    68. Public Function ToFileString() As String
    69. Dim tmp As String = ""
    70. For y = 0 To MatrixSize - 1
    71. For x = 0 To MatrixSize - 1
    72. tmp &= CInt(Matrix(x, y))
    73. Next
    74. tmp &= vbCrLf
    75. Next
    76. Return tmp
    77. End Function
    78. End Class

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

    Vielen dank für eure tollen, hochkarätigen Lösungen.

    Hab mir beide Angesehen, und muss auf den Ersten Blick Feststellen dass mir die Lösung von FreakJNS fast besser gefällt, vom design her und von der Auswahl, farbe erstauswählen dann anklicken usw. werde mir Morgen aber beide Lösungen noch genauer anschauen.


    Vielen Dank für eure Arbeit!!!

    Bin euch sehr dankbar!!

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

    kremsy schrieb:

    vom design her
    mit design meinst du, dass schwarz als standard-farbe voreingestellt ist?

    das kannste mit einer kleinen änderung auch bei die dgv-lsg bewirken:

    VB.NET-Quellcode

    1. Private _Brush As Brush() = {Brushes.Black, Brushes.Red, Brushes.Green, Brushes.Blue, Brushes.White, Brushes.Yellow, Brushes.Magenta, Brushes.Turquoise}
    ist halt so gemacht, dass der erste Brush der Standard-Brush ist.

    Und mitte Selection musstemal rumprobieren: Mulitselection ermöglicht, mitte Maus größere Bereiche zu umfassen, und wenndedann die Strg-Taste hälst, kannste noch weitere Bereiche zufügen.
    Auch mit Strg-Taste kann man einzelne Zellen oder Bereiche unselecten.
    Dann eine Farbe klicksen, und bunt ist :)

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