「ポップアップメニューでファイル選択」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
MSY-07 (トーク | 投稿記録)
概要の説明を追加
MSY-07 (トーク | 投稿記録)
スペースからタブに変更
15行目: 15行目:


MyFolderObj = function(){
MyFolderObj = function(){
    this.initialize.apply( this, arguments );
this.initialize.apply( this, arguments );
}
}
MyFolderObj.prototype = {
MyFolderObj.prototype = {
    files : "ファイルとサブフォルダのオブジェクトの配列",
files : "ファイルとサブフォルダのオブジェクトの配列",
    isrootfolder : "ルートフォルダのときture",
isrootfolder : "ルートフォルダのときture",
    parentfolder : "親フォルダのpath",
parentfolder : "親フォルダのpath",
    initialize : function( foldername ){
initialize : function( foldername ){
        var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
        if ( foldername == undefined || foldername.length == 0 || !objFso.FolderExists( foldername ) ){
if ( foldername == undefined || foldername.length == 0 || !objFso.FolderExists( foldername ) ){
            var f = objFso.GetFolder( "." );
var f = objFso.GetFolder( "." );
        } else {
} else {
            var f = objFso.GetFolder( foldername );
var f = objFso.GetFolder( foldername );
        }
}
        this.isrootfolder = f.IsRootFolder;
this.isrootfolder = f.IsRootFolder;
        if ( f.IsRootFolder ){
if ( f.IsRootFolder ){
            this.parentfolder = f.path;
this.parentfolder = f.path;
//         this.parentfolder = null;
// this.parentfolder = null;
        } else {
} else {
            this.parentfolder = f.parentfolder.path;
this.parentfolder = f.parentfolder.path;
        }
}
        var files = new Array();
var files = new Array();


        // ファイル → サブフォルダ の順で表示。
// ファイル → サブフォルダ の順で表示。
        var fc = new Enumerator( f.files );
var fc = new Enumerator( f.files );
        for ( ; !fc.atEnd(); fc.moveNext() ){
for ( ; !fc.atEnd(); fc.moveNext() ){
            files.push( fc.item() );
files.push( fc.item() );
        }
}
        var sfc = new Enumerator( f.SubFolders );
var sfc = new Enumerator( f.SubFolders );
        for ( ; !sfc.atEnd(); sfc.moveNext() ){
for ( ; !sfc.atEnd(); sfc.moveNext() ){
            files.push( sfc.item() );
files.push( sfc.item() );
        }
}


        this.files = files;
this.files = files;
        objFso = null;
objFso = null;
    }
}
}
}


