vb.net SetParent funktioniert nicht richtig

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

    vb.net SetParent funktioniert nicht richtig

    Hallo liebe Community!

    Ich würde sehr gerne in vb die SetParent funktion benutzen weil ich diese ziemlich gut finde.
    Doch nun habe ich ein Problem: Ich habe in mein Projekt eine "Template Form" die ich bei jeder neu erstellten Form einfüge damit diese genau so aussehen wie die Template Form

    VB.NET-Quellcode

    1. Inherits Window_Template

    Wenn ich dann einen Button drücke, soll die Form auf meiner Hautform angezeigt werden. Doch das funktioniert nicht so ganz...
    Ich habe auch noch versucht eine neue Form zu erstellen diese ohne meine Template form und diese wird angezeigt...

    Das verstehe ich nicht... Wenn ich eine Form erstelle diese mit meiner Template form versehe funktioniert es nicht doch wenn ich eine Form OHNE meine Templeate form erstelle fubnktioniert es
    Irgendwelche ideen?
    Naja was soll ich großartig schreiben hier mein Code zum aufrufen meiner Form über SetParent:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Desktop
    3. <DllImport("user32")> Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
    4. End Function
    5. Private Sub Desktop_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. SetParent(Weather.Handle, Me.Handle)
    7. Weather.Show()
    8. End Sub
    9. End Class
    Und was ist jetzt daran Template? Was ist Dein Template? Ne Datei? Ein mit Code versehenes, spezialisiertes Formular? Und was ist mit Deinem Code? Zeigt der jetzt, wie es erstmal funktioniert oder nicht funktioniert?
    btw: Fehlt nur noch, dass es am Ende daran scheitert, dass Du Weather falsch aufrufst. Das gehört instanziiert:

    VB.NET-Quellcode

    1. Dim WeatherFormular As New Weather
    2. WeatherFormular.Show

    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.

    Hier all mein Code der in meiner Template form drinne ist

    Code miner Template Form:
    (Template Form nochmal als Bild im Anhang)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Window_Template
    3. Inherits Form
    4. Private fullcolor As String = quick_saves.User_color
    5. Private UseFadeAnimation As String = "True"
    6. #Region "Commands"
    7. Private Sub close_lbl_Click(sender As System.Object, e As System.EventArgs) Handles close_lbl.Click
    8. Me.Close()
    9. End Sub
    10. Private Sub maximize_lbl_Click(sender As System.Object, e As System.EventArgs) Handles maximize_lbl.Click
    11. If maximize_lbl.Text = "□" Then
    12. Me.WindowState = FormWindowState.Normal
    13. maximize_lbl.Text = "■"
    14. Else
    15. Me.WindowState = FormWindowState.Maximized
    16. maximize_lbl.Text = "□"
    17. End If
    18. End Sub
    19. Private Sub minimize_lbl_Click(sender As System.Object, e As System.EventArgs) Handles minimize_lbl.Click
    20. Me.WindowState = FormWindowState.Minimized
    21. End Sub
    22. #End Region
    23. #Region "Mouseovers"
    24. Private Sub close_lbl_MouseEnter(sender As System.Object, e As System.EventArgs) Handles close_lbl.MouseEnter
    25. close_lbl.BackColor = Color.WhiteSmoke
    26. End Sub
    27. Private Sub close_lbl_MouseLeave(sender As System.Object, e As System.EventArgs) Handles close_lbl.MouseLeave
    28. close_lbl.BackColor = Color.Transparent
    29. End Sub
    30. Private Sub maximize_lbl_MouseEnter(sender As System.Object, e As System.EventArgs) Handles maximize_lbl.MouseEnter
    31. maximize_lbl.BackColor = Color.WhiteSmoke
    32. End Sub
    33. Private Sub maximize_lbl_MouseLeave(sender As System.Object, e As System.EventArgs) Handles maximize_lbl.MouseLeave
    34. maximize_lbl.BackColor = Color.Transparent
    35. End Sub
    36. Private Sub minimize_lbl_MouseEnter(sender As System.Object, e As System.EventArgs) Handles minimize_lbl.MouseEnter
    37. minimize_lbl.BackColor = Color.WhiteSmoke
    38. End Sub
    39. Private Sub minimize_lbl_MouseLeave(sender As System.Object, e As System.EventArgs) Handles minimize_lbl.MouseLeave
    40. minimize_lbl.BackColor = Color.Transparent
    41. End Sub
    42. #End Region
    43. #Region "Functions"
    44. Public Sub SetImgColor(ByVal _Control As String, ByVal _R As Integer, ByVal _G As Integer, ByVal _B As Integer)
    45. Dim x As Integer
    46. Dim y As Integer
    47. Dim img As Bitmap = New Bitmap(My.Resources.Taskbar_default1_transparent)
    48. For x = 0 To img.Width - 1
    49. For y = 0 To img.Height - 1
    50. img.SetPixel(x, y, Color.FromArgb(75, _R, _G, _B))
    51. Next
    52. Next
    53. For Each Control As Control In Me.Controls
    54. If Control.Name.Contains(_Control) = True Then
    55. Control.BackgroundImage = img
    56. End If
    57. Next
    58. End Sub
    59. #End Region
    60. #Region "Attribute"
    61. Private Const FADE_DEFAULT_VALUE As String = "True"
    62. Private _Fade As String = FADE_DEFAULT_VALUE
    63. <Browsable(True), DefaultValue(FADE_DEFAULT_VALUE), Description("Fade IN - OUT Effekt")>
    64. Public Property Fade() As String
    65. Get
    66. Return _Fade
    67. End Get
    68. Set(value As String)
    69. _Fade = value
    70. UseFadeAnimation = value
    71. End Set
    72. End Property
    73. #End Region
    74. Private Sub Window_Template_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    75. 'Set Titelbar Color
    76. Try
    77. Dim _red As Integer
    78. Dim _green As Integer
    79. Dim _blue As Integer
    80. _red = fullcolor.Split(",")(0)
    81. _green = fullcolor.Split(",")(1)
    82. _blue = fullcolor.Split(",")(2)
    83. SetImgColor("titelbar_", _red, _green, _blue)
    84. Catch ex As Exception
    85. End Try
    86. End Sub
    87. Private Sub Window_Template_Activated(sender As System.Object, e As System.EventArgs) Handles MyBase.Activated
    88. If UseFadeAnimation = "True" Then
    89. For fadein = 0.4 To 1.0 Step 0.1
    90. Me.Opacity = fadein
    91. Me.Refresh()
    92. Threading.Thread.Sleep(10)
    93. Next
    94. End If
    95. End Sub
    96. Private shutdown_fade_deactivate As Boolean = False
    97. Private Sub Window_Template_Deactivate(sender As System.Object, e As System.EventArgs) Handles MyBase.Deactivate
    98. If UseFadeAnimation = "True" Then
    99. If shutdown_fade_deactivate = False Then
    100. For fadeout = 1.0 To 0.4 Step -0.1
    101. Me.Opacity = fadeout
    102. Me.Refresh()
    103. Threading.Thread.Sleep(10)
    104. Next
    105. Else : End If
    106. End If
    107. End Sub
    108. Private Sub Window_Template_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    109. shutdown_fade_deactivate = True
    110. End Sub
    111. End Class



    Achja und immer wenn ich meine Template Form einfügen will kommt auch immer ein Fehler vllt liegt es ja an ihn (Bild im Anhang)
    Bilder
    • template.png

      15,59 kB, 536×427, 56 mal angesehen
    • fehler.png

      32,47 kB, 549×358, 46 mal angesehen
    Seh ich das richtig, dass Du in die von VS erstellte Form1.vb schreibst:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Inherits Windows_Template

    Das kann nicht funktionieren, da es noch eine Form1.Designer.VB gibt, die dir reingrätscht. Da sind viele Sachen schon festgeschrieben, u.a., dass Form1 von Form erbt. Und da Mehrfach(ver)erbungen unzulässig sind ...
    Da musst Du ne neue, leere Datei erstellen und einfügen:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Inherits Windows_Template
    3. End Class

    Dann geht's.

    ##########

    Zumindest ist es dann logisch und ohne Laufzeitfehler. Aber das Ergebnis ist noch nicht da. Wenn das mal nicht was für @Gather ist.
    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.

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

    Ok danke schonmal aber wie du schon gesagt hast ist das Ergebnis leider noch nicht da :/

    EDIT:
    Ich verstehe aber nicht ganz warum das mit meiner Template nicht ganz funktioniert.
    Achja wenn ich das Programm starte sollte die Form ja angezeigt werden doch was komisch ist die Form scheint da zu sein, doch diese ist irgendwie unsichtbar (Das habe ich gemaerkt als ich einfachmal Random überall ein Rechtsklick gemacht habe meine Hauptform besitzt nähmlich einen ContextMenuStrip)

    Hab was (aus dem Vergleich mit nem normalen Formular gefunden):
    Zwischen Imports System.ComponentModel und Public Class Window_Template fehlt <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
    Es muss also beginnen mit:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
    3. Public Class Window_Template : Inherits Form

    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.
    Bevor wir uns nun ewig auf Fehlersuche begeben, anbei meine lauffähige Version Deines Programms. Was das mit der Ursprungsfrage zu tun hat, weiß ich zwar nicht, aber vielleicht reicht das zur Problemlösung. Bitte beachte, dass ich folgende Sachen abgeändert/deaktiviert habe, weil mir Deine Resourcen dazu fehlen. Einfach wieder reaktivieren. Bei Dir sollten die Sachen ja erkannt werden:

    VB.NET-Quellcode

    1. Private fullcolor As String = Nothing ' quick_saves.User_color
    2. '[...]
    3. Public Sub SetImgColor(ByVal _Control As String, ByVal _R As Integer, ByVal _G As Integer, ByVal _B As Integer)
    4. 'Dim x As Integer
    5. 'Dim y As Integer
    6. 'Dim img As Bitmap = New Bitmap(My.Resources.Taskbar_default1_transparent)
    7. 'For x = 0 To img.Width - 1
    8. ' For y = 0 To img.Height - 1
    9. ' img.SetPixel(x, y, Color.FromArgb(75, _R, _G, _B))
    10. ' Next
    11. 'Next
    12. 'For Each Control As Control In Me.Controls
    13. ' If Control.Name.Contains(_Control) = True Then
    14. ' Control.BackgroundImage = img
    15. ' End If
    16. 'Next
    17. End Sub

    Dateien
    • WindowsApp1.zip

      (22,09 kB, 23 mal heruntergeladen, zuletzt: )
    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.

    Leider ging es bei mir nicht... :(

    Also ich habe mal den ganzen Code rüberkopiert doch es zeigt mir nun den gleichen Fehler an wie gerade und es zeigt mir nun auch 3 neue Fehler an (Anhang wie immer)
    Bilder
    • fehler3.png

      35,65 kB, 819×334, 43 mal angesehen
    Ich hab das Projekthochgeladen, damit Du schauen kannst, ob es für sich genommen so läuft, wie Du wolltest. Du kannst nicht einfach den Code nehmen und in Dein Projekt kopieren, in der Hoffnung, dass dann alles funktioniert. Ich weiß doch gar nicht, was Du alles sonst noch an Zusatzdateien hast und wie diese mit Deinem Template interagieren. Dazu müsste ich Deine komplette Projektmappe haben - was aber 1. ggf. nicht in Deinem Interesse ist und 2. nicht in meinem. Ich kann nicht mehr tun als Dir ein lauffähiges Projekt zu geben, welches Deine CustomFormularKlasse enthält und zum Laufen bringt. Sorry.
    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.
    Sorry mein PC ist gerade schon wieder abgestürtzt... Muss mir mal einen neuen glaub ich holen ist eh schon etwas älter..
    Also zurück zum Thema: Also ja es funktioniert super wie ich es haben wollte aber das Ding ist ja das SetParent iwi nicht funkt :/
    Aber wenn du möchtest könnte ich dir meine Projektmappe schicken ich hätte da nichts gegen.
    Wenn ich meinem Projekt ein neues Standardformular hinzufüge und dann da reinschreibe:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. <DllImport("user32")> Shared Function SetParent(ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As IntPtr
    4. End Function
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Dim Weather As New Window_Template
    7. SetParent(Weather.Handle, Me.Handle)
    8. Weather.Show()
    9. End Sub
    10. End Class

    Dann kommt das dabei raus:

    Wie gewünscht. (Hab noch'n bisken mit dem Design rumgespielt. N bisken Apple-like.)

    ##########

    ...wenn man davon absieht, dass Fade-In und Fade-Out von Form-in-Form-Apps wohl nicht so besonders unterstützt werden:
    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.

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

    Hmmmm das finde ich ein bisschen Strange...
    Erstmal nettes Design ;)
    Jaa ich weiss nicht wenn ich versuche die Template Form anzuzeigen über SetParent wird sie irgendwie nicht angezeigt Sie scheint unsichtbar zu sein.. :/
    Das Problem scheint irgendwie an meiner Template Form zu liegen

    EDIT:
    Also nochmal zur Verständnis: Wenn ich eine Form erstelle ohne meine Template Form wird Sie ganz normal angezeigt doch wenn ich meine Template Forme hinzufüge wird die ganze Form anscheinend unsichtbar angezeigt..


    EDIT 2:
    Hab nochmal Bilder hinzugefügt könnte vllt auch hilfreich sein

    LETZTER EDIT:
    AHA! Ich hatte mal eine super Idee und habe auf meiner Form1 mit Window_Template drinne einen ContextMenuStrip platziert d.h. wenn man rechtklick drauf macht plopt halt ein Menü auf, und dadurch gab es einige neue Infos würd ich mal sagen! Die Form ist mit Window_Template wirklich unsichtbar! (Bild im Anhang)
    Bilder
    • Ohne_Window_Template.png

      4,11 MB, 1.918×1.085, 36 mal angesehen
    • Mit_Window_Template.png

      4,26 MB, 1.918×1.085, 35 mal angesehen
    • unsichtbar.png

      4,25 MB, 1.917×1.085, 33 mal angesehen

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

    @ClonkAndre Forms werden in Partial Classes abgelegt, d.h., dass der Code zu einer Form auf mehrere Dateien verteilt sein kann.
    In der Datei FormX.Designer.vb steht dann Inherits Form und in der Klasse FormX.vb steht Inherits Window_Template. Das geht vor die Hose, Inherits sollte nur in einer dieser Dateien vorkommen.
    Sieh Dir mal Dein Projekt diesbezüglich an.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hey @RodFromGermany hab mal so ne Frage undzwar: Ist es egal wo das Inherits steht? Weil im Designer ist berteits ein Inherits vorhanden.
    Lohnt es sich dann nicht mehr das Inherits direkt im Designer von System.Windows.Forms.Form direkt zu meiner Template Form zu Leiten?
    Auch wenn die Frage nicht an mich ging, stell ich hier nochmal was klar - auch wenn es bestimmt alte Bekannte sind.
    Partial zeigt an, dass eine Klassendefinition auf mehrere Dateien aufgeteilt ist. Das wird z.B. verwendet, um Übersicht in den einzelnen Dateien zu schaffen, damit man nicht nur eine Klassendatei mit 5000+ Zeilen hat.
    Inherits bedeutet, dass eine Klasse von einer anderen erbt.
    Es gibt in VB.Net nur Einzelvererbungen.
    Daher ergibt es keinen Sinn, in verschiedenen Dateien, die jeweils eine Klasse beschreiben (Stichwort Partial), mehrmals das gleiche oder gar verschiedene Inherits-Zusätze zu schreiben. Wenn es in einer der Dateien steht, dass eine Klasse von irgendeiner anderen erbt, dann ist Schicht im Schacht. Dann braucht man nicht und darf man nicht in einer weiteren Datei, die dieselbe Klasse mitdeklariert, ein weiteres Inherits verwenden, da bereits feststeht, von welcher Klasse geerbt wird.

    Würde man also in Datei 1 haben:

    VB.NET-Quellcode

    1. Public Class MyCrazyClass : Inherits MyPoorStandardClass
    dann könnte man zwar in einer weiteren Datei noch schreiben

    VB.NET-Quellcode

    1. Partial Class MyCrazyClass
    aber bereits in Datei 1 wurde festgelegt, dass MyCrazyClass von MyPoorStandardClass erbt. Dann wurde alles geklärt und festgelegt. Ein weiteres Inherits ist dann unzulässig.

    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.

    ClonkAndre schrieb:

    oder?
    Ich nehme mal an, dass Dein Window_Template final von Form erbt.
    Also ersetze das Inherits Form in der Designer.vb einfach durch Inherits NAMESPACE.Window_Template und feddich.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!