OpenOffice.orgの最近のブログ記事

.sob .soc .sod .soe .sog .soh

C:/Users/(user-id)/AppData/Roaming/OpenOffice.org/3/user/config/ にある *.so? なファイルのメモ

拡張子 要素 備考
.sob
ビットマップ。zip アーカイブになってる。
standard.sob
.soc office:color-table
cmyk.soc
gallery.soc
html.soc
pallet.soc
standard.soc
sun-color.soc
web.soc
.sod office:dash-table
点線
standard.sod
style_ja.sod
.soe office:marker-table
線の終点
arrowhd_ja.soe
standard.soe
.sog ooo:gradient-table
グラデーション
classic_ja.sog
modern.sog
standard.sog
.soh office:hatch-table
ハッチング
hatching_ja.soh
standard.soh

OpenOffice で MySQL に Connector/j でつながらなかった。
まずい、コネクタを入れていなかった。

いれてみた。
クラスパスも指定した。
OOo の再起動もした。
でも「JDBC ドライバは読み込まれませんでした。」と出てきた。

64 bit Windows だから?
MySQL を winx64 にしたから?
しょうがないので ODBC にしてみた。
結果オーライ。

でもなんか納得できない。

しばらく経って原因に気がついた。
クイック起動を終了させていなかった。
OOo を再起動させたつもりがしてなかった。
馬鹿みたい。

でも原因を探っていろいろネットを見ているうちに拡張機能でコネクタなしの接続ができることを知った。

