Прикол с TColor [Решено]

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

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

Ответить
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Прикол с TColor [Решено]

Сообщение leo_bsv »

Создаю форму, кидаю кнопку, в обработчике пишу:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var  x: TColor;
begin
  Button1.Color:=x;
end;

нажимаю на кнопку - цвет меняется... :?:
почему?
как сделать чтобы не менялся?
предопределить?
каким образом если это свойство типа?
Последний раз редактировалось leo_bsv 02.01.2012 12:06:55, всего редактировалось 1 раз.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

leo_bsv писал(а):как сделать чтобы не менялся?

Задать начальное значение глобально?
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Little_Roo писал(а):Задать начальное значение глобально?

хотя-бы... обычно при определении переменной типа она имеет какое-то начальное значение... -1 например или nil... тут же какая-то фигня... ( создаёшь переменную типа TColor и каждый раз разное начальное значение чтоли? Т.е. не nil не что-то другое а именно значение? Разное? :shock: а мне нужно вот отследить изменялась ли переменная - как это сделать с переменной этого типа :?:
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

ну есть функции по извлечению из TColor значения компонент RGB и наоборот присваиванию TColor цвета закодированному в компонентах RGB.
Если хочешь, чтобы цвет не менялся, то сделай так:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
const
   R= <значение от 0 до 255>; G= <значение от 0 до 255>; B= <значение от 0 до 255>;
var  x: TColor;
begin
  x:= RGBToColor(R, G, B);
  Button1.Color:=x;
end;


ну и собственно если нужно отследить изменения в цвете, запоминай компоненты и сравнивай их извлекая текущие значения из TColor с помощью функций function Blue(rgb: TColor): BYTE; function Green(rgb: TColor): BYTE; function Red(rgb: TColor): BYTE;

короче вот ссылка: http://wiki.lazarus.freepascal.org/Colors
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

leo_bsv в FPC локальные переменные не инициализируются. Если нужно - указываем конкретное значение:

Код: Выделить всё

var  x: TColor = 0;
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Mr.Smart писал(а):leo_bsv в FPC локальные переменные не инициализируются. Если нужно - указываем конкретное значение:

Код:
var x: TColor = 0;


я в курсе, как указать конкретное значение если код не такой как выше а такой:

Код: Выделить всё

type
  MyType=record
    x:TColor;
    ...
  end;   
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

MyType.x := Button1.Color в начале тела метода?
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

ок.... помогло принудительное присвоение 0 нужному свойству типа TColor перед заполнением переменной типа, т.е. значение установлено в ноль перед предполагаемыми изменениями, т.о. если не изменилось, то остаётся 0.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Код: Выделить всё

type
  MyType=record
    x:TColor;
    y: Integer;
    ...
  end;   

var
  R: MyType = (x: 0; y: -1; ...);

Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Mr.Smart писал(а):Mr.Smart » 02.01.2012 12:06:40

тип используется для описания свойства класса, у типа 18 свойств различных типов... использовать предложенный вами способ не представляется возможным :) но всё-равно спасибо что напомнили :)
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Поставьте инициируемые свойства в начале:

Код: Выделить всё

type pp1 = record
       F1, F2, F3, F4, F5, F6: Integer;
     end;

var pp2: pp1 = (F1: 2; F2: 1);       
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

leo_bsv писал(а):у типа 18 свойств различных типов... использовать предложенный вами способ не представляется возможным

Как вариант:

Код: Выделить всё

FillByte(r,SizeOf(MyType),0);
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

sign писал(а):Поставьте инициируемые свойства в начале:

Супер! Спасибо! То что надо!

Добавлено спустя 1 минуту 41 секунду:
Mr.Smart писал(а):Как вариант:

да... тоже вариант :)
Ответить