ポップアップメニューでファイル選択
ナビゲーションに移動
検索に移動
概要[編集]
- ポップアップメニューでファイルを選択することができます。
ソースコード[編集]
- おかしなところは教えてください。
#title="ポップアップメニューでファイル選択" // MyFileSelector.js // ネットワーク環境での動作確認はしていません。 // 2013/02/24 // ショートカットは>、フォルダとドライブは└ が頭につきます。 // 関数objNameで指定しています。 MyFolderObj = function(){ this.initialize.apply( this, arguments ); } MyFolderObj.prototype = { files : "ファイルとサブフォルダのオブジェクトの配列", isrootfolder : "ルートフォルダのときture", parentfolder : "親フォルダのpath", initialize : function( foldername ){ var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( foldername == undefined || foldername.length == 0 || !objFso.FolderExists( foldername ) ){ var f = objFso.GetFolder( "." ); } else { var f = objFso.GetFolder( foldername ); } this.isrootfolder = f.IsRootFolder; if ( f.IsRootFolder ){ this.parentfolder = f.path; // this.parentfolder = null; } else { this.parentfolder = f.parentfolder.path; } var files = new Array(); // ファイル → サブフォルダ の順で表示。 var fc = new Enumerator( f.files ); for ( ; !fc.atEnd(); fc.moveNext() ){ files.push( fc.item() ); } var sfc = new Enumerator( f.SubFolders ); for ( ; !sfc.atEnd(); sfc.moveNext() ){ files.push( sfc.item() ); } this.files = files; objFso = null; } } MyFileSelector = function(){ this.initialize.apply( this, arguments ); } MyFileSelector.prototype = { myfolder : "MyFolderObj", lists : "表示するオブジェクトの配列", index : "表示の起点", selected : "選択されたファイル", offset : "popupMenuのオフセット(固定メニュー数上限)", menusize : "ポップアップメニューのファイル等の表示件数", initialize : function( foldername, menusize ){ this.myfolder = new MyFolderObj( foldername ); this.lists = this.myfolder.files.slice(); this.index = 0; this.selected = ""; this.offset = 9; this.menusize = ( arguments.length < 2 || menusize < 1 )? 20 : menusize; }, selectFile : function(){ var menu = CreatePopupMenu(); menu.Add( "上のフォルダー", 1, ( ( isDrive( this.lists[ 0 ] ) )? meMenuGrayed : 0 ) ); menu.Add( "次ページ", 2, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) ); menu.Add( "前ページ", 3, ( ( this.index > 0 )? 0 : meMenuGrayed ) ); menu.Add( "最後へ", 4, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) ); menu.Add( "-------", 0, meMenuSeparator ) for ( var i = this.index; i < this.index + this.menusize; i++ ){ if ( i < this.lists.length ){ menu.Add( objName( this.lists[ i ] ) , i + this.offset, 0 ); }else{ if ( this.index > 0 ){ menu.Add( "( 先頭へ )" , 5, 0 ); } break } } var r = ( menu.Track( 0 ) - this.offset ); switch( r ){ case 0 - this.offset : // 選択せず Quit(); case 1 - this.offset : // 上のフォルダー this.index = 0; if ( this.myfolder.isrootfolder ){ this.lists = getDriveList().slice(); } else { this.myfolder = new MyFolderObj( this.myfolder.parentfolder ); this.lists = this.myfolder.files.slice(); } break; case 2 - this.offset: // 次頁 var x = this.index + this.menusize this.index = ( x < this.lists.length )? x : this.index; break; case 3 - this.offset : // 前頁 var x = this.index - this.menusize this.index = ( x < 0 )? 0 : x; break; case 4 - this.offset : // 最後の頁 this.index = ( this.lists.length == 0 )? 0 : Math.floor( ( this.lists.length - 1 ) / this.menusize ) * this.menusize; break; case 5 - this.offset : // 先頭へ this.index = 0; break; default : var item = ( isLnk( this.lists[ r ] ) )? lnk2entity( this.lists[ r ] ) : this.lists[ r ]; if ( isFile( item ) ){ // ファイル this.selected = item; } else if ( isFolder( item ) || isDrive( item ) ){ // フォルダ、ドライブ this.index = 0; this.myfolder = new MyFolderObj( item.Path ); this.lists = this.myfolder.files.slice(); } } return this.selected; function lnk2entity( obj ){ // ショートカットの指すファイル(またはフォルダ)オブジェクトを返す。 var WshShell = new ActiveXObject( "WScript.Shell" ); var selectedPath = WshShell.CreateShortcut( obj.Path ).TargetPath ; var result = null; var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); if ( objFso.FileExists( selectedPath ) ){ result = objFso.GetFile( selectedPath ) } else if ( objFso.FolderExists( selectedPath ) ){ result = objFso.GetFolder( selectedPath ) } WshShell = null; selectedPath = null; objFso = null; return result; } function getDriveList(){ // 有効なDriveオブジェクトのルートフォルダをフォルダオブジェクトの配列で返す。 var fso, n, e, x; var dary = []; var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); e = new Enumerator( objFso.Drives ); for ( ; !e.atEnd(); e.moveNext() ){ x = e.item(); if ( x.IsReady ){ dary.push( x.RootFolder ); } } objFso = null; return dary; } function objName( obj ){ // ポップアップメニュー用に各オブジェクトの名前等を返す。 if ( isLnk( obj ) ){ // ショートカット return "> " + obj.Name; } else if ( isFile( obj ) ){ // ファイル return obj.Name; } else if ( isFolder( obj ) ){ // フォルダー, ディスク var str = ( obj.Name == "" )? obj.Path : obj.Name; return "└ " + str; } else { return "objName?" } } function isLnk( obj ){ return obj.type == "ショートカット"; } function isFile( obj ){ var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); var result = objFso.FileExists( obj.path ); objFso = null; return result; } function isFolder( obj ){ var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); var result = objFso.FolderExists( obj.path ); objFso = null; return result; } function isDrive( obj ){ if ( obj == undefined ){ return false }; var objFso = new ActiveXObject( "Scripting.FileSystemObject" ); var result = objFso.DriveExists( obj.path ); objFso = null; return result; } } } // ---------- path = document.path; menusize = 25; // 引数ナシでも動作します。 var myfileselector = new MyFileSelector( path, menusize ); var selected = ""; while ( selected == "" ){ selected = myfileselector.selectFile(); } Alert( selected.Path );
スポンサーリンク