Location eines (Sub)Controls in einem User Control setzen

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von cl10k.

    Location eines (Sub)Controls in einem User Control setzen

    Hallo,

    ich versuche mich gerade das erste Mal an User Controls. Dazu habe ich eine einfache Kombination aus 2 Labels und einem Textfeld erstellt (lbl_Bezeichner, txtbx_Wert, lbl_Bereich). Über Properties greife ich "von außen" auf die .Text Eigenschaften der 3 eingebetteten Controls zu. Das klappt soweit auch gut.

    Wie komme ich jedoch an die Location der Labels/Textbox heran? Ich möchte die Positionen der 3 (Sub)Controls auf dem User Control zentral über ein paar Integer-Variablen ändern können.

    (Meine Anwendung wird eine Menge dieses User Controls benötigen und ich bin mir noch nicht sicher, wie ich die Positionierung der 3 Elemente zueinander am Ende umsetze. Daher möchte ich mir die Möglichkeit offenhalten, durch einfaches verändern von Variablen die Elemente nachträglich zu verschieben)

    Das gesamte Konzept ist mir aber noch nicht klar. Ich habe testhalber versucht die Location ebenfalls über Properties anzusprechen, bekomme dann aber immer die Fehlermeldung:

    "Expression is a value and therefore cannot be the target of an assignment"

    Quellcode

    1. Dim Pos_Bezeichner As Integer
    2. Property Position_Bezeichner() As Integer
    3. Get
    4. Return Pos_Bezeichner
    5. End Get
    6. Set(ByVal value As Integer)
    7. Pos_Bezeichner = value
    8. lbl_Bezeichner.Location.X = Pos_Bezeichner 'hier taucht dann der Fehler auf
    9. End Set
    10. End Property


    Wo liegt der Denkfehler? Habt ihr dazu irgend eine gute Idee?

    lg
    Ich habe zwar selber auch noch recht wenig Ahnung in VB, aber mach doch mal Dein

    VB.NET-Quellcode

    1. Dim Pos_Bezeichner As Integer


    zu

    VB.NET-Quellcode

    1. Private Pos_Bezeichner As Integer


    So richtig blicke ich es auch noch nicht, aber wäre es nicht Sinnvoller erstmal herauszufinden wie den die Position der Labels ist? im Moment legst Du ja fest, dass lbl_Bezeichner eine bestimmte Postion von POS_Bezeichner haben soll. oder hast Du POS_Bezeichner schon vorher im Code mit Positionen gefüllt?

    cl10k schrieb:

    VB.NET-Quellcode

    1. lbl_Bezeichner.Location.X = Pos_Bezeichner
    @Hellmut: Dein Code funktioniert.
    Du kannst nicht eine Komponente von Location separat setzen, die musst Du beide zusammen setzen:

    VB.NET-Quellcode

    1. lbl_Bezeichner.Location = New System.Drawing.Point(Pos_Bezeichner, lbl_Bezeichner.Location.Y)
    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!
    Konzeptfrage: Ist es sinnvoll, wenn man die Positionen per Code ändern kann?
    Reicht es nicht, wenn man sich die Position im Designer zusammenzieht?

    Wenn Du die Position per Code ändern willst, vermute ich mal, dass Du sie überall ändern willst, oder?
    Da wäre es einfacher, die Property und die Variable statisch (Shared) anzulegen und ein privates, statisches Event auszulösen, auf das alle Instanzen reagieren.
    Dann kannst Du sowas schreiben:

    VB.NET-Quellcode

    1. DeineControlKlasse.LabelBezeichnerPosition = New Point(X, Y) 'DeineControlKlasse ist dann keine Instanz, sondern direkt die Klasse selbst
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Konzeptfrage
    Sehr guter Hinweis.
    @cl10k: Kann es sein, dass Du einfach Probleme hast, eine GUI so zu gestalten, dass sie beim Größerziehen ordentlich aussieht?
    Sieh Dir mal die diversen Panels an: SplitContainer, TableLayoutPanel usw.
    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 weiß garnet, wasses an UserControls herumzuversuchen gibt. Die sind doch absolut identisch mit Forms.
    Also Doppelklick drauf, und dann im Designer designed, bis passt.

    Der einzige Unterschied zw. Form und UserControl ist, dass man UserControls aus der Toolbox auf ein Form (oder anneres ucl) ziehen kann, während man ein Form mit .Show() anzeigt. Also die Verwendung ist unterschiedlich, aber die Erstellung ist identisch.
    Na hier war ja richtig was los^^ Vielen Dank an alle!

    @Rod1: Genau das ist die Lösung. Heute kam mir auf der Arbeit schon so eine Ahnung das es so funktionieren könnte...

    @Niko: Danke für die Idee mit Shared. Da werde ich mich mal einlesen. Klingt interessant! Tatsächlich mache ich es derzeit so, dass ich eine Sammlung an Variablen zur Positionierung von GUI-Elementen in ein Modul gepackt habe, und so zentral das Erscheinungsbild meiner Forms steuere. Ich habe mehrere UserControls-Klassen und keine Lust im Designer alle einzeln zu ändern.

    @Rod2: Ich bin eigentlich (obwohl VB-Laie) durchaus in der Lage meine Forms entsprechend (konventionell) sauber zu gestalten. Allerdings soll das Programm mehrsprachig werden und durch die unterschiedliche Länge bestimmter Wörter wäre es prima, wenn ich darauf mit einer Neupositionierung meiner Controls reagieren könnte. Außerdem hoffe ich damit auch die Probleme, welche aus unterschiedlichen DPI-Einstellungen auf verschiedenen Rechnern resultieren, sauber lösen zu können. (aber da tappe ich noch ein wenig im Dunkeln, bestimmt gibt es da geschicktere Wege)

    @Erfinder: Ich programmiere bereits seit meiner Kindheit einen ganz ganz schlechten Stil. Ich möchte endlich lernen wie man OOP richtig und konsequent umsetzt. Der Einsatz von (z.B.) UserControls mit Kapselung von Eigenschaften/Methoden geht mir noch nicht so leicht von der Hand. Ich habe im Rahmen meines (Nicht-Informatik-)Studiums ein 30.000 Zeilen Programm geschrieben das quasi nicht mehr zu warten ist. Das möchte ich jetzt endlich in eine vernünftige Form bringen. Wenn man OOP noch nicht wirklich verinnerlicht hat, gibt es auch an Kleinigkeiten wie UserControls eine Menge "herumzuversuchen" ;)

    Ich hoffe ihr nehmt es mir nicht übel, wenn ich hier zum Thema noch eine andere Frage stelle. Mir erschließt sich nicht der Sinn wann ich Properties bzw. Methoden benutze.

    Um beim beliebten Autobeispiel zu bleiben (entstammt dem Galileo-Buch zu VB.net 2010):


    Welchen Vorteil habe ich die Geschwindigkeit eines Autos per Methode "Beschleunigen" zu verändern, wenn ich auch direkt auf die Property Geschwindigkeit der Klasse zugreifen kann? Mir fällt absolut kein Beispiel ein warum ich eine Methode nutzen sollte...?!

    lg

    cl10k schrieb:

    Um beim beliebten Autobeispiel zu bleiben (entstammt dem Galileo-Buch zu VB.net 2010):


    Welchen Vorteil habe ich die Geschwindigkeit eines Autos per Methode "Beschleunigen" zu verändern, wenn ich auch direkt auf die Property Geschwindigkeit der Klasse zugreifen kann? Mir fällt absolut kein Beispiel ein warum ich eine Methode nutzen sollte...?!
    Möglicherweise ein bescheuertes Beispiel (ich kenns nicht)
    Bei bescheuerten Beispielen sind Sinnfragen nicht wirklich zulässig ;)


    dieses Buch lesen (hingegen das Galileio-Openbook ist Mist)