gifts2017

Диалог выбора цвета с возможностью определения составляющих цвета RGB для УФ.

Опубликовал Вячеслав Фесенко (DO_WHILE_LOOP) в раздел Программирование - Работа с интерфейсом

Один из вариантов решения известной проблемы определения составляющих цвета RGB при использовании штатного диалога выбора цвета.

Стандартный типовой диалог выбора цвета предлагает выбор из цветов вида: элемент стиля, web-цвет и ввод числовых значений составляющих цвета RGB, при этом нет гарантии каким способом будет выбрано значение цвета пользователем. Составляющие цвета RGB имеются только в абсолютном виде цвета (при вводе составляющих цвета RGB вручную). Есть ряд задач в которых необходимо хранить и передавать именно составляющие цвета RGB, а не сам цвет как тип, для таких целей может пригодиться  предлагаемый вариант.

Возможности: 

Для быстроты и удобства использования пользователями цвет выбирается мышкой, так же имеется возможность (при необходимости) скопировать значения цвета в HEX и RGB кодировке в буфер обмена. Диалог выбора цвета реализован на управляемых формах, без использования ВК, обработка самодостаточная (в ней присутствует все необходимое для работы).

Возвращаемое значение: тип цвет в абсолютном виде, который можно разложить на составляющие RGB.

 

 P.S.

Пример подстановки текущего изменяемого цвета в диалог выбора цвета при его открытии:

//Процедуры и функции
&НаСервере
Функция ПолучитьЦветHEX(Знач Красный = 0, Знач Зеленый = 0, Знач Синий = 0) Экспорт

   
ЦветHEX = "";

   
ЦифрыHEX = "0123456789abcdef";


   
КрасныйHEX = "";

    Если
Красный <= 0 Тогда

       
КрасныйHEX = "00";

    Иначе

        Пока
Красный > 0 Цикл

           
КрасныйHEX = Сред(ЦифрыHEX, Красный % 16 + 1, 1) + КрасныйHEX;

           
Красный = Цел(Красный / 16) ;

        КонецЦикла;

    КонецЕсли;


   
ЗеленыйHEX = "";

    Если
Зеленый <= 0 Тогда

       
ЗеленыйHEX = "00";

    Иначе

        Пока
Зеленый > 0 Цикл

           
ЗеленыйHEX = Сред(ЦифрыHEX, Зеленый % 16 + 1, 1) + ЗеленыйHEX;

           
Зеленый = Цел(Зеленый / 16) ;

        КонецЦикла;

    КонецЕсли;


   
СинийHEX = "";

    Если
Синий <= 0 Тогда

       
СинийHEX = "00";

    Иначе

        Пока
Синий > 0 Цикл

           
СинийHEX = Сред(ЦифрыHEX, Синий % 16 + 1, 1) + СинийHEX;

           
Синий = Цел(Синий / 16) ;

        КонецЦикла;

    КонецЕсли;

   
ЦветHEX = "#" + ?(СтрДлина(КрасныйHEX) = 1, "0" + КрасныйHEX, КрасныйHEX) + ?(СтрДлина(ЗеленыйHEX) = 1, "0" + ЗеленыйHEX, ЗеленыйHEX) + ?(СтрДлина(СинийHEX) = 1, "0" + СинийHEX, СинийHEX);

    Возврат
ЦветHEX;

КонецФункции


//Обработчики событий
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

   
ТекстДиалогаВыбораЦвета  = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ТекстДиалогаВыбораЦвета").ПолучитьТекст();

   
ТекущийЦвет = Неопределено;

   
Параметры.Свойство("ТекущийЦвет", ТекущийЦвет);

    Если Не
ТекущийЦвет = Неопределено Тогда

       
Объект.ВыбранныйЦвет = ТекущийЦвет;

       
Красный     = ТекущийЦвет.Красный;
       
Зеленый     = ТекущийЦвет.Зеленый;
       
Синий       = ТекущийЦвет.Синий;

       
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name='color' value='#000000'", "name='color' value='" + ПолучитьЦветHEX(Красный, Зеленый, Синий) + "'");
       
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name='colorR' value='0'", "name='colorR' value='" + Строка(Красный) + "'");
       
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name='colorG' value='0'", "name='colorG' value='" + Строка(Зеленый) + "'");
       
ТекстДиалогаВыбораЦвета = СтрЗаменить(ТекстДиалогаВыбораЦвета, "name='colorB' value='0'", "name='colorB' value='" + Строка(Синий) + "'");

    КонецЕсли;

   
Объект.ДиалогВыбораЦвета = ТекстДиалогаВыбораЦвета;

КонецПроцедуры


//Обработчики команд
&НаКлиенте
Процедура ДиалогВыбораЦветаПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)

   
СоставляющиеВыбранногоЦвета = Элемент.Документ;

    Если
СоставляющиеВыбранногоЦвета = Неопределено Тогда Возврат; КонецЕсли;

   
colorR      = СоставляющиеВыбранногоЦвета.getElementById("colorR");
   
colorG      = СоставляющиеВыбранногоЦвета.getElementById("colorG");
   
colorB      = СоставляющиеВыбранногоЦвета.getElementById("colorB");

   
Красный     = ?(colorR = Неопределено, 0, colorR.Value);
   
Зеленый     = ?(colorG = Неопределено, 0, colorG.Value);
   
Синий       = ?(colorB = Неопределено, 0, colorB.Value);

   
Объект.ВыбранныйЦвет = Новый Цвет(Красный, Зеленый, Синий);

КонецПроцедуры

&НаКлиенте
Процедура КомандаОК(Команда)

   
Закрыть(Объект.ВыбранныйЦвет);

КонецПроцедуры

&НаКлиенте
Процедура КомандаОтмена(Команда)

   
Закрыть(Неопределено);

КонецПроцедуры

 

Пример вызова диалога выбора цвета:

//Процедуры и функции

&НаКлиенте
Процедура УстановитьНовыйЦветКлиент(Элемент, СтандартнаяОбработка)

   
Элемент_Имя     = Элемент.Имя;

   
ТекущийЦвет     = Объект[Элемент_Имя];

   
ТекПараметры    = Новый Структура("ТекущийЦвет", ТекущийЦвет);

   
ВыбранныйЦвет   = ОткрытьФормуМодально("Обработка.ИмяОбработки.Форма.ФормаДиалогаВыбораЦвета", ТекПараметры, ЭтаФорма);

    Если Не
ВыбранныйЦвет = Неопределено Тогда

       
Объект[Элемент_Имя] = ВыбранныйЦвет;

    КонецЕсли;

   
СтандартнаяОбработка = Ложь;

КонецПроцедуры

//Обработчики событий
&НаКлиенте
Процедура ИзменяемыйЦветНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

   
УстановитьНовыйЦветКлиент(Элемент, СтандартнаяОбработка);

КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер
82_ДиалогВыбораЦветаRGB_УФ 85
.epf 59,87Kb
30.07.15
85
.epf 59,87Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Яков Коган (Yashazz) 05.05.13 10:59
Недавно сталкивался с такой задачей. Нужная вещь. Если кому надо, могу подкинуть функцию преобразования из RGB в 16-ричный.
2. Владимир Безфамильный (kondi55) 04.01.14 23:52
Афигеть! Супер! Спасибо! Встроил, пользуюсь! С новым годом и Рождеством, Автор!
3. Вячеслав Фесенко (DO_WHILE_LOOP) 10.01.14 15:39
(2) kondi55,
Спасибо. Всех благ, с новым годом и Рождеством!
P.S. Добавил пример использования.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа