Возникла задача изменить настраиваемое окно редактирования в БП таким образом, чтобы при допустимом количестве символов, превышающем 250, в окне формировался не 'TextDataControl' (как реализовано в базовой версии), а 'MemoDataControl'.
Решается задача модификацией логики function BuildDataControl(Window, ParentComponent, DatasetLink, DataField) сервиса wnd_CustomEditWindowScript.
Данная функция динамически создает и отрисовывает компоненты в настраиваемом окне редактирования.
Для решения задачи необходимо заменить функцию function BuildDataControl на приведенную ниже:

function BuildDataControl(Window, ParentComponent, DatasetLink, DataField) {
        var ComponentType = GetComponentTypeByDataField(DataField);
        if (IsEmptyStr(ComponentType)) {
                return;
        }
        var DataFieldName = DataField.Name;
        var ComponentName = GetControlName(Window, DataFieldName);
                if ((ComponentType == 'TextDataControl')&& (DataField.TextLength > 250)){
                 var Component = Window.CreateComponent('MemoDataControl', ComponentName);
                 Component.Height = 45;
                } else{
                var Component = Window.CreateComponent(ComponentType, ComponentName);
                }
        Component.DataFieldName = DataFieldName;
        Component.DatasetLink = DatasetLink;
        ParentComponent.Add(Component);
        Component.AlignHorizontal = alhClient;
        return Component;
}

Результат будет иметь вид:

/system/files/2_61.png

Нравится

Поделиться

0 комментариев
Показать все комментарии

Здравствуйте!
Появилась проблема с отображением поля MemoDataControl.

В дизайнере задаю высоту 33.

Если сохранить вкладку, на которой находится поле активной, т.е чтобы она открывалась сразу, то с размером поля все в порядке.

Но если активной сделать первую вкладку, то поле растягивается.

Подскажите в чем может быть дело.

Нравится

3 комментария

Светлана, поле Тариф и MemoDataControl находятся в одном FrameGroup?

Проблема обсуждалась: http://www.community.terrasoft.ru/forum/topic/5636

Олег, изменила свойство для MemoDataControl в скрипте и заработало корректно, спасибо! :)

Показать все комментарии

В версии 3.3.2.193 потребовалось проделать этот трюк. Есть MemoDataControl, и захотелось мне прикрутить к нему своё popup-меню. Чтоб всякие хитрые вставки делать и модификации выделенного многострочного текста. Благо есть такой пункт в свойствах, PopupMenu. А не тут-то было! Создал ActionMenu, создал пару ActionMenuItem-ов, указал ActionMenu в свойстве MemoDataControl... И ничего не произошло. Как выскакивало стандартное серое меню (вырезать-копировать-вставить), так и выскакивает.

Наверное, я не умею правильно пользоваться этим свойством, или это свойство у memo-контрола несёт лишь декоративные функции?

Нравится

2 комментария

Анатолий Васильевич, в версии 3.3.2 не реализована возможность использовать PopupMenu для MemoDataControl. Данная возможность будет доступна в версии 3.4.0

"Бондарь Наталия" написал:

Спасибо, Наталья!
Буду знать. Вот как выходит: это свойство выведено в настройки MemoDataControl-а (и многих других контролов) давным-давно, даже в 3.2.1 есть. И тоже существует декоративно, за редкими исключениями... Правда и используется редко.

В 3.4.0 стоит прибавить и свойство, возвращающее выделенную часть текста в MemoDataControl-е с номерами символов от-до выделенного фрагмента. Тогда свойство будет полноценным. Ведь надо будет знать, к чему относится появившееся контекстное меню!

Показать все комментарии

Заметил такую особенность: если в карточке редактирования (BaseDBEdit), разместить несколько закладок, расположить MemoDataControl на одной закладке, установить ему AlignHorizontal как alhClient, перейти на другую закладку и сохранить карточку, то при повторном ее открытии указанный control выравнивается как alhLeft, несмотря на то, что значение свойства остается прежним (alhClient). Возможно, кто-то еще сталкивался с подобной проблемой и нашел ее решение.

Нравится

2 комментария

Олег, данная проблема нам известна и будет исправлена в следующих версиях продуктов Terrasoft.

Что касается текущих версий, то в том случае, если карточка редактирования содержит одну страницу, достаточно, чтобы объект MemoDataControl не был единственным на фрейме. Если же страниц несколько, можно при переходе на страницу с MemoDataControl в скрипте изменить его свойство AlignHorizontal:

function pgDataOnChangeActivePage(Pages) {
	if (Pages.ActivePage.Name == 'pgPage') {
		MyWindow.ComponentsByName('MemoDataControl').AlignHorizontal = alhLeft;
		MyWindow.ComponentsByName('MemoDataControl').AlignHorizontal = alhClient;
	}
	...
}

Пока другого способа обойти я не нашёл.

Олег, спасибо за предложенное решение.

Показать все комментарии

Возможно ли, каким-либо образом, создать пользовательское поле схожее с Memo?

Нравится

5 комментариев

Думаю вряд ли.

Скорее всего нет, так для этого не предусмотрен механизм отображения пользовательских полей на карточке.

В Вашем случае проще будет организовать похожий механизм. Создайте на карточке компонент Memo и скрывайте/показывайте его (соответственно нужно будет изменять размер карточки) при изменении поля Тип. Получается не очень гибко, но может решить Вашу задачу.

"Александр Кравчук" написал:Получается не очень гибко, но может решить Вашу задачу.

Это как раз единственное, что приходит с ходу в голову, но хотелось бы как-то более человечным способом решить вопрос.:confused:

Без изменения ядра системы никак не получится такое сделать (создать пользовательское поле схожее с Memo), нужно в пользовательские поля добавлять новую функциональность по работе не только с обычными компонентами (TextDataControl, IntegerDataControl, FloatDataControl и т.д.), а еще и с MemoDataControl. Вероятней всего это будет дополнительная опция для пользовательских полей с типом "Строка".

Я приму во внимание Ваше пожелание и постараюсь реализовать в следующих версиях.

"Александр Кравчук" написал:Я приму во внимание Ваше пожелание и постараюсь реализовать в следующих версиях.

спс :twisted:

Показать все комментарии

В том случае если Вы импортируете многострочные данные в поле MemoDataContorol ("Описание") и в результате импорта они отображаются одной строкой, то эта проблема связана с особенностями Excel.
А именно, для того, чтобы данные переносились на другую строку, необходимы два знака: знак переноса строки и переноса каретки. В свою очередь в MS Excel не предусмотрен знак переноса каретки, поэтому после импорта данных из этого файла, данные помещаются все в одну строку. Для того, чтобы переносить данные на другую строку, необходимо в конфигурации программным образом добавить этот знак переноса каретки.

Для этого Вам нужно открыть сервис scr_DataflowExcelUtils.
В методе GetMemoryDatasetByDataflowItemNodeFromExcel после строки Stop = false; необходимо прописать следующее:

if (DataField.FieldType == dftString) {
Value = Value.replace(/\n/gi, '\r\n');
}

Сохраните внесенные изменения, перезапустите рабочее приложение Terrasoft CRM и протестируйте работоспособность системы.

Желаю удачи!

С уважением,
Мельникова Екатерина

Нравится

Поделиться

0 комментариев
Показать все комментарии