MyFileSelector = function(){
MyFileSelector = function(){
    this.initialize.apply( this, arguments );
this.initialize.apply( this, arguments );
}
}
MyFileSelector.prototype = {
MyFileSelector.prototype = {
    myfolder : "MyFolderObj",
myfolder : "MyFolderObj",
    lists : "表示するオブジェクトの配列",
lists : "表示するオブジェクトの配列",
    index : "表示の起点",
index : "表示の起点",
    selected : "選択されたファイル",
selected : "選択されたファイル",
    offset : "popupMenuのオフセット(固定メニュー数上限)",
offset : "popupMenuのオフセット(固定メニュー数上限)",
    menusize : "ポップアップメニューのファイル等の表示件数",
menusize : "ポップアップメニューのファイル等の表示件数",
    initialize : function( foldername, menusize ){
initialize : function( foldername, menusize ){
        this.myfolder = new MyFolderObj( foldername );
this.myfolder = new MyFolderObj( foldername );
        this.lists = this.myfolder.files.slice();
this.lists = this.myfolder.files.slice();
        this.index = 0;
this.index = 0;
        this.selected = "";
this.selected = "";
        this.offset = 9;
this.offset = 9;
        this.menusize = ( arguments.length < 2 || menusize < 1 )? 20 : menusize;
this.menusize = ( arguments.length < 2 || menusize < 1 )? 20 : menusize;
    },
},
    selectFile : function(){
selectFile : function(){
        var menu = CreatePopupMenu();
var menu = CreatePopupMenu();
        menu.Add( "上のフォルダー", 1, ( ( isDrive( this.lists[ 0 ] ) )? meMenuGrayed : 0 ) );
menu.Add( "上のフォルダー", 1, ( ( isDrive( this.lists[ 0 ] ) )? meMenuGrayed : 0 ) );
        menu.Add( "次ページ", 2, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) );
menu.Add( "次ページ", 2, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) );
        menu.Add( "前ページ", 3, ( ( this.index > 0 )? 0 : meMenuGrayed ) );
menu.Add( "前ページ", 3, ( ( this.index > 0 )? 0 : meMenuGrayed ) );
        menu.Add( "最後へ", 4, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) );
menu.Add( "最後へ", 4, ( ( this.index + menusize > this.lists.length )? meMenuGrayed: 0 ) );
        menu.Add( "-------", 0, meMenuSeparator )
menu.Add( "-------", 0, meMenuSeparator )
        for ( var i = this.index; i < this.index + this.menusize; i++ ){
for ( var i = this.index; i < this.index + this.menusize; i++ ){
            if ( i < this.lists.length ){
if ( i < this.lists.length ){
                menu.Add( objName( this.lists[ i ] ) , i + this.offset, 0 );
menu.Add( objName( this.lists[ i ] ) , i + this.offset, 0 );
            }else{
}else{
                if ( this.index > 0 ){ menu.Add( "( 先頭へ )" , 5, 0 ); }
if ( this.index > 0 ){ menu.Add( "( 先頭へ )" , 5, 0 ); }
                break
break
            }
}
        }
}
        var r = ( menu.Track( 0 ) - this.offset );
var r = ( menu.Track( 0 ) - this.offset );


        switch( r ){
switch( r ){
        case 0 - this.offset : // 選択せず
case 0 - this.offset : // 選択せず
            Quit();
Quit();
        case 1 - this.offset : // 上のフォルダー
case 1 - this.offset : // 上のフォルダー
            this.index = 0;
this.index = 0;
            if ( this.myfolder.isrootfolder ){
if ( this.myfolder.isrootfolder ){
                this.lists = getDriveList().slice();
this.lists = getDriveList().slice();
            } else {
} else {
                this.myfolder = new MyFolderObj( this.myfolder.parentfolder );
this.myfolder = new MyFolderObj( this.myfolder.parentfolder );
                this.lists = this.myfolder.files.slice();
this.lists = this.myfolder.files.slice();
            }
}
            break;
break;
        case 2 - this.offset: // 次頁
case 2 - this.offset: // 次頁
            var x = this.index + this.menusize
var x = this.index + this.menusize
            this.index = ( x < this.lists.length )? x : this.index;
this.index = ( x < this.lists.length )? x : this.index;
            break;
break;
       
        case 3 - this.offset : // 前頁
case 3 - this.offset : // 前頁
            var x = this.index - this.menusize
var x = this.index - this.menusize
            this.index = ( x < 0 )? 0 : x;
this.index = ( x < 0 )? 0 : x;
            break;
break;
        case 4 - this.offset : // 最後の頁
case 4 - this.offset : // 最後の頁
            this.index = ( this.lists.length == 0 )? 0 : Math.floor( ( this.lists.length - 1 ) / this.menusize ) * this.menusize;
this.index = ( this.lists.length == 0 )? 0 : Math.floor( ( this.lists.length - 1 ) / this.menusize ) * this.menusize;
            break;
break;
        case 5 - this.offset : // 先頭へ
case 5 - this.offset : // 先頭へ
            this.index = 0;
this.index = 0;
            break;
break;
        default :  
default :  
            var item = ( isLnk( this.lists[ r ] ) )? lnk2entity( this.lists[ r ] ) : this.lists[ r ];
var item = ( isLnk( this.lists[ r ] ) )? lnk2entity( this.lists[ r ] ) : this.lists[ r ];
            if ( isFile( item ) ){ // ファイル
if ( isFile( item ) ){ // ファイル
                this.selected = item;
this.selected = item;
            } else if ( isFolder( item ) || isDrive( item ) ){ // フォルダ、ドライブ
} else if ( isFolder( item ) || isDrive( item ) ){ // フォルダ、ドライブ
                this.index = 0;
this.index = 0;
                this.myfolder = new MyFolderObj( item.Path );
this.myfolder = new MyFolderObj( item.Path );
                this.lists = this.myfolder.files.slice();
this.lists = this.myfolder.files.slice();
            }
}
        }
}
        return this.selected;
return this.selected;


        function lnk2entity( obj ){
function lnk2entity( obj ){
            // ショートカットの指すファイル(またはフォルダ)オブジェクトを返す。
// ショートカットの指すファイル(またはフォルダ)オブジェクトを返す。
            var WshShell = new ActiveXObject( "WScript.Shell" );
var WshShell = new ActiveXObject( "WScript.Shell" );
            var selectedPath = WshShell.CreateShortcut( obj.Path ).TargetPath ;
var selectedPath = WshShell.CreateShortcut( obj.Path ).TargetPath ;
            var result = null;
var result = null;
            var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
            if ( objFso.FileExists( selectedPath ) ){
if ( objFso.FileExists( selectedPath ) ){
                result = objFso.GetFile( selectedPath )
result = objFso.GetFile( selectedPath )
            } else if ( objFso.FolderExists( selectedPath ) ){
} else if ( objFso.FolderExists( selectedPath ) ){
                result = objFso.GetFolder( selectedPath )
result = objFso.GetFolder( selectedPath )
            }
}
            WshShell = null;
WshShell = null;
            selectedPath = null;
selectedPath = null;
            objFso = null;
objFso = null;
            return result;
return result;
        }
}
        function getDriveList(){
function getDriveList(){
            // 有効なDriveオブジェクトのルートフォルダをフォルダオブジェクトの配列で返す。
// 有効なDriveオブジェクトのルートフォルダをフォルダオブジェクトの配列で返す。
            var fso, n, e, x;
var fso, n, e, x;
            var dary = [];
var dary = [];
            var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
            e = new Enumerator( objFso.Drives );
e = new Enumerator( objFso.Drives );
            for ( ; !e.atEnd(); e.moveNext() ){
for ( ; !e.atEnd(); e.moveNext() ){
                x = e.item();
x = e.item();
                if ( x.IsReady ){ dary.push( x.RootFolder ); }
if ( x.IsReady ){ dary.push( x.RootFolder ); }
            }
}
            objFso = null;
objFso = null;
            return dary;
return dary;
        }
}
        function objName( obj ){
function objName( obj ){
            // ポップアップメニュー用に各オブジェクトの名前等を返す。
// ポップアップメニュー用に各オブジェクトの名前等を返す。
            if ( isLnk( obj ) ){            // ショートカット
if ( isLnk( obj ) ){            // ショートカット
                return "> " + obj.Name;
return "> " + obj.Name;
            } else if ( isFile( obj ) ){    // ファイル
} else if ( isFile( obj ) ){    // ファイル
                return obj.Name;
return obj.Name;
            } else if ( isFolder( obj ) ){  // フォルダー, ディスク
} else if ( isFolder( obj ) ){  // フォルダー, ディスク
                var str = ( obj.Name == "" )? obj.Path : obj.Name;
var str = ( obj.Name == "" )? obj.Path : obj.Name;
                return "└ " + str;
return "└ " + str;
            } else {
} else {
                return "objName?"
return "objName?"
            }
}
        }
}
        function isLnk( obj ){
function isLnk( obj ){
            return obj.type == "ショートカット";
return obj.type == "ショートカット";
        }
}
        function isFile( obj ){
function isFile( obj ){
            var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
            var result = objFso.FileExists( obj.path );
var result = objFso.FileExists( obj.path );
            objFso = null;
objFso = null;
            return result;
return result;
        }
}
        function isFolder( obj ){
function isFolder( obj ){
            var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
            var result = objFso.FolderExists( obj.path );
var result = objFso.FolderExists( obj.path );
            objFso = null;
objFso = null;
            return result;
return result;
        }
}
        function isDrive( obj ){
function isDrive( obj ){
            if ( obj == undefined ){ return false };
if ( obj == undefined ){ return false };
            var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
var objFso = new ActiveXObject( "Scripting.FileSystemObject" );
            var result = objFso.DriveExists( obj.path );
var result = objFso.DriveExists( obj.path );
            objFso = null;
objFso = null;
            return result;
return result;
        }
}
    }
}
}
}


201行目: 201行目:
var selected = "";
var selected = "";
while ( selected == "" ){
while ( selected == "" ){
    selected = myfileselector.selectFile();
selected = myfileselector.selectFile();
}
}


Alert( selected.Path );
Alert( selected.Path );
</syntaxhighlight>
</syntaxhighlight>

2025年1月13日 (月) 02:51時点における版

概要

ポップアップメニューでファイルを選択することができます。

詳細はポップアップメニューでファイル選択.jsについてを参照してください。

ソースコード

#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 );
スポンサーリンク