Autor Téma: Delphi XE2 převod TColor na RGB  (Přečteno 4027 krát)

Offline Lister03

  • Příspěvků: 1
  • Karma: 0
Delphi XE2 převod TColor na RGB
« kdy: 16-06-2012, 02:49:59 »
Zdravím, může mi prosím někdo říct proč tento kód běží správně v Delphi 2010 ale v Delphi XE 2 to vrací jiné hodnoty ?

Je to funkce na rozklad barvy TColor na RGB.

Kód: Delphi [Vybrat]
  1. function GetColorASRGBString( barva : TColor): String;
  2. var
  3.   r,g,b : Byte;
  4. begin
  5.  
  6.   barva  := ColorToRGB(barva);
  7.  
  8.   r := GetRValue(barva);
  9.   g := GetGValue(barva);
  10.   b := GetBValue(barva);
  11.  
  12.   Result := 'R: ' + IntToStr(r)+ ' G: ' + IntToStr(g)+ ' B: ' + IntToStr(b);
  13.  
  14.   Form1.Color := RGB(r,g,b);
  15. end;

Převedením barvy clSkyBlue vznikne úplně jiná barva.

Beru jakékoli funkční řešení.
« Poslední změna: 16-06-2012, 03:00:59 od Lister03 »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Delphi XE2 převod TColor na RGB
« Odpověď #1 kdy: 16-06-2012, 08:16:23 »
Jen takový nápad:
Jakou hodnotu v hexa má ta barva v 2010 a v XE2? Hodně se šibovalo s konstantami a speciálně u clSkyBlue je
toto:

    // Use LegacySkyBlue to maintain consistency in VCL colors
    (Value: TColors.LegacySkyBlue; Name: 'clSkyBlue'),

Navíc pokud se nepletu tak FireMonkey má TColor s alfakanálem (4ty byte), kdežto VCL TColor bez, tak třeba to by mohl byt problém. Asi tady spíše hádám.
Embarcadero MVP - Czech republic

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 958
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Delphi XE2 převod TColor na RGB
« Odpověď #2 kdy: 18-06-2012, 08:27:57 »
A není jednodušší použít nějaký veřejný kód viz
Kód: Delphi [Vybrat]
  1. function RGB2TColor(const R, G, B: Byte): TColor;
  2. begin
  3.   Result := R + G shl 8 + B shl 16;
  4. end;
  5. procedure TColor2RGB(const Color: TColor; var R, G, B: Byte);
  6. begin
  7.   R := Color and $FF;
  8.   G := (Color shr 8) and $FF;
  9.   B := (Color shr 16) and $FF;
  10. end;
  11.  
« Poslední změna: 18-06-2012, 08:31:48 od JaroB »

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1127
  • Karma: 42
    • Verze Delphi: 7, 2010
Re:Delphi XE2 převod TColor na RGB
« Odpověď #3 kdy: 18-06-2012, 16:13:00 »
a nejsou to uplne stejne funkce, co ma Delphi v sobe? :D
to vysledek zrejme neovlivni

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 958
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Delphi XE2 převod TColor na RGB
« Odpověď #4 kdy: 18-06-2012, 16:39:35 »
Potíž způsobí tato funkce ColorToRGB(), bez převodu to funguje správně.
clSkyBlue je definováno jako R=166, G=202 a B=240

Offline ps

  • Mladík
  • **
  • Příspěvků: 61
  • Karma: 4
Re:Delphi XE2 převod TColor na RGB
« Odpověď #5 kdy: 20-06-2012, 08:51:22 »
Hmm, niekto nemá update2 :)

viď. tu:
http://edn.embarcadero.com/article/41750
QC: 99353

Kód: Delphi [Vybrat]
  1. delphi XE: clSkyBlue = TColor($F0CAA6);
  2. delphi XE2: LegacySkyBlue = TColor($A6CAF0);

prehodné hodnoty detto clCream.
IDE: Latest Delphi - Mobile, Lazarus - Desktop, OS:Win 10 ,Linux Mint