Добрый день, участники комьюнити.

Исходные данные:
Есть тулбар на форме редактирования. Есть ActionMenu привязанный к тулбару. Есть ActionMenuItem привязанный к ActionMenu. Есть ImageList с картинками и привязанный к ActionMenu. В общем есть всё что нужно для нормального отображения тулбара.

В скрипте происходит смена картинок у ActionMenuItem (amiTemp.ImageName = 'Pic1' или amiTemp.ImageName = 'Pic2' в зависимости от условий).

Проблема в том, что смена картинок не происходит пока не наведешь мышку на кнопку.
Что делать ума не приложу.
Что пробовал:
-BeginUpdate/EndUpdate/Prepare у Toolbar, ActionMenu, ActionMenuItem.
Ничего не помогло.

Вся надежда на вас.
Направьте меня на путь истинный :smile:.

Нравится

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

Здравствуйте.
Сейчас в COM для ActionMenu не вынесена функция Invalidate.
Но Вы можете инициировать ее вызов "передернув" свойство IsVisible у ActionMenuItem после смены ImageName:

ActionMenuItem.IsVisible = false;
ActionMenuItem.IsVisible = true;

Евгений, попробовал изменять ImageName в зависимости от значения типа контрагента при обработке события dlDataOnDatasetDataChange. Всё получилось. Пример скрипта:

	if (FieldName == 'AccountTypeID') {
		if (DataField.Value == '{3EAC7195-607B-4DAC-A832-8954E3201031}') {
			amiTest.ImageName = 'IncidentID';
		} else {
			amiTest.ImageName = 'TaskID';
		}
	}

Возможно, Вам тоже стоит попробовать обработку какого-либо другого события.

Отлично!
Спасибо, Александр.
Всё заработало.

Олег, возможно вы делаете обработку на OnPrepare, а возможно дело и в бинарниках. У меня 3.3.2.114. Я делаю обработку когда карточка уже открыта, с определенным интервалом.
Забегая чуть вперед скажу - это отслеживание состояния свободных линий IP телефона.

Проверял на 3.3.2.104.

"Евгений Либин" написал:Олег, возможно вы делаете обработку на OnPrepare

нет

"Лабьяк Олег Игоревич" написал:при обработке события dlDataOnDatasetDataChange

Больше нигде изменений не вносил. Карточка тоже уже открыта, при изменении типа меняется картинка в меню.

Видимо, у Вас не совсем такая реализация.

Вот что сейчас получилось

		if (Connector.Attributes('LiTPhone').GetLineStatus(Lines[i].Tag))
			Lines[i].ImageName = 'ActiveLine'
		else
			Lines[i].ImageName = 'InactiveLine';
 
//ранее  этого куска не было
		Lines[i].BeginUpdate();
		Lines[i].IsVisible  = false
		Lines[i].IsVisible  = true;
		Lines[i].EndUpdate()
 

Евгений, я понимаю, что сам код такой же. Вопрос в том, когда (во время какого события) он выполняется. Возможно, в Вашем случае обойтись без нижнего блока не получится.

Да, скорее всего вы правы.
Самое главное что решение найдено :wink:

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