CheckBox/NumericUpDown Height/Width lässt sich nicht per Code ändern

  • VB.NET

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

    CheckBox/NumericUpDown Height/Width lässt sich nicht per Code ändern

    Guten Tag alle zusammen,

    Ich möchte die Grösse und Position meiner Steuerelemente an die Fenstergrösse anpassen per Code.

    Das funktioniert auch bei allen, ausser bei einer Listbox und einem NumericUpDown Element. Ich vermute ich habe versehentlich jeweils eine Eigenschaft verändert. Die Eigenschaft AutoSize ist bei allen Steuerelementen auf False gesetzt. Leider kenne ich keine Eigenschaft die noch damit zu tun haben könnte...

    Hier mein Code:

    VB.NET-Quellcode

    1. Private Sub Startbildschirm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. btnBeenden.Width = Me.Width / 100 * 80
    3. btnDiaStarten.Width = Me.Width / 100 * 80
    4. CheckBox2.Width = Me.Width / 100 * 80
    5. btnSekundenzahl.Width = Me.Width / 100 * 80
    6. CheckBox3.Width = Me.Width / 100 * 80
    7. CheckBox1.Width = Me.Width / 100 * 80
    8. btnOrdnerauswahl.Width = Me.Width / 100 * 80
    9. txtPfad.Width = Me.Width / 100 * 80
    10. btnBeenden.Height = Me.Height / 100 * 10
    11. btnDiaStarten.Height = Me.Height / 100 * 10
    12. CheckBox2.Height = Me.Height / 100 * 10
    13. btnSekundenzahl.Height = Me.Height / 100 * 10
    14. CheckBox3.Height = Me.Height / 100 * 10
    15. CheckBox1.Height = Me.Height / 100 * 10
    16. btnOrdnerauswahl.Height = Me.Height / 100 * 10
    17. txtPfad.Height = Me.Height / 100 * 10
    18. btnBeenden.Left = Me.Width / 2 - btnBeenden.Width / 2
    19. btnDiaStarten.Left = Me.Width / 2 - btnDiaStarten.Width / 2
    20. CheckBox2.Left = Me.Width / 2 - CheckBox2.Width / 2
    21. btnSekundenzahl.Width = Me.Width / 2 - btnSekundenzahl.Width / 2
    22. CheckBox3.Width = Me.Width / 2 - CheckBox3.Width / 2
    23. CheckBox1.Left = Me.Width / 2 - CheckBox1.Width / 2
    24. btnOrdnerauswahl.Left = Me.Width / 2 - btnOrdnerauswahl.Width / 2
    25. txtPfad.Left = Me.Width / 2 - txtPfad.Width / 2
    26. btnBeenden.Top = Me.Height / 100 * 10 + btnDiaStarten.Top
    27. btnDiaStarten.Top = Me.Height / 100 * 10 + CheckBox2.Top
    28. CheckBox2.Top = Me.Height / 100 * 10 + btnSekundenzahl.Top
    29. btnSekundenzahl.Top = Me.Height / 100 * 10 + CheckBox3.Top
    30. CheckBox3.Top = Me.Height / 100 * 10 + CheckBox1.Top
    31. CheckBox1.Top = Me.Height / 100 * 10 + btnOrdnerauswahl.Top
    32. btnOrdnerauswahl.Top = Me.Height / 100 * 10 + txtPfad.Height
    33. txtPfad.Top = 20
    34. End Sub
    @kafffee Wenn das im Designer nicht geht, geht es auch per Code nicht.
    Die Breite beider Controls sollten aber per Code änderbar sein.
    Hole Dir den .Size in eine Variable, ändere darin die .Width-Property und weise sie der Size-Property des Controls wieder zu.
    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!
    Du meinst so?:

    VB.NET-Quellcode

    1. Dim BreiteNumeric = btnSekundenzahl.Size
    2. BreiteNumeric.Width = 50
    3. btnSekundenzahl.Size = BreiteNumeric


    Funktioniert nur wenn ich einen tatsächlichen Wert eingebe. Wenn ich statt 50 dann Me.Width / 100 * 80 eingebe hat das keinen Effekt...

    Das erklärt auch immer noch nicht, warum das mit der CheckBox2 nicht geht. Mit CheckBox1 und Checkbox3 geht das... Und bei Checkboxen kann ich doch .Width und .Height im Eigenschaftenfenster eingeben?

    kafffee schrieb:

    Me.Width / 100 * 80
    Welches Control ist Me?
    Bei mir ist das die Form.
    Was ganz genau willst Du denn erreichen?
    Vielleicht siehst Du Dir mal im Designer die Property .Anchor 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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Me ist bei mir die Form, auf der die Steuerelemente liegen.

    Ich möchte dass alle Steuerelemente eine auf der Form mittige Position und einheitliche Grösse bekommen, auch wenn das Zielsystem eine andere Bildschirmauflösung hat.

    Mit dem Code den ich geschrieben hab hat das auch geklappt, nur leider nicht bei CheckBox3 und btnSekundenzahl, also das 4. und 5. Element von oben...

    Ich komm einfach nicht drauf warum das bei allen anderen klappt nur bei denen zwei nicht...

    Auf dem Screenshot anbei siehst du die Form im Designer und zur Laufzeit.
    Bilder
    • vb_screenshot.jpg

      329,89 kB, 1.600×900, 60 mal angesehen
    @kafffee Sieh Dir mal an, wie eine GUI designt werden kann:
    Layout in Windows.Forms
    Kann es sein, dass die CheckBox die Property .AutoSize = True hat? Stell das mal auf False.
    Ansonsten funktioniert das bei mir:

    VB.NET-Quellcode

    1. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    2. Me.CheckBox1.Width = CInt(NumericUpDown1.Value)
    3. Me.NumericUpDown2.Width = CInt(NumericUpDown1.Value)
    4. End Sub
    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 glaub wir reden komplett aneinander vorbei.

    Ich will:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. NumericUpDown1.Width = Me.Width / 100 * 80
    3. CheckBox3.Width = Me.Width / 100 * 80
    4. End Sub


    Ganz einfach. Die Breite der Steuerelemente beim Laden von Form1 auf 80% der Fensterbreite setzen.
    Funktioniert bei den anderen Steuerelementen in dem Fenster ja. Aber nicht bei denen zwei. Die AutoSIze-Eigenschaft ist natürlich bei allen auf False.

    Hab sogar probiert die AutoSize-Eigenschaften während der Laufzeit zur Sicherheit nochmals auf False zu setzen. Kein Ergebnis...

    Und das absolut kuriose:
    Ich hab mir mal erlaubt die zwei Steuerelemente auf eine komplett neue Form zu kopieren. Und siehe da: Es funktioniert. Also warum nicht auf Form1?


    Edit:
    Und noch kurioser:
    Wenn ich das so mache lassen sich die Werte 50 problemlos zuweisen...

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. NumericUpDown1.Width = 50
    3. CheckBox3.Width = 50
    4. End Sub


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

    Ob das so Zukunft hat?
    Weil dann zieht einer das Form ganz gross, und alle Knöppe füllen das Form zu 80% aus - schön.
    Aber die Schrift auf den Knöppen ist ja nicht mit-gewachsen - also die User werden sich sehr wundern über so Riesen-Buttons mit Winz-Schrift darin.
    Und andersrum ähnlich: Wenn du das Form verkleinerst werden die Buttons iwann zu klein sein, um ihre Betextung noch vollständig anzeigen zu können.
    @kafffee Integer-Rechnung, probier mal die Berechnung anders herum:

    VB.NET-Quellcode

    1. NumericUpDown1.Width = Me.Width * 80 \ 100
    2. CheckBox1.Width = Me.Width * 80 \ 100
    Und mach Option Strict On.
    Visual Studio - Empfohlene Einstellungen
    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!
    Anders herum gehts auch nicht. Aber im Folgenden funktioniert es zumindest auf Form3:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. chkTimer.Width = Me.Width / 100 * 80
    3. numSekundenzahl.Width = Me.Width / 100 * 80
    4. Form3.chkTimer.Width = Form3.Width / 100 * 80 'Test auf Form3
    5. Form3.numSekundenzahl.Width = Form3.Width / 100 * 80 'Test auf Form3
    6. Me.Hide() 'Test auf Form3
    7. Form3.Show() 'Test auf Form3 'auf Form3 funktioniert es...
    8. End Sub

    nicht verwirren lassen ich hab den Steuerelementen ein bisschen passendere Namen gegeben...

    Hab oben auch Option Strict On eingefügt, aber dann geht gar nichts mehr. Fehlermeldung:
    "Option Strict On" lässt keine impliziten Konvertierungen von "Double" in "Integer" zu"
    in den Zeilen 2-6

    Hab mir den Link "Empfohlene Einstellungen" mal angeschaut, leider werden die Videos am Ende von Post1 nur sehr unscharf dargestellt, ich kann da quasi nichts erkennen..
    Tja, doof. Komisch - du bist der erste, dem die Video-Darstellung Probleme macht.

    Aber nützt nix. Die Fehler, die du mit Strict On jetzt kriegst sind die Fehler, die du bereits drinne hast.
    Und indem du die (mit Forum-Hilfe) fixen lernst, lernst du erstmalig das TypSystem von vb.net kennen, und was der Begriff Datentyp überhaupt bedeutet in einer streng typisierten Programmiersprache.
    Ist mühselige lästige Arbeit, und bringt dein Projekt scheinbar kein Stück voran.
    Es bringt aber dich voran - und das zahlt sich in kürzester Zeit auch für dein Projekt aus.

    Weiters: Mach einfach mal, was RFG sagt. Das wäre ja genau die Lösung dessen - an diesem Punkt.
    Was sagt er? Erst Multiplizieren, dann teilen. Und beim Teilen die Integer-Division verwenden statt der Double-Division.
    Schau genau - post#10 !
    @ErfinderDesRades

    So ich hab deinen Ratschlag mal befolgt. Ich hab den Videolink mal kopiert und dann extern auf Youtube angeschaut und die Auflösung manuell geändert. Hab alle Typen auch gleich explizit gewandelt. Jetzt bekomme ich aber einen Fehler in folgender Codezeile (aus einem anderen Beitrag von mir:

    Sporadische Fehlermeldungen beim Laden von Videos/Bildern

    VB.NET-Quellcode

    1. If Startbildschirm.ListBox2.Items(Zaehler).ToLower.EndsWith(".avi") Then


    Ich vermute das hat mit .ToLower.EndsWith zu tun... Denn irgendwie sollte das Startbildschirm.ListBox2.Items(Zaehler) glaube ich zuerst in einen String verwandelt werden liege ich da richtig? Meine Vermutung ist mit CStr() aber ich glaube ich setze die Klammern falsch...

    Da kommt die Fehlermeldung "Option Strict On lässt spätes Binden nicht zu."

    Ausserdem muss ich glaube ich MsgBox() anders aufrufen.

    Und es kommt noch zu folgendem Fehler:
    My.Computer.FileSystem.GetFiles(txtPfad.Text, FileIO.SearchOption.SearchAllSubDirectories, "*.jpg") 'Fehlermeldung: FileIO wurde nicht deklariert
    Ich nehme an einfach dann SystemIO ins Projekt importieren??

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

    kafffee schrieb:

    Denn irgendwie sollte das Startbildschirm.ListBox2.Items(Zaehler) glaube ich zuerst in einen String verwandelt werden liege ich da richtig?
    ja.
    Sehr einfach zum Umwandeln ist auch die .ToString() - Methode, die jedes Object hat.

    kafffee schrieb:

    My.Computer.FileSystem.GetFiles(txtPfad.Text, FileIO.SearchOption.SearchAllSubDirectories, "*.jpg") 'Fehlermeldung: FileIO wurde nicht deklariert
    Ich nehme an einfach dann SystemIO ins Projekt importieren??
    Ja. Das sollte auch der Editor gleich als Fehler-Fix vorschlagen - in sonem kleinen Icon an der Kringel-Linie. Dies Icon ist bei mir bischen unzuverlässig, aber wenn es sich klicken lässt, dann trägt es den erforderlichen Import auch gleich an die richtige Stelle inne Datei ein (nämlich oben).
    Ins Projekt würde ich System.IO nicht importieren - allenfalls in die Datei.

    kafffee schrieb:

    Anders herum gehts auch nicht.
    Pack den Code aus der Form_Load in eine Button_Click.
    Dann machst Du einen ScreenShot vorher und einen nachher und postest beide.
    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!
    Hab den Code nochmal optimiert, da auch Me.Width und Me.Height immer minimal unterschiedliche Werte zu liefern schienen (als ob sie mal auf- und mal abgerundet weden), hab ich sie in Variablen gepackt...

    VB.NET-Quellcode

    1. Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Breite As Integer = CInt(Me.Width * 80 / 100)
    3. btnBeenden.Width = Breite
    4. btnDiaStarten.Width = Breite
    5. chkTimer.Width = Breite
    6. numSekundenzahl.Width = Breite
    7. chkZufall.Width = Breite
    8. chkUnterordner.Width = Breite
    9. btnOrdnerauswahl.Width = Breite
    10. txtPfad.Width = Breite
    11. Dim Höhe As Integer = CInt(Me.Height / 100 * 10)
    12. btnBeenden.Height = Höhe
    13. btnDiaStarten.Height = Höhe
    14. chkTimer.Height = Höhe
    15. numSekundenzahl.Height = Höhe
    16. chkZufall.Height = Höhe
    17. chkUnterordner.Height = Höhe
    18. btnOrdnerauswahl.Height = Höhe
    19. txtPfad.Height = Höhe
    20. Dim Fensterbreite As Integer = CInt(Me.Width)
    21. btnBeenden.Left = CInt(Fensterbreite / 2 - btnBeenden.Width / 2)
    22. btnDiaStarten.Left = CInt(Fensterbreite / 2 - btnDiaStarten.Width / 2)
    23. chkTimer.Left = CInt(Fensterbreite / 2 - chkTimer.Width / 2)
    24. numSekundenzahl.Width = CInt(Fensterbreite / 2 - numSekundenzahl.Width / 2)
    25. chkZufall.Width = CInt(Fensterbreite / 2 - chkZufall.Width / 2)
    26. chkUnterordner.Left = CInt(Fensterbreite / 2 - chkUnterordner.Width / 2)
    27. btnOrdnerauswahl.Left = CInt(Fensterbreite / 2 - btnOrdnerauswahl.Width / 2)
    28. txtPfad.Left = CInt(Fensterbreite / 2 - txtPfad.Width / 2)
    29. Dim Fensterhöhe As Integer = CInt(Me.Height)
    30. txtPfad.Top = 20
    31. btnOrdnerauswahl.Top = CInt(Fensterhöhe / 100 * 10 + txtPfad.Top) + 10
    32. chkUnterordner.Top = CInt(Fensterhöhe / 100 * 10 + btnOrdnerauswahl.Top) + 10
    33. chkTimer.Top = CInt(Fensterhöhe / 100 * 10 + chkUnterordner.Top) + 10
    34. numSekundenzahl.Top = CInt(Fensterhöhe / 100 * 10 + chkTimer.Top) + 10
    35. chkZufall.Top = CInt(Fensterhöhe / 100 * 10 + numSekundenzahl.Top) + 10
    36. btnDiaStarten.Top = CInt(Fensterhöhe / 100 * 10 + chkZufall.Top) + 10
    37. btnBeenden.Top = CInt(Fensterhöhe / 100 * 10 + btnDiaStarten.Top) + 10
    38. Button1.Text = "BTN1 - Nach dem Klick"
    39. End Sub


    HIer die Bilder:
    Bilder
    • nach dem Klick.jpg

      341,85 kB, 1.600×900, 57 mal angesehen
    • vor dem Klick.jpg

      342,89 kB, 1.600×900, 53 mal angesehen
    @kafffee Pack Deine Controls in ein TableLayoutPanel, gib allen .Dock = Fill und den Label .AutoSize = False.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kafffee Auch dieses TableLayOutPanel hat Anchor und Dock und kann wiederum in Panels eingebettet werden.
    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!