Sun Connector for MySQL (Beta)
( http://extensions.services.openoffice.org/node/2447 2009.11.12 現在空っぽ)

MySQL Connector for OpenOffice.org
( http://extensions.services.openoffice.org/project/mysql_connector )

使い方:
・ OpenOffice.org で「新規データベース」
・ データベースウィザードで「既存のデータベースに接続」>「MySQL」
・ 「Native に接続(C)」
・ データベースの名前、サーバURL、ポート番号、Socket を指定。
URL に localhost とすると NG。127.0.0.1 とIPアドレスなら OK。
Socket は 空白。
・ ユーザID やパスワードを必要なら入力。
・ テスト接続で接続が確認できたら完了。

Windows の場合 AppData のOpenOffice/3/user/config/
にある standard.soc に保存されている。

<ooo:color-table ...> 〜 </ooo:color-table> の間に、
<draw:color draw:name="色の名前" draw:color="#xxyyzz" /> で記述する。

*.soc とつくファイルは総じて色物らしい。使い方、使われ方不明。
だれか、和色のテーブル作って欲しい。

以前つくった OpenOffice.org のフォーム用の Windows専用IMM 制御マクロを 
Vista + ATOK で使ってみたら、全角入力にした EDIT ボックスが「かな入力」に
なってしまうことを発見。対策としてコードの一部を変更。

具体的には imm コントロールのフラグを IME_CMODE_JAPANESE と
IME_CMODE_FULLSHAPE に加えて IME_CMODE_ROMAN も指定するようにしました。

MS-IME で使っているなら変更の必要はありません。
「ローマ字」より「かな入力」が得意な人はそのままでお使いください。

REM  *****  BASIC  *****

Option Explicit

const SYSTEM_WIN32 as long        = 1
const SYSTEM_WIN16 as long        = 2
const SYSTEM_JAVA as long           = 3
const SYSTEM_OS2 as long            = 4
const SYSTEM_MAC as long            = 5
const SYSTEM_XWINDOW as long  = 6

Declare Function ImmCreateContext        Lib "imm32.dll" () as long
Declare Function ImmAssociateContext    Lib "imm32.dll" (ByVal hWnd as long, ByVal hIMC as long) as long
Declare Function ImmDestroyContext        Lib "imm32.dll" (ByVal hIMC as long) as long
Declare Function ImmGetContext            Lib "imm32.dll" (ByVal hWnd as long) as long
Declare Function ImmReleaseContext        Lib "imm32.dll" (ByVal hWnd as long, ByVal hIMC as long) as long
Declare Function ImmSetOpenStatus        Lib "imm32.dll" (ByVal hIMC as long, ByVal bOpen as long) as long
Declare Function ImmGetOpenStatus        Lib "imm32.dll" (ByVal hIMC as long)  as long
Declare Function ImmGetConversionStatus    Lib "imm32.dll" (ByVal hIMC as long, cmode as long, smode as long) as long
Declare Function ImmSetConversionStatus    Lib "imm32.dll" (ByVal hIMC as long, ByVal cmode as long, ByVal smode as long) as long
Declare Function ImmGetDefaultIMEWnd        Lib "imm32.dll" (ByVal hWnd as long) as long

Global const IME_CMODE_ALPHANUMERIC        as long    = 0        ' アルファベット
Global const IME_CMODE_NATIVE            as long    = 1        ' 日本語(各国語)
Global const IME_CMODE_JAPANESE            as long    = 1        ' = IME_CMODE_NATIVE
Global const IME_CMODE_KATAKANA            as long    = 2        ' カタカナ/ひらかな
Global const IME_CMODE_LANGUAGE            as long    = 3        ' 言語マスク?
Global const IME_CMODE_FULLSHAPE        as long    = &h008    ' 全角/半角
Global const IME_CMODE_ROMAN            as long    = &h010    ' ローマ字入力
Global const IME_CMODE_CHARCODE            as long    = &h020    ' コード入力
Global const IME_CMODE_HANJACONVERT        as long    = &h040    '
Global const IME_CMODE_SOFTKBD            as long    = &h080    ' ソフトウェアキーボード
Global const IME_CMODE_NOCONVERSION        as long    = &h100    ' 
Global const IME_CMODE_EUDC                as long    = &h200    ' EUDC(ってなんだ?)
Global const IME_CMODE_SYMBOL            as long = &h400    ' シンボル記号(英数の?)
Global const IME_CMODE_FIXED            as long    = &h800    '

Global const MB_OK                        as long    = 0
Global const MB_ICONHAND                 as long    = 16
Global const MB_ICONQUESTION            as long    = 32
Global const MB_ICONEXCLAMATION         as long    = 48
Global const MB_ICONASTERISK            as long    = 64

Sub Main

'GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
'xray ThisComponent
GlobalScope.BasicLibraries.LoadLibrary("ProjectBEE")
msgBeep(64)
immToggle

End Sub


' --------------------------------------
'    びーぷ(ExampleDeclare改)
Declare Sub MessageBeep Lib "user32.dll"( byVal long )
Sub msgBeep(optional mb as long)
    if isMissing(mb) then mb = MB_OK
    MessageBeep( mb )
end Sub

' --------------------------------------
'    IME制御
' --------------------------------------
function imm(optional sw as long, optional mode as long) as long

    dim hWND as long
    dim hIMC as long
    dim PID() as byte
    dim cmode as long
    dim smode as long
    
    hWND =  StarDesktop.CurrentFrame.ContainerWindow.getWindowHandle(PID, SYSTEM_WIN32)                    ' good
    hIMC = ImmGetContext(hWnd)
    
    if IsMissing(sw) then                                    ' sw がなければ状態問い合わせ
        if (GetGUIType() <> 1) then
            imm = -1                                        ' Windows 以外は 戻り値:=-1
        else
            if (ImmGetOpenStatus(hIMC) = 0) then             ' imm の状態取得
                imm = 0                                        ' OFF なら戻り値:=0
            else                                             ' ON なら...
                ImmGetConversionStatus(hIMC, cmode, smode)    ' 変換モード取得
                imm = cmode                                    ' 戻り値:=変換モード
            end if
        end if
    else                                                    ' sw 指定時は imm 制御
        imm = ImmSetOpenStatus(hIMC, sw)                    ' 戻り値:= ImmSetOpenStatus の処理結果(BOOLEAN)

        if (sw) then                                        ' imm を ON にすれば...
            if IsMissing(mode) then mode = IME_CMODE_JAPANESE _
              + IME_CMODE_FULLSHAPE _
               + IME_CMODE_ROMAN
            ImmGetConversionStatus(hIMC, cmode, smode)
            imm = ImmSetConversionStatus(hIMC, mode, smode)    ' 戻り値:= ImmSetConversionStatus の処理結果(BOOLEAN)
        end if
    end if

    ImmReleaseContext(hWND,hIMC)

'    if (imm) then msgBeep(MB_ICONEXCLAMATION)

end function

' --------------------------------------
'    IME TOGGLE
sub immToggle

    dim hWND as long
    dim hIMC as long
    dim PID() as byte
    dim stat as long
        
    hWND = StarDesktop.CurrentFrame.ContainerWindow.getWindowHandle(PID, SYSTEM_WIN32)
    hIMC = ImmGetContext(hWnd)
    
    stat = ImmGetOpenStatus(hIMC)
    stat = 1 - stat
    ImmSetOpenStatus(hIMC,stat)
    
    ImmReleaseContext(hWND,hIMC)

end sub

sub immOn    ' --------------------------
    imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE +IME_CMODE_ROMAN)
end sub

sub immOff    ' --------------------------
    imm(FALSE)
end sub

sub immHira    ' --------------------------
    imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE _
 +IME_CMODE_ROMAN)
