◀ANSI版開発トップへ
  • 3156 あれこれ徹底討論!
    • 3157 Re:あれこれ徹底討論!
      • 3168 結論
        • 3182 メッセージのリソース化までの予定
          • 3184 Re: メッセージのリソース化までの予定
            • 3213 Re2: メッセージのリソース化までの予定
  • [3156] あれこれ徹底討論! wmlhq 2003年09月19日 11:04

    議題1: Unicodeに統一するか、ANSI版,UNICODE版の2関数に分けるか。それともUnicode化をあきらめるか。
    内部形式がSJISのため、このままではUnicode文字が化けます。すでにSJISで書かれたコードが多く、Unicodeのサポートは難しい。

    議題2: メッセージはリソース化が望まれます。文字列リソース(STRINGTABLE)かメッセージリソース(MESSAGETABLE)か。
    STRINGTABLEはすでに予約されているIDが多く、国際化でしたら、MESSAGETABLEは語順の問題がなくて便利です。なので、現在のところ、MESSAGETABLEが優勢です。

    議題3: 引数の多いMYMESSAGEBOXをそれぞれ別々の関数INFOBOX,ERRORBOX,QUERYBOXなどで包むか否か。この場合、直前のMessageBeepは吸収されます。

    議題4: システムエラーメッセージをユーザーへの応答として使うか否か?
    • [3157] Re:あれこれ徹底討論! wmlhq 2003年09月19日 11:08

      見れば分かるように、メッセージのリソース化と国際化に向けて、::MYMESSAGEBOXに代わる関数を考えています。

      // idMsgはMESSAGETABLEリソースのID。書式指定はwsprintfとは違って
      // 国際化のために %1!d!, %2!s! のように引数の順序を指定する。
      // 詳しくはFormatMessageを参照。
      int OurMsgBox(HWND hwnd, UINT uType, LPCTSTR lpszTitle, int idMsg, ...)
      {
      va_list args;
      va_start(args, idMsg);
      int idCmd=IDCANCEL;
      LPTSTR lpsz/*=NULL*/;
      int cchLen=FormatMessage(FORMAT_ALLOCATE_BUFFER|
      FORMAT_MESSAGE_FROM_HMODULE, GetModuleHandle(?), idMsg, LANG_USER_DEFAULT, (LPTSTR)&lpsz, 0, args);
      if(cchLen){
      MessageBeep(uType&MB_TYPEMASK);
      idCmd=MessageBox(hwnd,lpsz,lpszTitle,uType);
      LocalFree(lpsz)
      }
      va_end(args);
      return idCmd;
      }
      • [3168] 結論 wmlhq 2003年09月21日 10:57

        みんなやる気がなさそうなので、勝手に結論出しちゃいます。反論はありませんよね?

        内部処理のUnicode化は人材不足のため、ひとまず先送りする(とはいいながら、嫌な奴は書類選考で落とす)。
        システムエラーメッセージを有効に活用する。
        メッセージボックスを表示する関数は、メッセージリソースを使った関数に順次切り替え/*削除:さらに…(中略)…に変え*/る。
        メッセージボックスを表示する直前のMessageBeepは前述の関数に吸収される。
        メッセージリソースIDの識別子の名前は MSG_ で始め、msgresid.h 中に定義する。
        • [3182] メッセージのリソース化までの予定 サイコジプシー 2003年09月24日 15:35

          1. MYMESSAGEBOXの文字列定数をMESSAGETABLEリソースに置き換える。
           1.1. ソース中のMYMESSAGEBOX文を複数行正規表現Grepで探し尽くして、CSVファイルにする。
          1.2. できたCSVファイルを元に各文字列定数に対応するメッセージIDをすべてmsgresid.hに定義し、global.hで#includeする。
           1.3. MESSAGETABLEリソースを完成し、sakura_rcに追加。
          # ここまでを二週間以内に完了。

          2. MYMESSAGEBOXをMESSAGETABLE対応型に置き換える。
          2.1. 前述のOurMsgBoxをetc_utyに追加。
           2.2. ソース中のすべてのMYMESSAGEBOXを強力な置換ツールでOurMsgBoxに置き換え。
          # これで、四週間以内にメッセージのリソース化完了。

          さあ、できるかな? まぁ、君達には無理かもしれないが。
          • [3184] Re: メッセージのリソース化までの予定 げんた 2003年09月24日 21:47

            >さあ、できるかな? まぁ、君達には無理かもしれないが。
            その先に続くのは「私ならできるけどね」でしょーね.期待してまっせ.
            • [3213] Re2: メッセージのリソース化までの予定 wmlhq 2003年10月05日 15:48

              #!ruby
              $KCODE="S"
              FILES="C*.cpp"
              #WORKDIR="C:\\WINDOWS\\Src\\ssrc_2003-09-20\\sak
              ura_core"
              WORKDIR="C:\\WINNT\\System64\\devonly\\ssrc_200
              3-09-20.tar\\ssrc_2003-09-20\\sakura_core"

              RE_C_CMT=/\/\*[^\r\n*]*\*\//mo
              RE_CPP_CMT=/\/\/[^\r\n]*/mo
              RE_LITSTR=/("(([^"]|\\")*)")/mo
              RE_LITSTRS=/(#{RE_LITSTR.source}\s*)+/mo
              RE_MYMSGBOX=/MYMESSAGEBOX\([^,]+,[^,]+,[^,]+,\s*(#{
              RE_LITSTRS.source})\s*\)/mo
              RE_MSGBOX=/MessageBox\([\w\s]+,(#{RE_LITSTRS.source}),/mo

              def concat_litstrs(s)
              i=0; str=""
              while i=s.index(RE_LITSTR,i)
              i+=$1.size
              str<<$2
              end
              return str
              end

              msgs=[]
              Dir.chdir WORKDIR; files = Dir.glob(FILES)
              for f in files
              lines=File.readlines(f,nil)[0]
              lines.gsub! RE_C_CMT,""
              lines.gsub! RE_CPP_CMT,""
              i=0;
              while i=lines.index(RE_MYMSGBOX,i)
              msgs.push $3.strip
              i+=$1.size
              end
              msgs.uniq!
              end
              for m in msgs.sort!
              print m,"\n"
              end