2011-11-29 15 views
5

enter image description hereC# Konwersja delphi TColor do koloru (Hex)

Liczby te są przechowywane w bazie danych. Pochodzą z kodu Delphi. Chociaż zakładam, że podążają za jakimś standardem. Próbowałem Color.FromArgb(255);

ale wiem na pewno, że pierwszy jest czerwony (w delphi strony), gdzie podobnie jak w ASP.NET to jego myśli niebieski Color [A=0, R=0, G=0, B=255]

Chcę te liczby na kodem heksadecymalnym tak. To znaczy. # 000000, # FFFF99 etc etc

Każdy wie, jak konwertować te liczby całkowite (patrz rysunek DB) do szesnastkowego.

Odpowiedz

20

Kolory Delphi (TColor) to XXBBGGRR, gdy nie są z palety lub specjalnego koloru.

Aby uzyskać więcej informacji na temat formatu (i innych specjalnych przypadków), patrz: this article. The article wskazany przez Christian.K zawiera również pewne szczegóły na temat specjalnych przypadków.

Standardowe kolory

Aby przekształcić do standardowego koloru należy użyć coś takiego:

var color = Color.FromArgb(0xFF, c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF); 

Aby przekonwertować hex,:

string ColorToHex(Color color) 
{ 
    return string.Format("#{0:X2}{1:X2}{2:X2}", 
     color.R, color.G, color.B); 
} 

kolory systemowe

Dla systemu kolory (wartości ujemne w bazie danych), są po prostu consta okna nts zamaskowany przez 0x80000000.

Dzięki David Heffernan za informacje.

Przykładowy kod

Color DelphiColorToColor(uint delphiColor) 
{ 
    switch((delphiColor >> 24) & 0xFF) 
    { 
     case 0x01: // Indexed 
     case 0xFF: // Error 
      return Color.Transparent; 

     case 0x80: // System 
      return Color.FromKnownColor((KnownColor)(delphiColor & 0xFFFFFF)); 

     default: 
      var r = (int)(delphiColor & 0xFF); 
      var g = (int)((delphiColor >> 8) & 0xFF); 
      var b = (int)((delphiColor >> 16) & 0xFF); 
      return Color.FromArgb(r, g, b); 
    } 
} 

void Main() 
{ 
    unchecked 
    { 
     Console.WriteLine(DelphiColorToColor((uint)(-2147483646))); 
     Console.WriteLine(DelphiColorToColor(
       (uint)KnownColor.ActiveCaption | 0x80000000 
      )); 
     Console.WriteLine(DelphiColorToColor(0x00FF8000)); 
    } 
} 
+6

Najlepszym sposobem przekonwertowania koloru systemu na RGB jest wykonanie polecenia VCL. Wywołanie ['GetSysColor()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724371 (v = vs.85).aspx) przekazując 'c & 0x000000FF'. Innymi słowy, nie są one zdefiniowane jako VCL, są * zdefiniowane * systemowe. –

+1

@ David, w swoim komentarzu podałeś dokładną odpowiedź, nie publikując go jako odpowiedzi? –

+1

@PA. Komentarz jest tylko niewielką częścią odpowiedzi. Mam nadzieję, że VirtualBlackFox uwzględni tę sugestię w tej odpowiedzi, a więc będzie w stanie usunąć dość długą i męczącą listę. –

3

Wygląda na to, że numery są base-10 reprezentacja Delphi TColor values.

Sam Delphi wydaje się zapewniać pewne funkcje pomocnicze (na przykład GetRValue), aby wyodrębnić odpowiednie wartości odczytu, zielony i niebieski. Musisz napisać coś podobnego w C# siebie.

Po ustaleniu wartości można je połączyć w ciąg szesnastkowy.

string.Format("#{0:X2}{1:X2}{2:X2}", redComponent, greenComponent, blueComponent); 

Po prostu konwersja wartości całkowitej na szesnastkowy, wyściełany lub nie, najprawdopodobniej nie zrobi tego, co trzeba.

AKTUALIZACJA jako komentator James L. wskazuje, że kolejność komponentów jest rzeczywiście inna dla/w delphi. Aby wygenerować wartość podobną do TColor, zamówienie musi być:

string.Format("#{0:X2}{1:X2}{2:X2}", blueComponent, greenComponent, redComponent); 
+1

Myślę, że twoje zamówienie jest cofnięte. Czerwony powinien mieć wartość # 0000FF, zielony powinien być równy # 00FF00, a niebieski powinien mieć wartość # FF0000. Tak więc kolejność kolorów powinna zostać zmieniona na niebiesko-zieloną czerwoną. –