Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Изменение цвета от #000000 до #FFFFFF с заданным шагом   Найти похожие ветки 

 
azl ©   (2007-01-02 19:55) [0]

Зравствуйте, уважаемые мастера. С Новым Годом.

Подскажите, пожалуйста, как можно изменять цвет фона (цвет формы) в диапазоне от #000000 до #FFFFFF с заданным шагом?
Мне нужно выбрать цвет, задать шаг и по нажатию на кнопку менять цвет в зависимости от шага.
Как задавать этот шаг?

Спасибо.


 
Eraser ©   (2007-01-02 20:00) [1]

> [0] azl ©   (02.01.07 19:55)

var
 iStep: Integer;
...
 if Color + iStep < $FFFFFF then
   Color := Color + iStep
 else
   Color := 0;


 
vrem   (2007-01-02 20:02) [2]

[1] Eraser ©   (02.01.07 20:00)
Ну и что это будет? плавное покраснение, а потом?


 
Virgo_Style ©   (2007-01-02 20:07) [3]

vrem   (02.01.07 20:02) [2]
А это уже философия. ТЗ соответствует? Соответствует. Ну и все %-)


 
vrem   (2007-01-02 20:21) [4]

Давнишний исходник нашёл:
Процедура позволяет обойти все цвета спектра плавно,
для этого процедуре нужно давать числа плавно изменяющиеся от 0 и до 6,
на выходе получаем
нечто вида [b,g,r] = [0,0.3333,1]
умножаем на "цветность", например на 255, округляем и получаем -
[0,85,255] - некий цвет.
с фотошопом совпадает :)

type
 colex = array[1..3] of extended;

procedure cveme(gde:extended; var bgr:colex);
var dr:extended;
begin //даёт цвет из спектра по номеру = gde
//gde=0..5.999 = 6 штук короче - по два на каждую часть спектра
gde:=gde-6*int(gde/6); //0 тоже считается
if gde<0 then gde:=gde+6; dr:=gde-int(gde); gde:=int(gde)+1;
if gde<=2 then begin if gde=1 then begin bgr[1]:=1; bgr[2]:=0; bgr[3]:=dr; exit; end;
bgr[1]:=1-dr; bgr[2]:=0; bgr[3]:=1; exit; end else
if gde<=4 then begin if gde=3 then begin bgr[1]:=0; bgr[2]:=dr; bgr[3]:=1; exit; end;
bgr[1]:=0; bgr[2]:=1; bgr[3]:=1-dr; exit; end else begin
if gde=5 then begin bgr[1]:=dr; bgr[2]:=1; bgr[3]:=0; exit; end;
bgr[1]:=1; bgr[2]:=1-dr; bgr[3]:=0; exit;
end;
end;


 
azl ©   (2007-01-02 20:32) [5]

Eraser, спасибо. Только вот что-то не совсем правильно получается. присваиваю iStep := 1; При этом ни зеленый, ни красный цета не появляются. Или это так и дожно быть?


 
Anatoly Podgoretsky ©   (2007-01-02 20:44) [6]

> vrem  (02.01.2007 20:02:02)  [2]

Потом будет позеленение и так далее.


 
Anatoly Podgoretsky ©   (2007-01-02 20:45) [7]

> azl  (02.01.2007 20:32:05)  [5]

Не может этого быть


 
azl ©   (2007-01-02 21:02) [8]

Может. Пишу вот так:

procedure TForm1.Button1Click(Sender: TObject);
var
iStep: Integer;
begin
 iStep := 1;
if Color + iStep < $FFFFFF then
  Color := Color + iStep
else
  Color := 0;
end;


Красный и зеленый цвет не появляется.


 
Eraser ©   (2007-01-02 21:20) [9]

> [8] azl ©   (02.01.07 21:02)

появляются, просто ты не успеваешь их заметить :)


 
Eraser ©   (2007-01-02 21:21) [10]

лучше подобные "игры" с цветом реализовывать через RGB представление... так понятнее будет.


 
Германн ©   (2007-01-03 01:21) [11]

Ещё один повод вспомнить RxLib :-)


 
azl ©   (2007-01-03 12:12) [12]

Германн ©

> Ещё один повод вспомнить RxLib :-)

А с этого момента поподробнее, пожалуйста.


 
Германн ©   (2007-01-03 14:29) [13]


> azl ©   (03.01.07 12:12) [12]
>
> Германн ©
>
> > Ещё один повод вспомнить RxLib :-)
>
> А с этого момента поподробнее, пожалуйста.
>

Смотри в RxLib:
{ Gradient fill procedure - displays a gradient beginning with a chosen    }
{ color and ending with another chosen color. Based on TGradientFill       }
{ component source code written by Curtis White, cwhite@teleport.com.      }
procedure GradientFillRect(Canvas: TCanvas; ARect: TRect; StartColor,
 EndColor: TColor; Direction: TFillDirection; Colors: Byte);


 
Tirael ©   (2007-01-03 15:07) [14]