end sub

sub immKata    ' --------------------------
    imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_KATAKANA+IME_CMODE_FULLSHAPE _
 +IME_CMODE_ROMAN)
end sub

sub immCode    ' --------------------------
    imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE+IME_CMODE_CHARCODE)
end sub

sub immKbd    ' --------------------------
    imm(TRUE, IME_CMODE_JAPANESE+IME_CMODE_FULLSHAPE+IME_CMODE_SOFTKBD)
end sub

OpenOffice BASIC で strcpy

Windows の IMM の API で ImmGetConversionList を使って
漢字の読みを取り出したかったんだけどうまくいかない。
VBだとできるらしいんだけど。

いろいろと試行錯誤していると本題とは関係ないけど面白いことに気が付いた。
C の基本関数が OOo の BASIC からも使える

----------------------------------------
REM  *****  BASIC  *****

declare function strncpy lib "ntdll" (byRef dst as string, _
	byRef src as string, byVal siz as long)
declare function strlen lib "ntdll" (byRef dst as string) as long

Sub Main
	dim src as string : 	src = "文字列コピー"
	dim dst as string : 	dst =  string$(8,0)
	siz = len(dst)
	dummy = strncpy(dst, src, siz)
	msgbox "'"& src &"' ("& strlen(src) &"byte) -> '" _
		& dst &"' (" & strlen(dst) &"bytes)"
End Sub
----------------------------------------
つうことは、なにか。
C で DLL 書いてやれば BASIC の関数の拡張は簡単って事か?
# きっともっと別の、そして正規の方法があるんだけど。
VB のコードを参考にして OpenOffice.org のBASICで API からの文字列を
受け取ってみた。

参照先: 「DLL 関数から文字列を返す」
http://msdn.microsoft.com/ja-jp/library/cc376816.aspx

VB と異なるところは、Declare Function で文字列を受け取るバッファを
 byRef でなく byVal で宣言しなければ期待した動作が行われないこと。
バッファから String 変数にコピーする際は Null文字(¥0) でターミネート
しているらしいこと。

REM ***** BASIC ***** Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" _ (ByVal nBufferLength As Long, ByRef lpBuffer As String) As Long Sub Main msgbox GetTempDir End Sub function GetTempDir() As String ' 使用している Temp フォルダへのパスを返します。 ' Windows を起動するには一時フォルダが必要なため、確実に ' パスには 1 が返されますが、一応 GetTempPath の戻り値を ' 確認します。 Dim strTempPath As String Dim lngTempPath As Long ' 文字列に Null 文字を入力します。 strTempPath = String$(255, 0) ' 0 = vbNullChar ' 文字列の長さを取得します。 lngTempPath = Len(strTempPath) ' GetTempPath を呼び出し、文字列の長さと文字列を渡します。 L = GetTempPath(lngTempPath, strTempPath) If (L > 0) Then ' GetTempPath はパスを文字列に返します。 ' 最初の Null 文字を切り捨てます。 GetTempDir = strTempPath Else GetTempDir = "" End If End function

JIS.X0402 and JIS.X0401

日本郵便の「郵便番号データダウンロード」から落とした全国一括データをもとに
JIS X0401 と X0402 の情報を抜き出してみました。
2009年4月現在の郵便番号情報を基にした、県(X0401) と市町村区(X0402) のテーブルです。
ご自由にお使いください。

JIS_X0401.csv
JIS_X0402.csv
JIS_X0402.ods (OOo 3.1)
JIS_X0402.odb (OOo 3.1)

郵便番号の csv ファイルをデータベースに読み込み、県名でグルーピングしたのが x0401、
市町村名でグループ化したのが x0402 になってます。
ミスってたらごめんなさい。

jis_x0401.csv は、"JIS X0401","県名(漢字)","県名(カナ)" の並びです。
jis_x0402.csv は、"JIS X0402","県名(漢字)","市町村名(漢字)","県名(カナ)","市町村名(カナ)" の並びです。
jis_x0402.ods / jis_x0402.odb は x0401 と x0402 が両方入っています。

連絡先

nakanohito