home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2002 April / VPR0204A.ISO / OLS / LF-CSVPAD102 / lf-csvpad102.lzh / LF-CSVPad.mac next >
Text File  |  2002-01-01  |  20KB  |  726 lines

  1. // LF-CSVPad.mac,tab = 4
  2. //=============================================================================
  3. // Name    : LF-CSVPad CSVファイル編集マクロ
  4. // Version : 1.02
  5. // Author  : Yusuke Komori
  6. // Date    : 2001.10.27(Sat) Start
  7. //         : 2001.11.03(Sat) Version 1.00
  8. //         : 2001.12.24(Mon) Version 1.01
  9. //              ・先頭レコードへジャンプした際に、先頭レコードの次の行へジャン
  10. //                プしてしまう不具合を修正。
  11. //              ・CSVでないファイルで実行した際にエラーが発生してしまう不具合
  12. //                を修正。
  13. //              ・田楽DLLのロード方法を改良した。
  14. //              ・途中でフィールド数が増えた場合にダイアログを表示し直すように
  15. //                した。
  16. //              ・フィールドを追加した場合は空行ではなくCSVを出力するようにし
  17. //                た。
  18. //         : 2002.01.02(Wed) Version 1.02
  19. //              ・フィールド数が多い場合、横に並べて表示できるようにした。
  20. //-----------------------------------------------------------------------------
  21. // Copyright: Original code by Yusuke Komori.
  22. //                 Copyright (c) 2001-2002. Yusuke Komori, All rights reserved.
  23. //=============================================================================
  24. $VERSION    = "LF-CSVPad ver1.02";
  25. $COPY_RIGHT = "Copyright (c) 2001-2002. Yusuke Komori, All rights reserved.";
  26.  
  27.  
  28. //= カスタマイズ用の変数  =====================================================
  29. #HEAD_FIELD_WIDTH  = 20;        // ヘッダフィールド幅(デフォルト値)
  30. #INPUT_FIELD_WIDTH = 30;        // 入力フィールド幅
  31. #INPUT_FIELD_ROW = 20;            // 入力フィールド1列あたりの数
  32.  
  33. #IGNORE_VOIDLINE = true;        // trueの場合、空行を無視する
  34. #IGNORE_COMMENT  = true;        // trueの場合、コメント行を無視する
  35. // 各行のタブ、スペースを除いた先頭の1文字が$COMMENT_HEADERのどれか
  36. // 一文字に一致した場合、コメント行と見なす
  37. $COMMENT_HEADER = "#";            // コメントと見なす先頭文字列(複数指定化)
  38. $SEPARATOR      = ",";            // セパレータ
  39. //=============================================================================
  40.  
  41. #max_field = 0;                        // 最大フィールド数
  42. #field_column = 1;                    // フィールドの横カラム数
  43. #isOpen = false;                    // ダイアログを表示しているか?
  44.  
  45. call InitDengakuDLL;                // 田楽DLLのロード
  46.  
  47. disablebreak;
  48.  
  49. // ヘッダの取得
  50. #prev_x = x;                        // 現在のカーソル位置を保存
  51. #prev_y = y;
  52. gofiletop;
  53. #orgCommentFlg = #IGNORE_COMMENT;    // オリジナル設定を保存
  54. #orgVoidFlg    = #IGNORE_VOIDLINE;    
  55. #IGNORE_COMMENT = false;            // ヘッダはコメントでも取得する
  56. #IGNORE_VOIDLINE = true;            // 先頭行が空行の場合は次の行をヘッダとする
  57. call GetCSVDownward 0;
  58. #IGNORE_COMMENT  = #orgCommentFlg;    // オリジナル設定を復帰
  59. #IGNORE_VOIDLINE = #orgVoidFlg;
  60. #max_field = #fieldcount;
  61. #HEAD_FIELD_WIDTH = #maxfieldlen;
  62.  
  63. // 現在行の取得
  64. moveto #prev_x,#prev_y;                // カーソル位置を元に戻す
  65. call GetCSVDownward 1;                // 現在位置が空/コメント行の場合は次へ移動
  66.  
  67. //メイン処理
  68. call MainProcess;
  69.  
  70. goto EndProcess;
  71.  
  72.  
  73. //-----------------------------------------------------------------------------
  74. // ■ メイン処理
  75. //-----------------------------------------------------------------------------
  76. MainProcess:
  77.     call ResizeDialog;            // ダイアログの再表示
  78.     call DispData lineno, 1;    // ダイアログへ現在行のデータを表示する
  79.     
  80.     while (true)
  81.     {
  82.         $$name = "";
  83.         while ($$name == "")
  84.         {
  85.             $$name = dllfuncstr("WAITCTRLNOTIFY", 100);
  86.         }
  87.         // キャンセルされたときの処理
  88.         if ($$name == "0")
  89.         {
  90.             if (!dllfunc("ENDDIALOG")) goto EndProcess;
  91.             break;
  92.         }
  93.         // OKボタンを押されたときの処理
  94.         else if ($$name == "1")
  95.         {
  96.             call WriteData ##isChanged;    // フィールドが変更されていたら書き出す
  97.             ##isChanged = false;
  98.             
  99.             // ダイアログを閉じる
  100.             if (!dllfunc("ENDDIALOG")) goto EndProcess;
  101.             break;
  102.         }
  103.         // 「前のレコード」ボタンが押されたときの処理
  104.         else if ($$name == "1000")
  105.         {
  106.             call WriteData ##isChanged;    // フィールドが変更されていたら書き出す
  107.             ##isChanged = false;
  108.             
  109.             golinetop2;                    // 1行上へ移動
  110.             left;
  111.             call GetCSVUpward 1;        // CSV取得
  112.             call ResizeDialog;            // 必要ならばダイアログを再表示
  113.             call DispData lineno, 1;    // ダイアログへ現在行のデータを表示する
  114.         }
  115.         // 「次のレコード」ボタンが押されたときの処理
  116.         else if ($$name == "1001")
  117.         {
  118.             call WriteData ##isChanged;    // フィールドが変更されていたら書き出す
  119.             ##isChanged = false;
  120.             
  121.             golineend2;                    // 1行下へ移動
  122.             right;
  123.             call GetCSVDownward 1;        // CSV取得
  124.             call ResizeDialog;            // 必要ならばダイアログを再表示
  125.             call DispData lineno, 1;    // ダイアログへ現在行のデータを表示する
  126.         }
  127.         // 「先頭のレコード」ボタンが押されたときの処理
  128.         else if ($$name == "1002")
  129.         {
  130.             call WriteData ##isChanged;    // フィールドが変更されていたら書き出す
  131.             ##isChanged = false;
  132.             
  133.             // ヘッダの次の行を取得する。
  134.             gofiletop;                    // ファイルの先頭へ移動
  135.             // 空行以外のレコードを検索し、ヘッダと見なして読み捨てる
  136.             #orgCommentFlg = #IGNORE_COMMENT;    // オリジナル設定を保存
  137.             #orgVoidFlg    = #IGNORE_VOIDLINE;    
  138.             #IGNORE_COMMENT = false;    // ヘッダはコメントでも取得する
  139.             #IGNORE_VOIDLINE = true;    // 空行は無視
  140.             call GetCSVDownward 1;
  141.             #IGNORE_COMMENT  = #orgCommentFlg;    // オリジナル設定を復帰
  142.             #IGNORE_VOIDLINE = #orgVoidFlg;
  143.             
  144.             golineend2;
  145.             right;
  146.             call GetCSVDownward 1;        // CSV取得
  147.             call DispData lineno, 1;    // ダイアログへ現在行のデータを表示する
  148.         }
  149.         // 「最後のレコード」ボタンが押されたときの処理
  150.         else if ($$name == "1003")
  151.         {
  152.             call WriteData ##isChanged;    // フィールドが変更されていたら書き出す
  153.             ##isChanged = false;
  154.             
  155.             gofileend;                    // ファイルの最後へ移動
  156.             call GetCSVUpward 1;        // CSV取得
  157.             call ResizeDialog;            // 必要ならばダイアログを再表示
  158.             call DispData lineno, 1;    // ダイアログへ現在行のデータを表示する
  159.         }
  160.         // 「追加」ボタンが押された時の処理
  161.         else if ($$name == "1004")
  162.         {
  163.             // ファイルが書き込み禁止かチェック
  164.             call WarnReadOnly;
  165.             if (##return == false)
  166.             {
  167.                 // フィールドが変更されていたら書き出す
  168.                 call WriteData ##isChanged;
  169.                 ##isChanged = false;
  170.                 if (##return == false)
  171.                 {
  172.                     golineend2;
  173.                     insertreturn;
  174.                     
  175.                     call ClearCSV 1,0;            // 配列を消去
  176.                     ##isChanged = true;
  177.                     call DispData lineno, 1;    // 現在行のデータを表示する
  178.                 }
  179.             }
  180.         }
  181.         // 「削除」ボタンが押された時の処理
  182.         else if ($$name == "1005")
  183.         {
  184.             // ファイルが書き込み禁止かチェック
  185.             call WarnReadOnly;
  186.             if (##return == false)
  187.             {
  188.                 golinetop2;                    // 行を削除
  189.                 deleteafter;
  190.                 delete;
  191.                 
  192.                 call GetCSVDownward 1;        // CSV取得
  193.                 call DispData lineno, 1;    // 現在行のデータを表示する
  194.             }
  195.         }
  196.         // 「元に戻す」ボタンが押されたときの処理
  197.         else if ($$name == "1006")
  198.         {
  199.             if (##isChanged == true)
  200.             {
  201.                 // フィールドが変更されている場合
  202.                 call DispData lineno, 1;    // フィールドを元に戻す
  203.                 ##isChanged = false;
  204.             }
  205.         }
  206.         // 「検索」ボタンが押された時の処理
  207.         else if ($$name == "1007")
  208.         {
  209.             find;
  210.             if (result)
  211.             {
  212.                 // 検索結果が存在した場合
  213.                 // フィールドが変更されていたら書き出す
  214.                 call WriteData ##isChanged;
  215.                 ##isChanged = false;
  216.                 
  217.                 call GetCSV 1;                // CSV取得
  218.                 call DispData lineno, 1;    // 現在行のデータを表示する
  219.             }
  220.             else
  221.             {
  222.                 if(!dllfunc("SHOWMESSAGE", "9999", "文字列が見つかりません")) goto ErrorProcess;
  223.             }
  224.         }
  225.         // フィールドが変更されたときの処理
  226.         else if ( ($$name == "10000") && (##isChanged == false) )
  227.         {
  228.             if(!dllfunc("SETCTRLSTRING", "changed", "変更")) goto ErrorProcess;
  229.             ##isChanged = true;
  230.         }
  231.     }
  232.     
  233.     return;
  234.  
  235.  
  236. //-----------------------------------------------------------------------------
  237. // ■ フィールド数が増加していればダイアログを再表示する
  238. //-----------------------------------------------------------------------------
  239. ResizeDialog:
  240.     // フィールド数が増えたか、ダイアログを開いていない場合に処理する
  241.     if ((#fieldcount > #max_field) || (#isOpen == false))
  242.     {
  243.         if (#fieldcount > #max_field)
  244.         {
  245.             #max_field = #fieldcount;        // 最大フィールド数を更新する
  246.         }
  247.         
  248.         // ダイアログを開いていれば一度閉じる
  249.         if (#isOpen)
  250.         {
  251.             if (!dllfunc("ENDDIALOG")) goto EndProcess;
  252.         }
  253.         
  254.         // ダイアログの作成と表示
  255.         call CreateDialog;
  256.         if (!dllfunc("SHOWDIALOG", hidemaruhandle(0), 0)) goto ErrorProcess;
  257.         #isOpen = true;
  258.     }
  259.     return;
  260.  
  261.  
  262. //-----------------------------------------------------------------------------
  263. // ■ ダイアログの作成を行う
  264. //-----------------------------------------------------------------------------
  265. CreateDialog:
  266.     
  267.     // ダイアログの横幅を計算する
  268.     #field_column = (#max_field / #INPUT_FIELD_ROW) + 1;        // 列の数
  269.     ##last_column = #max_field % #INPUT_FIELD_ROW;                // 最終列の行数
  270.     if (##last_column == 0)
  271.     {
  272.         #field_column = #field_column - 1;
  273.         ##last_column = #INPUT_FIELD_ROW;
  274.     }
  275.     ##column_width = #HEAD_FIELD_WIDTH + #INPUT_FIELD_WIDTH;    // フィールド幅
  276.     ##dialog_width = (##column_width + 2) * #field_column - 1;     // ダイアログ幅
  277.     // 通常列の行数
  278.     if (#field_column > 1)
  279.     {
  280.         ##real_row = #INPUT_FIELD_ROW;
  281.     }
  282.     else
  283.     {
  284.         ##real_row = #max_field;
  285.     }
  286.     
  287.     
  288.     // ダイアログの準備
  289.     if (!dllfunc("NEWDIALOG", $VERSION, ##dialog_width, "")) goto ErrorProcess;
  290.     
  291.     // 行番号表示
  292.     if (dllfunc("NEWCONTROL", "text", "", "行番号") == 0 ||
  293.         dllfunc("SETCTRLWIDTH", "", #HEAD_FIELD_WIDTH) == 0 ||
  294.         dllfunc("NEWCONTROL", "text", "lineno", "") == 0 ||
  295.         dllfunc("SETCTRLWIDTH", "", ##dialog_width - #HEAD_FIELD_WIDTH - 4) == 0 ||
  296.         dllfunc("NEWCONTROL", "text", "changed", "") == 0 ||
  297.         dllfunc("NEWCONTROL", "hline") == 0 )
  298.     {
  299.         goto ErrorProcess;
  300.     }
  301.     
  302.     // フィールド表示
  303.     if(!dllfunc("NEWPAGE", ##column_width)) goto ErrorProcess;
  304.     
  305.     ##index = 0;
  306.     ##j = 1;
  307.     while (##j <= #field_column)
  308.     {
  309.         // 現在の列の行数を計算
  310.         if (##j == #field_column)
  311.         {
  312.             // 最終列の場合
  313.             ##column_num = ##last_column;
  314.         }
  315.         else
  316.         {
  317.             // それ以外の場合
  318.             ##column_num = ##real_row;
  319.         }
  320.         
  321.         
  322.         // 1列分を表示
  323.         ##i = 0;
  324.         while(##i < ##column_num)
  325.         {
  326.             if (dllfunc("NEWCONTROL", "text", "", $csv[0][##index]) == 0 ||
  327.                 dllfunc("SETCTRLWIDTH", "", #HEAD_FIELD_WIDTH) == 0 ||
  328.                 dllfunc("NEWCONTROL", "edit", str(##index), "") == 0 ||
  329.                 dllfunc("SETCTRLNOTIFY", "", "10000") == 0 )
  330.             {
  331.                 goto ErrorProcess;
  332.             }
  333.             
  334.             ##index = ##index + 1;
  335.             ##i = ##i + 1;
  336.         }
  337.         
  338.         // 区切り線と新しい列を作成
  339.         if ((#field_column > 1) && (##j < #field_column))
  340.         {
  341.             if (dllfunc("NEWCOLUMN", 1) == 0 ||
  342.                 dllfunc("NEWCONTROL", "vline") == 0 ||
  343.                 dllfunc("SETCTRLHEIGHT", "", (#INPUT_FIELD_ROW * 27/20)) == 0 ||
  344.                 dllfunc("NEWCOLUMN", ##column_width) == 0
  345.                 )
  346.             {
  347.                 goto ErrorProcess;
  348.             }
  349.         }
  350.         
  351.         ##j = ##j + 1;
  352.     }
  353.     
  354.     
  355.     ##quotWidth = ##dialog_width / 4;
  356.     
  357.     if (// 仕切線
  358.         dllfunc("NEWPAGE", ##dialog_width) == 0 ||
  359.         dllfunc("NEWCONTROL", "hline") == 0 ||
  360.         
  361.         // 先頭/前/次/最後ボタン
  362.         dllfunc("NEWCONTROL", "button", "", "(&T) <<- 先頭") == 0 ||
  363.         dllfunc("SETCTRLNOTIFY", "", "1002") == 0 ||
  364.         dllfunc("SETCTRLWIDTH", "", ##quotWidth) == 0 ||
  365.         dllfunc("NEWCONTROL", "button", "", "(&P) <- 前") == 0 ||
  366.         dllfunc("SETCTRLNOTIFY", "", "1000") == 0 ||
  367.         dllfunc("SETCTRLWIDTH", "", ##quotWidth) == 0 ||
  368.         dllfunc("NEWCONTROL", "button", "", "(&N) 次 ->") == 0 ||
  369.         dllfunc("SETCTRLNOTIFY", "", "1001") == 0 ||
  370.         dllfunc("SETCTRLWIDTH", "", ##quotWidth) == 0 ||
  371.         dllfunc("NEWCONTROL", "button", "", "(&B) 最後 ->>") == 0 ||
  372.         dllfunc("SETCTRLNOTIFY", "", "1003") == 0 ||
  373.         
  374.         // 追加/削除/元に戻す/検索ボタン
  375.         dllfunc("NEWCONTROL", "button", "", "(&A) 追加") == 0 ||
  376.         dllfunc("SETCTRLNOTIFY", "", "1004") == 0 ||
  377.         dllfunc("SETCTRLWIDTH", "", ##quotWidth) == 0 ||
  378.         dllfunc("NEWCONTROL", "button", "", "(&D) 削除") == 0 ||
  379.         dllfunc("SETCTRLNOTIFY", "", "1005") == 0 ||
  380.         dllfunc("SETCTRLWIDTH", "", ##quotWidth) == 0 ||
  381.         dllfunc("NEWCONTROL", "button", "", "(&U) 元に戻す") == 0 ||
  382.         dllfunc("SETCTRLNOTIFY", "", "1006") == 0 ||
  383.         dllfunc("SETCTRLWIDTH", "", ##quotWidth) == 0 ||
  384.         dllfunc("NEWCONTROL", "button", "", "(&F) 検索") == 0 ||
  385.         dllfunc("SETCTRLNOTIFY", "", "1007") == 0 ||
  386.         
  387.         // OK・キャンセルボタン
  388.         dllfunc("NEWPAGE", ##dialog_width) == 0 ||
  389.         dllfunc("NEWCONTROL", "okcancel") == 0 )
  390.     {
  391.         goto ErrorProcess;
  392.     }
  393.     
  394.     return;
  395.  
  396.  
  397. //-----------------------------------------------------------------------------
  398. // ■ ダイアログへデータを表示する
  399. //
  400. // ●引数
  401. //   ##1        現在行
  402. //   ##2        表示したい$csvの要素番号
  403. //   $csv       表示したい要素を格納した配列
  404. //   #max_field 最大フィールド数
  405. //-----------------------------------------------------------------------------
  406. DispData:
  407.     // 行番号の表示
  408.     if (!dllfunc("SETCTRLSTRING", "lineno", str(##1))) goto ErrorProcess;
  409.     if (!dllfunc("SETCTRLSTRING", "changed", "")) goto ErrorProcess;
  410.     
  411.     // 各フィールドの表示
  412.     ##i = 0;
  413.     while(##i < #max_field)
  414.     {
  415.         $$idx = str(##i);
  416.         if (dllfunc("SETCTRLSTRING", $$idx, $csv[##2][##i]) == 0 )
  417.         {
  418.             goto ErrorProcess;
  419.         }
  420.         
  421.         ##i = ##i + 1;
  422.     }
  423.     
  424.     // フィールド変更に伴う通知を読み捨てる
  425.     while (1)
  426.     {
  427.         $$name = dllfuncstr("WAITCTRLNOTIFY", 5);
  428.         if ($$name == "")
  429.         {
  430.             break;
  431.         }
  432.     }
  433.     
  434.     return;
  435.  
  436.  
  437. //-----------------------------------------------------------------------------
  438. // ■ ダイアログからデータを取り込んでテキストへ書き出す
  439. //
  440. // ●引数
  441. //   ##1         true ならばテキストが変更されている。
  442. //   $$SEPARATOR セパレータ
  443. //   #max_field  最大フィールド数
  444. //
  445. // ●戻り値
  446. //   ##return    書き込み禁止で書き込めなかった場合、true
  447. //-----------------------------------------------------------------------------
  448. WriteData:
  449.     // テキストが変更されていなければ何も行わない
  450.     if (##1 == false)
  451.     {
  452.         return false;
  453.     }
  454.     
  455.     // 書き込み禁止でないかチェックする
  456.     call WarnReadOnly;
  457.     if (##return == true)
  458.     {
  459.         return true;
  460.     }
  461.     
  462.     // 各フィールドからテキストを読み込む
  463.     ##i = 0;
  464.     while(##i < #max_field)
  465.     {
  466.         $$writeStr =
  467.             $$writeStr + dllfuncstr("GETCTRLSTRING", str(##i)) + $SEPARATOR;
  468.         ##i = ##i + 1;
  469.     }
  470.     
  471.     // 最後のセパレータを取り除く
  472.     $$writeStr = leftstr($$writeStr, strlen($$writeStr) - 1);
  473.     
  474.     golinetop2;            // 論理行頭へ移動
  475.     deleteafter;        // カーソルより後ろを削除
  476.     insert $$writeStr;    // 新しいデータを挿入
  477.     
  478.     return;
  479.  
  480.  
  481. //-----------------------------------------------------------------------------
  482. // ■ 現在のファイルが書き込み禁止の場合、警告メッセージを表示
  483. // 
  484. // ●戻り値
  485. //   ##return 書き込み禁止の場合、true
  486. //-----------------------------------------------------------------------------
  487. WarnReadOnly:
  488.     if (readonly == true)
  489.     {
  490.         if(!dllfunc("SHOWMESSAGE", "9999", "現在のファイルは書き込み禁止です.")) goto ErrorProcess;
  491.         return true;
  492.     }
  493.     
  494.     return false;
  495.  
  496. //-----------------------------------------------------------------------------
  497. // ■ カーソルのある行をセパレータで分割して配列に格納する
  498. //    空行やコメント行の場合は1行上を格納する。
  499. //
  500. // ●引数
  501. //   ##1 結果を格納する要素番号
  502. //   ##2 1を指定した場合、先頭行に達したときに逆にたどらない。
  503. //-----------------------------------------------------------------------------
  504. GetCSVUpward:
  505.     while (1)
  506.     {
  507.         // 現在行のCSVを取得
  508.         call GetCSV ##1;
  509.         if ( ##return > 0 )
  510.         {
  511.             break;
  512.         }
  513.         else
  514.         {
  515.             // 空行やコメント行だった場合
  516.             golinetop2;
  517.             ##prevline = lineno;            // 現在の行番号を保存
  518.             left;
  519.             if (##prevline == lineno)        // 先頭行に達した場合
  520.             {
  521.                 if (##2 == 1)
  522.                 {
  523.                     // 下へたどらないで終了
  524.                     break;
  525.                 }
  526.                 else
  527.                 {
  528.                     // 有効なレコードを下にたどって取得
  529.                     call GetCSVDownward ##1, 1;
  530.                     break;
  531.                 }
  532.             }
  533.         }
  534.     }
  535.     
  536.     return;
  537.     
  538.     
  539. //-----------------------------------------------------------------------------
  540. // ■ カーソルのある行をセパレータで分割して配列に格納する
  541. //    空行やコメント行の場合は1行下を格納する。
  542. //
  543. // ●引数
  544. //   ##1 結果を格納する要素番号
  545. //   ##2 1を指定した場合、最終行に達したときに逆にたどらない。
  546. //-----------------------------------------------------------------------------
  547. GetCSVDownward:
  548.     while (1)
  549.     {
  550.         // 現在行のCSVを取得
  551.         call GetCSV ##1;
  552.         if (##return > 0)
  553.         {
  554.             break;
  555.         }
  556.         else
  557.         {
  558.             // 空行やコメント行だった場合
  559.             golineend2;
  560.             ##prevline = lineno;        // 現在の行番号を保存
  561.             right;
  562.             if (##prevline == lineno )    // 最終行に達した場合
  563.             {
  564.                 if (##2 == 1)
  565.                 {
  566.                     // 上へたどらないで終了。
  567.                     break;
  568.                 }
  569.                 else
  570.                 {
  571.                     // 有効なレコードを上にたどって取得
  572.                     call GetCSVUpward ##1, 1;
  573.                     break;
  574.                 }
  575.             }
  576.         }
  577.     }
  578.     
  579.     return;
  580.     
  581.     
  582. //-----------------------------------------------------------------------------
  583. // ■ カーソルのある行をセパレータで分割して配列に格納する
  584. //
  585. // ●引数
  586. //   ##1 結果を格納する要素番号
  587. //   $csv[##1]   セパレータで分割した文字列
  588. // 
  589. // ●戻り値
  590. //   コメント行だった場合は 0。空行の場合は-1。それ以外はフィールド数
  591. //   #fieldcount  フィールド数
  592. //   #maxfieldlen 最も長いフィールドの文字数
  593. //-----------------------------------------------------------------------------
  594. GetCSV:
  595.     golineend2;                    // 論理行末へ移動して座標を取得
  596.     ##x_end = x;
  597.     ##y_end = y;
  598.     golinetop2;                    // 論理行頭へ移動して座標を取得
  599.     ##x_start = x;
  600.     ##y_start = y;
  601.     
  602.     if (code == eof)
  603.     {
  604.         // 配列を消去しておく
  605.         call ClearCSV ##1, 0;
  606.         return 0;
  607.     }
  608.     
  609.     $$line = gettext(##x_start, ##y_start, ##x_end, ##y_end);
  610.     
  611.     $$trimline = dllfuncstr("LTRIM", $$line);
  612.     
  613.     // コメント行であるか判断する
  614.     if (#IGNORE_COMMENT == true)
  615.     {
  616.         $$top = leftstr($$trimline, 1);
  617.         if (strstr($COMMENT_HEADER, $$top) > -1)
  618.         {
  619.             // 配列を消去しておく
  620.             call ClearCSV ##1, 0;
  621.             return 0;
  622.         }
  623.     }
  624.     
  625.     // 空行であるか判断する
  626.     if ( (#IGNORE_VOIDLINE == true) && (strlen($$trimline) < 1) )
  627.     {
  628.         // 配列を消去しておく
  629.         call ClearCSV ##1, 0;
  630.         return -1;
  631.     }
  632.     
  633.     // 文字列をセパレータで分割
  634.     #fieldcount = 0;
  635.     #maxfieldlen = 0;
  636.     $$token = dllfuncstr("GETTOKEN",$$line, $SEPARATOR);
  637.     while (1)
  638.     {
  639.         // フィールドのトリムを行う
  640.         $$token = dllfuncstr("LTRIM", $$token);
  641.         $$token = dllfuncstr("RTRIM", $$token);
  642.         $csv[##1][#fieldcount] = $$token;
  643.         
  644.         // フィールド文字列の最大長を更新
  645.         ##fieldlen = strlen($csv[##1][#fieldcount]);
  646.         if (##fieldlen > #maxfieldlen)
  647.         {
  648.             #maxfieldlen = ##fieldlen;
  649.         }
  650.         
  651.         #fieldcount = #fieldcount + 1;
  652.         
  653.         if (dllfunc("HASMORETOKENS") == 0)
  654.         {
  655.             // トークンがもう存在しなければ終了
  656.             break;
  657.         }
  658.         
  659.         // 次のトークンを取り出す
  660.         $$token = dllfuncstr("GETTOKEN", "", $SEPARATOR);
  661.     }
  662.     
  663.     // フィールド数が満たない場合は、前のゴミを消しておく
  664.     call ClearCSV ##1, #fieldcount;
  665.     
  666.     return #fieldcount;
  667.  
  668.  
  669. //-----------------------------------------------------------------------------
  670. // ■ $CSV配列の消去を行う
  671. // 
  672. // ●引数
  673. //   ##1 要素番号
  674. //   ##2 消去を始めるフィールド番号
  675. //-----------------------------------------------------------------------------
  676. ClearCSV:
  677.         // 配列を消去しておく
  678.         ##i = ##2;
  679.         while (##i < #max_field)
  680.         {
  681.             $csv[##1][##i] = "";
  682.             ##i = ##i + 1;
  683.         }
  684.         return;
  685.  
  686.  
  687. //-----------------------------------------------------------------------------
  688. // ■ 田楽DLLの利用準備
  689. //-----------------------------------------------------------------------------
  690. InitDengakuDLL:
  691.     if (1/2 == 0 && version < 309) {
  692.         message "このマクロには秀丸の Ver.3.09 以降が必要です。";
  693.         endmacro;
  694.     }
  695.     
  696.     // 田楽DLLのパス
  697.     $$dllFileName = hidemarudir + "\\dengakudll.dll";
  698.     
  699.     // 田楽DLLのロード(すでにロードされている場合はロードしない)
  700.     if (loaddllfile != $$dllFileName)
  701.     {
  702.         title "田楽DLL をロード中・・・";
  703.         loaddll($$dllFileName);
  704.         if (!result)
  705.         {
  706.             message "田楽DLL をロードできませんでした。";
  707.             endmacro;
  708.         }
  709.         title 0;
  710.     }
  711.     
  712.     return;
  713.  
  714.  
  715. //---------------------------------------------
  716. // ■ マクロ終了処理ルーチン
  717. //---------------------------------------------
  718. ErrorProcess:
  719.     message "処理中にエラーが発生しました.";
  720.     freedll;        // 念のため、DLLを破棄
  721.     
  722. EndProcess:
  723.     endmacro;
  724.  
  725. //======================================================== End of LF-CSVPad.mac
  726.