> azl ©   (02.01.07 20:32) [5]
>
> Eraser, спасибо. Только вот что-то не совсем правильно получается.
>  присваиваю iStep := 1; При этом ни зеленый, ни красный
> цета не появляются. Или это так и дожно быть?

ты крут! при iStep=1 чтоб всю палитру пройти нужно 16777215 раз баттон надавить )


 
azl ©   (2007-01-03 16:49) [15]

Tirael,
Дело в том, что при iStep = 1 больше всего разных цветов появляется. Если, например, iStep := 100, то появляется только черный цвет и больше не меняется.


 
vrem   (2007-01-03 17:01) [16]

azl, а моя процедура чем не хороша?


 
azl ©   (2007-01-03 17:12) [17]

vrem, я  попытался с ней работать, у меня чего-то не получилось. Если тебя не затруднит, приведи, пожалуйста, пример использования.


 
Tifon ©   (2007-01-03 17:20) [18]

А почему бы не задавать цвет просто через RGB с помощью таймер, например в таймере наращивая 3 переменных изменять цвет или одну или две и такой подборкой подобрать себе нужные цвета?


 
azl ©   (2007-01-03 17:35) [19]

Да я бы с удовольствием, но дали мне задачку вот какую:
Написать программу, которая бы выводила на требуемом фоне, введенный с клавиатуры текст, заданного цвета.
Предусмотреть:
- Задание начального цвета текста и фона (От #000000 до #FFFFFF);
- Выбор изменяемого цвета (Будем изменять цвет фона или текста);
- Выбор шрифта для текста, поле для введения текста;
- Шаг изменения цвета;
- Кнопка, которая будет изменять выбранный цвет с введенным шагом;
Кнопка вывода текущего цвета текста и шага.

Одним словом - дурдом.


 
Eraser ©   (2007-01-03 17:51) [20]

> [19] azl ©   (03.01.07 17:35)


> - Кнопка, которая будет изменять выбранный цвет с введенным
> шагом;

сделай изменение нажатием кнопки только одного из каналов цвета, и соответственно сам выбор канала цвета сделай при помощи тех же radio buttons. И будет тебе счастье )


 
Zeqfreed (gentoo)   (2007-01-03 17:56) [21]

Aha. Use HSL model and be happy. Sorry for english.


 
azl ©   (2007-01-03 18:33) [22]

Eraser,
Вариант, спасибо. но не знаю, правильно ли это будет. Я сделал следующим образом:

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 TrackBar1.Position;
 Color := rgb(Color,TrackBar1.Position,Color);
 Caption := ColorToString(Color);
end;


TrackBar взял для пробы, чтобы кнопку не тыкать постоянно.


 
vrem   (2007-01-03 18:49) [23]

[22] azl ©   (03.01.07 18:33)
Добавь на пустую форму кнопку и вот её код

procedure TForm1.Button1Click(Sender: TObject);
type
colex = array[1..3] of extended;

procedure cveme(gde:extended; var bgr:colex);
var dr:extended;
begin //даёт цвет из спектра по номеру = gde
//gde=0..5.999 = 6 штук короче - по два на каждую часть спектра
gde:=gde-6*int(gde/6); //0 тоже считается
if gde<0 then gde:=gde+6; dr:=gde-int(gde); gde:=int(gde)+1;
if gde<=2 then begin if gde=1 then begin bgr[1]:=1; bgr[2]:=0; bgr[3]:=dr; exit; end;
bgr[1]:=1-dr; bgr[2]:=0; bgr[3]:=1; exit; end else
if gde<=4 then begin if gde=3 then begin bgr[1]:=0; bgr[2]:=dr; bgr[3]:=1; exit; end;
bgr[1]:=0; bgr[2]:=1; bgr[3]:=1-dr; exit; end else begin
if gde=5 then begin bgr[1]:=dr; bgr[2]:=1; bgr[3]:=0; exit; end;
bgr[1]:=1; bgr[2]:=1-dr; bgr[3]:=0; exit;
end;
end;

var i,j,k,m:integer; sp:colex;
de:extended;
begin
j:=256; //длина спектра
k:=255; //цветность
m:=50; //толщина спектра :)

for i := 1 to j do begin
cveme((6/j)*i,sp);
form1.Canvas.MoveTo(i,1);
form1.Canvas.Pen.Color:=
trunc(sp[1]*k)*65536+
trunc(sp[2]*k)*256+trunc(sp[3]*k);
form1.Canvas.LineTo(i,m);
end;

end;



Страницы: 1 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.055 c
4-1158067773
max1991
2006-09-12 17:29
2007.01.21
Икрнка в трее


2-1167197615
New_Lamer
2006-12-27 08:33
2007.01.21
Странная ошибка


2-1167192241
Marat
2006-12-27 07:04
2007.01.21
преобразовать в дату


15-1167230461
Calibr
2006-12-27 17:41
2007.01.21
HTML + Delphi?


3-1162412746
Gunek
2006-11-01 23:25
2007.01.21
Как выполнить запрос на выборку данных из нескольких таблиц?