FC2ブログ

GSL Shell + IUP でドラッグ&ドロップ

2021-05-05 :  PCクリニック
“A_Prog.gsl”を、“B_Data.txt”を入力して、実行する場合、
DOS窓で、
gsl-shell  A_Prog.gsl  B_Data.txt
と打ち込んで実行する。
これが、CUIモード。

これに対して、
@echo  off
cd /d %0\..
gsl-shell A_Prog.gsl %1
なる“DnD_A_Prog.bat”ファイルを用意して、
エクスプローラで、
“B_Data.txt”ファイル・アイコンを、
“DnD_A_Prog.bat”に、ドラッグ&ドロップして実行する。
これが、GUIモード。


ここで、この“BAT”ファイルを作る代わりに、
“A_Prog.gsl”ファイルの中に、何らかのコードを埋め込むことで、
同等なことができないかを学習した。

つまり、
“B_Data.txt”ファイル・アイコンを、
“A_Prog.gsl”に、ドラッグ&ドロップすることで実行する方法。



5年前の記事(2016-03-19):
GSL Shell 学習:IUP でドラッグ&ドロップ
では、

  ファイル名の取得をドラッグ&ドロップで出来ないか?

と云うことで、

  何とかコード化できた:
function mysplit( inputstr, sep )
if sep == nil then sep = '%s' end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str i = i + 1
end
return t
end
charA = |s| ffi.cast( 'char*', s )
voidA = |x| ffi.cast( 'void*', x )

local iup = ffi.load( 'iup' )
ffi.cdef[[
typedef void Ihandle;
typedef void ( __stdcall *Icallback ) ( void*, const char* fnm, int num, int x, int y );
void IupOpen( int );
void IupClose( );
Ihandle* IupDialog( Ihandle* child );
void IupSetAttribute( Ihandle*, const char* name, const char* value );
void IupSetCallback( void*, char*, Icallback );
void IupPopup( void*, int, int );
]]
iup.IupOpen( 0 )

Fcb = ffi.cast( 'Icallback', function( z, F, n, x, y )
Fname=ffi.string(F)
iup.IupClose()
end )

