Rubrik: Controls | VB-Versionen: VB2010 - VB2015 | 04.03.20 |
Ändern von Control-Eigenschaften in der Runtime Funktionen, die das Ändern einer Eigenschaft eines oder mehrerer Controls während der Laufzeit gestatten | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 1.954 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Ich hatte das Problem, meine Anwendungen auf eine andere Screen-Auflösung als der, unter der die Anwendungen entwickelt wurden, anzupassen; insbesondere Fontgrößen. Die Fenster enthalten viele Controls, sodass wirklich Funktionen für alle notwendig wurden.
Die folgenden Funktionen realisieren das Ändern einer bestimmten vorzugebenden Eigenschaft (mit ihrem Namen), deren Wert/Einstellung auf eine neue Vorgabe gesetzt werden soll. Die Funktionen sind ausreichend dokumentiert.
Die Verwendung der Funktionen erfordert:
Imports System.Reflection
Hier die betreffenden Funktionen:
1. Die gewünschte Eigenschaft der Controls eines bestimmten Typs auf neuen Wert ändern
''' <summary> ''' Alle Controls des angegebenen Typs im angegebenen Container-Objekt ''' eine bestimmte Eigenschaft mit neuem Wert versehen, ''' wobei auch weitere Container-Controls ''' innerhalb des Container-Objekts berücksichtigt werden können ''' </summary> ''' <param name="oContainer">der Original-Container</param> ''' <param name="refControl">das Referenz-Control (zur Ermittlung des Typs)</param> ''' <param name="thePropName">der Name der zu ändernden Eigenschaft</param> ''' <param name="thePropVal">der neue Eigenschaftenwert</param> ''' <param name="bSubContainerAlso">SubContainer berücksichtigen ja|nein</param> Public Sub setControlsPropVal(oContainer As Control, refControl As Control, thePropName As String, Optional thePropVal As Object = Nothing, Optional bSubContainerAlso As Boolean = True) Dim typ As Type = refControl.GetType Dim PropertyInfo As PropertyInfo If Not IsNothing(oContainer) Then ' alle Controls des Container-Objekts durchlaufen For Each oControl As Control In oContainer.Controls If CtrlPropertyExists(oControl, thePropName) Then 'ist Eigenschaft vorhanden? ' Falls es sich um ein Container-Control handelt und die ' Controls ebenfalls geändert werden sollen, muss ' die Funktion setControls rekursiv erneut aufgerufen werden If bSubContainerAlso AndAlso oControl.Controls.Count > 0 Then setControlsPropVal(oControl, refControl, thePropName, thePropVal) Else ' sofern es sich um ein Control vom Type typ handelt Inhalt ändern If oControl.GetType.Equals(typ) Then PropertyInfo = oControl.GetType().GetProperty(thePropName) PropertyInfo.SetValue(oControl, thePropVal, Nothing) End If End If End If Next End If End Sub
2. Die gewünschte Eigenschaft aller Controls verschiedenen Typs auf neuen Wert ändern
''' <summary> ''' Alle Controls im angegebenen Container-Objekt ''' eine bestimmte Eigenschaft mit neuem Wert versehen, ''' wobei auch weitere Container-Controls ''' innerhalb des Container-Objekts berücksichtigt werden können ''' </summary> ''' <param name="oContainer">der Original-Container</param> ''' <param name="thePropName">der Name der zu ändernden Eigenschaft</param> ''' <param name="thePropVal">der neue Eigenschaftenwert</param> ''' <param name="bSubContainerAlso">SubContainer berücksichtigen ja|nein</param> Public Sub setAllControlsPropVal(oContainer As Control, thePropName As String, Optional thePropVal As Object = Nothing, Optional bSubContainerAlso As Boolean = True) Dim PropertyInfo As PropertyInfo If Not IsNothing(oContainer) Then ' alle Controls des Container-Objekts durchlaufen For Each oControl As Control In oContainer.Controls If CtrlPropertyExists(oControl, thePropName) Then 'ist Eigenschaft vorhanden? ' Falls es sich um ein Container-Control handelt und die ' Controls ebenfalls geändert werden sollen, muss ' die Funktion setControls rekursiv erneut aufgerufen werden If bSubContainerAlso AndAlso oControl.Controls.Count > 0 Then setAllControlsPropVal(oControl, thePropName, thePropVal) Else PropertyInfo = oControl.GetType().GetProperty(thePropName) PropertyInfo.SetValue(oControl, thePropVal, Nothing) End If End If Next End If End Sub
3. Überprüfung, ob ein Control eien bestimmte Eigenschaft besitzt
''' <summary> ''' Prüfen, ob ein Control eine bestimmte Eigenschaft besitzt ''' </summary> ''' <param name="theCtrl">das Control</param> ''' <param name="thePropName">der Name der zu überprüfenden Eigenschaft</param> ''' <returns>True|False</returns> Public Function CtrlPropertyExists(theCtrl As Control, thePropName As String) As Boolean ' Filter erzeugen, der bestimmt, ob eine Eigenschaft mit dem Namen "Text" verfügbar ist, ' dabei wird die Gross-und-Kleinschreibung ignoriert Dim filter As Reflection.MemberFilter _ = Function(member As Reflection.MemberInfo, criteria As Object) _ (member.Name.Equals(thePropName, StringComparison.InvariantCultureIgnoreCase)) ' nur Eigenschaften, die sowohl öffentlich als auch nicht statisch sind, zulassen Dim flags As Reflection.BindingFlags _ = Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance ' keine Kriterien (filterCriteria) nötig --> Der Parameter ist Nothing Dim members() As Reflection.MemberInfo _ = GetType(Control).FindMembers(Reflection.MemberTypes.Property, flags, filter, Nothing) ' existiert eine Eigenschaft mit dem Namen thePropName? Return (members.Length > 0) End Function
Die Funktionen realisieren auch, dass Controls in einem bestimmten Container sich befinden können, eventuell sogar auch in weiteren Containern.
Beispiel des Aufrufs:
Im Container werden alle Controls (falls sie die Eigenschaft Font besitzen) mit einem neuen Font versehen.
setAllControlsPropVal(SplitContainer1.Panel1, "Font", Font)