Конвертация формата данных

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Конвертация формата данных

Сообщение qivi » 19.12.2010 20:04:37

Переменная типа Utf8String хранит следующую строку: '$00A1CCA1' но компилятор говорит что ожидается тип TGraphicsColor.

Как конвертировать Utf8String в TGraphicsColor и обратно?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Конвертация формата данных

Сообщение Mr.Smart » 19.12.2010 20:08:27

Интересно вы вопросы задаёте. Приходится применять методы телепатии...
Код: Выделить всё
:=StrToInt('$00A1CCA1');
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Конвертация формата данных

Сообщение qivi » 19.12.2010 20:21:57

Нет не интегер...
Пардон, думал будет понятно, поясню. Грубо говоря вот так:

Код: Выделить всё
var s:utf8string;
...
s:='$00A1CCA1';
...
ColorButton1.ButtonColor:=s;



Компилятор говорит:
unit1.pas(136,48) Error: Incompatible type for arg no. 1: Got "UTF8String", expected "TGraphicsColor"
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Конвертация формата данных

Сообщение Mr.Smart » 19.12.2010 20:56:26

По вашему это что?
Код: Выделить всё
type
  TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Конвертация формата данных

Сообщение qivi » 19.12.2010 21:08:41

Mr.Smart писал(а):По вашему это что?
Код: Выделить всё
type
  TGraphicsColor = -$7FFFFFFF-1..$7FFFFFFF;


Как конвертировать эти форматы?

Написанное выше просто для примера, строка типа "$00A1CCA1" на самом деле попадает в переменную s при разборке другой строки которая содержит не только цвет. Позволяет же инспектор объектов Лазаруса представление цвета в виде строки типа "$00A1CCA1"...

КАК КОНВЕРТИРОВАТЬ ЭТИ ФОРМАТЫ ДАННЫХ?!!!!
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Конвертация формата данных

Сообщение Mr.Smart » 19.12.2010 21:14:12

Я вас не понимаю! Зачем проявлять свои эмоции?
Я вам показал как можно это сделать!
Код: Выделить всё
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
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Конвертация формата данных

Сообщение qivi » 19.12.2010 21:22:27

Mr.Smart, извини, действительно работает. Ты написал я попробовал - опять ошибка... может я напутал, случайно написал обратную конвертацию.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Конвертация формата данных

Сообщение qivi » 11.01.2011 10:14:07

Немного усложнилась задача.
Возможно ли (следовательно как) во первых ColorButton1.ButtonColor разобрать на каналы (RGBA) в отдельные интегерные переменные (для сохранения в файл), а во вторых имея эти 4 интегерные переменные вернуть цвет в кнопку?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Конвертация формата данных

Сообщение VirtUX » 11.01.2011 12:17:48

Код: Выделить всё
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
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Конвертация формата данных

Сообщение Mr.Smart » 11.01.2011 18:15:00

VirtUX
Зачем так извращаться?
В модуле Graphics есть функции вида:
Код: Выделить всё
function Blue(rgb: TColor): BYTE;
function Green(rgb: TColor): BYTE;
function Red(rgb: TColor): BYTE;
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Конвертация формата данных

Сообщение VirtUX » 11.01.2011 20:44:07

Тогда уж лучше
Код: Выделить всё
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;
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Конвертация формата данных

Сообщение dunin » 12.01.2011 17:35:07

Код: Выделить всё
uses
  Graphics, ...
...
procedure TForm1.Button1Click(Sender:TObject);
  var s:utf8string;
begin
  s:='$00A1CCA1';
  Form1.Color := StringToColor(s);
end;


1.png
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Конвертация формата данных

Сообщение qivi » 13.01.2011 07:38:24

Нет немного не то, исходной данной является свойство ColorButton1.ButtonColor, а не стринговая переменная. Как её преобразовать в 4 интегерные переменные (цветовые каналы + альфа), и как в неё вернуть цвет из этих 4 переменных?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Конвертация формата данных

Сообщение dunin » 13.01.2011 09:41:19

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;     
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

Re: Конвертация формата данных

Сообщение qivi » 14.05.2012 21:12:40

А каков формат типов данных TGraphicsColor и TColor? Я имею ввиду последовательность каналов RGBA или ABGR или как ещё?
Что то я эмперическим путём умудрился запутаться, у меня свой велосипед деления по каналам так что вроде как и без разницы, но для "чистоты" хотелосьбы не отклоняться от истины.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: sts и гости: 222

Рейтинг@Mail.ru