oscript-simple-gui icon indicating copy to clipboard operation
oscript-simple-gui copied to clipboard

Особенности поведения в Linux(Ubuntu)

Open alex-bob-lip opened this issue 5 years ago • 4 comments

При выполнении примера example-all-components.os из поставки релиза библиотеки версии 1.1.2.3 замечены следующие особенности:

  1. Падение скрипта на строках ПолеСоСписком = Данные; и ПолеСписка = Данные2. После комментирования этих строк окно открывается.
  2. В открывшемся окне все заголовки полей обрезаны примерно до 7 символов.

Для устранения ошибки 1 я заменил код сеттера свойства СписокВыбора на следующий: `set { ArrayList KeysAndValues = new ArrayList(); foreach (ScriptEngine.HostedScript.Library.KeyAndValueImpl _keyAndValue in value) { IValue _key = _keyAndValue.Key; IValue _value = _keyAndValue.Value; KeysAndValues.Add(new ScriptEngine.HostedScript.Library.KeyAndValueImpl(_key, _value)); }

            if (this._formFieldType == (int)EnumFormFieldType.ListBox)
            {
                this._choiceList = value;
                
                ((ListBox)this._item).DataSource = KeysAndValues;
                ((ListBox)this._item).DisplayMember = "Key";
                ((ListBox)this._item).ValueMember = "Value";           
            }
            else
            {
                this._choiceList = value;
                
                ((ComboBox)this._item).DataSource = KeysAndValues;
                ((ComboBox)this._item).DisplayMember = "Key";
                ((ComboBox)this._item).ValueMember = "Value";
            }`

Кстати, насколько я понимаю логику работы объекта КлючИЗначение, Ключ это строка, а значение может быть и числом и датой и объектом. Поэтому отображать надо ключ, а в Значение при выборе помещать Значение. В текущей версии библиотеки наоборот.

Эффект из пункта 2 устранился (в результате экспериментов и плясок с бубном) после комментирования строки в конструкторе _label = new Label(); _panelTitleContainer.Controls.Add(_label); _label.AutoSize = true; // следующая строка мешает //_label.Dock = DockStyle.Fill;

alex-bob-lip avatar Aug 23 '19 05:08 alex-bob-lip

1.1

        /// <summary>
        /// Установка / получение списка выбора для ПолеСоСписком, ПолеСписка
        /// </summary>
        /// <value>Соответствие</value>
        [ContextProperty("СписокВыбора", "ChoiceList")]
        public ScriptEngine.HostedScript.Library.MapImpl ChoiceList
        {
            get { return this._choiceList; }
            set
            {
                BindingSource bindingSource = new BindingSource();
                bindingSource.DataSource = ChoiceList;

                if (this._formFieldType == (int)EnumFormFieldType.ListBox)
                {
                    this._choiceList = value;
                    ((ListBox)this._item).BeginUpdate();
                    ((ListBox)this._item).DataSource = new BindingSource(ChoiceList, null);
                    ((ListBox)this._item).DisplayMember = "Value";
                    ((ListBox)this._item).ValueMember = "Key";
                    ((ListBox)this._item).EndUpdate();
                }
                else
                {
                    this._choiceList = value;
                    ((ComboBox)this._item).BeginUpdate();
                    ((ComboBox)this._item).DataSource = new BindingSource(ChoiceList, null);
                    ((ComboBox)this._item).DisplayMember = "Value";
                    ((ComboBox)this._item).ValueMember = "Key";
                    ((ComboBox)this._item).EndUpdate();
                }
            }
        }

DisplayMember - Получает или задает свойство отображения для объекта ListControl.(Inherited from ListControl)

ValueMember - Получает или задает путь к свойству, которое должно использоваться как фактическое значение для компонентов в элементе управления ListControl.(Inherited from ListControl)

Мы подаем: ScriptEngine.HostedScript.Library.MapImpl - Соответствие. У соответствия есть

  1. Ключ - Ключ устанавливаемого элемента. Уникальное
  2. Значение - Значение устанавливаемого элемента

Поэтому и идет связка: ValueMember = Ключ DisplayMember = Значение

1.2 В реализации .net под Windows это не вызывает ошибку. Можно попробовать убрать _label.AutoSize = true; оставив _label.Dock = DockStyle.Fill Надо проверять, пока не моделировал.

ret-Phoenix avatar Aug 23 '19 13:08 ret-Phoenix

Кстати, а почему вообще для СпискаВыбора используется Соответствие, а не список значений как в 1с?

alex-bob-lip avatar Aug 26 '19 11:08 alex-bob-lip

Исторически сложилось.

ret-Phoenix avatar Aug 26 '19 12:08 ret-Phoenix

:) Понятно. Хотя и неправильно. Я еще в #68 комментарий добавил.

alex-bob-lip avatar Aug 26 '19 13:08 alex-bob-lip