Конвертация формата данных
Модератор: Модераторы
Конвертация формата данных
Переменная типа Utf8String хранит следующую строку: '$00A1CCA1' но компилятор говорит что ожидается тип TGraphicsColor.
Как конвертировать Utf8String в TGraphicsColor и обратно?
Как конвертировать Utf8String в TGraphicsColor и обратно?
Интересно вы вопросы задаёте. Приходится применять методы телепатии...
Код: Выделить всё
:=StrToInt('$00A1CCA1');Нет не интегер...
Пардон, думал будет понятно, поясню. Грубо говоря вот так:
Компилятор говорит:
Пардон, думал будет понятно, поясню. Грубо говоря вот так:
Код: Выделить всё
var s:utf8string;
...
s:='$00A1CCA1';
...
ColorButton1.ButtonColor:=s;Компилятор говорит:
unit1.pas(136,48) Error: Incompatible type for arg no. 1: Got "UTF8String", expected "TGraphicsColor"
По вашему это что?
Код: Выделить всё
type
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;Mr.Smart писал(а):По вашему это что?Код: Выделить всё
type
TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
Как конвертировать эти форматы?
Написанное выше просто для примера, строка типа "$00A1CCA1" на самом деле попадает в переменную s при разборке другой строки которая содержит не только цвет. Позволяет же инспектор объектов Лазаруса представление цвета в виде строки типа "$00A1CCA1"...
КАК КОНВЕРТИРОВАТЬ ЭТИ ФОРМАТЫ ДАННЫХ?!!!!
Я вас не понимаю! Зачем проявлять свои эмоции?
Я вам показал как можно это сделать!
Добавлено спустя 3 минуты 23 секунды:
Обратно соответственно так:
или так:
Я вам показал как можно это сделать!
Код: Выделить всё
var
s: UTF8String;
begin
s:='$00A1CCA1';
ColorButton1.ButtonColor:=StrToInt(s);
end;Добавлено спустя 3 минуты 23 секунды:
Обратно соответственно так:
Код: Выделить всё
s:='$'+IntToHex(ColorButton1.ButtonColor,8)или так:
Код: Выделить всё
s:=Format('$%.8x',[ColorButton1.ButtonColor]);Mr.Smart, извини, действительно работает. Ты написал я попробовал - опять ошибка... может я напутал, случайно написал обратную конвертацию.
Немного усложнилась задача.
Возможно ли (следовательно как) во первых ColorButton1.ButtonColor разобрать на каналы (RGBA) в отдельные интегерные переменные (для сохранения в файл), а во вторых имея эти 4 интегерные переменные вернуть цвет в кнопку?
Возможно ли (следовательно как) во первых ColorButton1.ButtonColor разобрать на каналы (RGBA) в отдельные интегерные переменные (для сохранения в файл), а во вторых имея эти 4 интегерные переменные вернуть цвет в кнопку?
Код: Выделить всё
var
s: string;
rgba: array [1..4] of Byte;
begin
s := IntToHex(ColorButton1.ButtonColor,8);
rgba[1] := strtoint(copy(s, 1, 2));
rgba[2] := strtoint(copy(s, 3, 2));
rgba[3] := strtoint(copy(s, 5, 2));
rgba[4] := strtoint(copy(s, 7, 2));
Обратное преобразование, думаю, и так понятно.
VirtUX
Зачем так извращаться?
В модуле Graphics есть функции вида:
Зачем так извращаться?
В модуле Graphics есть функции вида:
Код: Выделить всё
function Blue(rgb: TColor): BYTE;
function Green(rgb: TColor): BYTE;
function Red(rgb: TColor): BYTE;Тогда уж лучше

а еще лучше
чуть не забыл: обратное преобразование
Код: Выделить всё
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte);а еще лучше
Код: Выделить всё
function TColorToFPColor(const c: TColor): TFPColor;Код: Выделить всё
TFPColor = record
red,green,blue,alpha : word;
end;чуть не забыл: обратное преобразование
Код: Выделить всё
function FPColorToTColor(const FPColor: TFPColor): TColor;- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Код: Выделить всё
uses
Graphics, ...
...
procedure TForm1.Button1Click(Sender:TObject);
var s:utf8string;
begin
s:='$00A1CCA1';
Form1.Color := StringToColor(s);
end;У вас нет необходимых прав для просмотра вложений в этом сообщении.
Нет немного не то, исходной данной является свойство ColorButton1.ButtonColor, а не стринговая переменная. Как её преобразовать в 4 интегерные переменные (цветовые каналы + альфа), и как в неё вернуть цвет из этих 4 переменных?
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
qivi писал(а):Нет немного не то, исходной данной является свойство ColorButton1.ButtonColor, а не стринговая переменная. Как её преобразовать в 4 интегерные переменные (цветовые каналы + альфа), и как в неё вернуть цвет из этих 4 переменных?
Хм... Дык если так, то VirtUX же все уже написал...
Код: Выделить всё
uses
FPimage, ...
...
var
Form1: TForm1;
TheColor: tFPColor;
cR,cG,cB,cA: integer;
...
procedure TForm1.Button1Click(Sender:TObject);
begin
TheColor:= TColorToFPColor(ColorButton1.ButtonColor);
Label1.Caption:= 'R = '+inttostr(TheColor.red);
Label2.Caption:= 'G = '+inttostr(TheColor.green);
Label3.Caption:= 'B = '+inttostr(TheColor.blue);
Label4.Caption:= 'A = '+inttostr(TheColor.alpha);
cR:= TheColor.red; // и т.д.
// сохраняем в файл...
end;
procedure TForm1.Button2Click(Sender:TObject);
begin
TheColor.red:= ...// считываем из файла...
// ... и т.д.
ColorButton2.ButtonColor:= FPColorToTColor(TheColor);
end; А каков формат типов данных TGraphicsColor и TColor? Я имею ввиду последовательность каналов RGBA или ABGR или как ещё?
Что то я эмперическим путём умудрился запутаться, у меня свой велосипед деления по каналам так что вроде как и без разницы, но для "чистоты" хотелосьбы не отклоняться от истины.
Что то я эмперическим путём умудрился запутаться, у меня свой велосипед деления по каналам так что вроде как и без разницы, но для "чистоты" хотелосьбы не отклоняться от истины.
