for文は次の様に定義されていると考えられがちです。 一般的なfor文に対する認識 for([カウンタの開始値(初期化)];[カウンタの終了値];[カウンタの増減値]){ [実行文] } ここで一旦VBScriptの記述を見てみましょう。 VBScriptのfor文(Step以降は省略可。省略時は[Step 1]と見なされる。) For [カウンタの開始値(初期化)] To [カウンタの終了値] Step [カウンタの増減値] [実行文] Next 0から9までループする処理をそれぞれの方法で記述してみます。 0から9までループ(JavaScript) for(i=0;i<10;i++){ [実行文] } 0から9までループ(VBScript) For i=0 To 9 [実行文] Next JavaScriptはなぜ変数[i]を複数回記述しなければならないのでしょう。 次の様に記述させてもよさそうに思えます。 JavaScript似の仮想言語によるfor文 for(i=0;10;1){ //もしくは[for(i=0;9;1){] [実行文] } 実はfor文の定義は次のようになっています。 JavaScriptのfor文 for([ループ初回に実行される処理];[ループを抜ける為の条件(真偽値)];[ループ2回目以降に実行される処理]){ [実行文] } 処理を詳細に追ってみます。 for文の処理を詳細に追う for(i=0;i<10;i++){ alert(i.toString(10)); } i=0 [ループ初回に実行される処理] i<10 [真偽値判定] (0<10=true) alert(i.toString(10)); [実行文] ("0"を表示) i++ [ループ2回目以降に実行される処理] (i=1) i<10 [真偽値判定] (1<10=true) alert(i.toString(10)); [実行文] ("1"を表示) i++ [ループ2回目以降に実行される処理] (i=2) i<10 [真偽値判定] (2<10=true) alert(i.toString(10)); [実行文] ("2"を表示) ・ ・ ・ i++ [ループ2回目以降に実行される処理] (i=9) i<10 [真偽値判定] (9<10=true) alert(i.toString(10)); [実行文] ("9"を表示) i++ [ループ2回目以降に実行される処理] (i=10) i<10 [真偽値判定] (10<10=false) [ループを抜ける] この様な動作になっている為、次の様な変わった記述も可能なのです。 特異なfor文の例 for(var str="";str.length<50;str+=prompt("入力して下さい。\nstr=\""+str+"\"","")){} これを一般的な記述方法に書き換えてみましょう。 一般的な記述に書き換えた例 var str=""; while(str.length<50){ str+=prompt("入力して下さい。\nstr=\""+str+"\"",""); } これらの特異なfor文は推奨しません。 一般的なPGはfor文を見ると[カウンタ付のループ]と判断します。 [カウンタ付のループ]の定義部分で文字列の操作が行なわれているとは夢にも思いません。
業務アプリケーションは新しい技術よりも安定した技術を好むから、この業界にいつ頃普及するのかわからないですけど、VBっぽい画面も好むので案外早いかもしれません。 ユーザの立場にたったWebアプリケーションの開発が加速する事を期待します。
前回、大日本タイポ組合で書きましたが、「愛」と「カナサンソフト」でうまくできたのは運が良かったからのようです。 個人名での作成をかなりの時間をかけて試してみましたがうまくいきません。 (前回のエントリーから30分程しか経っていませんが、単なるエントリー忘れです。) やっぱり、センスが違うのでしょう。 またイベントがあったとしても、東京。 さすがに印鑑一つの為に、東京には行けない。 でも、欲しい。
まずはこちらdainippon type organization: 大日本タイポ組合のインボウを見て頂きたい。 印鑑である。 でもデザインに何か違和感が...。 何故か? 今度はこちらのdainippon type organization: 書き初めを見て頂きたい。 夢と書かれているが、同じく違和感がある。 良く、見ると...、カタカナでメッセージが書かれているのである。 何が書かれているのか、自身で見つけるのがこの芸術の醍醐味であると思うので、あえて伏せておく。 先程の印鑑も同様。 正直、この印鑑が欲しいと思ってしまった。 過去2度のイベントで、オーダーメイドの印鑑作成を行っていたそうである。 もちろん、来客者の名前等を組み込んで...。 サイト上から注文できないものかと思い探してみるが、受け付けてない模様。 余りにも悔しいので、「Kanasansoft」の語源「愛さん」の「愛」に「カナサンソフト」を組み込んでみた。 あれあれ? 「愛」の画数と「カナサンソフト」の字数が相性がいいのか、運良くうまくできてしまった。 やった!! いや違う。 うまくできたと喜ぶべきではない。 印鑑が手に入らないと悔しがるべきなのだ。
Bookmarkletのリンク上でコンテキストメニューを表示します(Windowsでは右クリック、MacintoshではControlキー+クリック)。 「お気に入りに追加」もしくは「ブックマークに追加」を選択して下さい。 アラートが表示される事がありますが、そのまま追加処理を続行して下さい。 後は、Bookmarkletを実行したいページを開き、お気に入り(ブックマーク)からBookmarkletを選択するだけです。
JavaScriptをある程度使えるようになった人にお薦めの本、JavaScript 第3版 (Amazonへリンク)です。 文字や画像の色や位置の変更、つまり見た目の派手さ重視の書籍が多い中で、珍しくJavaScriptを体系的に学べる数少ない本です。 国内で発行されているJavaScript関連の書籍にはかなり目を通していますが、この本のレベルは抜きん出ています。 これ以上詳しく書いた日本語で読めるものを、私は知りません。
<a href=" javascript:( function(){ var F=function(w){ try{ var m=w.document.forms ,o ,t ,p ,i ,j ,k ; for(i=0;i<m.length;i++){ o=m[i].elements; for(j=0;j<o.length;j++){ t=o[j]; switch(t.type){ case "text": case "textarea": case "hidden": case "password": t.value=""; break; case "radio": case "checkbox": t.checked=false; break; case "select-one": case "select-multiple": t.selectedIndex=-1; p=t.options; for(k=0;k<p.length;k++){ p[k].selected=false } break; } } } }catch(e){ } for(i=0;i<w.frames.length;i++){ F(w.frames[i]) } } ; F(top) } ) () " class="bookmarklet">フォームをクリアするBookmarklet Ver1.0.1 早速ですが前バージョンにバグがあったので修正します。 /* ================================================================================ Name : フォームをクリアするBookmarklet Ver1.0.1 In : [none] Out : [none] Note : 初期化ではなくクリアを行う -------------------------------------------------------------------------------- Version : Ver1.0.0 | 2005/07/23 | 新規作成 : Ver1.0.1 | 2005/07/23 | 不具合修正・ソースの整理 -------------------------------------------------------------------------------- Copyright : 2005 Kanasansoft URL : www.kanasansoft.com ================================================================================ */ javascript:( function(){ var F=function(w){ try{ var m=w.document.forms ,o ,t ,p ,i ,j ,k ; for(i=0;i<m.length;i++){ o=m[i].elements; for(j=0;j<o.length;j++){ t=o[j]; switch(t.type){ case "text": case "textarea": case "hidden": case "password": t.value=""; break; case "radio": case "checkbox": t.checked=false; break; case "select-one": case "select-multiple": t.selectedIndex=-1; p=t.options; for(k=0;k<p.length;k++){ p[k].selected=false } break; } } } }catch(e){ } for(i=0;i<w.frames.length;i++){ F(w.frames[i]) } } ; F(top) } ) ()
<a href=" javascript:( function(){ var F=function(w){ try{ var t,i,j,k ,o,p ,m=w.document.forms; for(i=0;i<m.length;i++){ o=m[i].elements; for(j=0;j<o.length;j++){ t=o[j]; switch(t.type){ case "text": case "textarea": case "hidden": case "password": t.value=""; break; case "radio": case "checkbox": t.checked=false; break; case "select-one": case "select-multiple": t.selectedIndex=-1; p=t.options; for(k=0;k<p.length;k++){ p[k].selected=false } break; } } } }catch(e){ } for(i=0;i<w.frames.length;i++){ F(w.frames[i]) } } F(top); } ) () " class="bookmarklet">フォームをクリアするBookmarklet Ver1.0.0 フォームをクリアします。 初期状態にするのではありません。 テキストボックス・テキストエリア・ヒドゥン・パスワードの内容を空白に、ラジオボタン・チェックボックスを未チェック状態に、単一セレクトメニュー・複数セレクトメニューを未選択状態にします。 特にラジオボタン・単一セレクトメニューの入力チェック試験に役に立つでしょう。 「ラジオボタンの初期状態をチェック状態、単一セレクトメニューの初期状態を選択状態にすれば、入力チェックが不要」と考えている開発者が少なからずいる為、この試験は実施する価値があると思います。 /* ================================================================================ Name : フォームをクリアするBookmarklet Ver1.0.0 In : [none] Out : [none] Note : 初期化ではなくクリアを行う -------------------------------------------------------------------------------- Version : Ver1.0.0 | 2005/07/23 | 新規作成 -------------------------------------------------------------------------------- Copyright : 2005 Kanasansoft URL : www.kanasansoft.com ================================================================================ */ javascript:( function(){ var F=function(w){ try{ var t,i,j,k ,o,p ,m=w.document.forms; for(i=0;i<m.length;i++){ o=m[i].elements; for(j=0;j<o.length;j++){ t=o[j]; switch(t.type){ case "text": case "textarea": case "hidden": case "password": t.value=""; break; case "radio": case "checkbox": t.checked=false; break; case "select-one": case "select-multiple": t.selectedIndex=-1; p=t.options; for(k=0;k<p.length;k++){ p[k].selected=false } break; } } } }catch(e){ } for(i=0;i<w.frames.length;i++){ F(w.frames[i]) } } F(top); } ) ()
MomableType テンプレート for Kanasansoft Web Lab.[2005/07/19版]
Kanasansoft Web Lab.のテンプレート[2005/07/19版] 当サイト固有のデータをテンプレートモジュールにまとめました。 可搬性は確保できたと思いますが、どこかに固有のものが残っていましたらコメントに書き込んでください。
Bookmarkletを作成するツールのバージョンアップ
Bookmarkletを作成するツール[Kanasansoft Convert Source And Bookmarklet]をバージョンアップしました。 当ブログのテンプレート変更に合わせ、変換方法を改良しました。 新バージョン[Kanasansoft Convert Source And Bookmarklet Ver1.1] 旧バージョン[Kanasansoft Convert Source And Bookmarklet Ver1.0]
技術系の雑誌や書籍を読んでいると驚くような記述を見つけることがたまにあります。 今までで一番驚いたのが「入力チェックはサーバに負担がかかるのでクライアントで全て済ましてしまえばいい。」という記述。 「サーバでのチェックは不要」と続く。 やめて下さい、無責任な主張は。 新人が本気にします。 コード内にバグやセキュリティホールを垂れ流します。 クライアントでの入力チェックはサーバ負荷の軽減には役には立ちますが、最終的にサーバ側でも入力チェックは必要です。 何故でしょうか。 クライアントの入力チェックを通さずにデータの送信が可能だからです。 クライアントの入力チェック後、データの送信過程で改竄が可能だからです。 ブラウザ上以外からもデータの送信が可能だからです。 順を追って説明します。 1.クライアントの入力チェックを通さずにデータの送信が可能 送信イベントで入力チェック後データ送信 上記コードは「ブラウザのJavaScriptを無効」にすると関数[fncInput]が実行されずそのまま送信可能です。 同一関数内で入力チェック後データ送信 function fncSubmit(){ if(fncInputCheck()){ document.forms["frmMain"].submit(); } } (略) 上記コードは「JavaScriptを無効にしたブラウザ上からのデータ送信を防ぐ」事を目的にしています。 つまりJavaScript無効状態では関数[fncSubmit]が実行されないため、送信が不可能です。 但し、任意のコードを実行するBookmarklet Ver1.1を使用すると送信可能になります。 任意のコードを実行するBookmarklet Ver1.1を実行し、開いた別ウィンドウで次のコードを実行します。 入力チェックせずにデータ送信 window.opener.document.forms["frmMain"].submit(); 2.クライアントの入力チェック後、データの送信過程で改竄 プロキシを使用します。 例えば、[Achilles]はクライアントにインストールするプロキシサーバです。 ブラウザが送信したデータを受け取り、編集した上でサーバへ送信できます。 受信も同様で、サーバに取得しに行ったデータを受け取り、HTMLを編集しブラウザへ表示させる事ができます。 [Achilles proxy]で検索すると日本語のサイトも引っ掛かりますので詳細な使用方法はそちらをご覧下さい。 3.ブラウザ上以外からもデータの送信が可能 ブラウザが送信するデータと同じ形式のデータ送信が可能であれば良いわけですから、そういうプログラムを作ればいいのです。 スキルはある程度求められますが、一番汎用性が高いでしょう。 コマゴマと書きましたが何が言いたいかと言いますと、「入力チェックはサーバ側で、受信したデータ全てに対して行う」ようにする。 そして、「クライアントの入力チェックは、サーバの負荷を下げる為の補助的な処理とする」事です。 これ以上、こんなコードは書くべきではありません。 プログラマの皆さん、もし何かあった時、これまでに記述されたコード全てを修正するのは他でもない、アナタですよ。
選択中のコードをコメントアウトする秀丸マクロ Ver2.6
選択中のコードをコメントアウトする秀丸マクロ Ver2.6です。 以前に選択中のコードをコメントアウトする秀丸マクロ Ver2.5 先行公開とエントリーしましたが、修正を更に行いましたのでバージョンアップとしました。 [コメントアウト処理方式]に[一行処理]を追加しています。 役に立たなさそうな[一行処理]ですが次の開発への布石です。 操作感も向上したと思います。
選択中のコードをコメントアウトする秀丸マクロ Ver2.5 先行公開
バージョンアップしました。 変更は不具合の解消とコメントアウト設定の追加です。 コメントの一覧が表示されている時に、スペースを押しながら[Esc]を押してください。 [コメントアウト処理方式][選択項目既定値][コメントアウト種類最大表示数]を設定できます。 ReadMeも作成していませんがコードを先行公開します。 ReadMe作成後、正式バージョンをアップ、秀まるおのホームページ－秀丸エディタのマクロライブラリに登録します。 [コメントアウト処理方式]だけちょっと説明。 [連続処理]はコメントアウトとして登録されている文字列を順に挿入していきます。 広範囲のコメントアウトが可能ですが、コメントアウト前の状態に戻すには何度も取り消しを行わなくてはなりません。 [一括処理]はコメントアウトの対象となる文字列を取得し、コメントアウト処理を施した後、コメントアウト対象を置き換えます。 文字列の取得の制限により広範囲のコメントアウトはできませんが、取り消しを二度行うだけでコメントアウト前の状態に戻すことができます。 旧バージョンの選択中のコードをコメントアウトする秀丸マクロは[連続処理]を行っています。 //================================================================================ // Name : knsn_HIDEMARU_MACRO_COMMENT_OUT Ver2.5 // In : [Ini] コメント // Out : [Ini] コメント // : [Write] 選択コメント // Note : 選択中のコードをコメントアウトするマクロ //-------------------------------------------------------------------------------- // Version : Ver1.0 | 2004/09/16 | 新規作成 // Version : Ver1.1 | 2004/10/29 | コメント種追加 // Version : Ver2.0 | 2005/06/22 | コメント種を編集可能にした // Version : Ver2.1 | 2005/06/23 | コメントアウト範囲の算出が正常に行われないバグを修正 // Version : Ver2.5 | 2005/07/06 | コメントアウト後の選択範囲算出が正常に行われないバグを修正・コメントアウト設定機能追加 //-------------------------------------------------------------------------------- // Copyright : 2004-2005 Kanasansoft // URL : www.kanasansoft.com //================================================================================ //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- $INITIAL_FILE_NAME = "knsn_HIDEMARU_MACRO_COMMENT_OUT_2_5.ini"; $SECTION_CONTROL = "CONTROL"; $SECTION_COMMENT_HEAD = "COMMENT_NUMBER_"; //$SECTION_CONTROL $KEY_PROCESS_MODE = "PROCESS_MODE"; $KEY_SELECT_DEFAULT = "SELECT_DEFAULT"; $KEY_SELECT_NUMBER = "SELECT_NUMBER"; $KEY_COMMENT_MAX = "COMMENT_MAX"; //$SECTION_COMMENT_HEAD $KEY_BLOCK_TOP = "BlockTop"; $KEY_LINE_TOP = "LineTop"; $KEY_LINE_END = "LineEnd"; $KEY_BLOCK_END = "BlockEnd"; //$KEY_PROCESS_MODE #PROCESS_MODE_COUNT = 2 ; #PROCESS_MODE_SEQUENCE = 0 ; $PROCESS_MODE[#PROCESS_MODE_SEQUENCE] = "連続処理"; #PROCESS_MODE_BATCH = 1 ; $PROCESS_MODE[#PROCESS_MODE_BATCH] = "一括処理"; //$KEY_SELECT_DEFAULT #DEFAULT_MODE_COUNT = 2; #DEFAULT_MODE_FIRST = 0 ; $DEFAULT_MODE[#DEFAULT_MODE_FIRST] = "常に最初の項目"; #DEFAULT_MODE_LAST_TIME = 1 ; $DEFAULT_MODE[#DEFAULT_MODE_LAST_TIME] = "前回の選択項目"; #COMMENT_MAX_DEFAULT = 10; #COMMENT_MAX_MINIMUM = 3; #COMMENT_MAX_MAXIMUM = 100; $SHORT_CUT[0] = "1"; $SHORT_CUT[1] = "2"; $SHORT_CUT[2] = "3"; $SHORT_CUT[3] = "4"; $SHORT_CUT[4] = "5"; $SHORT_CUT[5] = "6"; $SHORT_CUT[6] = "7"; $SHORT_CUT[7] = "8"; $SHORT_CUT[8] = "9"; $SHORT_CUT[9] = "0"; $SHORT_CUT[10] = "A"; $SHORT_CUT[11] = "B"; $SHORT_CUT[12] = "C"; $SHORT_CUT[13] = "D"; $SHORT_CUT[14] = "E"; $SHORT_CUT[15] = "F"; $SHORT_CUT[16] = "G"; $SHORT_CUT[17] = "H"; $SHORT_CUT[18] = "I"; $SHORT_CUT[19] = "J"; $SHORT_CUT[20] = "K"; $SHORT_CUT[21] = "L"; $SHORT_CUT[22] = "M"; $SHORT_CUT[23] = "N"; $SHORT_CUT[24] = "O"; $SHORT_CUT[25] = "P"; $SHORT_CUT[26] = "Q"; $SHORT_CUT[27] = "R"; $SHORT_CUT[28] = "S"; $SHORT_CUT[29] = "T"; $SHORT_CUT[30] = "U"; $SHORT_CUT[31] = "V"; $SHORT_CUT[32] = "W"; $SHORT_CUT[33] = "X"; $SHORT_CUT[34] = "Y"; $SHORT_CUT[35] = "Z"; call subMain; endmacro; //=============================================================================== // Name : subMain // In : [none] // Out : [none] // Note : コメントアウトのメイン処理 //=============================================================================== subMain: while(true) { //---------------------------------------- //設定取得 //---------------------------------------- //コメントアウト処理方式取得 ##ProcessMode = getininum ( $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_PROCESS_MODE ); //選択項目既定値フラグ取得 ##SelectFlg = getininum ( $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_SELECT_DEFAULT ); //選択項目既定値項目取得 ##SelectComment = getininum ( $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_SELECT_NUMBER ); //コメントアウト種類最大表示数取得 ##CommentMax = getininum ( $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_COMMENT_MAX ); //コメントアウト種類最大表示数の修正 if(##CommentMax<=0) { ##CommentMax = #COMMENT_MAX_DEFAULT; } //選択項目既定値項目の修正 if(##SelectFlg==0) { ##SelectComment = 0; } if(##SelectComment>=##CommentMax) { ##SelectComment = 0; } //---------------------------------------- //ショートカットの作成 //---------------------------------------- ##CommentNumber = 0; while(##CommentNumber<##CommentMax) { if($SHORT_CUT[##CommentNumber]!="") { $MENU_SHORT_CUT[##CommentNumber] = "(&" + $SHORT_CUT[##CommentNumber] + ") "; } else { $MENU_SHORT_CUT[##CommentNumber] = ""; } ##CommentNumber = ##CommentNumber + 1; } //---------------------------------------- //保存されたコメントの取得 //---------------------------------------- ##CommentNumber = 0; while(##CommentNumber<##CommentMax) { $$BlockTop[##CommentNumber] = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##CommentNumber) , $KEY_BLOCK_TOP ); $$LineTop[##CommentNumber] = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##CommentNumber) , $KEY_LINE_TOP ); $$LineEnd[##CommentNumber] = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##CommentNumber) , $KEY_LINE_END ); $$BlockEnd[##CommentNumber] = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##CommentNumber) , $KEY_BLOCK_END ); ##CommentNumber = ##CommentNumber + 1; } //---------------------------------------- //メニュー用エンコード //---------------------------------------- ##CommentNumber = 0; while(##CommentNumber<##CommentMax) { call subReplaceAll $$BlockTop[##CommentNumber] , "&" , "&&"; $$MenuBlockTop[##CommentNumber] = $$return; call subReplaceAll $$LineTop[##CommentNumber] , "&" , "&&"; $$MenuLineTop[##CommentNumber] = $$return; call subReplaceAll $$LineEnd[##CommentNumber] , "&" , "&&"; $$MenuLineEnd[##CommentNumber] = $$return; call subReplaceAll $$BlockEnd[##CommentNumber] , "&" , "&&"; $$MenuBlockEnd[##CommentNumber] = $$return; ##CommentNumber = ##CommentNumber + 1; } //---------------------------------------- //メニュー項目作成 //---------------------------------------- ##CommentNumber = ##SelectComment; while(##CommentNumber<##CommentMax) { $$Menu[##CommentNumber-##SelectComment] = $MENU_SHORT_CUT[##CommentNumber] + "" + $$MenuBlockTop[##CommentNumber] + " " + $$MenuLineTop[##CommentNumber] + "..." + $$MenuLineEnd[##CommentNumber] + " " + $$MenuBlockEnd[##CommentNumber] + "" ; ##CommentNumber = ##CommentNumber + 1; } ##CommentNumber = 0; while(##CommentNumber<##SelectComment) { $$Menu[##CommentNumber+(##CommentMax-##SelectComment)] = $MENU_SHORT_CUT[##CommentNumber] + "" + $$MenuBlockTop[##CommentNumber] + " " + $$MenuLineTop[##CommentNumber] + "..." + $$MenuLineEnd[##CommentNumber] + " " + $$MenuBlockEnd[##CommentNumber] + "" ; ##CommentNumber = ##CommentNumber + 1; } //---------------------------------------- //メニュー表示 //---------------------------------------- menuarray $$Menu,##CommentMax; if(result==0) { ##SelectComment = -1; } else { ##SelectComment = result + ##SelectComment - 1; } if(##SelectComment>=##CommentMax) { ##SelectComment = ##SelectComment - ##CommentMax; } //---------------------------------------- //選択による処理分岐 //---------------------------------------- //スペースを押されずにメニューが未選択の場合は終了 if( iskeydown(0x20) == 0 && ##SelectComment < 0 ) { break; } //スペースを押しながらメニューが未選択の場合は設定モード if( iskeydown(0x20) == 1 && ##SelectComment < 0 ) { call subControlMenu; continue; } //スペースを押されずにメニューが選択された場合はコメント挿入 if( iskeydown(0x20) == 0 && ##SelectComment >= 0 ) { if( ##ProcessMode == #PROCESS_MODE_SEQUENCE ) { call subInsertCommentSequence ##SelectComment ; } else if( ##ProcessMode == #PROCESS_MODE_BATCH ) { call subInsertCommentBatch ##SelectComment ; } //選択項目保存 writeininum $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_SELECT_NUMBER , ##SelectComment ; break; } //スペースを押しながらメニューが選択された場合は編集モード if( iskeydown(0x20) == 1 && ##SelectComment >= 0 ) { call subEditComment ##SelectComment ; continue; } } return; //=============================================================================== // Name : subInsertCommentSequence // In : [Number] コメントの番号 // Out : [none] // Note : コメントを挿入する(連続処理方式) //=============================================================================== subInsertCommentSequence: //画面描画の禁止 disabledraw; //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- ##SelectComment = ##1; $$BlockTop = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_TOP ); $$LineTop = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_TOP ); $$LineEnd = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_END ); $$BlockEnd = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_END ); //---------------------------------------- //選択範囲取得 //---------------------------------------- if(selecting==1) //選択状態 { $$ModeSelect = "Selection"; //ワープロ的選択座標の取得 ##TopXWrdpro = seltopx; ##TopYWrdpro = seltopy; ##EndXWrdpro = selendx; ##EndYWrdpro = selendy; //選択の解除 escape; //ワープロ的座標からエディタ的座標を取得 moveto ##TopXWrdpro,##TopYWrdpro; ##TopXEditor = column; ##TopYEditor = lineno; moveto ##EndXWrdpro,##EndYWrdpro; ##EndXEditor = column; ##EndYEditor = lineno; } else //未選択状態 { $$ModeSelect = "Unselection"; //エディタ的座標による選択範囲座標の取得 ##TopXEditor = column; ##TopYEditor = lineno; ##EndXEditor = column; ##EndYEditor = lineno; } //---------------------------------------- //補正 //---------------------------------------- //選択範囲終了位置(ファイルの先頭から遠い方)が最終行行頭だった場合 //前の行までの選択をさす為、補正が必要 if( $$ModeSelect == "Selection" && ##EndXEditor == 0 ) { ##EndYEditor = ##EndYEditor - 1; } //ファイル最終行のチェック if(##EndYEditor==linecount2) { ##EOFFlg = 1; } else { ##EOFFlg = 0; } //---------------------------------------- //コメントアウト処理 //---------------------------------------- //処理後の選択範囲 ##TopYSelect = ##TopYEditor; ##EndYSelect = ##EndYEditor; //ブロックの前 if($$BlockTop!="") { //移動してコメントを挿入 movetolineno 0,##TopYEditor; insert $$BlockTop+"\n"; //ブロックの前に一行追加されたため補正 ##TopYEditor = ##TopYEditor + 1; ##EndYEditor = ##EndYEditor + 1; ##EndYSelect = ##EndYSelect + 1; } //選択されていた行をループ ##Cnt=##TopYEditor; while(##Cnt<=##EndYEditor) { //行の最初 if($$LineTop!="") { //移動してコメントを挿入 movetolineno 0,##Cnt; insert $$LineTop; } //行の最後 if($$LineEnd!="") { //移動してコメントを挿入 movetolineno 0,##Cnt; movetolineno linelen2+1,##Cnt; insert $$LineEnd; } //カウントアップ ##Cnt = ##Cnt+1; } //ブロックの後 if($$BlockEnd!="") { //移動してコメントを挿入 movetolineno 0,##EndYSelect; movetolineno linelen2+1,##EndYSelect; insert "\n"+$$BlockEnd; //ブロックの後に一行追加されたため補正 ##EndYSelect = ##EndYSelect + 1; } //---------------------------------------- //後処理 //---------------------------------------- //選択開始 movetolineno 0,##TopYSelect; beginsel; if(##EOFFlg==0) { movetolineno 0,##EndYSelect+1; } else { movetolineno 0,##EndYSelect; movetolineno linelen2+1,##EndYSelect; } endsel; //画面描画の禁止の解除 enabledraw; return; //=============================================================================== // Name : subInsertCommentBatch // In : [Number] コメントの番号 // Out : [none] // Note : コメントを挿入する(一括処理方式) //=============================================================================== subInsertCommentBatch: //画面描画の禁止 disabledraw; //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- ##SelectComment = ##1; $$BlockTop = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_TOP ); $$LineTop = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_TOP ); $$LineEnd = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_END ); $$BlockEnd = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_END ); //---------------------------------------- //選択範囲取得 //---------------------------------------- if(selecting==1) //選択状態 { $$ModeSelect = "Selection"; //ワープロ的選択座標による選択範囲座標の取得 ##TopXWrdpro = seltopx; ##TopYWrdpro = seltopy; ##EndXWrdpro = selendx; ##EndYWrdpro = selendy; //選択の解除 escape; //ワープロ的座標からエディタ的座標を取得 moveto ##TopXWrdpro,##TopYWrdpro; ##TopXEditor = column; ##TopYEditor = lineno; moveto ##EndXWrdpro,##EndYWrdpro; ##EndXEditor = column; ##EndYEditor = lineno; } else //未選択状態 { $$ModeSelect = "Unselection"; //エディタ的座標による選択範囲座標の取得 ##TopXEditor = column; ##TopYEditor = lineno; ##EndXEditor = column; ##EndYEditor = lineno; } //---------------------------------------- //補正 //---------------------------------------- //選択範囲終了位置(ファイルの先頭から遠い方)が最終行行頭だった場合 //前の行までの選択をさす為、補正が必要 if( $$ModeSelect == "Selection" && ##EndXEditor == 0 ) { ##EndYEditor = ##EndYEditor - 1; } //ファイル最終行のチェック if(##EndYEditor==linecount2) { ##EOFFlg = 1; } else { ##EOFFlg = 0; } //ワープロ的選択座標によるコメントアウト範囲座標の取得 //(gettextがエディタ的座標に対応していないためワープロ的座標) //先頭行の行頭 movetolineno 0,##TopYEditor; ##TopX = x; ##TopY = y; //最終行の行末 movetolineno 0,##EndYEditor; movetolineno linelen2+1,##EndYEditor; ##EndX = x; ##EndY = y; //---------------------------------------- //コメントアウト文字列作成 //---------------------------------------- //処理後の選択範囲 ##TopYSelect = ##TopYEditor; ##EndYSelect = ##EndYEditor; //コメントアウト処理済文字列 $$InsertString = ""; //コメントアウト対象文字列取得 $$TargetString = gettext(##TopX,##TopY,##EndX,##EndY); //ブロックの前 if($$BlockTop!="") { //ブロック前のコメントを追加 $$InsertString = $$InsertString + $$BlockTop + "\n"; ##EndYSelect = ##EndYSelect + 1; } //行の最初と最後 if( $$LineTop!="" || $$LineEnd!="" ) { call subReplaceAll $$TargetString , "\r\n" , $$LineEnd+"\r\n"+$$LineTop; $$TargetString = $$LineTop + $$return + $$LineEnd; } $$InsertString = $$InsertString + $$TargetString; //ブロックの後 if($$BlockEnd!="") { //ブロック前のコメントを追加 $$InsertString = $$InsertString + "\n" + $$BlockEnd; ##EndYSelect = ##EndYSelect + 1; } //---------------------------------------- //コメントアウト処理 //---------------------------------------- //選択開始 movetolineno 0,##TopYEditor; beginsel; movetolineno 0,##EndYEditor; movetolineno linelen2+1,##EndYEditor; endsel; //文字列挿入 insert $$InsertString; //---------------------------------------- //後処理 //---------------------------------------- //選択開始 movetolineno 0,##TopYSelect; beginsel; if(##EOFFlg==0) { movetolineno 0,##EndYSelect+1; } else { movetolineno 0,##EndYSelect; movetolineno linelen2+1,##EndYSelect; } endsel; //画面描画の禁止の解除 enabledraw; return; //=============================================================================== // Name : subEditComment // In : [Number] コメントの番号 // Out : [none] // Note : コメントを編集し保存する //=============================================================================== subEditComment: //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- ##SelectComment = ##1; $$BlockTop = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_TOP ); $$LineTop = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_TOP ); $$LineEnd = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_END ); $$BlockEnd = getinistr ( $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_END ); //---------------------------------------- //コメントの編集 //---------------------------------------- while(true) { //メニュー表示用にコメント部品文字列を編集 call subReplaceAll $$BlockTop , "&" , "&&"; $$MenuBlockTop = "(&1) ブロックの前: " + $$return; call subReplaceAll $$LineTop , "&" , "&&"; $$MenuLineTop = "(&2) 行の最初: " + $$return; call subReplaceAll $$LineEnd , "&" , "&&"; $$MenuLineEnd = "(&3) 行の最後: " + $$return; call subReplaceAll $$BlockEnd , "&" , "&&"; $$MenuBlockEnd = "(&4) ブロックの後: " + $$return; //メニュー表示 menu $$MenuBlockTop , $$MenuLineTop , $$MenuLineEnd , $$MenuBlockEnd ; //選択結果取得 ##SelectMenu = result - 1; //選択されたコメント部品を編集 if ( ##SelectMenu == -1 ){ break ; } else if ( ##SelectMenu == 0 ){ $$BlockTop = input("ブロックの前の文字を入力して下さい。" , $$BlockTop ) ; } else if ( ##SelectMenu == 1 ){ $$LineTop = input("行の最初の文字を入力して下さい。" , $$LineTop ) ; } else if ( ##SelectMenu == 2 ){ $$LineEnd = input("行の最後の文字を入力して下さい。" , $$LineEnd ) ; } else if ( ##SelectMenu == 3 ){ $$BlockEnd = input("ブロックの後の文字を入力して下さい。" , $$BlockEnd ) ; } } //---------------------------------------- //コメントの保存 //---------------------------------------- writeinistr $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_TOP , "'" + $$BlockTop + "'" ; writeinistr $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_TOP , "'" + $$LineTop + "'" ; writeinistr $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_LINE_END , "'" + $$LineEnd + "'" ; writeinistr $INITIAL_FILE_NAME , $SECTION_COMMENT_HEAD+str(##SelectComment) , $KEY_BLOCK_END , "'" + $$BlockEnd + "'" ; return; //=============================================================================== // Name : subControlMenu // In : [none] // Out : [none] // Note : 設定用メニュー //=============================================================================== subControlMenu: //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- //コメントアウト処理方式取得 ##ProcessMode = getininum ( $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_PROCESS_MODE ); //選択項目既定値フラグ取得 ##SelectFlg = getininum ( $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_SELECT_DEFAULT ); //コメントアウト種類最大表示数取得 ##CommentMax = getininum ( $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_COMMENT_MAX ); //---------------------------------------- //コメントアウトの設定 //---------------------------------------- while(true) { //メニュー表示 menu "(&1) コメントアウト処理方式: " + $PROCESS_MODE[##ProcessMode] , "(&2) 選択項目既定値: " + $DEFAULT_MODE[##SelectFlg] , "(&3) コメントアウト種類最大表示数: " + str(##CommentMax) ; //選択結果取得 ##SelectMenu = result - 1; //選択されたコメント部品を編集 if ( ##SelectMenu == -1 ){ break ; } else if ( ##SelectMenu == 0 ){ call subProcessMode ##ProcessMode ; ##ProcessMode = ##return ; } else if ( ##SelectMenu == 1 ){ call subSelectDefault ##SelectFlg ; ##SelectFlg = ##return ; } else if ( ##SelectMenu == 2 ){ call subCommentMax ##CommentMax ; ##CommentMax = ##return ; } } //---------------------------------------- //コメントアウトの設定の保存 //---------------------------------------- //コメントアウト処理方式保存 writeininum $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_PROCESS_MODE , ##ProcessMode ; //選択項目既定値フラグ保存 writeininum $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_SELECT_DEFAULT , ##SelectFlg ; //コメントアウト種類最大表示数保存 writeininum $INITIAL_FILE_NAME , $SECTION_CONTROL , $KEY_COMMENT_MAX , ##CommentMax ; return; //=============================================================================== // Name : subProcessMode // In : [Number] コメントアウト処理方式 // Out : [none] // Note : コメントアウト処理方式設定用メニュー //=============================================================================== subProcessMode: //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- ##ProcessMode = ##1; //---------------------------------------- //メニュー項目作成 //---------------------------------------- ##Count = 0; while(##Count<#PROCESS_MODE_COUNT) { $$Menu[##Count] = "(&" + str(##Count+1) + ") " + $PROCESS_MODE[##Count]; ##Count = ##Count + 1; } //---------------------------------------- //コメントアウト処理方式の選択 //---------------------------------------- menuarray $$Menu,#PROCESS_MODE_COUNT; //選択結果取得 ##SelectMenu = result - 1; if( ##SelectMenu != -1 ) { ##ProcessMode = ##SelectMenu; } return ##ProcessMode; //=============================================================================== // Name : subSelectDefault // In : [Number] 選択項目既定値 // Out : [none] // Note : 選択項目既定値設定用メニュー //=============================================================================== subSelectDefault: //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- ##SelectFlg = ##1; //---------------------------------------- //メニュー項目作成 //---------------------------------------- ##Count = 0; while(##Count<#DEFAULT_MODE_COUNT) { $$Menu[##Count] = "(&" + str(##Count+1) + ") " + $DEFAULT_MODE[##Count]; ##Count = ##Count + 1; } //---------------------------------------- //選択項目既定値の選択 //---------------------------------------- menuarray $$Menu,#DEFAULT_MODE_COUNT; //選択結果取得 ##SelectMenu = result - 1; if( ##SelectMenu != -1 ) { ##SelectFlg = ##SelectMenu; } return ##SelectFlg; //=============================================================================== // Name : subCommentMax // In : [Number] コメントアウト種類最大表示数 // Out : [none] // Note : コメントアウト種類最大表示数設定 //=============================================================================== subCommentMax: //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- ##CommentMax = ##1; //---------------------------------------- //コメントアウト種類最大表示数入力 //---------------------------------------- while(true) { $$CommentMax = input( "コメントアウト種類最大表示数を入力して下さい。\n(" + str(#COMMENT_MAX_MINIMUM) + "～" + str(#COMMENT_MAX_MAXIMUM) + ")" , str(##CommentMax) ); $$CommentMaxCheck = $$CommentMax; call subReplaceAll $$CommentMaxCheck , "0" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "1" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "2" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "3" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "4" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "5" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "6" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "7" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "8" , "" ; $$CommentMaxCheck = $$return ; call subReplaceAll $$CommentMaxCheck , "9" , "" ; $$CommentMaxCheck = $$return ; if( strlen($$CommentMax) != 0 && strlen($$CommentMaxCheck) == 0 ) { } else { continue; } if( #COMMENT_MAX_MINIMUM <= val($$CommentMax) && val($$CommentMax) <= #COMMENT_MAX_MAXIMUM ) { ##CommentMax = val($$CommentMax); break; } } return ##CommentMax; //=============================================================================== // Name : subReplaceAll // In : [String] 検索対象文字列 // : [String] 検索文字列 // : [String] 置換文字列 // Out : [String] 検索置換結果文字列 // Note : 検索置換 //=============================================================================== subReplaceAll: //---------------------------------------- //変数初期化と引数取得 //---------------------------------------- $$str = $$1; $$old = $$2; $$new = $$3; $$rtn = ""; //---------------------------------------- //検索置換処理 //---------------------------------------- while(true) { //検索文字列を検索(位置所得) ##search = strstr($$str,$$old); //検索結果 if(##search!=-1) //見つかった場合 { //見つかった位置よりも前方の文字列を戻り値へ連結 $$rtn = $$rtn + midstr($$str,0,##search) + $$new; //見つかった位置よりも後方の文字列を検索対象文字列として再定義 $$str = midstr($$str,##search+strlen($$old),strlen($$str)-##search-strlen($$old)); } //見つからなかった場合 else { //残りの文字列を戻り値へ追加してbreak $$rtn = $$rtn + $$str; break; } } return $$rtn;
Kanasansoft Web Lab.のテンプレート[2005/06/28版]です。 テンプレート・モジュール[Site Name][Blog Abbreviation]は環境に合わせ書き換えてください。 ソースを表示するために、右ペインを大きくとるようにしています。 この為、時代に逆行してtableタグを使用していますが、css2のmin-widthとmin-heightが使えるようになるまでこれで通すつもりです。 以前のバージョンのMovableTypeもtableタグでレイアウトを行っていましたが、現行バージョンではdivタグを使っています。