Zamiana RGB na TColor

0

Dzień dobry mam na formie trzy ScrollBar'y (min: 0, max: 255)
Ich zadaniem ma być zmienianie koloru formy.

Chciałem wiedzieć jak zamienić nasycenie trzech barw
(RGB) w formie zmiennych typu integer od 0 do 255 na jeden
integer który działał by tak samo jak TColor ?

Nie chodzi mi także o użycie jakieś funkcji w stylu RGBtoColor()
jeżeli taka jest, i też nie chodzi mi o takie rozwiązanie:

var
r, g, b: string;
begin
r := IntToHex(ScrollBar1.Position, 2);
g := IntToHex(ScrollBar2.Position, 2);
b := IntToHex(ScrollBar3.Position, 2);
Form1.Color := StrToInt('$' + b + g + r);
end;

...tylko żeby podstawić te zmienne do jakiegoś wzoru i żeby wyszedł
od razu właściwy TColor.

0

var
c: tcolor;
r, g, b :byte;
begin
c:=(b shl 16)+ (g shl 8)+ r;

0

TColor robisz funkcją RGB(R, G, B: Byte): COLORREF; jest to chyba Result:=(R shl 16) or (G shl 8) or B; w tym wypadku r:=Color shr 16; g:= color shr 8; b:= byte(Color);

[Dopisek]
Pomyliłem się... Kolor opysany przeze mnie jest zapisany RGB a powinien być BRG. pq Ma rację

0

ale jeden integer to to samo co jeden tColor...
to ja wiem :)

0

moim zdaniem jeden int64 to jeden tcolor a tak à propos:

tcolor:=rgb(red,green,blue);

i gitara

0

TColor ma identyczny zakres co integer, a funkcja RGB zwraca typ CARDINAL (coś jak integer tylko że liczby naturalne do $FFFFFF a integer całkowite)

0

var
c: tcolor;
r, g, b :byte;
begin
c:=(b shl 16)+ (g shl 8)+ r;

dzięki wszystkim, a o to co napisał pq właśnie mi chodziło :)

0

Kurde, nie zauważyłe mże pq napisał '+' zamiast 'or' a to duża różnica. $FF or $FF00 =$FFFF a $FF+$FF=$1FE. '+' jest błędem!

0

Kurde, nie zauważyłe mże pq napisał '+' zamiast 'or' a to duża różnica. $FF or $FF00 =$FFFF a $FF+$FF=$1FE. '+' jest błędem!

ale $ff + $ff00=$ffff więc gdzie błąd?

0

Tak od dłuższego czasu czytuję ten temat i nie wiem, dlaczego tak wszyscy kombinujecie. Jest funkcja, która z podanych składowych generuje TColor. Nazywa się RGB. A tak oto wygląda jej implementacja:

function RGB(r, g, b: Byte): COLORREF;
begin
Result := (r or (g shl 8) or (b shl 16));
end;

Przy czym COLORFEF = DWord = LongWord czyli liczba bez znaku, a TColor jest zdefiniowane jako typ okrojony:
TColor = -$7FFFFFFF-1..$7FFFFFFF;
Czyli typ całkowity (ze znakiem).
Szczerze mówiąc to nie wiem, dlaczego akurat tak zdefiniowano TColor, a nie tak jak to ma miejsce w Windowsie jako typ DWord z kanałami odpowiednio (patrząc od najmniej znaczącego bajtu) R, G, B, A (kanał Alpha - przezroczystość). (Teoretycznie pierwszy bajt od lewej może mieć wartości 00, 01 lub 02 i od tego zależy dopasowanie do palety systemowej, ale przy deklaracji DWord też mogłoby tak być...)
Jakby na to nie patrzeć to funkcja RGB zwraca tą samą wartość co przedstawione przez was sposoby. Więc po co się męczyć?

0

Więc po co się męczyć?

Może po to, żeby uniknąć wywoływania funkcji (zjada wszak troche czasu) a kodzik wpisac wprost w potrzebne miejsce...

1 użytkowników online, w tym zalogowanych: 0, gości: 1