Automatische Größe eines Formulares

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Automatische Größe eines Formulares

    Hallo,
    ich habe ein InfoFormular mit einem Label und einem Button. Nun möchte ich, dass, je nach der Länge des auszugebenden Textes die Größe des Formulares automatisch angepaßt wird. Das Formular wird beispielsweise folgendermaßen aufgerufen:

    VB.NET-Quellcode

    1. InfoFormular.Text = "Achtung"
    2. InfoFormular.InfoLabel.Text = "Dies ist ein Beispieltext, welcher im Infoformular angezeigt werden soll."
    3. InfoFormular.ShowDialog(Me)
    4. InfoFormular.Close()


    Hier nun die entsprechende Funktion zum Anpassen der Größe:

    VB.NET-Quellcode

    1. Private Sub InfoFormular_Resize(sender As Object, e As EventArgs) Handles Me.Resize
    2. InfoLabel.AutoSize = False
    3. InfoLabel.Left = 10
    4. InfoLabel.Top = 10
    5. InfoLabel.Width = Me.ClientSize.Width - 20
    6. Do Until Me.ClientSize.Height >= InfoLabel.Height + 30 + OKBefehl.Height
    7. Me.Height += 1
    8. Loop
    9. OKBefehl.Top = Me.ClientSize.Height - 10 - OKBefehl.Height
    10. OKBefehl.Left = CInt((Me.ClientSize.Width / 2) - (OKBefehl.Width / 2))
    11. End Sub


    Gibt es eine Möglichkeit, dass Labels nur die Höhe und nicht die Breite dem Textinhalt anpassen?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @tron25 Verwende eine ReadOnly Multiline TextBox und Integer-Division:

    VB.NET-Quellcode

    1. OKBefehl.Left = (Me.ClientSize.Width \ 2) - (OKBefehl.Width \ 2)
    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!

    tron25 schrieb:

    Gibt es eine Möglichkeit, dass Labels nur die Höhe und nicht die Breite dem Textinhalt anpassen?
    Ich verstehe die Frage nicht. Kannst Du das Wunschziel anders beschreiben?
    Aber mal ein österlicher Spekulatius: Schalte mal AutoEllipsis des Labels auf True, damit es einen automatischen Zeilenumbruch bei Textüberlänge gibt.

    btw: InfoFormular.Close() ist wohl überflüssig. Da ein Dialog bleibt, bis er geschlossen wird. Die Ausführung hängt dann eh in der Zeile ShowDialog fest. Den Dialog danach nochmal zu schließen, ist daher nicht nötig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das Infoformular soll seine Breite behalten und seine Höhe nach der Länge des Textes richten.

    "AutoEllipsis = true" bringt leider nicht den gewünschten Effekt. Ich müßte einen manuellen Zeilenumbruch einbauen, was ich aber eigentlich nicht möchte, da, es alles automatisch passieren soll.

    Gibt es ein entsprechendes Zeichen für die Multiplikation von Kommazahlen, deren Ergebnis als Integer angezeigt werden soll? "\" bringt bei Division das gleiche Ergebnis, wie "CInt()".

    Danke für den Hinweis.

    tron25 schrieb:

    Gibt es ein entsprechendes Zeichen für die Multiplikation von Kommazahlen, deren Ergebnis als Integer angezeigt werden soll?
    Nein.
    Was ist mit der ReadOnly-TexzBox?
    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 möchte, dass immer der komplette Text angezeigt werden soll. Gibt es eine Möglichkeit, festzustellen, ob der komplette Text in einer Textbox oder einem Label angezeigt wird. Wenn ja, könnte zuerst das Label bzw. die Textbox seine Größe anpassen. Danach das Formular.
    Wenn die Textzuweisung nur einmalig pro Dialogaufruf ist, dann kannst Du es so machen:
    • AutoSize bei True belassen, sodass es ein einzeiliges Label ist
    • dem Label den Text zuweisen
    • Labelbreite messen
    • ausrechnen, wieviele Textzeilen es wären, wenn es eine Wunschbreite hätte
    • AutoSize auf False setzen
    • Einzeilen-Höhe mal Textzeilen gleich neue Sollhöhe

    VB.NET-Quellcode

    1. InfoLabel.AutoSize = False
    2. Dim DesiredLabelWidth = 50
    3. Dim CountOfTextLines = CInt(Math.Ceiling(InfoLabel.Width / DesiredLabelWidth))
    4. InfoLabel.Height = (InfoLabel.Height + 4) * CountOfTextLines 'das plus 4 ist ein empirisch ermittelter Wert
    5. InfoLabel.Width = DesiredLabelWidth
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank für die Idee. Hier mein endgültiger Code:

    VB.NET-Quellcode

    1. Dim Ausfuehren As Boolean = True
    2. Private Sub OKBefehl_Click(sender As Object, e As EventArgs) Handles OKBefehl.Click
    3. Me.Close()
    4. End Sub
    5. Private Sub InfoFormular_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. InfoFormular_Resize(Me, EventArgs.Empty)
    7. End Sub
    8. Private Sub InfoFormular_Resize(sender As Object, e As EventArgs) Handles Me.Resize
    9. If Not Ausfuehren Then
    10. Exit Sub
    11. End If
    12. Dim Textbreite As Integer = Me.ClientSize.Width - 20
    13. Dim Zeilenzahl As Integer
    14. Dim Zeilenhoehe As Integer
    15. InfoLabel.AutoSize = True
    16. InfoLabel.Left = 10
    17. InfoLabel.Top = 10
    18. Zeilenzahl = CInt(InfoLabel.Width / Textbreite)
    19. Zeilenhoehe = InfoLabel.Height + 4
    20. InfoLabel.AutoSize = False
    21. InfoLabel.Width = Textbreite
    22. InfoLabel.Height = Zeilenhoehe * Zeilenzahl
    23. Ausfuehren = False
    24. Do Until Me.ClientSize.Height >= InfoLabel.Height + 30 + OKBefehl.Height
    25. Me.Height += 1
    26. Loop
    27. Ausfuehren = True
    28. OKBefehl.Top = Me.ClientSize.Height - 10 - OKBefehl.Height
    29. OKBefehl.Left = CInt((Me.ClientSize.Width / 2) - (OKBefehl.Width / 2))
    30. End Sub


    Die Variable "Ausfuehren" benutze ich, damit sich die "Resize"-Funktion nicht immer wieder beim Größe anpassen selbst aufruft, bzw. nicht immer wieder erneut durchläuft.

    tron25 schrieb:

    Gibt es eine Möglichkeit, festzustellen, ob der komplette Text in einer Textbox oder einem Label angezeigt wird.
    Bei einer TextBox ist bei vollständigem Text die ScrollBar disabled.
    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!