プログラムから文字列を識別するラベルのリストをenum出力してみる
LanguageMan()->SetLang( "日本語" );
wchar_t * str_help=LanguageMan()->GetString( STR_LABEL_TUTORIAL );
こんなふうにアクセスするために
VBAを書いてみる
元のエクセル
出力結果
ヘッダー
出力結果 cpp
文字列が少ないから
LanguageMan()->SetLang( "日本語" );
wchar_t * str_help=LanguageMan()->GetString( STR_LABEL_TUTORIAL );
こんなふうにアクセスするために
VBAを書いてみる
| ' 出力 ' STR_LABELを探す ' STR_LABELから下へラベル ' STR_LABELから右へ言語リスト ' C++ヘッダーファイル名 Const fn_enum As String = "lang_str" Const fn_path As String = "\..\src_game\" ' ラベル識別 enum classなどに使う Const str_label As String = "STR_LABEL" ' C++用言語名 Const str_言語名 As String = "str_言語名" Dim sheet_now As Worksheet Dim lbl_x As Long Dim lbl_y As Long ' tbl Dim lbl_pos() As Long ' n個目のラベルのY位置 Dim lbl_max As Long ' ラベルの個数 Dim lang_pos() As Long ' n個目の言語のX位置 Dim lang_max As Long ' 言語の個数 ' enumとバイナリー出力 Sub 文字列のバイナリー出力とラベル() Set sheet_now = ActiveSheet Set lbl = sheet_now.Cells.Find(str_label) If lbl Is Nothing Then Exit Sub lbl_x = lbl.Column() lbl_y = lbl.Row() バイナリー出力のラベルと言語の走査 sheet_now バイナリー出力のラベル sheet_now, ActiveWorkbook.Path & fn_path & fn_enum End Sub ' ラベルと言語の走査 Sub バイナリー出力のラベルと言語の走査(sh As Worksheet) If sh Is Nothing Then Exit Sub Dim y As Long lbl_max = 0 ReDim lbl_pos(0) Dim x As Long lang_max = 0 ReDim lang_pos(0) ' ラベルの個数 For y = lbl_y + 1 To sh.UsedRange.Rows.Count + sh.UsedRange.Rows.Row + 10 If sh.Cells(y, lbl_x).Value <> "" Then lbl_max = lbl_max + 1 ReDim Preserve lbl_pos(lbl_max) lbl_pos(lbl_max) = y End If Next y ' 言語の個数 For x = lbl_x + 1 To sh.UsedRange.Columns.Count + sh.UsedRange.Columns.Column + 10 If sh.Cells(lbl_y, x).Value <> "" Then lang_max = lang_max + 1 ReDim Preserve lang_pos(lang_max) lang_pos(lang_max) = x End If Next x 'MsgBox "ラベル=" & lbl_max & " 言語=" & lang_max End Sub ' ラベルのenum Sub バイナリー出力のラベル(sh As Worksheet, fn As String) If sh Is Nothing Then Exit Sub ' Open fn & ".h" For Output As #1 ' Print #1, "#pragma once" Print #1, "/**" Print #1, " @brief 文字列のラベルリスト" Print #1, " @author " & ActiveWorkbook.Name Print #1, "*/" Print #1, "" Print #1, "//! 文字列の識別子" Dim y As Long Dim yp As Long Print #1, "enum " & str_label & " {" For y = 1 To lbl_max yp = lbl_pos(y) Print #1, " " & str_label & "_" & sh.Cells(yp, lbl_x).Value & ", // " & sh.Cells(yp, lbl_x - 1).Value Next y Print #1, " " & str_label & "_MAX" Print #1, "};" Print #1, "" Print #1, "//! 言語名の個数" Print #1, "#define " & str_言語名 & "_MAX " & lang_max Print #1, "//! 言語名リスト" Print #1, "extern const wchar_t* " & str_言語名 & "[" & str_言語名 & "_MAX+1]; " Close #1 ' Open fn & ".cpp" For Output As #1 ' Print #1, "#include """ & fn_enum & ".h""" Print #1, "/**" Print #1, " @brief 文字列の言語名リスト" Print #1, " @author " & ActiveWorkbook.Name Print #1, "*/" Print #1, "" Print #1, "//! 言語名リスト" Print #1, "const wchar_t* " & str_言語名 & "[" & str_言語名 & "_MAX+1]={ " Dim x As Long Dim xp As Long For x = 1 To lang_max xp = lang_pos(x) Print #1, " L""" & sh.Cells(lbl_y, xp).Value & """, " Next x Print #1, " nullptr" Print #1, "};" Close #1 End Sub |
元のエクセル
| help | 説明 | STR_LABEL | 日本語 | English |
| 言語 | LANGUAGE | 言語 | language | |
| ゲームから操作説明へ | TUTORIAL | 操作説明 | tutorial | |
| ゲームに戻る | RETURN2GAME | ゲームにもどる | return to game | |
| 操作説明「一歩進む」 | TUTORIAL_GO | 一歩進んでみよう | ||
| 操作説明「左にまがる」 | TUTORIAL_TURN_LEFT | 左にまがってみよう | ||
| 操作説明「右にまがる」 | TUTORIAL_TURN_RIGHT | 右にまがってみよう | ||
| 操作説明「ゴールまですすむ」 | TUTORIAL_GOAL | ゴールまで進んでみよう | ||
出力結果
ヘッダー
| #pragma once /** @brief 文字列のラベルリスト @author ゲーム文字列.xlsm */ //! 文字列の識別子 enum STR_LABEL { STR_LABEL_LANGUAGE, // 言語 STR_LABEL_TUTORIAL, // ゲームから操作説明へ STR_LABEL_RETURN2GAME, // ゲームに戻る STR_LABEL_TUTORIAL_GO, // 操作説明「一歩進む」 STR_LABEL_TUTORIAL_TURN_LEFT, // 操作説明「左にまがる」 STR_LABEL_TUTORIAL_TURN_RIGHT, // 操作説明「右にまがる」 STR_LABEL_TUTORIAL_GOAL, // 操作説明「ゴールまですすむ」 STR_LABEL_MAX }; //! 言語名の個数 #define str_言語名_MAX 2 //! 言語名リスト extern const wchar_t* str_言語名[str_言語名_MAX+1]; |
出力結果 cpp
| #include "lang_str.h" /** @brief 文字列の言語名リスト @author ゲーム文字列.xlsm */ //! 言語名リスト const wchar_t* str_言語名[str_言語名_MAX+1]={ L"日本語", L"English", nullptr }; |
文字列が少ないから
プログラムに内包したほうがはやそうですが
今後のためにこのまま
次回、文字列そのもののバイナリー出力
コメント
コメントを投稿