* フォントカラー不具合/フォーム位置不具合 [#lba98c32]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|S-Osaka|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(低,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(Calc 表計算,faq03,category)|
 |~投稿日|2010-09-25 09:35:02 (土)|
 |~OS|vista|
 |~依存するページ||
 |~バージョン|#listbox3(3.2.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#b4fa04d5]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 いつもお世話になります。~
 不具合出現の条件はわかりません。~
 Option VBASupport 1でシート関数を使いループ計算、と言うルーチンの計算後同じルーチン内に別のグラフ描画ルーチン実行を指定しています。~
 グラフ描画ルーチンの方はcalcのグラフではなくセル上にループ専用フォントキャラでバーグラフを作画します。~
 その際、バーの行ごとに色分けするようにしています。~
 ところが~
 Dsp_s.getCellByPosition(11, 11+n).CharColor = RGB(255, 0, 0)~
 の命令に対して青色を描画します。~
 計算ルーチンに連続せず単独で実行すれば、ちゃんと赤色を描画します。~
 赤青が逆転するようで緑は命令どおりになります~
 ちなみに、~
 Dsp_s.getCellByPosition(11, 11+n).CharColor ="&Hff0000"~
 なら問題なく処理されます。~
 以前フォームコントロールのボタンの編集モードが解除できない件をご相談しましたが、
 calcではフォームの位置を固定できないようです。~
 毎回微妙にずれています。~
 「位置とサイズ」で固定していますが毎回少しずつずれて、1mm以上動いているようです。~
 たぶん不具合と思われますのでご報告しておきます。~
 
 ----
 ***「フォーム位置不具合」はfaq/6/24へ [#n6f73951]
 >M.Kamataki (2010-09-25 10:49:31 (土))~
 ~
 2つのご質問がありますが、ほとんど関連性がないので「フォーム位置不具合」については別の質問としました。たぶん、当ページでやり取りすると、わけがわからなくなります。「フォーム位置不具合」関連のコメントはfaq/6/24へお願いします。~
 
 //
 ***Excel VBAとの互換性 [#m37b7728]
 >M.Kamataki (2010-09-25 11:03:12 (土))~
 ~
 「RGB(255, 0, 0)」が青、「RGB(0, 255, 0)」が緑、「RGB(0, 0, 255)」が赤になるという理解でよいでしょうか。さらに「単独で実行すれば」正常ということですね。~
 ~
 Excel VBAとの互換性の問題なので、一つひとつOpenOffice.orgの不具合・要望データベースであるIssueTrackerへ報告しないと直らないと思います。~
 
 //
 ***VBA モードと普通の API を混ぜてはいけません [#i0478eb9]
 >はにゃ? (2010-09-25 12:24:01 (土))~
 ~
 単独で実行すると正常の理由は分かりませんが、基本的に VBA モードと普通の API 関数を混ぜて利用してはいけません。~
 ~
 Option VBASupport 1 を指定すると Option Compatible が自動的に指定されます。このときランタイム関数は互換モードで動作します。~
 ~
 RGB 関数は OOo Basic の場合、RGB(red, gree, blue) とすると返り値は red * 2 ^ 16 + green + 2 ^ 8 + blue です。VBA の場合、red + green * 2 ^ 8 + blue * 2 ^ 16 らしいです。VBASupport を利用すると計算が後者のものに変わります。~
 ~
 VBA 用の API ではこの色コードを内部で OOo API で利用されているものに変換しなおしてから OOo の API で色を設定しています。~
 
 //
 ***お世話になります [#u062a313]
 >S-Osaka (2010-09-25 14:19:44 (土))~
 ~
 Option VBASupport 1~
 で作ったプロシージャからooo basicで書いたプロシージャを呼び出しています。(モジュールは別です)~
 OOo basicのプロシージャ単独では正常です。~
 はにゃさんの説明でそのあたりかな・・と言う気がしましたが、~
 10進数でRGB指定したものに赤・青逆転があり、16進数指定は問題ないので不具合かと思いました。~
 
 //
 ***Re: 単独で実行すると問題ない [#n1043b82]
 >はにゃ? (2010-09-25 15:07:33 (土))~
 ~
 単独で実行するときには、VBASupport 1 を指定していないモジュールから直接実行しているのであれば、正しく動作しています。~
 ~
 VBASupport 1 は実行されたルーチンや関数のあるモジュールで指定されていると、その後全てのモジュールおよびライブラリで有効になります。~
 ~
 以下の例を実行すると、最初の module2 の関数は 16711680 を返します。module 3 で VBASupport が有効にされて 255 が表示されます。最後にもう一度 module2 の関数を呼び出すと、255 が表示されます。~
 ~
  ' module 1
  Sub Main
    msgbox RGBMod2 ' 16711680 
    msgbox RGBMod3 ' 255
    msgbox RGBMod2 ' 255 (再度 module 2 
  End Sub
 ~
  ' module 2
  Function RGBMod2
    RGBMod2 = RGB(255, 0, 0)
  End Function
 ~
  ' module 3
  Option VBASupport 1
  Function RGBMod3
    RGBMod3 = RGB(255, 0, 0)
  End Function
 ~
 VBASupport を有効にする場合には、その関連ライブラリも全て有効な状態で動作するように (Option VBASupport 1 を各モジュールで指定する) すべきです。~
 
 //
 ***RGB関数はVBAモードでも、OOoが解釈する色はOOoのまま [#ef5fb0e8]
 >K.Tsunoda (2010-09-25 19:36:24 (土))~
 ~
 VBA互換モードにより、RGB関数が[VBA仕様]で色値(&Hbbggrr)を算出しても、~
 OOo自体(セル、ダイアログ、グラフ等)が解釈する色値はOOo仕様のまま~
 (&Hrrggbb)であるという事からくる齟齬ですね。~
 ~
 下記に整理しました。~
 http://blog.livedoor.jp/addinbox/archives/51223736.html~
 
 //
 ***CompatibilityMode について [#p47ced8b]
 >はにゃ? (2010-09-25 23:13:31 (土))~
 ~
 あまり利用するべきではないと思いますが、書いておきます。~
 ~
 以下の例では一時 Compatible モードを無効にしています。セル A1 は青色の背景に、無効にした状態の A2 は赤色の背景色が設定されます。~
  Option VBASupport 1
  
  Sub Main
   oSheet = ThisComponent.getSheets().getByIndex(0)
   oSheet.getCellByPosition(0, 0).CellBackColor = RGB(255, 0, 0)
   CompatibilityMode(False)
   oSheet.getCellByPosition(0, 1).CellBackColor = RGB(255, 0, 0)
   CompatibilityMode(True)
  End Sub
 ~
 Option VBASupport 1 を指定すると、ほとんどの文字列操作関数が互換モードで動作、ReDim やファイル操作関数などの振る舞い、ルーチンのスコープが変更されます。~
 何度も書きますが、Option VBASupport 1 を指定するときには VBA 互換 API と互換モードでテストしたランタイム関数のみを利用すべきです。~
 
 //
 ***無題 [#sa725734]
 >S-Osaka (2010-09-26 10:23:02 (日))~
 ~
 ループ処理が極端に遅いのでいろいろ試しすぎました。~
 →VBASupport を有効にする場合には、その関連ライブラリも全て有効な状態で動作するように (Option VBASupport 1 を各モジュールで指定する) すべきです。~
 →何度も書きますが、Option VBASupport 1 を指定するときには VBA 互換 API と互換モードでテストしたランタイム関数のみを利用すべきです。~
 と言うことなので、~
 Option VBASupport 1はやめて、処理プロセスが増えそうですが、とりあえず~
 ShtFnc = CreateUnoService("com.sun.star.sheet.FunctionAccess") ~
 を使います。~
 今回も大変勉強になりました。~
 皆さん本当にありがとう。~
 
 //
 ***追) [#za093df2]
 >S-Osaka (2010-09-26 10:31:58 (日))~
 ~
 CompatibilityMode(False)~
 CompatibilityMode(True)~
 は、こういうのがあるかどうか知りくて、探していたコードなのでなんか得した気分です。~
 
 //
 ***完了にします [#ve58fd08]
 >M.Kamataki (2010-09-27 00:25:55 (月))~
 ~
 VBAとOpenOffice.org Basicの色指定に関する仕様の違いが原因のようですので、完了にします。~
 ~
 K.Tsunodaさんのまとめページも紹介しておきます。~
 ~
 RGBのHex並びが逆~
 http://blog.livedoor.jp/addinbox/archives/51223736.html~
 
 //
 #article