「ポップアップメニューでファイル選択」の版間の差分
ナビゲーションに移動
検索に移動
概要の説明を追加 |
スペースからタブに変更 |
||
| 15行目: | 15行目: | ||
MyFolderObj = function(){ | MyFolderObj = function(){ | ||
this.initialize.apply( this, arguments ); | |||
} | } | ||
MyFolderObj.prototype = { | 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(){ | MyFileSelector = function(){ | ||
this.initialize.apply( this, arguments ); | |||
} | } | ||
MyFileSelector.prototype = { | 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; | |||
} | |||
} | |||
} | } | ||
| 201行目: | 201行目: | ||
var selected = ""; | var selected = ""; | ||
while ( selected == "" ){ | while ( selected == "" ){ | ||
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 );
スポンサーリンク