Как из строки с наименованием цвета (например clGold) получить RGB-составляющие цвета
Если мою просьбу изложить коротко, без предисловия, то нужно из строки с наименованием цвета (например clGold) получить RGB-составляющие цвета.
А если не кратко, то...
Pascal ABC.NET
В справке (Стандартные модули\Модуль GraphABC) есть таблица "Цветовые константы".
Цветовые константы представлены в виде некоего "наименования цвета". Например, у цвета "золотой" имя "clGold".
Эти цветовые константы были скопированы из справки и вставлены в Word в таблицу. То есть, имеется ячейка таблицы в Word-е, в которой хранится значение (наименование) цвета. Захотел залить ячейку цветом, наименование которого в ячейке хранится.
Написал небольшую программу, в которую (в переменную "с") ввожу скопированное из ячейки Word-а значение. Программа получает из наименования Цвета его RGB-значения и записывает это в текстовый файл. Далее в модуле GraphABC рисуется небольшой прямоугольник и заливается Цветом.
В Word-е на ленте разместил кнопку, к которой привязал маленькую программу, написанную на VBA. Программка читает из текстового файла строку с RGB-значением Цвета, получает из строки RGB-значения Цвета. И заливает ячейку Цветом.
Так все работает.
Вот программа:
##
uses System.Windows.Forms, GraphABC;
SetWindowSize(250, 120);
SetWindowCaption('цвета и r g b - значения');
//var c := Clipboard.GetText; // переменная - цвет !!! получаем из буфера обмена
{Это не работает. Компилятор ругается "Нельзя преобразовать тип string к
System.Drawing.Color"}
//var cl := c.ToColor;
var c: color := clGold;
var r := GetRed(c); // Возвращает красную составляющую цвета
var g := GetGreen(c); // Возвращает зеленую составляющую цвета
var b := GetBlue(c); // Возвращает синюю составляющую цвета
println(c); // печать названия цвета
var color: string := r.ToString + ', ' + g.ToString + ', ' + b.ToString;
WriteAllText('d:\PABCWork.NET\color.txt', color);
print(r, g, b); // печать r g b - значения цвета
setpenwidth(1); // установили толщину пера = 1
setpencolor(clGray); // установили цвет пера
moveTo(50, 50); // перо в точку 50, 50
lineTo(200, 50); // линия до точки 200, 50
lineto(200, 100); // линия до точки 200, 100
lineto(50, 100); // линия до точки 50, 100
lineto(50, 50); // линия до точки 50, 50
floodfill(75, 75, c); // от точки 75, 75 заливаем цветом
=== Захотел исключить из цепочки действий (копирование из ячейки Word-а значения Цвета → вставка этого значения в программу) второе звено цепочки - вставку. Пусть программа получает строку со значением цвета из буфера обмена. Получать-то она получает, но дальше при попытке получить из строки значение GetRed(c) начинает ругаться "Нельзя преобразовать тип string к System.Drawing.Color"
Может быть кто-то поможет справиться с этим местом:
##
uses System.Windows.Forms, GraphABC;
SetWindowSize(250, 120);
SetWindowCaption('цвета и r g b - значения');
var c := Clipboard.GetText; // переменная - цвет !!! получаем из буфера обмена
{Это не работает. Компилятор ругается "Нельзя преобразовать тип string к
System.Drawing.Color"}
//var cl := c.ToColor;
//var c: color := clGold;
var r := GetRed(c); // Возвращает красную составляющую цвета
var g := GetGreen(c); // Возвращает зеленую составляющую цвета
var b := GetBlue(c); // Возвращает синюю составляющую цвета
println(c); // печать названия цвета
var color: string := r.ToString + ', ' + g.ToString + ', ' + b.ToString;
WriteAllText('d:\PABCWork.NET\color.txt', color);
Ответы (2 шт):
Нашел (подсказали) решение Цвет получить из названия можно так:
var c := system.Drawing.Color.FromName(Clipboard.GetText)
##
uses System.Windows.Forms, GraphABC;
SetWindowSize(450, 120);
SetWindowCaption('цвета и r g b - значения');
// clGold
var c := system.Drawing.Color.FromName(Clipboard.GetText);// переменная
- цвет !!! получаем из буфера обмена
print('c ', c, '**'); println(c.GetType().FullName);
var r := GetRed(c); // Возвращает красную составляющую цвета
var g := GetGreen(c); // Возвращает зеленую составляющую цвета
var b := GetBlue(c); // Возвращает синюю составляющую цвета
// печать названия цвета
var color: string := r.ToString + ', ' + g.ToString + ', ' + b.ToString;
WriteAllText('d:\PABCWork.NET\color.txt', color);
print(r, g, b); // печать r g b - значения цвета
setpenwidth(1); // установили толщину пера = 1
setpencolor(clGray); // установили цвет пера
moveTo(50, 50); // перо в точку 50, 50
lineTo(200, 50); // линия до точки 200, 50
lineto(200, 100); // линия до точки 200, 100
lineto(50, 100); // линия до точки 50, 100
lineto(50, 50); // линия до точки 50, 50
floodfill(75, 75, c); // от точки 75, 75 заливаем цветом
В VBA тоже есть цветовые константы
PascalABC.Net: clGold
VBA: rgbGold
Хотя за полное их соответствие не ручаюсь
Поменять стандартную палитру
Возможно вам просто не нравятся стандартные цвета заливки в приложениях MSOffice. Вот ссылочка на справку как поменять палитру.
Кстати для формирования собственной палитры/цветовой темы/схемы советую инструмент от GitHub Prizm, он построен на цветовой схеме HSLuv (так для общего развития)
Перегонка цветов все же нужна
Нужна, то нужна, но как минимум не оптимально гонять еще одну программу кроме Word, каждый раз как понадобится цвет. Тем более, что у вас есть полный список названий цветов. Проще взять все данные цветов разом и сделать из них цветовые константы в VBA
Конвертирование из PascalABC.Net
uses System.Drawing;
uses GraphABC;
uses System.Text;
uses System.Windows.Forms;
begin
// начальнный ввод как список строк, но можно считывать из файла или как-то по другому.
var names := new List<string>(Arr('clGold', 'clGreen', 'clBlack'));
Println(names);
var sb := new StringBuilder();
foreach var name in names do
begin
var c := Color.FromName(name.Substring(2)); // обрезается начало имени, префикс "cl"
//в VBA и не только значение цвета хранится в виде лонгинт.
var long_val := GetBlue(c) * 65536 + GetGreen(c) * 256 + GetRed(c);
//К сожалению, константе нельзя присвоить вычисляэмую функцию
sb.AppendFormat('Public Const {0} = {1} '' RGB({2}, {3}, {4})' + END_OF_LINE_SYMBOL,
name, long_val, GetRed(c), GetGreen(c), GetBlue(c));
end;
WriteAllText('MyColorCollection.bas', sb.ToString);
end.
На выходе получаем файл со списком констант, который можно сразу импортировать в VBA (Редактор VBA: Файл - Импортировать файл)
У меня получился такой файл для импорта
Public Const clGold = 55295 ' RGB(255, 215, 0)
Public Const clGreen = 32768 ' RGB(0, 128, 0)
Public Const clBlack = 0 ' RGB(0, 0, 0)