Klasse erstellen? x-mal Darstellung einer Zeilen (Zeile Enthält, Label, Msg-Box, Ausgabefeld etc.) mit verschiedenen Parametern

  • VB.NET

Es gibt 90 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Klasse erstellen? x-mal Darstellung einer Zeilen (Zeile Enthält, Label, Msg-Box, Ausgabefeld etc.) mit verschiedenen Parametern

    Hallo Zusammen,

    ich bin auf der Suche nach einer Vereinfachung des Programmcode. Der bestehende Code soll erweitert werden. Die jetzige Visualisierung hat mehrere Parameter pro Eingabe. Die Eingaben sind abhängig von einer EXCEL-Liste und es können nun bis 24 Eingabezeilen benötigt werden.

    (Siehe Bsp. des Buttons.) Dies wiederholt sich für Ein&Ausgabefelder, Msg.Box etc.Welche Funktion/Programmaufbau bietet sich hier an, damit ich nicht mühsam der Code 24 wiederholen muss? Ich möchte gerne eine Funktion Schreiben und anschliessend (falls nötig) Instanzen erstellen.

    Hat jemand Erfahrung diesbezüglich? Danke für die Tipps



    VB.NET-Quellcode

    1. If ParameterRead(Parameter_counter).Funct = 3 ThenSelect Case ParameterRead(Parameter_counter).Group
    2. Case 1
    3. If ParameterRead(Parameter_counter).Enable = True Then
    4. Group1.Text = ParameterRead(Parameter_counter).Language(Language).Text
    5. Group1.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    6. Else
    7. Group1.Text = ""
    8. End IfCase 2
    9. If ParameterRead(Parameter_counter).Enable = True Then
    10. Group2.Text = ParameterRead(Parameter_counter).Language(Language).Text
    11. Group2.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    12. Else
    13. Group2.Text = ""
    14. End IfCase 3
    15. If ParameterRead(Parameter_counter).Enable = True Then
    16. Group3.Text = ParameterRead(Parameter_counter).Language(Language).Text
    17. Group3.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    18. Else
    19. Group3.Text = ""
    20. End IfCase 4
    21. If ParameterRead(Parameter_counter).Enable = True Then
    22. Group4.Text = ParameterRead(Parameter_counter).Language(Language).Text
    23. Group4.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    24. Else
    25. Group4.Text = ""
    26. End IfCase 5
    27. If ParameterRead(Parameter_counter).Enable = True Then
    28. Group5.Text = ParameterRead(Parameter_counter).Language(Language).Text
    29. Group5.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    30. Else
    31. Group5.Text = ""
    32. End IfCase 6
    33. If ParameterRead(Parameter_counter).Enable = True Then
    34. Group6.Text = ParameterRead(Parameter_counter).Language(Language).Text
    35. Group6.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    36. Else
    37. Group6.Text = ""
    38. End IfCase 7
    39. If ParameterRead(Parameter_counter).Enable = True Then
    40. Group7.Text = ParameterRead(Parameter_counter).Language(Language).Text
    41. Group7.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    42. Else
    43. Group7.Text = ""
    44. End IfCase 8
    45. If ParameterRead(Parameter_counter).Enable = True Then
    46. Group8.Text = ParameterRead(Parameter_counter).Language(Language).Text
    47. Group8.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    48. Else
    49. Group8.Text = ""
    50. End IfCase 9
    51. If ParameterRead(Parameter_counter).Enable = True Then
    52. Group9.Text = ParameterRead(Parameter_counter).Language(Language).Text
    53. Group9.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    54. Else
    55. Group9.Text = ""
    56. End IfCase 10
    57. If ParameterRead(Parameter_counter).Enable = True Then
    58. Group10.Text = ParameterRead(Parameter_counter).Language(Language).Text
    59. Group10.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    60. Else
    61. Group10.Text = ""
    62. End IfCase 11
    63. If ParameterRead(Parameter_counter).Enable = True Then
    64. Group11.Text = ParameterRead(Parameter_counter).Language(Language).Text
    65. Group11.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    66. Else
    67. Group11.Text = ""
    68. End IfCase 12
    69. If ParameterRead(Parameter_counter).Enable = True Then
    70. Group12.Text = ParameterRead(Parameter_counter).Language(Language).Text
    71. Group12.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    72. Else
    73. Group12.Text = ""
    74. End IfCase 13
    75. If ParameterRead(Parameter_counter).Enable = True Then
    76. Group13.Text = ParameterRead(Parameter_counter).Language(Language).Text
    77. Group13.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    78. Else
    79. Group13.Text = ""
    80. End IfCase 14
    81. If ParameterRead(Parameter_counter).Enable = True Then
    82. Group14.Text = ParameterRead(Parameter_counter).Language(Language).Text
    83. Group14.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    84. Else
    85. Group14.Text = ""
    86. End IfCase 15
    87. If ParameterRead(Parameter_counter).Enable = True Then
    88. Group15.Text = ParameterRead(Parameter_counter).Language(Language).Text
    89. Group15.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    90. Else
    91. Group15.Text = ""
    92. End IfCase 16
    93. If ParameterRead(Parameter_counter).Enable = True Then
    94. Group16.Text = ParameterRead(Parameter_counter).Language(Language).Text
    95. Group16.Enabled = ParameterRead(Parameter_counter).PWDL = 0
    96. Else
    97. Group16.Text = ""
    98. End If
    99. End SelectEnd If

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

    Du kannst die Gruppen in ein Array oder List(Of Group) packen und per Index drauf zugreifen.
    ach aus dem Integer ggf. ein Enum, das liest sich einfacher.
    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!
    Ich habe folgende Struktur für den automatischen Aufruf der jeweiligen Labelts, Text etc. erstellt. Dies ist nur ein Auszug aus dem Programm

    Nun wird die Checkbox aber nicht dargestellt:-( Hat jemand eine Idee?


    VB.NET-Quellcode

    1. CBCB(IndexCount) = New CheckBox
    2. CBCB(IndexCount).Visible = True
    3. CBCB(IndexCount).Name = "CheckBoxNr" & IndexCount.ToString
    4. CBCB(IndexCount).Left = 12
    5. CBCB(IndexCount).Top = 12 + IndexCount * 24 + 20
    6. CBCB(IndexCount).Height = 24
    7. CBCB(IndexCount).Text = "CheckBoxNr." & IndexCount.ToString
    8. CBCB(IndexCount).Tag = IndexCount.ToString
    9. Me.Controls.Add(CBCB(IndexCount))



    In einem Test-Programm ist dies kein Problem. Wollte dies in Übertragen, jedoch ohne Erfolg. Danke für Eure Unterstützung
    Setz auf Me.Controls.Add(CBCB(IndexCount)) einen Haltepunkt und sieh Dir Location und Size an.
    Zieh ggf. das Hauptfenster groß auf, falls sie irgendwo unten gelandet ist.
    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!
    Das ganze wird im Private Sub SettingsWin_Load über eine Funktion aufgerufen.

    Positionierung scheint auch stattgefunden zu haben.
    Location; {X = 12 Y = 32}
    Size; {Width = 104 Height = 24}

    (Gibt es eine Möglich alle Paremter auszulesen, damit ich diese hier Posten könnte?
    Wie weiss man, dass die Checkbox auch wirklich auf der SettingsWin_Load Seite platziert wurde?


    Was noch zu erwähen ist, es handelt sich um eine TabPage
    1-5 möchte ich auf Page 1
    6-11 auf Page2 etc. anzeigen lassen


    VB.NET-Quellcode

    1. Private Sub SettingsWin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. On Error GoTo errFunc
    3. ' Parameter LINE enable and disable the line
    4. ' load parameter file and assign the input output variables to the local tags on the display
    5. Dim textstr As String
    6. Dim csvColumn() As String
    7. Dim tagname As String
    8. Dim parameterSet As Parameterlist = New Parameterlist
    9. acx_counter = 0
    10. parametercounter = 0
    11. labelcounter = 0
    12. booleancounter = 0
    13. Tabpage1Used = False
    14. Tabpage2Used = False
    15. Tabpage3Used = False
    16. Tabpage4Used = False
    17. Tabpage5Used = False
    18. ' load all the alarm messages from the file into the local list with the
    19. ' open the Parameter config file
    20. AxAdsSetting.EnableErrorHandling = True ' switch on error handling in conjunction with onError go to
    21. If AxAdsSetting.AdsAmsPortEnabled() Then
    22. ' start from the beginning of the list
    23. For i As Integer = 0 To parameter.Count - 1
    24. parameterSet = parameter(i)
    25. 'Check the group description and if it is enabled
    26. If parameterSet.Enable And (parameterSet.Group = GroupDesc) Then
    27. Select Case parameterSet.Funct '1:INPUT, 2:OUTPUT, 3:TITLE,
    28. Case 1
    29. If parameterSet.Typ = 3 Then '1: REAL, 2: INT, 3: BOOL,
    30. AddIOButtonParameter(parameterSet, True)
    31. Else
    32. AddIOParameter(parameterSet)
    33. End If
    34. Case 2
    35. If parameterSet.Typ = 3 Then '1: REAL, 2: INT, 3: BOOL,
    36. AddIOButtonParameter(parameterSet, False)
    37. Else
    38. AddOParameter(parameterSet)
    39. End If
    40. Case 3
    41. Me.Text = parameterSet.Language(Language).Text
    42. End Select
    43. End If
    44. Next




    VB.NET-Quellcode

    1. Private Sub AddIOParameter(ByRef parameterset As Parameterlist)
    2. Dim hv1 As Double
    3. 'decide if the min or max value is a parameter from the plc or if it is a fixed value
    4. ' in case of an parameter link the min or max field to the plc
    5. Dim IndexCount As Integer
    6. For IndexCount = 0 To MaxIC
    7. Tabpage1Used = True
    8. If IndexCount > 5 Then
    9. Tabpage2Used = True
    10. End If
    11. If IndexCount > 11 Then
    12. Tabpage3Used = True
    13. End If
    14. CBCB(IndexCount) = New CheckBox
    15. CBCB(IndexCount).Visible = True
    16. CBCB(IndexCount).Name = "CheckBoxNr" & IndexCount.ToString
    17. CBCB(IndexCount).Left = 12
    18. CBCB(IndexCount).Top = 12 + IndexCount * 24 + 20
    19. CBCB(IndexCount).Height = 24
    20. CBCB(IndexCount).Text = "CheckBoxNr." & IndexCount.ToString
    21. CBCB(IndexCount).Tag = IndexCount.ToString
    22. Me.Controls.Add(CBCB(IndexCount))
    Dein Code funktioniert.
    Auf einer TabPage geht es dann so:

    VB.NET-Quellcode

    1. Me.TabPage1.Controls.Add(CBCB(IndexCount))
    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!
    Danke für den Tipp, ganau das war es.




    Nun möchte ich noch das Bild auf dem Button platzieren

    Btn_Info(IndexCount).Image = B1_Info_Button

    mit diesem Befehl kommt aber folgende Fehlermeldung;


    Fehler 2 Der Wert vom Typ "System.Windows.Forms.Button" kann nicht in "System.Drawing.Image" konvertiert werden.

    Was ist der korrekte Befehl dieses Bild anzusprechen? Es liegt im gleichnamigen .RESX Verzeichniss
    @ erfinder des Rades; Wenn ich Option Strict einschalten kommen über 100 Fehler. Die muss ich wohl mal durchforsten.....:-(

    @ Vatter.
    Das Bitmap liegt in der .RESX Datei. (Warum weiss ich auch nicht)
    Ich habe es jetzt zu den Resourcen hinzugefügt, aber mit My.Resources. wird es nicht angezeigt:-( (Es liegt ein anderes Bild dort und dieses wird angezeigt und dieses kann ich auch aufrufen)

    Danke für Eure Ideen

    carepicha schrieb:

    Wenn ich Option Strict einschalten kommen über 100 Fehler.

    Da siehst Du, was Du gleich richtig hättest machen können.
    Stell in Deinem Studio die Eigenschaften so ein, dass ein neues Projekt immer mit Option Strict On erstellt wird.
    Ist leider nicht Standard. :S
    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!
    Frage 1;

    Jemand eine Idee was ich eingeben muss um auf das Bitmap in der eingebetten Ressource zuzugreifen?

    Btn_Info(IndexCount).Image = ??????????????????????'My.Resources.info_button

    Frage 2;
    Btn_Info(IndexCount).Image = My.Resources.info_button

    Obwohl das Bitmap im ResourcenOrdner ist wird es nicht vorgeschlagen.....:-(

    Das kann doch nicht so schwer sein ein Bild auf einem Knopf einzufügen :?:

    Was ist der bessere Weg? .RESX oder Ressourcen. Wo liegen die wesentlichen Unterschiede?
    hmmm, wie soll eine Eingabe auf dem Form-Designer möglich sein wenn ich den entsprechenden Button abhängig vom Index erstelle. (Es kann bis 24 Eingabezeilen auf 3 Pages geben)

    VB.NET-Quellcode

    1. Btn_Info(IndexCount) = New Button
    2. Btn_Info(IndexCount).Name = "Button" & IndexCount.ToString
    3. Btn_Info(IndexCount).Left = 7
    4. Btn_Info(IndexCount).Top = 3 + IndexCount * 60 + 15
    5. Btn_Info(IndexCount).Height = 53
    6. Btn_Info(IndexCount).Image = ??????????????????????'My.Resources.info_buttonBtn_Info(IndexCount).Text = "Button" & IndexCount.ToString
    7. Btn_Info(IndexCount).Tag = IndexCount.ToStringBtn_Info(IndexCount).Visible = Not String.IsNullOrEmpty(parameterset.Language(Language).Description)
    8. Me.TabPage1.Controls.Add(Btn_Info(IndexCount))
    Projekt -> Eigenschaften -> Ressourcen -> Ressource hinzufügen -> vorhandene Datei hinzufügen
    aussuchen, ordentlich benennen und fertich.
    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!

    Der Index war ausserhalb des Array bereich......

    Zuerst eine kleine Beschreibung was ich machen möchte;

    Ich habe auf einer Form verschiedene Buttons über welche eine Form aufgerufen wird. Auf der neuen Form gibt es abhängig von Excel Einträgen unterschiedlich viele Button, Labels, etc.

    Nun habe noch etwas mühe mit dem Array;

    Frage; Wann bzw. muss der IndexCount (Zähler für den Index) belegt werden? => Dieser ist ja jedes mal unterschiedlich, je nach Anzahl einträgen im Excel



    Hier der Aufruf der Seite;

    VB.NET-Quellcode

    1. Private Sub SettingsWin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. On Error GoTo errFunc
    3. ' Parameter LINE enable and disable the line
    4. ' load parameter file and assign the input output variables to the local tags on the display
    5. Dim textstr As String
    6. Dim csvColumn() As String
    7. Dim tagname As String
    8. Dim parameterSet As Parameterlist = New Parameterlist
    9. 'Dim IndexCount As Integer
    10. 'Dim IndexCountOffset As Integer = 0 'Offset wird benötigt, damit Position wieder oben auf neuer TabPage
    11. acx_counter = 0
    12. parametercounter = 0
    13. labelcounter = 0
    14. booleancounter = 0
    15. Tabpage1Used = False
    16. Tabpage2Used = False
    17. Tabpage3Used = False
    18. Tabpage4Used = False
    19. Tabpage5Used = False
    20. ' load all the alarm messages from the file into the local list with the
    21. ' open the Parameter config file
    22. AxAdsSetting.EnableErrorHandling = True ' switch on error handling in conjunction with onError go to
    23. If AxAdsSetting.AdsAmsPortEnabled() Then
    24. ' start from the beginning of the list
    25. For i As Integer = 0 To parameter.Count - 1
    26. parameterSet = parameter(i)
    27. 'Check the group description and if it is enabled
    28. If parameterSet.Enable And (parameterSet.Group = GroupDesc) Then
    29. Select Case parameterSet.Funct '1:INPUT, 2:OUTPUT, 3:TITLE,
    30. Case 1
    31. If parameterSet.Typ = 3 Then '1: REAL, 2: INT, 3: BOOL,
    32. AddIOButtonParameter(parameterSet, True)
    33. Else
    34. [b] AddIOParameter(parameterSet)[/b] End If




    und dann soll die Entsprechende Anzahl Buttons (abhängig vom Index) etc. erstellt werden.

    VB.NET-Quellcode

    1. '
    2. Private Sub AddIOParameter(ByRef parameterset As Parameterlist)
    3. Dim hv1 As Double
    4. 'decide if the min or max value is a parameter from the plc or if it is a fixed value
    5. ' in case of an parameter link the min or max field to the plc
    6. Tabpage1Used = True
    7. If IndexCount > 5 Then
    8. Tabpage2Used = True
    9. End If
    10. If IndexCount > 11 Then
    11. Tabpage3Used = True
    12. End If
    13. '----------------------------------------------------------------------
    14. ----------------------------------------------------------------------
    15. 'ANZEIGE INFO BUTTON
    16. '----------------------------------------------------------------------
    17. Btn_Info(IndexCount) = New Button
    18. Btn_Info(IndexCount).Name = "Button" & IndexCount.ToString
    19. Btn_Info(IndexCount).Left = 3
    20. Btn_Info(IndexCount).Top = 0 + (IndexCount + IndexCountOffset) * 55 + 5
    21. Btn_Info(IndexCount).Height = 53
    22. Btn_Info(IndexCount).Width = 53
    23. Btn_Info(IndexCount).Image = My.Resources.Info_Button
    24. 'Btn_Info(IndexCount).Text = "Button" & IndexCount.ToString
    25. Btn_Info(IndexCount).Tag = IndexCount.ToString
    26. Btn_Info(IndexCount).Visible = Not String.IsNullOrEmpty(parameterset.Language(Language).Description)
    27. IndexCount = IndexCount + 1



    Muss der (IndexCount) mit den Anzahl zu erwartenden hinterlegt werden?
    Eine For Schlaufe geht nicht, da die jeweilige Funktion zum Button erstellen jeweils mit Parameterübergabe Aufgerufen wird