出先で使用しているVB6で作成されたシステムでは、データベースに保存された色の値(16進数)を読み込んで表示に使用している。
C#で作成している新しいシステムでもその色の値を使おうと思ったら、なぜか違う色になった。
現在のシステムを稼働させながら新しいシステムの開発を行っており、同じデータベースのデータを読み込んでいるので、C#用に値を変えることは出来ないし、新しいシステム用に値を登録すると移行後に古いデータを消し忘れてゴミが残る可能性があるので、できれば古い値をそのまま使いたい。
その実現が少しだけ面倒だったのでメモを残す。
前提
データベースに入っている値: &H0040C0
VB6での色指定の記述例: ctrl.BackColor = &H0040C0
最初にやったこと
string code = "&H0040C0"; //実際にはデータベースから値を読み込む
string newcode = code.substring(2,6);
ctrl.BackColor = ColorTranslator.FromHtml("#" + newcode );
色はついたけれど、思っていた色ではない。
考えたこと
あれこれ調べてみると、C#でも「000000」が黒で「FFFFFF」が白なのは間違いないようだ。(当然)
「&H」はVB6の場合何色であっても付くので、色情報として後ろ6桁を使用するのは間違いないはず。
その場合、2桁ずつで赤、緑、青を表しているのも同じはず。
だとすると、赤、緑、青の並び順が違うのでは?
試したこと
「00」「40」「C0」の順番を変えながら、何色が表示されるかを確認。
確認には下記サイトを利用した。
RGBと16進数カラーコードの相互変換ツール - PEKO STEP
分かったこと(結果)
VB6での「0040C0」は、C#では「C00040」
C#では文字通り「RGB(赤緑青)」の順で表記されているが、VB6では「GBR(緑青赤)」の順で表記されていたようだ。
そもそも
2020年にもなってVB6で作られたシステムが現役だというところに問題があry
なおこのシステムの開発は2010年頃で、その1つ前のシステムを1990年代に開発した会社に依頼したところ、その会社の都合でVB6になったらしい。
私は開発が始まってから関わるようになったので、遅々として開発が進まず、「入力欄にアポストロフィを入力するとエラーで強制終了」に代表される技術力のなさに愕然とし、最終的にはその会社から開発の権利を引き継いで、私が通常業務の片手間(と言いつつたくさんサービス残業した)で2年ほどかけ完成させたのであった。(ソースコードを初めて目にした時、あまりのひどさに目まいがした)