「
Mery.iniのオプション値を取得
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。
スパム攻撃防止用のチェックです。 けっして、ここには、値の入力は
しない
でください!
== GetIniOption() 関数 == Mery.ini ファイル内の各行 <br> '''KeyName'''='''value''' の「項目名 <code>KeyName</code>」の文字列を指定して「値 <code>value</code>」を取得するための '''組み込み用関数''' です。<br> Mery.ini の任意の項目名(左辺) <code>KeyName</code> で検索をかけて、生の値(右辺)<code>value</code> をそのまま取得します。 * [[#関数1|組み込み関数本体]] を任意のマクロのソースコード内にペーストして使用します。 : ペーストする位置は呼び出し元のコードから参照できるスコープ内であれば、ソースコードの末尾でも問題ありません。 : 使い方は [[#使い方|使用例]] を参考にしてください。 * INI 内に '''同名の「項目名」''' がある場合は、さいしょにヒットした項目の「値」のみを返します。これは、引数の配列の要素(項目名)と戻り値の配列の要素(値)を 1 対 1 で対照させるための仕様です。<br> → 重複する「項目名」のある項目を参照する場合は [[#GetIniOption2() 関数|GetIniOption2() 関数]] か [[#GetIniOption3() 関数|GetIniOption3() 関数]] を使用してください(2019/05/21, 2020/05/14 追加)。 * 引数の配列で「オプション項目名 <code>KeyName</code>」の記述を間違えると、 警告ダイアログを表示し、誤った項目名を指摘します。<br> ※ 呼び出し元のコードの処理は継続されます。 * 「Mery.exe」自体のファイル名をリネームしている場合も、Mery の実行ファイルのベース名を取得して、適切な INI ファイルを読みこみます。 * <b style="color:#c00;">このマクロ関数は Mery.ini の内容を編集(書き換え)するものではありません。 </b> <br> * 基本的に Mery.ini は [[ヘルプ:ツール#オプション|オプション]] などの設定ダイアログを閉じたときと Mery を終了したときにしか更新されず、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい、INI の内容が最新の状態とはなりません。 <br> よって、かならずしもエディタの表示状態(折り返しや色の反転、記号の表示設定など)どおりの値を取得できるわけではありません。<br> ・・・ MeryInfo.js にはない項目として「行の表示方法」の取得ぐらいしか使い道がない? :* Mery.ini の直接編集でオプションパネルから設定変更できない「'''隠し機能'''」項目をカスタマイズしている人なら、現在の設定値の確認などにも使えるかも? :* [[#メモ|メモ]] に挙げた導入事例のマクロのように、関数コードを改造することで Mery.ini のマクロへの活用法の幅がひろがりますが…。 === ソースコード === // #title="Mery.ini のオプション値を取得" /** * 組み込み関数 '''GetIniOption( keyArray )''' * 引数で指定した '''任意の''' INI オプション項目の「値」を返す * * '''引数:''' INI オプション項目名を列挙した配列 * ※ 記述形式は '''''[ "KeyName1", "KeyName2", "KeyName3" ]''''' * * '''戻り値:''' INI オプション項目の「値」を並べた '''配列'''。 * ※ 配列の形式は '''''[ "value1", "value2", "value3" ]''''' * 各要素 value は '''数値型'''(Number) または '''文字列型'''(String) */ <div id="関数1"> </div> <syntaxhighlight lang="javascript"> // ---------- ▼ 組み込み関数 ココから ▼ ---------- function GetIniOption( keyArray ) { // Mery.ini を探す var iniPath = editor.FullName.replace( /\.exe$/i, ".ini" ); var Fso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( ! Fso.FileExists( iniPath ) ) { var iniName = /\\([^\\]+)\.exe$/.exec( editor.FullName )[1]; var WshShell = new ActiveXObject( "WScript.Shell" ); iniPath = WshShell.SpecialFolders( "APPDATA" ) + "\\Mery\\" + iniName + ".ini"; } // Mery.ini を読みこむ var Adodb = new ActiveXObject( "ADODB.Stream" ); var adTypeText = 2, adReadAll = -1; Adodb.Type = adTypeText, Adodb.Charset = "UTF-8"; Adodb.Open(); Adodb.LoadFromFile( iniPath ); var iniText = Adodb.ReadText( adReadAll ); Adodb.Close(); /* includeライブラリの IO.js, MeryInfo.js を #include しているマクロに組み込むなら var iniPath から Adodb.Close() までは以下の一行だけでもよい */ // var iniText = IO.LoadFromFile( MeryInfo.GetIniPath(), "utf-8" ); // 引数の配列をループ処理して ini からオプションの値を取得する var reg, value, iniOptionArray = []; for ( var i = 0, len = keyArray.length; i < len; i ++ ) { reg = new RegExp( "^" + keyArray[i] + "=[^\\r\\n]*$", "gm" ); try { // 項目名の記述ミスがあるとこの行でエラーが発生する value = iniText.match( reg )[0] .substr( keyArray[i].length + 1 ); // 10進数なら Number 型で返す if ( /^-?[1-9][0-9]*$/.test( value ) ) { value = Number( value ); } } catch( e ) { Alert( keyArray[i] + " という項目はありません。" ); value = undefined; } iniOptionArray.push( value ); } return iniOptionArray; } // ---------- ▲ 組み込み関数 ココまで ▲ ---------- </syntaxhighlight> === 使い方 === /** * 【使い方】 * * GetIniOptions() 関数の使用を1回で済ませないと * その都度 '''INI ファイルの読み込み''' が発生してマクロの処理速度が落ちるので * 取得したい項目すべてをひとつの配列にまとめること * * ※ 取得したいオプション項目がひとつだけの場合でも引数は * 配列 '''''["KeyName"]''''' のかたちで記述すること * * '''''<code>GetIniOption( [ "KeyName" ] )</code>''''' * * ※ INI のオプション項目名の記述を間違えても警告ダイアログを表示して * 組み込み関数および呼び出し元のコードを続行する * → 誤ったキーの戻り値は '''''<syntaxhighlight lang="javascript" inline>undefined</syntaxhighlight>''''' */ <syntaxhighlight lang="javascript"> // ➀ 取得したい INI オプション項目を配列 ["KeyName1", "KeyName2" ...] に列挙する var iniItem = [ "LineColumnView", "WrapMode", "QuoteCharacter", "TabColumns", "AutoIndent" ]; // または var iniItem = new Array( "LineColumnView", "WrapMode", "QuoteCharacter", "TabColumns", "AutoIndent" ); // ➁ GetIniOption() の引数に配列を指定して変数に代入する var iniValue = GetIniOption( iniItem ); // ※戻り値も配列 // ➂-1.(例1)取得したオプションをダイアログで順々に表示する for ( var i = 0, type; i < iniItem.length; i ++ ) { type = Object.prototype.toString.call( iniValue[i] ).slice( 8, -1 ); Alert( iniItem[i] + " = " + iniValue[i] + "\nobject type: " + type ); } // "LineColumnView = 1 ↲ object type: number" ... // ➂-2.(例2)個々の「値」の参照には、戻り値の配列の [index] で要素を指定する var settings = { lineColumnView: iniValue[0], // 「行の表示方法」 wrapMode: iniValue[1], // 「折り返し方法」 quoteCharacter: iniValue[2], // 「引用マーク」 tabColumns: iniValue[3], // 「タブの桁数」 autoIndent: iniValue[4] // 「自動インデントを有効にする」 }; Alert( "行の表示方法: " + ( settings.lineColumnView == 1 ? "表示行" : "論理行" ) ); // ➂-3.(注)取得したいオプション項目がひとつの場合も、配列型 ["keyName"] で記述すること Alert( GetIniOption( ["LineColumnView"] ) ); </syntaxhighlight>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
編集を中止
編集の仕方
(新しいウィンドウで開きます)
スポンサーリンク
案内メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク