<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<!--Created: 30.01.2020 16:50:16-->
<!--ACTOptimumVersion: 6.0.7270.30199-->
<ACTOptimumItems ACTOptimumVersion="6.0.7270.30199" Created="30.01.2020 16:50:16">
    <AutoDataMenu Created="30.01.2020 16:50:16" ClassName="Melville_Schellmann.ACTOptimum6.Plugin.MenuItemAutoData" PrefClassVersion="1.0" ACTOptimumVersion="6.0.7270.30199">
        <GlobalPref>True</GlobalPref>
        <NeededRole>2</NeededRole>
        <Name>ADM_DumpColumns</Name>
        <Tooltip>Zeigt alle Spalten von allen Registerkarten der aktuellen Detailansicht an.</Tooltip>
        <Description>Zeigt alle Spalten von allen Registerkarten der aktuellen Detailansicht an.</Description>
        <CommandBar>Connected Menus</CommandBar>
        <Menu>act-ui://com.act/application/menu/view</Menu>
        <Index>-1</Index>
        <Separator>False</Separator>
        <Shortcut>None</Shortcut>
        <SourceCode>' #ScriptName: ADM_DumpTabColumns
    ' #Description: Zeigt von allen Registerkarten einer Detailansicht die benutzerdefinierten Spaltenauswahlen an.
    ' #Author: Robert Schellmann, rs@act7.de
    ' #Copyright: © 2019 by Melville-Schellmann
    ' #Version: 1.0.1 (30.01.2020) Zeigt auch bei Listenansichten die Spaltenauswahl an.
    ' #Version: 1.0.0 (17.01.2019) s.o.
    ' AddReference("ACT.UI.TabPage")
    ' AddReference("ACT.Shared.Windows.Forms")
    ' AddReference("ACT.Framework.ComponentModel")
    
    m_sScriptName = "DumpColumns"
    m_oError = New ErrorHandling.BaseErrorMessage
    m_oACTApp = ACTApp
    
    If IsViewDetailView(m_oACTApp.CurrentView) Then
      Dim oDetailViewSetting As DetailViewSetting
      oDetailViewSetting = New DetailViewSetting()
      If oDetailViewSetting.TryInit(m_oACTApp.CurrentView) = False Then
        oDetailViewSetting.ShowError(MsgBoxStyle.Information, m_sScriptName)
      End If
      ShowSetting(oDetailViewSetting)
    End If
    If IsViewListView(m_oACTApp.CurrentView) Then
      Dim oListViewSetting As ListViewSetting
      oListViewSetting = New ListViewSetting()
      If oListViewSetting.TryInit(m_oACTApp.CurrentView) = False Then
        oListViewSetting.ShowError(MsgBoxStyle.Information, m_sScriptName)
      End If
      ShowSetting(oListViewSetting)
    End If
    
  
    Abbruch:
    If m_oError.HasAnError Then
      m_oError.ShowError(MsgBoxStyle.Exclamation, m_sScriptName)
    End If  
  End Sub
  Private Shared Sub ShowSetting(oViewSetting As ViewSetting)
  
    Dim frmSettings As FormPropertyGrid
    
    frmSettings = New FormPropertyGrid
    frmSettings.Text = m_sScriptName
    frmSettings.Width = 640
    frmSettings.SelectedObject = oViewSetting
    frmSettings.SetLabelRatio(4)
    frmSettings.ShowDialog
  End Sub
  Private Shared Function IsViewListView(oView As Object) As Boolean
    IsViewListView = False
    If oView Is Nothing Then
      GoTo Abbruch
    End If
    
    Dim oViewInterfaces As System.Collections.ArrayList = New ArrayList(oView.GetType.GetInterfaces)
    If oViewInterfaces.Contains(GetType(Act.UI.IContactListView)) Or _ 
      oViewInterfaces.Contains(GetType(Act.UI.ICompanyListView)) Or _ 
      oViewInterfaces.Contains(GetType(Act.UI.IGroupListView)) Or _ 
      oViewInterfaces.Contains(GetType(Act.UI.IOpportunityView)) Then 
      IsViewListView = True
    End If
    Abbruch:
  End Function
  Private Shared Function IsViewDetailView(oView As Object) As Boolean
    IsViewDetailView = False
    If oView Is Nothing Then
      GoTo Abbruch
    End If
    
    Dim oViewInterfaces As System.Collections.ArrayList = New ArrayList(oView.GetType.GetInterfaces)
    If oViewInterfaces.Contains(GetType(Act.UI.IContactDetailView)) Or _ 
      oViewInterfaces.Contains(GetType(Act.UI.ICompanyDetailView)) Or _ 
      oViewInterfaces.Contains(GetType(Act.UI.IGroupDetailView)) Or _ 
      oViewInterfaces.Contains(GetType(Act.UI.IOpportunityDetailView)) Then 
      IsViewDetailView = True
    End If
    Abbruch:
  End Function
  Private Shared Function IsTabPageWithTable(oTab As Act.UI.TabPage.ActTabPage)
    
    IsTabPageWithTable = False
    
    If oTab Is Nothing Then
      GoTo Abbruch
    End If
    
    Select Case oTab.Name
      Case "activitiesTab", "historyTab", "notesTab", "libraryTab", "opportunityTab", "groupsTab", "contactsTab", "secondaryTab", "productsTab","contactAssociationTab"
        IsTabPageWithTable = True
      Case  "webContextTab"
 
      Case Else

    End Select
    Abbruch:
  End Function
  Private Class TableSetting 
    Inherits ErrorHandling.BaseErrorMessage
    
    Private m_sName As String
    Private m_sDisplayName As String
    Private m_oColumns As System.Collections.Generic.List(Of ColumnSetting)
    
    Public Sub New ()
      MyBase.New()
      
      m_sName = String.Empty
      m_sDisplayName = String.Empty
      m_oColumns = New System.Collections.Generic.List(Of ColumnSetting)
      
    End Sub
    Public Sub New(sName As String, sDisplayName As String)
      Me.New()
      
      m_sName = sName
      m_sDisplayName = sDisplayName
    End Sub
    Public Property Name As String
      Get
        Return m_sName
      End Get
      Set(value As String)
        m_sName = value
      End Set
    End Property 
    Public Property DisplayName As String
      Get
        Return m_sDisplayName
      End Get
      Set(value As String)
        m_sName = value
      End Set
    End Property 
    Public ReadOnly Property Columns As System.Collections.Generic.List(Of ColumnSetting)
      Get 
        Return m_oColumns
      End Get
    End Property
    Public ReadOnly Property ColumnsSettingString() As String
      Get
        Dim i As Integer
        Dim oSettingString As System.Text.StringBuilder
        oSettingString = New System.Text.StringBuilder
        For i = 0 To m_oColumns.Count - 1
          If i &gt; 0 Then
            oSettingString.Append(";")
          End If
          oSettingString.Append(m_oColumns.Item(i).SettingString)
        Next
        Return oSettingString.ToString
      End Get
    End Property

    Public Function TryReadColumnsSettings(oFieldNames As system.Collections.ArrayList, oColumnSizes As system.Collections.ArrayList) As Boolean

      Dim i As Integer
      Dim oCol As ColumnSetting

      TryReadColumnsSettings = False
      ClearError
      
      m_oColumns.Clear
      
      For i = 0 To oFieldNames.Count - 1
        oCol = New ColumnSetting(oFieldNames.Item(i), oColumnSizes.Item(i), String.Empty)
        m_oColumns.Add(oCol)
      Next
    
      TryReadColumnsSettings = True
      Abbruch:
    End Function
    Public Function TryReadColumnsSettings(oColumnHelper As Act.Shared.Windows.Forms.FlexGridColumnHelper) As Boolean

      Dim i As Integer
      Dim oCol As ColumnSetting

      TryReadColumnsSettings = False
      ClearError
      
      m_oColumns.Clear
      
      If oColumnHelper Is Nothing Then
        SetError("Es wurde kein ColumnHelper übergeben.")
        GoTo Abbruch
      End If
      If oColumnHelper.CurrentColumns Is Nothing Then
        For i = 0 To oColumnHelper.DefaultColumnInfo.Length - 1
          oCol = New ColumnSetting(oColumnHelper.DefaultColumnInfo(i).propertyName, oColumnHelper.DefaultColumnInfo(i).colWidth, oColumnHelper.DefaultColumnInfo(i).descriptor.Description)
          m_oColumns.Add(oCol)
        Next
      Else
        For i = 0 To oColumnHelper.CurrentColumns.Length - 1
          oCol = New ColumnSetting(oColumnHelper.CurrentColumns(i).propertyName, oColumnHelper.CurrentColumns(i).colWidth, oColumnHelper.CurrentColumns(i).descriptor.Description)
          m_oColumns.Add(oCol)
        Next
      End If
    
      TryReadColumnsSettings = True
      Abbruch:
    End Function
    Public Function TryReadColumnsSettings(oColumnHelper As Act.Framework.ComponentModel.Dashboard.OppColumnHelper) As Boolean

      TryReadColumnsSettings = False
      ClearError
      
      m_oColumns.Clear
      
      If oColumnHelper Is Nothing Then
        SetError("Es wurde kein ColumnHelper übergeben.")
        GoTo Abbruch
      End If
      If oColumnHelper.FieldNames Is Nothing Or oColumnHelper.ColumnSizes Is Nothing Then
        SetError("Es wurden keine FieldNames oder ColumnSizes gefunden.")
        GoTo Abbruch
      End If
      Dim i As Integer
      Dim oCol As ColumnSetting
      Dim oFieldDescriptor As ACT.Framework.MutableEntities.MutableEntityFieldDescriptor
      Dim sDescription As String
      
      For i = 0 To oColumnHelper.ColumnSizes.Length - 1
        oFieldDescriptor = Act.Framework.ComponentModel.Dashboard.OppColumnHelper.GetFieldDescriptorFromName(m_oactapp.actframework.opportunities, oColumnHelper.FieldNames(i))
        If oFieldDescriptor Is Nothing Then
          SetError("Es konnte nicht der FieldDescriptor für das Feld '{0}' gefunden werden.", oColumnHelper.FieldNames(i))
          GoTo Abbruch
        End If
        oCol = New ColumnSetting(oColumnHelper.FieldNames(i), oColumnHelper.ColumnSizes(i), oFieldDescriptor.DisplayName)
        m_oColumns.Add(oCol)
      Next
    
      TryReadColumnsSettings = True
      Abbruch:
    End Function
  End Class
  Private Class ColumnSetting
    
    Private m_sName As String
    Private m_sDisplayName As String
    Private m_lWidth As Integer
    
    Public Sub New ()
      m_sName = String.empty
      m_sDisplayName = String.Empty
      m_lWidth = 100
    End Sub
    Public Sub New(sName As String, lWidth As String, sDisplayName As String)
      m_sName = sName
      m_sDisplayName = sDisplayName
      m_lWidth = lWidth
    End Sub
    Public Property Name As String
      Get
        Return m_sName
      End Get
      Set(value As String)
        m_sName = value
      End Set
    End Property 
    Public Property DisplayName As String
      Get
        Return m_sDisplayName
      End Get
      Set(value As String)
        m_sName = value
      End Set
    End Property 
    Public Property Width As Integer
      Get
        Return m_lWidth
      End Get
      Set(value As Integer)
        m_lWidth = value
      End Set
    End Property 
    Public ReadOnly Property SettingString() As String
      Get
        Return String.Format("!{0};{1}", m_sName, m_lWidth)
      End Get
    End Property
  End Class
  Private Class ViewSetting 
    Inherits ErrorHandling.BaseErrorMessage

    Protected m_sTypeOfView As String
    Protected m_sTitle As String
    
    Protected m_oTables As System.Collections.Generic.List(Of TableSetting)

    Public Sub New ()
      MyBase.New()
      m_sTypeOfView = String.Empty
      m_sTitle = String.Empty
      
      m_oTables = New System.Collections.Generic.List(Of TableSetting)
    End Sub

    Public Overridable Function TryInit(oView As System.Windows.Forms.Form) As Boolean
      Return True
    End Function
   
    &lt;System.ComponentModel.Category("Act! Ansicht")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Titel")&gt; _
    Public ReadOnly Property Title As String
      Get
        Return m_sTitle
      End Get
    End Property
    &lt;System.ComponentModel.Category("TabGrids")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Tabellen")&gt; _
    Public ReadOnly Property Tables As System.Collections.Generic.List(Of TableSetting)
      Get
        Return m_oTables
      End Get
    End Property    
    Protected Function GetSettingStringFromTableName(TableName As String) As String
      Dim i As Integer
      Dim sText As String
      
      For i = 0 To m_oTables.Count - 1
        If String.Compare(TableName, m_oTables.item(i).name, True) = 0 Then
          sText = m_oTables.item(i).ColumnsSettingString
          If String.IsNullOrEmpty(sText) Then
            sText = "nicht geladen"
          End If
          Return sText
        End If
      Next
      Return "nicht gefunden"
      
    End Function
    Protected Function TryToGetMemberFromObject(ByVal oObject As Object, ByVal sMemberName As String, ByVal oMemberType As System.Reflection.MemberTypes, ByVal oReturnType As System.Type, ByRef oReturnMember As System.Reflection.MemberInfo, ByRef oReturnValue As Object) As Boolean
      Dim aMember() As System.Reflection.MemberInfo
      Dim oValue As Object

      Dim oCurrentType As Type
      Dim bMemberFound As Boolean
      Dim oProp As System.Reflection.PropertyInfo
      Dim oField As System.Reflection.FieldInfo
    
    
      TryToGetMemberFromObject = False
    
      oCurrentType = oObject.GetType
 
      While Not oCurrentType Is GetType(System.Object)
        ' Try
        aMember = oCurrentType.GetMember(sMemberName, oMemberType, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
        oReturnValue = Nothing
        Select Case aMember.Length
          Case 0
          ' Nicht gefunden, nichts machen
          Case 1
            Select Case aMember(0).MemberType
              Case Reflection.MemberTypes.Property
                oProp = CType(aMember(0), System.Reflection.PropertyInfo)
                Try
                  oValue = oProp.GetValue(oObject, Nothing)
                Catch ex As Exception
                  setError(ex, "Beim Ermitteln des Wertes für die Eigenschaft '{0}' ist ein Fehler aufgetreten.", oProp.Name)
                  GoTo Abbruch
                End Try
                If oReturnType.IsInterface Then
                  If New ArrayList(oValue.GetType.GetInterfaces).Contains(oReturnType) = False Then
                    SetError("Der Type von der Property '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oProp.PropertyType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                Else
                  If Not oReturnType.IsAssignableFrom(oProp.PropertyType)  Then
                    SetError("Der Type von der Property '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oProp.PropertyType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                End If
              Case Reflection.MemberTypes.Field
                oField = CType(aMember(0), System.Reflection.FieldInfo)
                oValue = oField.GetValue(oObject)
              
                If oReturnType.IsInterface Then
                  If New ArrayList(oField.FieldType.GetInterfaces).Contains(oReturnType) = False Then
                    SetError("Der Type vom Field '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oField.FieldType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                Else
                  If Not oReturnType.IsAssignableFrom(oField.FieldType)  Then
                    SetError("Der Type vom Field '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oField.FieldType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                End If
              Case Else
                SetError("Der Membertype '{0}' für das Member '{1}' wird nicht unterstützt.", aMember(0).MemberType.ToString, sMemberName)
                GoTo Abbruch
            End Select
          Case Else
            SetError("Es wurden mehr als ein Member mit dem Namen '{0}' am Objekt vom Typ '{1}' gefunden.", sMemberName, oCurrentType.ToString)
            GoTo Abbruch
        End Select
        '   Catch ex As Exception
        '    seterror(ex, "Es ist ein Fehler beim Ermitteln des Members '{0}' im Object vom Typ '{1}' aufgetreten.", sMemberName, oObject.GetType.ToString)
        '   GoTo Abbruch
        'End Try
        oCurrentType = oCurrentType.BaseType
      End While
      If bMemberFound = False Then
        SetError("Es wurde kein Member mit dem Namen '{0}' im Objekt vom Type '{1}' gefunden.", sMemberName, oObject.GetType.ToString)
        GoTo Abbruch
      End If
      TryToGetMemberFromObject = True
    
      Abbruch:
    
    End Function
    Private Function TryGetMethodInfo(typeStart As System.Type, MethodName As String, BindingAttr As System.Reflection.BindingFlags, ByRef oMethodInfo As System.Reflection.MethodInfo) As Boolean

      Dim typeCurrent As system.Type
      typeCurrent = typeStart
      Do
        ' MsgBox(typeCurrent.ToString &amp; " " &amp; MethodName)
        oMethodInfo = typeCurrent.GetMethod(MethodName, BindingAttr)
        If oMethodInfo Is Nothing Then
          If Not typeCurrent.BaseType Is Nothing Then
            typecurrent = typeCurrent.BaseType
          End If
        Else
          Return True
        End If
      Loop Until typeCurrent.BaseType Is Nothing
      Return False      
      
    End Function

  End Class
  Private Class ListViewSetting 
    Inherits ViewSetting
    
    Public Sub New ()
      MyBase.New()
    End Sub
    Public Overrides Function TryInit(oView As System.Windows.Forms.Form) As Boolean
           
      Dim bTry As Boolean = False
      ClearError
      
      Dim oValue As Object
      Dim oMember As System.Reflection.MemberInfo
      Dim i As Integer
      
      Dim oTabControl As ACT.UI.TabPage.ActTabControl
      Dim sFieldNameACTTabControl As String = "Tabs"
      Dim oTabPage As ACT.UI.TabPage.ActTabPage
      Dim oGridTabPage As Act.UI.TabPage.GridTabPage
      Dim oData As System.Collections.ArrayList
      
      Dim sTableName As String
      Dim oTable As TableSetting

      m_sTypeOfView = oView.GetType.ToString
      m_sTitle = CType(oView, System.Windows.Forms.Form).Text

      sTableName = oView.GetType.tostring
      oTable = New TableSetting(sTableName, oView.Text)

      Select Case oView.GetType.ToString
        Case "Act.UI.OpportunityView.OpportunityListView"
          If TryToGetMemberFromObject(oView, "columnsHelper", system.Reflection.MemberTypes.Field, GetType(Act.Framework.ComponentModel.Dashboard.OppColumnHelper), oMember, oValue) = False Then
            GoTo Abbruch
          End If
          If oTable.TryReadColumnsSettings(CType(oValue, Act.Framework.ComponentModel.Dashboard.OppColumnHelper)) = False Then
            SetError(oTable, "Es konnte nicht die Spaltenauswahl von der Registerkarte '{0}' bestimmt werden.", oTable.DisplayName)
            GoTo Abbruch
          End If          
        Case Else
          
          Dim m_sFieldNamefieldNames As String = "fieldNames"
          Dim m_sFieldNamecolumnSizes As String = "columnSizes"
          Dim oFieldNames As System.Collections.ArrayList
          Dim oColumnSizes As System.Collections.ArrayList
          
          Dim oMemberInfo As system.Reflection.MemberInfo
          If TryToGetMemberFromObject(oView, m_sFieldNamefieldNames, system.Reflection.MemberTypes.Field, GetType(System.Collections.ArrayList), oMemberInfo, oFieldNames) = False Then
            SetError(oTable, "Es konnte nicht die Spaltenauswahl von der Listenansicht '{0}' bestimmt werden.", oTable.DisplayName)
            GoTo Abbruch
          End If
          If TryToGetMemberFromObject(oView, m_sFieldNamecolumnSizes, system.Reflection.MemberTypes.Field, GetType(System.Collections.ArrayList), oMemberInfo, oColumnSizes) = False Then
            SetError(oTable, "Es konnte nicht die Spaltenauswahl von der Listenansicht '{0}' bestimmt werden.", oTable.DisplayName)
            GoTo Abbruch
          End If          
          
          If oTable.TryReadColumnsSettings(oFieldNames, oColumnSizes) = False Then
            SetError(oTable, "Es konnte nicht die Spaltenauswahl von der Listenansicht '{0}' bestimmt werden.", oTable.DisplayName)
            GoTo Abbruch
          End If
      End Select
      m_oTables.Add(oTable)
      
      bTry = True
      Abbruch:
      Return bTry
    End Function
    &lt;System.ComponentModel.Category("Tabelle")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Spaltenauswahl")&gt; _
    Public ReadOnly Property FieldList As String
      Get
        Return  m_oTables.item(0).ColumnsSettingString
      End Get
    End Property
  End Class
  Private Class DetailViewSetting 
    Inherits ViewSetting
    
    Public Sub New ()
      MyBase.New()
    End Sub
    Public Overrides Function TryInit(oView As System.Windows.Forms.Form) As Boolean
           
      TryInit = False
      ClearError
      
      Dim oValue As Object
      Dim oMember As System.Reflection.MemberInfo
      Dim i As Integer
      
      Dim oTabControl As ACT.UI.TabPage.ActTabControl
      Dim sFieldNameACTTabControl As String = "Tabs"
      Dim oTabPage As ACT.UI.TabPage.ActTabPage
      Dim oGridTabPage As Act.UI.TabPage.GridTabPage
      Dim oData As System.Collections.ArrayList
      
      Dim sTableName As String
      Dim oTable As TableSetting

      m_sTypeOfView = oView.GetType.ToString
      m_sTitle = CType(oView, System.Windows.Forms.Form).Text

      If Not TryToGetMemberFromObject(m_oACTApp.CurrentView, sFieldNameACTTabControl, Reflection.MemberTypes.Field, GetType(ACT.UI.TabPage.ActTabControl), oMember, oValue) Then
        GoTo Abbruch
      End If
      oTabControl = CType(oValue, ACT.UI.TabPage.ActTabControl)
      For Each oTabPage In oTabControl.ActTabPages
        If IsTabPageWithTable(oTabPage) Then
          For i = 0 To oTabPage.Controls.Count - 1
            If GetType(Act.UI.TabPage.GridTabPage).IsAssignableFrom(oTabpage.Controls(i).GetType)  Then
              oGridTabPage = CType(oTabpage.Controls(i), Act.UI.TabPage.GridTabPage)
              oData = oGridTabPage.GetObjectData
              
              sTableName = oTabPage.Name
              If sTableName = "groupsTab" And i &gt; 0 Then
                sTableName = "companiesTab"
              End If
              oTable = New TableSetting(sTableName, oTabPage.Text)
              m_oTables.Add(oTable)
              
              If oData Is Nothing Then
                SetError("Es wurden keine Daten über die Methode GetObjectData geliefert.")
                GoTo Abbruch
              End If
              If oData.Count = 0  Then
                
                ' ContactOpportunityPage, CompanyOpportunityPage, GroupOpportunityPage 
                Dim oStriker As Act.UI.Opportunities.OpportunityTabStriker
                Dim oOppColumnHelper As Act.Framework.ComponentModel.Dashboard.OppColumnHelper
                
                If TryToGetMemberFromObject(oGridTabPage, "striker", System.Reflection.MemberTypes.Field, GetType(Act.UI.Opportunities.OpportunityTabStriker), oMember, oValue) = False Then
                  GoTo Abbruch
                End If
                If oValue Is Nothing Then
                  SetError("Es konnte nicht die Spaltenauswahl von der Registerkarte '{0}' bestimmt werden ({1}).", oTable.DisplayName, "no striker")
                  GoTo Abbruch
                End If
                oStriker = CType(oValue, Act.UI.Opportunities.OpportunityTabStriker)
                If TryToGetMemberFromObject(oStriker, "columnsHelper", system.Reflection.MemberTypes.Field, GetType(Act.Framework.ComponentModel.Dashboard.OppColumnHelper), oMember, oValue) = False Then
                  GoTo Abbruch
                End If
                If oValue Is Nothing Then
                  'SetError("Es konnte nicht die Spaltenauswahl von der Registerkarte '{0}' bestimmt werden ({1}).", oTable.DisplayName, "no columnHelper")
                  
                Else
                  oOppColumnHelper = CType(oValue, Act.Framework.ComponentModel.Dashboard.OppColumnHelper)
                  If oTable.TryReadColumnsSettings(oOppColumnHelper) = False Then
                    SetError(oTable, "Es konnte nicht die Spaltenauswahl von der Registerkarte '{0}' bestimmt werden.", oTable.DisplayName)
                    GoTo Abbruch
                  End If
                End If
              Else
                Dim oColumnHelper As ACT.Shared.Windows.Forms.FlexGridColumnHelper
                
                If TryToGetMemberFromObject(oGridTabPage, "gridColumnHelper", System.Reflection.MemberTypes.Field, GetType(ACT.Shared.Windows.Forms.FlexGridColumnHelper), oMember, oValue) = False Then
                  GoTo Abbruch
                End If
                If oValue Is Nothing Then
                  SetError("Es konnte nicht die Spaltenauswahl von der Registerkarte '{0}' bestimmt werden ({1}).", oTable.DisplayName, "no gridColumnHelper")
                  GoTo Abbruch
                End If
                
                oColumnHelper = CType(oValue, ACT.Shared.Windows.Forms.FlexGridColumnHelper)
                  
                If oTable.TryReadColumnsSettings(oColumnHelper) = False Then
                  SetError(oTable, "Es konnte nicht die Spaltenauswahl von der Registerkarte '{0}' bestimmt werden.", oTable.DisplayName)
                  GoTo Abbruch
                End If
              End If
            End If

          Next
          
       
        End If

      Next
      '          Select Case oTabPage.Name
      '            Case "activitiesTab"
      '            Case "historyTab"
      '            Case "notesTab"
      '            Case "libraryTab"
      '            Case "opportunityTab"
      '            Case "groupsTab"
      '            Case "contactsTab"
      '            Case "companiesTab"
      '            Case "secondaryTab"
      '            Case "productsTab"
      '            Case "contactAssociationTab"
      '          End Select
      '          Dim sDump As System.Text.StringBuilder
      '          sDump = New System.Text.StringBuilder
      '          sDump.AppendLine(String.Format("{0}", m_oACTApp.CurrentView))
      '          sDump.AppendLine("TabName" &amp; vbtab &amp; "ColumnsWithSizes")          'sDump.Appendline(oTabPage.Name &amp; vbtab &amp; GetColumnsAndSizesFromTab(oTabPage))
      '          Try
      '            System.Windows.Forms.Clipboard.Clear
      '            System.Windows.Forms.Clipboard.SetText(sDump.ToString)
      '          Catch ex As Exception
      '            Msgbox(ex.message)
      '          End Try   
      ' Msgbox(sDump.ToString)
      TryInit = True
      Abbruch:  
    End Function
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Tätigkeiten")&gt; _
    Public ReadOnly Property ActivityTab As String
      Get
        Return  GetSettingStringFromTableName("activitiesTab")
      End Get
    End Property
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Historien")&gt; _
    Public ReadOnly Property HistoryTab As String
      Get
        Return  GetSettingStringFromTableName("historyTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Notizen")&gt; _
    Public ReadOnly Property NoteTab As String
      Get
        Return GetSettingStringFromTableName("notesTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Verkaufschancen")&gt; _
    Public ReadOnly Property OpportunityTab As String
      Get
        Return GetSettingStringFromTableName("opportunityTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Gruppen")&gt; _
    Public ReadOnly Property GroupTab As String
      Get
        Return GetSettingStringFromTableName("groupsTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Firmen")&gt; _
    Public ReadOnly Property CompanyTab As String
      Get
        Return GetSettingStringFromTableName("companiesTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Kontakte")&gt; _
    Public ReadOnly Property ContactTab As String
      Get
        Return GetSettingStringFromTableName("contactsTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Sekundärkontakte")&gt; _
    Public ReadOnly Property SecondaryContactTab As String
      Get
        Return GetSettingStringFromTableName("secondaryTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Beziehungen")&gt; _
    Public ReadOnly Property AssociationTab As String
      Get
        Return GetSettingStringFromTableName("contactAssociationTab")
      End Get
    End Property    
    &lt;System.ComponentModel.Category("Registerkarten")&gt; _
    &lt;System.ComponentModel.DisplayNameAttribute("Produkte")&gt; _
    Public ReadOnly Property ProducrtTab As String
      Get
        Return GetSettingStringFromTableName("productsTab")
      End Get
    End Property    
  End Class

  Private Class FormPropertyGrid 
    Inherits System.Windows.Forms.Form
    
    Private Sub ButtonOK_Click(sender As System.Object, e As System.EventArgs) Handles ButtonOK.Click

    End Sub

    Private Sub ButtonCancel_Click(sender As System.Object, e As System.EventArgs) Handles ButtonCancel.Click

    End Sub

    Private Sub PropertyGrid_Click(sender As System.Object, e As System.EventArgs) Handles PropertyGrid.Click

    End Sub
    
    Public Property SelectedObject As Object
      Get
        Return PropertyGrid.SelectedObject
      End Get
      Set(value As Object)
        PropertyGrid.SelectedObject = value
      End Set
    End Property

    Public Sub SetLabelRatio(value As Double)
      ' 2 -&gt; 50%
      ' 4 -&gt; 25%
      
      Dim oValue As Object
      Dim oPropertyGridView As System.Windows.Forms.Control
      Dim oFieldInfo As system.Reflection.FieldInfo
      Dim oMethodInfo As system.Reflection.MethodInfo
      
      oValue = Me.PropertyGrid.GetType.GetField("gridView", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic).GetValue(Me.PropertyGrid)
      If ovalue Is Nothing Then
        Exit Sub
      End If
      oPropertyGridView = CType(oValue, System.Windows.Forms.Control)
      
      If oPropertyGridView Is Nothing Then
        Exit Sub
      End If
      
      oMethodInfo = oPropertyGridView.GetType.GetMethod("MoveSplitterTo", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
      
      If oMethodInfo Is Nothing Then
        Exit Sub
      End If
      
      oFieldInfo = oPropertyGridView.GetType.GetField("labelRatio", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Public)
      If oFieldInfo Is Nothing Then
        Exit Sub
      End If      
      oFieldInfo.SetValue(oPropertyGridView, value)
      
      oPropertyGridView.Invalidate
      
    End Sub

    
    Public Sub New()

      ' Dieser Aufruf ist für den Designer erforderlich.
      InitializeComponent()

      ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.

    End Sub

    Protected Overrides Sub Finalize()
      MyBase.Finalize()
    End Sub
    
    'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    &lt;System.Diagnostics.DebuggerNonUserCode()&gt; _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
      Try
        If disposing AndAlso components IsNot Nothing Then
          components.Dispose()
        End If
      Finally
        MyBase.Dispose(disposing)
      End Try
    End Sub

    'Wird vom Windows Form-Designer benötigt.
    Private components As System.ComponentModel.IContainer

    'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    'Das Bearbeiten ist mit dem Windows Form-Designer möglich.  
    'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    &lt;System.Diagnostics.DebuggerStepThrough()&gt; _
    Private Sub InitializeComponent()
      Me.ButtonOK = New System.Windows.Forms.Button()
      Me.ButtonCancel = New System.Windows.Forms.Button()
      Me.PropertyGrid = New System.Windows.Forms.PropertyGrid()
      Me.SuspendLayout()
      '
      'ButtonOK
      '
      Me.ButtonOK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles)
      Me.ButtonOK.DialogResult = System.Windows.Forms.DialogResult.OK
      Me.ButtonOK.Location = New System.Drawing.Point(43, 327)
      Me.ButtonOK.Name = "ButtonOK"
      Me.ButtonOK.Size = New System.Drawing.Size(75, 23)
      Me.ButtonOK.TabIndex = 1
      Me.ButtonOK.Text = "OK"
      Me.ButtonOK.UseVisualStyleBackColor = True
      '
      'ButtonCancel
      '
      Me.ButtonCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
      Me.ButtonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel
      Me.ButtonCancel.Location = New System.Drawing.Point(266, 327)
      Me.ButtonCancel.Name = "ButtonCancel"
      Me.ButtonCancel.Size = New System.Drawing.Size(75, 23)
      Me.ButtonCancel.TabIndex = 2
      Me.ButtonCancel.Text = "Abbruch"
      Me.ButtonCancel.UseVisualStyleBackColor = True
      '
      'PropertyGrid
      '
      Me.PropertyGrid.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
        Or System.Windows.Forms.AnchorStyles.Left) _
        Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles)
      Me.PropertyGrid.Location = New System.Drawing.Point(12, 12)
      Me.PropertyGrid.Name = "PropertyGrid"
      Me.PropertyGrid.Size = New System.Drawing.Size(360, 309)
      Me.PropertyGrid.TabIndex = 0
      '
      'FormPropertyGrid
      '
      Me.AcceptButton = Me.ButtonOK
      Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
      Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
      Me.CancelButton = Me.ButtonCancel
      Me.ClientSize = New System.Drawing.Size(384, 362)
      Me.Controls.Add(Me.PropertyGrid)
      Me.Controls.Add(Me.ButtonCancel)
      Me.Controls.Add(Me.ButtonOK)
      Me.MinimumSize = New System.Drawing.Size(300, 300)
      Me.Name = "FormPropertyGrid"
      Me.ShowInTaskbar = False
      Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent
      Me.Text = "Title"
      Me.ResumeLayout(False)

    End Sub
    Friend WithEvents ButtonOK As System.Windows.Forms.Button
    Friend WithEvents ButtonCancel As System.Windows.Forms.Button
    Friend WithEvents PropertyGrid As System.Windows.Forms.PropertyGrid

  End Class
  
  Private Shared m_sScriptName As String
  Private Shared m_oError As ErrorHandling.BaseErrorMessage
  Private Shared m_oACTApp As Act.UI.ActApplication

  Private Shared Sub Dummy</SourceCode>
        <IconName>ACTOptimum_AutoData</IconName>
    </AutoDataMenu>
</ACTOptimumItems>