↑上の記述を、スタイルシートとして
■ 投げ入れられたアイコンのパスを通知するコントロール。
ローカル(非Web)で使用するためのものである。
HTA または、IE (ブラウザ)または IEコンポーネント使用のアプリケーション用。
IE(ブラウザ)では、「スクリプトや ActiveX コントロール ...」の
使用許諾のダイアログに、OK しないと使えない。
HTA で、window(フレーム-IFrame,Frame要素)の構成がある時、その内部の窓では、使えない。
内に含まれる窓の中にアイコンを持って来て落とすと、
その中のページが消失、または移動するか、ダウンロードのダイアログが出る。
ドラッグ関連のイベントで、デフォルト動作を止めようとしても効かない。
更に、ページ移動先から戻る事も、更新=[F5] して初期化も出来ず、終了する他ない。
使用には、登録(インストール)が必要、 RegSvr32 ファイル
(WindowsXPか、管理者として実行なら) (以降のWindowsで)
※ この HTA を「管理者として実行」しているなら、左のボタンでも実行可能。
※ 右のボタンは、ユーザーアカウント制御の画面が出る。
※ Administers でないユーザーは、インストール/アンインストールできない !
この場所 に在る事が、登録されるので注意!。
( 置き場所を移動したら、そこで再び登録すれば、変更できる。)
※ 下の● 使用テスト に表示されていたら、既にインストールされている。
※ [インストール]ボタンを押した後、表示するには リロード[F5] が必要。
登録解除は、regsvr32 /u ファイル
(WindowsXPか、管理者として実行なら) (以降のWindowsで)
※ XPより以降で、管理者として実行してないで、左の[アンインストール]を押すと、
「成功しました」と出るかも知れないが、アンインストールはされてない。
※ 新しく開く窓から使用不能になるが、object を確保している窓では、使用を続けられる。
更新[F5] しても続行可能なようなので、不能を確認したいなら、この窓は閉じる必要あり。
※ regsvr32 [/u] ファイル
は、コマンドプロンプトから実行できる。
(右メニュー その他 >「管理者として実行」から起動。)
※ IE(ブラウザ)では、ActiveX 使用に OK して、管理者の方のボタンを押しても、
何も起きない、実行されないようである。
※ ファイルは、このフォルダにある、 "DropFiles.ocx" で、
この説明ファイルのある場所を、Current directory とし、そこに在るものとして実行する。
この説明と別の所にあるなら →
● 使用テスト
←この中に、アイコンを投げ入れると、↓そのパスを表示する。
修飾キー:
● 使い方
▼ 要素の記述
<object classid="clsid:44D91B99-3F94-4563-8D76-BAEA5B3A3869"
id="iconPit" width="幅" height="高さ"
ondragover="return false" ondragenter="return false" >
<param name="color" value="16711680"> <!--背景色 0xFF0000 の指定-->
<param name="text" value="アイコン 投入口"> <!--表示する文字-->
<param name="textColor" value="16777215"> <!--文字色 0xFFFFFF-->
</object>
object 要素への指定は、他に例えば、
style="border-style: solid;"
枠の指定(例)
tabindex="数"
Tabキーの移動に入れる
このコントロールが、在る(登録されている)か、使える(有効)かは、
object要素の Enabled プロパティで判断できるようである。
if( window.要素 && 要素.Enabled ){ /*有効*/ }
`window.要素
`の確認は、無効時に、要素が undefined になる事がある為である。
コントロールが登録されてない時、object要素の HTML の記述の直後で、
window.要素id
は、object要素を指しているが、
onload では、undefined (未定義)になり、要素は消されてしまうようである。
( 別のコントロールで、未登録時でも、onload 以降も、object要素が
消されてないものがあったので、どれでもという事ではない。)
IE で、スクリプトや ActiveX.. の実行に許可を与えなかった時は、
コントロールは無効であるが、object要素は消されてない。
object要素の記述より前に、使えるかどうか知るには、
try{ new ActiveXObject("DropFiles.FormX") }catch(e){ /*無効*/ }
エラーにならないなら、登録済みで使用可能。( このコントロールは、表示が
あって機能するものなので、上のように、オブジェクトを得ても役に立たない。)
▼ アイコンのパスの受け取り方( JScript )
コントロール::名前
の関数を使って、
function iconPit::notifyPaths( paths, iModKey ){
alert( paths )
// 受け取る値は、パスが、複数なら、改行( \n 1文字)で区切ってある。
// 配列への変換は、paths.split("\n")
// 2つ目の引数は、修飾キーが押されているかどうかを表す数値で、
// [Shift]キー 1 、[Ctrl]キー 2 、[Alt]キー 4 、
// 合わせてなら、その和 (ビットOR)。
// マウスボタンが、左右どちらかについては、この方法では、
// 取得法が判らず、この値の中に含める事が出来なかった。
}
// iconPit は、object に指定した要素ID 。
for, event 属性付きの SCRIPT 要素を使って、
<script for="iconPit" event="notifyPaths" >
alert( arguments[0] )
//var iModKey = arguments[1]
</script>
このスクリプト要素が、イベントから呼び出される関数になる。
引数は、arguments プロパティから得る。
( Firefox, Chrome で、ここは実行されないようだが、ブラウザによっては、
普通のスクリプトとして、読み込まれた時に、そのまま実行されてしまう。
だから例えば全体を if 文などで括って、IE である時に限るなどと...)
▼ コントロール:: の関数について
コントロールからの通知、イベントを受け取る関数は、
function コントロール :: イベント名( [引数] ){ [コード] }
と書くのだが、これは、JavaScript の標準の構文ではないので、他のブラウザ
では、エラーになる。これを回避する方法の一つは、script 要素を、IE の条件
コメントで囲って、コメントの中に入れてしまい、他のブラウザに認識させない。
<!--[if IE]><script>
// コード
</script><![endif]-->
しかし、多分 IE 10 から、この条件付きコメントはサポートされなくなり、
その中は、ただのコメントとして隠されるだけになった。
そこは、そのままにして、イベントを受け取る (for, event 属性付きの) SCRIPT要素を、
<![if ! IE ]> /*HTML文*/ <![endif]>
の中に書き入れると、
条件コメントを理解しない IE 10 以降なら、その間は適用される。
IE のバージョンがそれでも、HTA では、IE 7 として動作するので、条件コメントは
有効であるし、HTA でのみ使うなら、そもそも条件コメントなどは不要…。
他のブラウザで :: がエラーになるとしても、独立したスクリプト要素に記述しておけば、
スクリプトの他の部分へは影響しないので、エラーになっても構わないのでは…。
コントロールが、インストールされてない、無効である時、
コントロール::イベント
の function は、エラーになるかも知れない。
( コントロールは、object要素の ID、イベントは、呼ばれる関数の名前。)
エラーは、「'要素id' は宣言されていません。」
エラーを避けるには、これらの関数定義を、関数の中に入れてしまい、
コントロールが有効である時のみ、その関数を呼び出せば良いのだろう。
(コントロール要素のイベント関数なので、関数の中に入っていても、
関数内のスコープとは無関係。)
(関数の中に入れても、他のブラウザからは隠せず、::
でエラーになるが。)
このエラーは、onload 以降で、object要素が、undefined になる為と思われるが、
onload 前で、object要素の記述の後でなら、::
付き関数を
定義してもエラーにならないかも知れない。
Flash からは、::
で定義された関数でなく、普通の関数を呼び出せる。
だから、コントロール側から、コールバックするのに、::
付きで関数を
定義しなければならない訳でもないようなのだが。
▼ ブラウザでの、アイコンのドロップに対するデフォルト動作のキャンセル。
窓の中にアイコンが落とされた時は、そのファイルへページが移動したり、
開くか保存(ダウンロード)かのダイアログが出る、といった動作になるので、
これを抑えないと、ブラウザ(IE)では、このコントロールは使えない。( HTAではなく、)
IE では、当該の object要素か、それを含む上位要素で、
ondragover="return false" ondragenter="return false"
とすると、
デフォルトの動作をキャンセルできるようである。
(return false は、又は event.preventDefault() か event.returnValue=true)
ページ全体を抑制するには、コンテナ要素(HTML か BODY のどちらか)でするが、
これは、ondragover イベントに、false を返すだけで済む。
IE 11 で確認してみると、コンテナ要素でなくても、ondragover だけで済み、
ondragenter は不要であった。
アイコンを落とされた時の既定の動作をさせたくないのだから、ondrop で断れば良いのでは
と、考えてしまうが、IE では関係ないらしい。
( ondrop は、その要素では1回起きるが、ondragover は、マウスが少し動くと起きる
かのように、頻繁に繰り返し発生するようで、その度に呼び出されるのであるが、、)
他のブラウザで、アイコンのドロップでのページの移動を断るには、
Chrome, Firefox では、ondragover と、ondrop イベントの2つ共で行うなら、効果ある。
( このコントロールは使えないので関係ない事であるが。)
IE, HTA で、このコントロールが使える時に、
ondragover と、ondrop イベントの2つで、阻止すると、コントロールが使えなくなる。
(コントロールが呼び出されなくなるのだと思うが)。
これは当該の object要素か、それを含む HTML までの上位要素のどこで、しても。
(これらのイベントで、浮上・伝播の阻止 .stopPropagation() や .cancelable=true
については、何か効果があるのか分からない。)
以前の IE では、RegisterAsDropTarget プロパティを偽にする方法もあった。例えば
var IE = new ActiveXObject("InternetExplorer.Application")
IE.RegisterAsDropTarget = false
IE.Visible = true
IE.Navigate( パス )
として起動した IE では、落としたファイルを開かないが、このコントロールは使える。
現在の IE では、無効のようである。
▼ HTA での、アイコンのドロップと、ページの移動。
HTA の独立(トップ)の窓で、デフォルトの状態は、ページの移動など無く、
アイコンが落とされても、イベントの動作をキャンセルしたりする必要はない。
HTA:Application タグに、属性 navigable="yes" を設定すると、ページの移動が可能になり、
アイコンを落とした場合も、それを自身の窓で開くので、このコントロールは、使えなくなる。
( Windows XP 上の HTA で試すと、アイコンのドロップでは、ページの移動は
起きないが、その時、このコントロールも、機能しない。)
ブラウザの場合と異なり、イベントで阻止しようとしても、無効であるようだ。
HTA 窓の中にある窓( IFRAME や FRAME 要素)では、ページの移動がある。
内の窓へアイコンを落とすと、ブラウザが開けるものは、その内の窓で開く。
ブラウザでは普通、子の窓へ落としても、移動するのは、親(最上位)の窓である。
Windows XP の HTA では(これは何か不具合かも知れないが)、落としたファイルを
開くのでなく、空白ページ(about:blank)へ飛ばされる。(リンク(A)は普通に開く。)
ブラウザが開けないものでも、ダイアログが出ず、ページが消えてしまう。
トップの窓と違って、navigable=no としても、移動してしまう。
HTA:Application タグを作る事は出来ても機能していない、属性は無効。
トップの窓の navigable 属性の値が適用されるのでもない。
しかし、ブラウザの場合とも違い、ondragover や ondragenter に false を返しても、
移動を止められない。
そのため、このコントロールにアイコンを落とすと、ページが移動(または消失)するか
ダイアログが出る事になってしまい、コントロールが利用できない。
window か body の onbeforeunload で、false を返すと、移動するかの
ダイアログが出るので、[いいえ] なら、移動を止める事はできるが、
このコントロールへアイコンは渡されない。
ondragenter 時に、WScript.Shell で、 .SendKeys("{ESC}")
として、
[ESC]キーを押したことにしてみると、エクスプローラからドラッグした場合は
回避できる (SendKeys はアクティブな窓へキーを送るとあるが、デスクトップ
へは送れないようで、デスクトップのアイコンでは止められない)
が、勿論 [ESC] すると、このコントロールへのドロップもされない。
アイコンだけでなく、リンク(A要素)を、ドラッグ&ドロップしても同様の事が起きる。
内の窓のページ中のリンク(A要素)を、クリックするつもりで、少しずらして、
離してしまった場合、ページが消えたり、移動してしまう。( target を
設定してないなら、その移動は、クリックと同じではあるが。)
ブラウザでは、自身のページや、中の窓(フレーム)のページにある、リンクを
自分自身の所で運んでいる間、カーソルは丸に斜線で無効が示されていたりし、
落としても、何も起きない。
navigable=yes の HTA(のトップ窓)でも、それは無効であるが、
その内にある窓では、そうならない。
ドラッグの開始 ondragstart
で、false を返せば、これは抑止できるが、
選択テキストのドラッグも出来なくなる。
HTA の IFRAME, FRAME 要素には、application 属性(値は yes/no )を指定できる。
yes なら、HTA 同様に動作するのかと思うが、分かる違いは、
ActiveXObject の取得で、FileSystemObject や WScript.Shell だと、
no では、警告(許可)のダイアログが出る事くらいかと思う。
どちらでも、このコントロールは、警告なしに使えている。
( ネット上のファイルを指定した場合は、違うのだろうけれど。)
src に指定できるのは、ブラウザと同じようで、application=yes としても、
拡張子 .hta のファイルを、中の窓に取り込む事はできず、
ダウンロード(保存か、他で開くか)のダイアログが出る。
独立(トップ)の窓で、navigable=yes の時( target を指定してない場合だが)、
リンク先は拡張子 .hta のファイルでも開く事が出来る。
内の窓のリンクでは、.hta を指定しても、中で開く事はできない。
ページを移動させた後、[前に戻る]事はできない。トップの窓でも同じ。
application=no でも、ブラウザの戻る/進むは、無効。
トップの窓で [最新の情報に更新] しても、最初の状態に戻らない。
▼ 色(背景色)の設定
デフォルトは、ページの background-color でなく、window の背景色。
PRAME 要素での指定は、
<param name="color" value="数字" >
この値は、10進数字で指定。
スクリプトからは、 iconPit.color = 数値
( プロパティ(パラメータ)の名前に、大小文字の区別はないらしい。)
( iconPit は、object 要素に指定した任意の要素ID )
数値は、HTML, CSS の色とは、順序が逆で、4 バイトの、
2 バイト目が 青、3 バイト目が 緑、最下位バイトが 赤。
0xFF は 赤、0xFF0000 は 青。 0x00bbggrr で、Windows GDI の COLORREF 値と同じ。
1 バイト目が、0xFF なら、システム色を表すらしい。( clSystemColor = $FF000000; とある。
→ Borland\BDS\4.0\source\Win32\vcl\Graphics.pas
この時の下の値は、COLOR_WINDOW = 5; COLOR_WINDOWTEXT = 8; などと、
Win32\rtl\win\Windows.pas にあるが、この定数は、MS の WinUser.h のと同じで、
MSDN の、GetSysColor に その定数の説明あり。)
背景色のデフォルト値は、4278190085 (-16777211) = 0xFF000005 = WINDOW 色
テキスト色の無指定時は、4278190088 (-16777208 ) = 0xFF000008 = WINDOWTEXT 色
例えば、COLOR_HIGHLIGHT = 13 (0xD) は、0xFF000000 | 13 とビット演算では、
4 バイトの符号付整数にされて?、-16777203 になるが、単純に加算すると、
0xFF00000D (4278190093) で、スクリプトから設定する場合は、どちらの
値を使っても同じ結果になる様である。
スクリプトからは、16進で設定できるが、PRAME 要素では、10進に換算してから、
書き記す必要がある。また上の負数は理解されず無効らしい。
▼ 文字の設定
(以下の iconPit は、object 要素に指定した任意の要素ID )
iconPit.text = 文字列;
表示のテキスト (無指定時は "Drop" )
iconPit.textAlign = 数;
テキストの横方向の配置 (Alignment)
0: LeftJustify, 1: RightJustify, 2: Center 、既定値は 2 (Center)
iconPit.textVAlign = 数;
テキストの縦方向の配置 (Layout)
0: Top, 1: Center, 2: Bottom 、既定値は 1 (Center)
iconPit.textColor = 数;
テキスト(フォント)の色。値は、背景色の項を参照。
以上は、PARAM 要素では、
<PARAM NAME="text" VALUE="文字列">
( 改行は、実際に改行してもいいが、HTMLのエスケープで渡せる。)
<PARAM NAME="textAlign" VALUE="数">
<PARAM NAME="textVAlign" VALUE="数">
<PARAM NAME="textColor" VALUE="数">
iconPit.Font.Name = 文字列;
フォント名 ( 既定値は、Tahoma )
iconPit.Font.Size = 数;
フォント・サイズ、point
iconPit.Font.Bold = 真偽;
iconPit.Font.Italic = 真偽;
iconPit.Font.Underline = 真偽;
iconPit.Font.Strikethrough = 真偽;
取り消し線
iconPit.Font.Weight = 数;
「フォントの太さを表す 0 から 1000 までの値」
Font.Bold が true なら、Font.Weight の値は 700 に、false では 400 になる。
iconPit.Font.Charset = 数;
0: ANSI_CHARSET, 1: DEFAULT_CHARSET,
2: SYMBOL_CHARSET, 128: SHIFTJIS_CHARSET,
...→ WinGDI.h
( 多言語対応にするには、何を指定すればいいのか判らない。)
スクリプトでは、Font は、object だが、パラメータ要素では、Name のみ設定可能らしい。
<PARAM NAME="Font" VALUE="MS Gothic">
Font の他のプロパティは、スクリプトから設定する他ないが、要素の記述の直後に設定
しても、問題ないようである。インストールされているかどうかは、
if( window.iconPit && iconPit.Enabled )
で確認。
▼ その他の設定
表示の大きさは、object 要素の width, height または、その style の width, height に
指定する。最初の表示後も、スクリプトから随時変更できる。
初期時に指定なしは、240×180 に設定した既定値の大きさだが、その場合に、
要素.width/height の変更が効かない事がある?。
枠線(Border)も、object要素の style で指定。(コントロール側にもあるが、後述の様に?)
このコントロールは、無償版の Borland Turbo Delphi Explorer で作ったのだが、
デフォルトで、イベントや、プロパティが、多く用意されている。
それに付け加えたのは、プロパティの、text, textAlign, textVAlign, textColor と、
イベントの notifyPaths である。
上の、Color と、Font は、デフォルトに用意されていたプロパティそのままであり、
他には、一部削除したが、以下のものがある。( 動作に疑問があるものは、
書き足されるべきコードが、不足しているからなのかも知れない。)
イベント (コントロール側からの呼び出し)
function iconPit::OnClick( iKeyState ){
// ボタンや修飾キーの情報を、引数にするようにした。
if( iKeyState & 1 ) ;// 左マウスボタン
else if( iKeyState & 2 ) ;// 右ボタン
else if( iKeyState & 4 ) ;// 中ボタン
else{//キー押下による場合、下位2バイト目に、そのコードを入れてある。
var key = iKeyState >> 8
if( key==13 ) ;// [Enter]キー
else if( key==32 ) ;// [Space]キー
}
//修飾キー
if( iKeyState & 16 ) ;// [Shift] キーが伴う
if( iKeyState & 32 ) ;// [Ctrl]
if( iKeyState & 64 ) ;// [Alt]
}
function iconPit::OnDblClick(){ ... }
( この前に一度、OnClick が来る。)
function iconPit::OnKeyPress( key ){ ... }
object要素に、tabindex を設定すると有効になり、[Tab]キーでフォーカス
させてから、キーを押すと反応する。引数には、キーコード(ASCII)が渡される。
( キーフォーカスされたかは、HTML側の onfocus イベントで。)
function iconPit::OnMouseEnter(){ ... } マウスが入った時
function iconPit::OnMouseLeave(){ ... } マウスが去った時
function iconPit::OnActivate(){ ... }
開始後、最初のキーフォーカスかクリックで生じ、後は起きない、
プロパティ
<PARAM NAME="AxBorderStyle" VALUE="1">
境界線。 0: None、1: 一重線(Single)、2: へこんだ(Sunken)、
3: 浮き上がった(Raised)。既定値は、1 だが、何故か見えない。2, 3 は効果あり。
( しかし、2, 3 では、アイコンを落とした時、反応しなくなる?)
枠(Border)は、object要素のスタイルでの方が、細かく指定できる。
<PARAM NAME="Enabled" VALUE="-1">
「マウス,キーボード,およびタイマーイベントに応答するかどうか」(真偽)
<PARAM NAME="Visible" VALUE="-1"> 「表示するかどうか」(真偽)
スクリプトで偽に設定すれば、表示が消えるが、PARAM では無効らしい。
<PARAM NAME="Caption" VALUE="name">
キャプション、独立した窓なら、そのタイトルバーに現れるものだが、
無いので変更しても意味があるとは思えない。
<PARAM NAME="PixelsPerInch" VALUE="96">
「現在の画面解像度に対するフォームのスケーリング」
「Scaled プロパティも true に設定する必要」あり
<PARAM NAME="PrintScale" VALUE="1"> 「印刷時の比率」
0: None, 1: Proportional, 2: PrintToFit
<PARAM NAME="Scaled" VALUE="-1"> (真偽)
「フォームサイズを PixelsPerInch プロパティの値に基づいて変更するかどうか」
<PARAM NAME="AlignWithMargins" VALUE="0"> (真偽) 不明
<PARAM NAME="AutoSize" VALUE="0">
サイズを「中身に合わせて自動的に変更」するかどうか(真偽)。
真(0以外)にすると、要素に指定した width, height でなく、デフォルトのサイズ
(240×180)が使われるようであるが。
readonly のプロパティ (PARAM要素にはない。)
Active
MouseInClient
ExplicitLeft
ExplicitTop
ExplicitHeight
ExplicitWidth
デフォルトで用意されていたが、削除したもの⇒
-----------------------------------------------
イベント
function iconPit::OnDeactivate(){ ... }
OnActivate と対のはずだが、いつ起きるのか不明。
function iconPit::OnCreate(){ ... } 起きない?。
function iconPit::OnDestroy(){ ... }
更新[F5]時は 起きるが、窓を閉じる時は 起きなかったりする?。
OnDestroy は起きるが、OnCreate の方は不明。
function iconPit::OnPaint(){ ... }
描画時 (隠れている所から現れた時等も)。
プロパティ
<PARAM NAME="AutoScroll" VALUE="0">
「スクロールバーを自動的に表示するかどうか」(真偽)。
<PARAM NAME="KeyPreview" VALUE="0">
「フォームがアクティブコントロールより前にキーボードイベントを受け取るかどうか」
<PARAM NAME="DropTarget" VALUE="0">
「現在ドラッグアンドドロップ操作のターゲットであるかどうか」(真偽)
<PARAM NAME="HelpFile" VALUE="">
「ヘルプを表示するのに使用するファイルの名前」
<PARAM NAME="PopupMode" VALUE="0">
Z オーダーが常に上?、 0: None, 1: Auto, 2: Explicit
<PARAM NAME="ScreenSnap" VALUE="0">
「フォームを移動したときに,フォームの縁をスクリーンの縁にスナップするかどうか」
<PARAM NAME="SnapBuffer" VALUE="10"> ScreenSnapの距離
「フォームの縁とスクリーンの縁の間の最大の距離をピクセルで」
<PARAM NAME="DockSite" VALUE="0">
「true に設定すると,ほかのコントロールをこのウィンドウコントロールにドッキングできる」
<PARAM NAME="DoubleBuffered" VALUE="0">
「false の場合,ウィンドウコントロールは直接ウィンドウに描画され」
true では「メモリ内ビットマップに描画され,そのビットマップがウィンドウへの描画に使用」
DockSite && UseDockManager の「場合は,ダブルバッファリングを行う必要」
<PARAM NAME="UseDockManager" VALUE="0">
「ドラッグアンドドック操作でドッキングマネージャを使用するかどうか」
readonly のプロパティ
AlignDisabled
VisibleDockClientCount
以上は、よく判らないので、削除した。-----------------------------------------------
▼ その他
このコントロールでは、左右どちらのマウスボタンで、ドラッグされたのかを知る方法が判らない。
方法を変えて、OLE の IDropTarget を使うと、マウスボタンが判り、
また、ファイル以外のドロップにも対応できる。
(テキストが、ドロップされた場合は、IE の event でも得られるが。)
これについては、IDropTarget 版を作ってみた。
C# 版アイコン投入口も。 .NET であるからだろうが、その dll は、11 KB、
こちらは、511 KB である。
----------------------------------------------------
要素に、選択テキストや リンク(A要素)が、運ばれて来て落とされた時、ブラウザの
イベント・オブジェクト(中の event.dataTransfer)から、情報が得られるようである。
まず、ondragover で、イベントの既定の動作を止めておくと、それを、
要素へ落とす事=要素で受け入れる事が、出来るようになるらしい。
ondrop (または ondragend)イベントにて、event.dataTransfer.getData("…")
メソッドで、文字列データを取る事が出来る。
選択されたテキストなら、.getData("Text")で、そのテキストが得られる。
リンクなら、.getData("Text") 又は .getData("Url") で、リンク先 URL 。
このイベントでは、ブラウザによっては、何かしようとするので、
false を返しておく(既定の動作を抑制する)必要あり。
アイコンが落とされた時、IE, HTA では、.getData("Text") の戻り値は、
null ( 他のブラウザでは、空文字)。ここ辺りで、パスが得られるならば、
このような ActiveX コントロールなど、不要なのであるが、。
event.dataTransfer は、HTML5 に取り入れられ、更に、ファイル(アイコン)の
ドラッグ&ドロップにて、event.dataTransfer.files
から、
ファイル(オブジェクト)が得られるようになった。 .files.length あれば、
.files[0] が、1つ目のファイルで、 .files[0].name がファイル名。
.files.length の他、event.dataTransfer.types.contains("Files") が
true なら、物がファイルと判断できる。この確認は、
テキストやリンクの場合、引数に、IE なら "Text", "Url" だが、
他は、"text/plain", "text/html", "text/uri-list" となっている。
この文字列は、getData() へも与えられる。
得たファイル(オブジェクト)から、FileReader というのを使って、
ファイル内容の読み取りも可能。
しかし、ブラウザなので、パスを知る事はできない。
( Chrome では、インターネットショートカットファイルなら、getData(..) で
URL が返る。)
IE は、10 から?。 HTA では( IE 7 で止まっているので)使えない。
要素.ondragover = function(){ return false }
要素.ondrop = function(ev){
var txt ="", dt; if( ! ev ) ev = event
ev.preventDefault==null ?
(ev.returnValue=true): ev.preventDefault()
if( dt= ev.dataTransfer ){
txt = dt.getData("Text")
if( ! txt && dt.files && dt.files.length ){
var ary= []
for(var i=0, len=dt.files.length; i<len; ++i)
ary.push( dt.files[i].name )
txt = ary.join("\n")
}
}
//alert(txt) //return false →.preventDefault()
}
▽ HTA 中で、このコントロールを使う場合で、
PC が 64ビット機の時、その HTA の呼び出し方の問題。
その HTA ファイルを、ファイルの関連付けによって、直接呼ぶ場合は問題ないが、
何かの事情で、mshta.exe の引数に そのファイルを指定する形式にする場合、
コントロールが使用不能になることがある。例えば、
mshta HTAファイルのパス
%SystemRoot%\system32\mshta.exe HTAファイルのパス
C:\Windows\system32\mshta.exe HTAファイルのパス
などと普通に書くと、コントロールがインストールされてない状態と同じになる。
次のように system32 を SysWOW64 フォルダに変えると、動作する。
%SystemRoot%\SysWOW64\mshta.exe HTAファイルのパス
C:\Windows\SysWOW64\mshta.exe HTAファイルのパス
--------------------------------------------------------------
● ファイル
./DropFiles.ocx 当該のコントロール
./DropFiles/ ソース
FormImpl.pas 作業部分のソース (テキスト)
FormImpl.dfm フォーム(ウィンドウ)のソース (テキスト)
DropFiles_TLB.pas タイプライブラリ (〃)
DropFiles.dpr プロジェクトファイル (〃)
▽ 履歴
2008/2 作成。
2009/7 JIS 外の文字を扱えなかったのを、多言語の文字対応(UNICODE)に修正した。
2011/1 テキスト表示を追加。また、このファイルを修正加筆。
2011/5 このファイル(説明)を、少し修正。
2011/7 通知に2つ目の引数(修飾キー)を追加。
2011/8 OnClick にも、2つ目の引数(修飾キー)を追加。
2016/11 この htmlファイル(説明と使用テスト)を修正。
------------------------------------------------
※この表示の問題、
HTA か IE 7 で、white-space: pre; や PRE 要素に、
フォントが、無指定だったり monospace だったりすると、
末尾の文字が全角か半角かで、次の空白のサイズ(幅)が、違ってきて、
行の冒頭の空白文字(\x20)による字下げの幅が、揃わない。(タブでは揃うが)
この時、フォントは、"Times New Roman", "Courier New" で、
IE のフォントの ラテン語ベース(ラテン語基本)の 設定が、使われている。
(このファイルが、UTF-8 の為、日本語フォントの設定にならない。)
フォントに、"MS Gothic" 等を指定した場合は、そうならないので、
欧米系のフォントが使われると起きる事だと思う。
それで末尾を半角文字にする為に、ソース中の行末の各所に、\xA0( の生文字)
を入れてある(通常の \x20 では効かない)。
( "MS Gothic"を指定する事にしたので、不要となってしまったが、)
IE 8 以降では、そのようにはならない。
font-family:monospace; とし、行頭 | が揃うか。行末⇒half size
| 行末⇒全角
| 行末⇒half size
|
テスト用入力欄の表示