Eine Frage bezüglich Background Image

  • VB.NET
  • .NET 4.5

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Eine Frage bezüglich Background Image

    Hallo alle da im weiten Internet,

    ich habe eine Frage, Ich dachte mir "Warum auch immer ich die Idee hatte" ich will das man Die Form Background Image per Knopfdruck ändern kann. Dann hab ich mir gedacht, ach das geht fix per Registry.
    Nun die Frage an die Experten,
    ich habe es so umgesetzt das man mit einer Checkbox in der Registrierung das Design von False auf True ändert, wenn True, dann werden alle Form(en) den Background bekommen. Da es in der Registrierung steht und nicht geändert wird, wird es auch gespeichert.
    Wenn ich also das Programm nun Schließe bleibt die Einstellung gespeichert. Das Klappt.
    Und jetzt kommt es. Wenn ich eine X Beliebige Form (Ausser die Main) öffne und wieder Schließe, (Me.Close) und sie im selben Task wieder aufrufe, also ohne das Programm neu gestartet zu haben, hat die X Beliebige Form nicht mehr das Eingestellte Design. (Background Image)
    Wundere mich darüber.. (Klar man könnte es auch über eine xml machen, aber für eine Schnapps Idee, frag ich mich nun einfach warum das so ist, ob das jemand schon mal so hatte, oder hab ich da irgendwas nicht beachtet?

    Hier mal etwas Code aus meinen Formen..
    1. Main Form (Form1) :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. ...
    3. 'Hintergrundfarbeinstellungen'
    4. Designbtn_black.Checked = CBool(regkey.GetValue("Design_Black"))
    5. Designbtn_blue.Checked = CBool(regkey.GetValue("Design_Blue"))
    6. Designbtn_green.Checked = CBool(regkey.GetValue("Design_Green"))
    7. Designbtn_default.Checked = CBool(regkey.GetValue("Design"))
    8. End Sub


    2. Eine X Belibige zweite Form
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Network_Option_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. ...
    3. My.Forms.Form1.Designbtn_black.Checked = CBool(regkey.GetValue("Design_Black")) = True
    4. My.Forms.Form1.Designbtn_blue.Checked = CBool(regkey.GetValue("Design_Blue")) = True
    5. My.Forms.Form1.Designbtn_green.Checked = CBool(regkey.GetValue("Design_Green")) = True
    6. My.Forms.Form1.Designbtn_default.Checked = CBool(regkey.GetValue("Design")) = True
    7. End Sub


    3. Die Background Sub
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Designbtn_blue_CheckedChanged(sender As Object, e As EventArgs) Handles Designbtn_blue.CheckedChanged
    2. My.Forms.Form1.BackgroundImage = My.Resources._2bg_2020b
    3. My.Forms.Accountverwaltung.BackgroundImage = My.Resources._2bg_2020b
    4. My.Forms.adusr.BackgroundImage = My.Resources._2bg_2020b
    5. My.Forms.Browser.BackgroundImage = My.Resources._2bg_2020b
    6. My.Forms.Game_Manager.BackgroundImage = My.Resources._2bg_2020b
    7. My.Forms.generator.BackgroundImage = My.Resources._2bg_2020b
    8. My.Forms.Mail.BackgroundImage = My.Resources._2bg_2020b
    9. My.Forms.Network_Option.BackgroundImage = My.Resources._2bg_2020b
    10. My.Forms.save1.BackgroundImage = My.Resources._2bg_2020b
    11. My.Forms.save2.BackgroundImage = My.Resources._2bg_2020b
    12. My.Forms.save3.BackgroundImage = My.Resources._2bg_2020b
    13. My.Forms.ueber.BackgroundImage = My.Resources._2bg_2020b
    14. My.Forms.Updater.BackgroundImage = My.Resources._2bg_2020b
    15. My.Computer.Registry.CurrentUser.CreateSubKey("Software\Andy2002 Media Systems\AndyNET\Einstellungen", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree).SetValue("Design_Blue", Designbtn_blue.CheckState = CheckState.Checked)
    16. Designbtn_blue.Text = "Blau Aktiv"
    17. If Designbtn_blue.CheckState = False Then
    18. Designbtn_blue.Text = "Blau Aus"
    19. End If
    20. End Sub

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

    Hallo @Andy2002 ,

    Statt

    VB.NET-Quellcode

    1. My.Forms.Form1.Designbtn_black.Checked = CBool(regkey.GetValue("Design_Black")) = True


    Mach lieber

    VB.NET-Quellcode

    1. My.Forms.Form1.Designbtn_black.Checked = CBool(regkey.GetValue("Design_Black"))


    Der Abgleich auf True ist überflüssig. Mal ganz davon ab dass du die Designbuttons der Form1 füllst und Form1.Load entweder nicht geladen wird oder bereits geladen ist. So oder so wird das Load-Event in Form1 ja nicht gefeuert nur weil du deine Design-Button füllst. Erstelle in Form1 einen Public Sub und regel alles weitere darüber.

    Wieso löst du das nicht über Vererbung, wenn du sagst dass das bei der Mainform klappt. Mach eine BaseForm die das regelt und vererb sie an alle "x-beliebigen Forms". Generelles Maskenverhalten programmiert man nicht in jeder Maske neu.

    EDIT: Der neue Spoiler, der gerade dazu gekommen ist, bestätigt was ich gerade geschrieben habe: Das Event über das du den Background änderst, heißt CheckedChanged. Wichtig ist hier der Schlüsselbegriff Changed. Das Event wird also nicht gefeuert, wenn die Buttons von True auf True editiert werden. Dann liegt keine Veränderung (Change) vor. Und nochmal das Stichwort VERERBUNG. Spart viel Zeit und Mühe in deinem Fall.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Ok, den Code an sich kommentier ich lieber nicht.
    Wie wird denn die X-beliebige Form erzeugt und aufgerufen? Mit welchem Code kommst Du vom Mainform zum XForm? Denn das Setzen des HG-Bildes wird ja nur in der Designbtn_blue_CheckedChanged-Sub bewerkstelligt, nicht im XForm-Erzeugungscode. Und daher dürften die Referenz-Bezüge in der CheckedChange-Sub wohl nicht mehr gelten. Aber das ist ohne Form-Erzeugungscode Spekulatius.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    So bevor ich meinen Post jetzt nochmal editiere, weil du deinen editierst, nutze ich mal die Antworten-Funktion ;)

    Hier noch ein oder zwei Verbesserungsvorschläge, die dir zeigen sollen was @VaporiZed mit seinem ersten Satz gemeint hat:
    Du solltest dir ganz dringend das Thema Vererbung anschauen. Das Background-Image und jedes generelle Maskenverhalten definierst du in der BaseForm von der ALLE ANDEREN FORMEN!!! (inkl. deiner Mainform) erben. Anschließend lässt du jede Form die du hast im Designer nicht von System.Windows.Forms erben, sondern von deiner BaseForm.

    Ein weiteres Thema wäre die Trennung von Daten und Design. Erstell dir für das Dataholding ein separates Module (meint eine Shared Class) in die du deine Einstellungen auslagerst und die du (dadurch dass die Shared ist) für alle deine Formen greifbar machst. Nicht!!! die Daten ins Control laden und von dort wieder auslesen. Alle Daten ins Module und dann dem Control zuweisen. Nicht umgekehrt.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    @VaporiZed @Yanbel

    Also der Code so wie er da steht, Funktioniert, nur eben nicht wenn ich z.b. X Beliebige zweite form Schließe und wieder öffne, Gestartet wird die zweite einfach durch xyz.show(me) Fertig.
    Wie gesagt das war ein 5 Minuten code, mit dem zweck einfach mal das mit der Registrierung zu testen, und das geht ja auch Wunderbar. Nur eben wenn ich in (Form1) Grün Aktiviere (Alles wird Grün) -> (Form2) Öffne (Sie ist auch Grün) -> (Form2) Schließe -> (Form2) öffne.. Dann hat sie wieder den Standard Default Background. Obwohl ja die Checkbox sowie der Registereintrag Aktiv ist.
    Ich wollte eben nur das wissen, warum das passiert. (Habe das Project eh schon wieder gelöscht, wie gesagt war nur ein Gedanken Experiment.)

    Im XForm Erzeugercode steht eben NUR im Load Event My.Forms.Form1.Designbtn_blue.Checked = CBool(regkey.GetValue("Design_Blue")) = True Sonst nichts.

    ​ Das Event wird also nicht gefeuert, wenn die Buttons von True auf True editiert werden. Dann liegt keine Veränderung (Change) vor.
    => Das erklärt warum Xform nach Deaktivierung des Buttons mit Anschließender erneuten Aktivierung wieder "Grün" ist. Rofl

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

    Das der Code soweit beschrieben funktioniert bezweifelt hier auch keiner. Nur eben dass dir diese Art Coding deine Struktur immer weiter belastet. Du gehst nicht mal auf eine spezifische Instanz von Form1 ein. Das würde dir nicht passieren wenn du ein Settings Module hast, dort das Design festlegst und auch nur von dort abfragst.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Mach dir eine Klasse welche von Form erbt, dort im Load Event deinen Style setzen, die Klasse instanzierst du ordentlich und lässt den VB6-Kram weg(das My.Forms-Object), dann geht das auch vernünftig.

    Es würde dir gut tun, das mal durchzunehmen:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Hmm ich frage doch nur die Registrierung ab, ob der entsprechende Design Wert True oder False ist.
    Das tolle ist eben das es das Programm nicht nötig Vergrößert.. Also in dem Experiment, eben 2 Formen, 4 Checkboxen, 3 Buttons Und 4, 1px Große Bilder.

    Für ein Richtiges Programm nutz ich i.d.r XML oder ini. War eben nur eine Idee, die Funktioniert, und sehr sehr wenig Ressourcen benötigt. Und das mit dem
    Das Event wird also nicht gefeuert, wenn die Buttons von True auf True editiert werden. Dann liegt keine Veränderung (Change) vor.
    Könnte man ja beim Aufrufen der XForm, von der Form1 ja umschreiben, wüsste gerade nicht aus dem Kopf wie, aber das geht sicherlich. :)


    Und ganz ehrlich Background wechsel hab ich auch nie benötigt.. Hatte nur mal ne Idee, da ich mich im Moment mit der Windows Registry beschäftige.
    @Andy2002 Setze einen Haltepunkt rein und überzeuge Dich davon, dass er an dieser Codezeile vorbeikommt und der Code korrekt ausgeführt wird.
    Debuggen, Fehler finden und beseitigen
    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 ist echt kein Aufwand:

    Module

    VB.NET-Quellcode

    1. Public Module UserSettings
    2. 'Code sorgt automatisiert dafür, dass immer ein Design aktiv ist und auch immer nur EIN Design (warum auch immer hier keine Enumeration verwendet wird)
    3. Private _BlackDesign As Boolean
    4. Public Property BlackDesign As Boolean
    5. Get
    6. Return _BlackDesign
    7. End Get
    8. Set(ByVal value As Boolean)
    9. If Not Boolean.Equals(_BlackDesign, value) Then
    10. _BlackDesign = value
    11. If _BlackDesign Then
    12. _BlueDesign = False
    13. _GreenDesign = False
    14. _DefaultDesign = False
    15. Else
    16. If Not _BlueDesign AndAlso Not _GreenDesign Then
    17. _DefaultDesign = True
    18. End If
    19. End If
    20. End If
    21. End Set
    22. End Property
    23. Private _BlueDesign As Boolean
    24. Public Property BlueDesign As Boolean
    25. Get
    26. Return _BlueDesign
    27. End Get
    28. Set(ByVal value As Boolean)
    29. If Not Boolean.Equals(_BlueDesign, value) Then
    30. _BlueDesign = value
    31. If _BlueDesign Then
    32. _BlackDesign = False
    33. _GreenDesign = False
    34. _DefaultDesign = False
    35. Else
    36. If Not _BlackDesign AndAlso Not _GreenDesign Then
    37. _DefaultDesign = True
    38. End If
    39. End If
    40. End If
    41. End Set
    42. End Property
    43. Private _GreenDesign As Boolean
    44. Public Property GreenDesign As Boolean
    45. Get
    46. Return _GreenDesign
    47. End Get
    48. Set(ByVal value As Boolean)
    49. If Not Boolean.Equals(_GreenDesign, value) Then
    50. _GreenDesign = value
    51. If _GreenDesign Then
    52. _BlackDesign = False
    53. _BlueDesign = False
    54. _DefaultDesign = False
    55. Else
    56. If Not _BlackDesign AndAlso Not _BlueDesign Then
    57. _DefaultDesign = True
    58. End If
    59. End If
    60. End If
    61. End Set
    62. End Property
    63. Private _DefaultDesign As Boolean
    64. Public Property DefaultDesign As Boolean
    65. Get
    66. Return _DefaultDesign
    67. End Get
    68. Set(ByVal value As Boolean)
    69. If Not Boolean.Equals(_DefaultDesign, value) Then
    70. _DefaultDesign = value
    71. If _DefaultDesign Then
    72. _BlackDesign = False
    73. _BlueDesign = False
    74. _GreenDesign = False
    75. Else
    76. If Not _BlackDesign AndAlso Not _BlueDesign AndAlso Not _GreenDesign Then
    77. _DefaultDesign = True
    78. End If
    79. End If
    80. End If
    81. End Set
    82. End Property
    83. End Module


    Module laden

    VB.NET-Quellcode

    1. '...
    2. BlackDesign = CBool(RegKey.GetValue("Design_Black"))
    3. BlueDesign = CBool(RegKey.GetValue("Design_Blue"))
    4. GreenDesign = CBool(RegKey.GetValue("Design_Green"))
    5. DefaultDesign = CBool(RegKey.GetValue("Design"))


    Module auslesen (Mainform)

    VB.NET-Quellcode

    1. Designbtn_black.Checked = BlackDesign
    2. Designbtn_blue.Checked = BlueDesign
    3. Designbtn_green.Checked = GreenDesign
    4. Designbtn_default.Checked = DefaultDesign
    5. 'Benamung willkürlich
    6. Select Case True
    7. Case BlackDesign
    8. Me.BackgroundImage = My.Resources._1bg_2020b
    9. Case BlueDesign
    10. Me.BackgroundImage = My.Resources._2bg_2020b
    11. Case GreenDesign
    12. Me.BackgroundImage = My.Resources._3bg_2020g
    13. Case DefaultDesign
    14. Me.BackgroundImage = My.Resources._4bg_2020d
    15. End Select


    "Andere Form"

    VB.NET-Quellcode

    1. 'Benamung willkürlich
    2. Select Case True
    3. Case BlackDesign
    4. Me.BackgroundImage = My.Resources._1bg_2020b
    5. Case BlueDesign
    6. Me.BackgroundImage = My.Resources._2bg_2020b
    7. Case GreenDesign
    8. Me.BackgroundImage = My.Resources._3bg_2020g
    9. Case DefaultDesign
    10. Me.BackgroundImage = My.Resources._4bg_2020d
    11. End Select



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    Ich finde das Thema interessant, habe noch nie verschiedene Styles in meinen Apps verwendet. Daher habe ich auch was gebastelt, der Style wird bei änderung in allen offenen Forms übernommen.

    Wichtig, da die Projektmappe bereinigt ist, muss man einmal das Projekt erstellen bevor man die Forms im Designer öffnen kann, da ich die Designer-Dateien bearbeitet hab und die Formulare von meiner Form-Klasse erben, welche wiederum von Form erbt. Das könntest du erweitern und anstatt in einer Datei zu speichern halt in der Registry.

    Was kann man da besser machen? Habe das gefühl das kann man noch einfacher machen, brauche mal kreative Ideen.

    Wäre es besser anstatt alle Formulare von meiner abgeleiteten Form erben zu lassen, einfach eine Klasse Stylemanager zu erstellen, diese alles machen lassen? Irgendwie kommt mir diese Variante im nachinein ein wenig dirty vor.
    Dateien
    • WindowsApp1.zip

      (16,29 kB, 3 mal heruntergeladen, zuletzt: )

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

    Da geht noch einiges. Ich verwende grundsätzlich Forms ohne BoderStyle und designe diese vollständig. Auch den Großteil der .NET Controls habe ich komplett überarbeitet neu geschrieben. Ich lege sehr viel Wert auf das Design einer Applikation, sodass ich für jeden Teilbereich eigene Bibliotheken habe. Unterteilt in Business Applications, Sicherheitssoftware, Hacking-Tools und AI. Das sind die Hauptbereiche in denen ich privat programmiere und jedes hat sein komplett individuelles Design.

    Bilder habe ich schonmal gepostet in WinForms mit Viewmodel


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Das ist richtig, auch wenn es nicht unbedingt Azure sein muss. Azure ist nur empfehlenswert, wegen der hohen Bandbreite, der Skalierbarkeit und der Leistung. Du kannst die Anwendung aber auf einem eigenen Server laufen lassen, denn Azure wird auf Dauer als Privatanwendern ganz schnell ganz schön teuer. Die Architektur (SQL-Zugriff, Kommunikation, etc.) läuft über Microservices / APIs die auf dem Server liegen. Die Desktop-Anwendung stellt an dieser Stelle nur noch ein grafisches Interface bereit und ist ansonsten "dumm". Die Neuronalen Netze werden also nicht in der Desktopanwendung geschrieben, sondern in Form von mehreren Microservices auf dem Server. Ich habe erst vor kurzem angefangen, weil ich das Thema spannend finde und ich selber mal schauen will, was eigentlich aktuell so möglich ist. Und ich kann jetzt schon sagen, dass das mit an Sicherheit grenzender Wahrscheinlichkeit mein größtes Projekt wird.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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