dlg = iup.IupDialog( voidA(0) ) -- 枠だけ
iup.IupSetAttribute( dlg, charA('SIZE'), charA('100x80') )
iup.IupSetAttribute( dlg, charA('TITLE'), charA('DnD here') )
iup.IupSetCallback( dlg, charA('DROPFILES_CB'), Fcb )
iup.IupPopup( dlg, 100, 100 )
----------------------------------------------------------------------------
print( Fname )
FN = mysplit( Fname, '\\' ) print( FN[#FN] ) -- これで、ファイル名


その後(2016-04-28)の記事:
GSL Shell 学習:“IUP.lua”モジュール自作
で、
  'IUP.lua' モジュールを作った:
local IUP = { }
local iup = ffi.load( 'iup' )

function split_path( p )
return string.match( p, "(.-)([^\\]-([^%.]+))$" ) end
charA = |s| ffi.cast( 'char*', s )
voidA = |x| ffi.cast( 'void*', x )
-----
ffi.cdef[[
typedef struct Ihandle_ Ihandle;
typedef int (*Icallback)(Ihandle*);
int IupOpen( int ); // int IupOpen( int *argc, char ***argv );
void IupClose( );
Ihandle* IupDialog( Ihandle* child );
void IupDestroy( void* );
void IupSetAttribute( Ihandle*, char* name, char* value );
char* IupGetAttribute( Ihandle*, char* name );
void IupSetCallback( Ihandle*, char*, Icallback func );
void IupPopup( void*, int, int );

Ihandle* IupLabel( char* title );
Ihandle* IupText( char* action );
Ihandle* IupButton( char*title, char* action );
Ihandle* IupVbox( Ihandle* child, ... );
Ihandle* IupHbox( Ihandle* child, ... );
]]

function IUP.Open( z ) return iup.IupOpen( z ) end
function IUP.Close( ) iup.IupClose( ) end
function IUP.Dialog( z ) return iup.IupDialog( z ) end
function IUP.Destroy( ) return iup.IupDestroy( z ) end

function IUP.Label( s ) return iup.IupLabel( charA(s) ) end
function IUP.Text ( s ) return iup.IupText ( charA(s) ) end
function IUP.Button( s1, s2 )
return iup.IupButton( charA(s1), charA(s2) ) end

function IUP.Hbox( ... ) return iup.IupHbox( ... ) end
function IUP.Vbox( ... ) return iup.IupVbox( ... ) end

function IUP.SetAttribute( z, s1, s2 )
iup.IupSetAttribute( z, charA(s1), charA(s2) ) end
function IUP.GetAttribute( z, s )
return iup.IupGetAttribute( z, charA(s) ) end
function IUP.SetCallback( z, s, f )
iup.IupSetCallback( z, charA(s), f ) end

function IUP.Popup( z, x, y ) iup.IupPopup( z, x, y ) end

return IUP
このモジュールを使ったコードは、
翌年(2017-02-12)の記事:
IUP で GUI アプリ:コード改訂
で、書いている:
local Iup = require'IUP'
Iup.Open( 0 ) ---------- これ必須!!!
NULL=voidA(0)
--------------- BUTTON の 'ACTION' コールバック関数
Bcb = ffi.cast( 'Icallback', function( z )
tt1 = ffi.string( Iup.GetAttribute( txt1, 'VALUE') )
tt2 = ffi.string( Iup.GetAttribute( txt2, 'VALUE') )
print( 'Button Clicked' )
print( tt1 )
print( tt2 )
return -2
end )
---------------------------------------
s7=' '; s14=s7..s7 -- 7文字、14文字空白

txt1 = Iup.Text('')
txt2 = Iup.Text('')
btn1 = Iup.Button(' Go ', '')

dlg = Iup.Dialog( Iup.Vbox(
Iup.Hbox( Iup.Label(s7), NULL ),
Iup.Hbox( Iup.Label(s7), Iup.Label('TEXT1 : '), txt1, NULL ),
Iup.Hbox( Iup.Label(s7), Iup.Label('TEXT2 : '), txt2, NULL ),
Iup.Hbox( Iup.Label(s7), NULL ),
Iup.Hbox( Iup.Label(s14), btn1, NULL ), NULL )
)
Iup.SetAttribute( dlg, 'SIZE', '100x90' )
Iup.SetAttribute( dlg, 'TITLE', 'test' ) -- 窓のタイトル
Iup.SetCallback( btn1, 'ACTION', Bcb )

Iup.Popup( dlg, 350, 250 ) -- 窓表示左上隅
Iup.Close() -- <===右上[X]で終了。
---------------------------------------
print( tt1 )
print( tt2 )
_ = io.read(1) -- [Enter]キー入力待ち。



今回は、これを必要最小限度に行数を削減してみた。

第1ステップ:
local Iup = require'IUP';  Iup.Open( 0 )  -- これは必須
NULL=voidA(0)
---------------------- ファイル名D&D
-- 'F_DnD' は、'Icallback' 同等
Fcb = ffi.cast( 'F_DnD', function( z, F, n, x, y )
Fname=ffi.string(F); nn, xx, yy = n, x, y
print( Fname, n, x, y ) ----- ここ※1
return -2
end )
----------------------
dlg = Iup.Dialog(
Iup.Vbox( Iup.Hbox( Iup.Label(' '), NULL ),
Iup.Hbox( Iup.Label(' Drop Here Then Close Window'), NULL ),
NULL )
)
Iup.SetAttribute( dlg, 'SIZE', '180x100' ) -- 窓サイズ
Iup.SetCallback( dlg, 'DROPFILES_CB', Icb(Fcb) ) -- Icb()

Iup.Popup( dlg, 350, 220 ) -- 窓左上隅
Iup.Close()
-----------------------------------------------------------------

Dir, Fnm, Ext = split_path( Fname ) ----- ここ※2
print( Dir, Fnm, Ext, nn, xx, yy ) -- パス名、ファイル名、拡張子、
-- 0, 窓内のドロップ位置
_ = io.read(1)
上記の“ここ※1”か、“ここ※2”の場所で、
得られたファイル名に対する処理が実行できる。


第2ステップ:更なる行数削減
Iup=require'IUP'; Iup.Open(0);  NL=voidA(0)
Fcb=ffi.cast('F_DnD',function(z,F,n,x,y) Fname=ffi.string(F); return -2 end)
dlg=Iup.Dialog(Iup.Hbox(Iup.Label('\n Drop & Close '),NL))
Iup.SetAttribute(dlg,'SIZE','180x100')
Iup.SetCallback(dlg,'DROPFILES_CB',Icb(Fcb))
Iup.Popup(dlg,350,220); Iup.Close(); _,Fnm,_=split_path(Fname)
print(Fnm); _=io.read(1)
これでもOK。

更に、第3ステップ:減らしてみた。
Iup=require'IUP'; Iup.Open(0);  NL=voidA(0)
Fcb=ffi.cast('F_DnD',function(z,F,n,x,y) Fnm=ffi.string(F); return -2 end)
dlg=Iup.Dialog(Iup.Label('\n Drop and\n Close Window \n'),NL)
Iup.SetCallback(dlg,'DROPFILES_CB',Icb(Fcb))
Iup.Popup(dlg,350,220); Iup.Close(); _,Fname,_=split_path(Fnm)
print(Fname); _=io.read(1)
これで、十分か?


“ドラッグ&ドロップ”で取得した“ファイル名”を用いて、
処理をするプログラムの、最初に、
この5行(6行目は確認用なので、不要)
を記述する。

これで、
プログラムが、処理の対象とするファイルは、
当該プログラムが出す窓に“ドラッグ&ドロップ”することで、指定できる。



と云うことで、
使えるかナ?



本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒

210212,23,0330
関連記事
スポンサーサイト



コメントの投稿

管理者にだけ表示を許可する

人気blog Ranking



最新記事
カレンダー
07 | 2021/08 | 09
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

FC2 / i2i / Google




Google Analytics
ブックマーク