Richtige Fenstergröße ermitteln

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Zim.

    Richtige Fenstergröße ermitteln

    Hey ho,
    ich hab mir einen Messagerequester gemacht aber der will nicht ganz wie ich will.
    Ich habe das Problem das er sich immer so Komische Größen raussucht. Vermutlich wegen der Schriftgröße.
    Ich setzte das Fenster auf Autosize damit er sich an die indifiduellen Texte anpasst. Danach schalte ich dann Autosize aus. Aber Teilweise ist das Fenster viel zu groß oder klein. Hat jemand eine Idee wie ich es besser machen könnte ?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Messagerequester
    2. Dim FSize As Integer = Font.Size
    3. Dim Breite, Höhe, Button As Integer
    4. Public Sub Zeige1(ByVal Title As String, ByVal Message As String, ByVal Button01 As String, ByVal picture As Bild) ' As Boolean
    5. Button2.Visible = False
    6. Label1.Text = Message
    7. Button1.Text = Button01
    8. Me.Text = Title
    9. Img(picture)
    10. Einst()
    11. End Sub
    12. Public Sub Zeige2(ByVal Title As String, ByVal Message As String, ByVal Button01 As String, ByVal Button02 As String, ByVal picture As Bild) ' As String
    13. Button2.Visible = True
    14. Label1.Text = Message
    15. Button2.Text = Button02
    16. Button1.Text = Button01
    17. Me.Text = Title
    18. Img(picture)
    19. Einst()
    20. End Sub
    21. Public Sub Zeige1(ByVal Title As String, ByVal Message As String, ByVal Button01 As String, ByVal Font As Font, ByVal picture As Bild) ' As Boolean
    22. Button2.Visible = False
    23. Label1.Text = Message
    24. Button1.Text = Button01
    25. Me.Text = Title
    26. Me.Font = Font
    27. Me.FontHeight = FSize
    28. Img(picture)
    29. Einst()
    30. End Sub
    31. Public Sub Zeige2(ByVal Title As String, ByVal Message As String, ByVal Button01 As String, ByVal Button02 As String, ByVal Font As Font, ByVal picture As Bild) ' As String
    32. Button2.Visible = True
    33. Label1.Text = Message
    34. Button2.Text = Button02
    35. Button1.Text = Button01
    36. Me.Text = Title
    37. Me.Font = Font
    38. Me.FontHeight = FSize
    39. Img(picture)
    40. Einst()
    41. End Sub
    42. Private Sub Einst()
    43. Me.Refresh()
    44. Höhe = Me.Height
    45. If Label1.Height > 100 Then
    46. Höhe += (Button1.Height + 25)
    47. End If
    48. Breite = Me.Width
    49. Me.AutoSize = False
    50. Me.Height = Höhe
    51. Me.Width = Breite
    52. Button1.SetBounds(15, Höhe - (Button1.Height + 35), Button1.Width, Button1.Height)
    53. Button2.SetBounds(Breite - (Button2.Width + 20), Höhe - (Button2.Height + 35), Button2.Width, Button2.Height)
    54. PictureBox1.SetBounds(15, 15, 49, 49)
    55. MyBase.WindowState = FormWindowState.Normal
    56. MyBase.Opacity = 100
    57. Me.ShowDialog()
    58. End Sub
    59. Private Sub Img(ByVal Picture As Integer)
    60. If Picture = 1 Then
    61. PictureBox1.Image = MainForm.information
    62. ElseIf Picture = 2 Then
    63. PictureBox1.Image = MainForm.warning
    64. ElseIf Picture = 3 Then
    65. PictureBox1.Image = MainForm.important
    66. ElseIf Picture = 4 Then
    67. PictureBox1.Image = MainForm.critical
    68. ElseIf Picture = 5 Then
    69. PictureBox1.Image = MainForm.question
    70. Else
    71. PictureBox1.Image = Nothing
    72. End If
    73. End Sub
    74. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    75. MainForm.Messagereturn = Button1.Text
    76. Me.AutoSize = True
    77. MyBase.Opacity = 0
    78. MyBase.WindowState() = FormWindowState.Minimized
    79. Me.Close()
    80. End Sub
    81. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    82. MainForm.Messagereturn = Button2.Text
    83. Me.AutoSize = True
    84. MyBase.Opacity = 0
    85. MyBase.WindowState() = FormWindowState.Minimized
    86. Me.Close()
    87. End Sub
    88. Enum Bild
    89. information = 1
    90. warning = 2
    91. important = 3
    92. critical = 4
    93. question = 5
    94. nix = 0
    95. End Enum
    96. Private Sub Messagerequester_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    97. End Sub
    98. End Class


    Mit Freundlichem Gruß Zim
    Zunächst einmal sollte der Code nach dem Einfügen keine Fehler bringen:

    VB.NET-Quellcode

    1. Dim FSize As Integer = Font.Size
    2. MainForm.xxx
    Danach können wir überlegen, wie es weitergeht.
    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!
    ???
    Also ich bekomme keine Fehlermeldung.
    Vllt weil ich die Form habe welche hier verwendet wird ?
    Das ist ne Form mit 2 Knöpfen einem Textlabel und einer Picturebox.
    Die Bilder werden aus meiner Hauptklasse(Mainform) geholt damit ich die nicht immer neu laden muss.

    RodFromGermany schrieb:

    Zunächst einmal sollte der Code nach dem Einfügen keine Fehler bringen:

    VB.NET-Quellcode

    1. Dim FSize As Integer = Font.Size
    2. MainForm.xxx
    Danach können wir überlegen, wie es weitergeht.

    Vielleicht solltest Du noch ein wenig Information posten, denn wenn Dir geholfen werden soll, hat man keine Lust, den fehlenden Quelltext von Dir nachzuerfinden.
    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!
    Naja das ist die komplette Klasse die ihr da seht ^^
    öhm ja also ich hab die Form noch auf "autoscalemode = font" "optical = 0" und "minimized" dann noch "autosizemode" auf "growandshrink"
    Jo das war eigentlich was ich dazu noch sagen könnte. Wenn ihr wollt könnte ich noch nen screen von dem Fenster machen.

    "Dim FSize As Integer = Font.Size"
    Ist wohl noch ein altes überbleipsel einer älteren version kann also raus.
    :thumbdown:
    Du greifst auf einige Eigenschaften einer anderen Klasse zu, die ich nicht nacherfinden, sondern von Dir gepostet haben möchte.

    VB.NET-Quellcode

    1. If Picture = 1 Then
    2. PictureBox1.Image = MainForm.information
    3. ElseIf Picture = 2 Then
    4. PictureBox1.Image = MainForm.warning
    5. ElseIf Picture = 3 Then
    6. PictureBox1.Image = MainForm.important
    7. ElseIf Picture = 4 Then
    8. PictureBox1.Image = MainForm.critical
    9. ElseIf Picture = 5 Then
    10. PictureBox1.Image = MainForm.question
    11. Else
    12. PictureBox1.Image = Nothing
    13. End If
    Alle Zugriffe auf MainForm.
    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 sind einfach nur Bilder ...

    VB.NET-Quellcode

    1. Public question, warning, information, critical, important As Image 'Messagerequester
    2. Try
    3. important = Image.FromFile(Pfad & "\Bilder\" & "important.png")
    4. question = Image.FromFile(Pfad & "\Bilder\" & "question.png")
    5. warning = Image.FromFile(Pfad & "\Bilder\" & "warning.png")
    6. information = Image.FromFile(Pfad & "\Bilder\" & "info.png")
    7. critical = Image.FromFile(Pfad & "\Bilder\" & "error.png")
    8. Catch
    9. MsgBox("Die Bilder des Messagerequesters konnten nicht geladen werden!", MsgBoxStyle.Exclamation, "Bilder Laden")
    10. End Try
    Du meinst

    VB.NET-Quellcode

    1. Public Class MainForm
    2. Public question, warning, information, critical, important As Image 'Messagerequester
    3. End Class
    Ich würde da lieber die Instanz durchreichen:

    VB.NET-Quellcode

    1. xxx = New Messagerequester(Me)
    und dann in Messagerequester per Referenz zugreifen:

    VB.NET-Quellcode

    1. Public Class Messagerequester
    2. Private _Parent As MainForm
    3. Public Sub New(ByVal parent As MainForm)
    4. _Parent = parent
    5. End Sub
    6. '...
    7. Private Sub xxx()
    8. PictureBox1.Image = _Parent.information
    9. End Sub
    10. End Class
    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!
    Aso ja sry

    VB.NET-Quellcode

    1. Public Class MainForm
    2. Public question, warning, information, critical, important As Image 'Messagerequester
    3. Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Try
    5. important = Image.FromFile(Pfad & "\Bilder\" & "important.png")
    6. question = Image.FromFile(Pfad & "\Bilder\" & "question.png")
    7. warning = Image.FromFile(Pfad & "\Bilder\" & "warning.png")
    8. information = Image.FromFile(Pfad & "\Bilder\" & "info.png")
    9. critical = Image.FromFile(Pfad & "\Bilder\" & "error.png")
    10. Catch
    11. MsgBox("Die Bilder des Messagerequesters konnten nicht geladen werden!", MsgBoxStyle.Exclamation, "Bilder Laden")
    12. End Try
    13. End Sub
    14. End Class
    und

    VB.NET-Quellcode

    1. Public Messagereturn As String
    haste vergessen? :D :D :D
    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!
    Und wie muss ich nun Dein Programm bedienen, damit der von Dir beschriebene Effekt auftritt?
    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!
    Naja ich sage z.B.

    VB.NET-Quellcode

    1. Messagerequester.Zeige2("Schließen?", "Möchten Sie die Software beenden?", "Ja", "Nein", StandardFont, Messagerequester.Bild.question)

    Geht auch und sieht meiner Meinung nach gut aus.
    So jetzt sage ich z.B.

    VB.NET-Quellcode

    1. Messagerequester.Zeige1("Eingabe", "Ihre Eingabe war ungültig!" & vbCrLf & "Der Endwert kann nicht kleiner als der Untere Messpunkt sein!", "OK", StandardFont, Messagerequester.Bild.information)

    So das geht auch.

    Wenn ich nun aber was kleineres aufrufe, bleibt das Fenster in der Größe der letzten Meldung.
    Heisst, er wird Größer wenn das Label größer wird, aber kleiner nicht mehr.

    Was auch komisch ist wenn ich das Fenster mit ein und der selben Nachricht immer wieder aufrufe, dann sollte das Fenster in der Größe ja gleich bleiben, tut es aber nicht.

    Evtl. muss ich beim schließen sagen das es x = 0 usw ist ?