トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
野中文雄
Åê¹ÆNo.11058
投稿日時: 2004-9-24 16:32
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
ENTERキーでフォーカス移動」(迷える子羊の部屋)より移行しました。

「効率的」というのが、フォーカスするTextFieldの追加が楽なようにという意味でしたら、配列に格納して処理をすればよいでしょう。
var oKeyListener = new Object();
oKeyListener.text_array = [text1_txt, text2_txt, text3_txt];
oKeyListener.oTextFields = new Object();
for (var i = 0; i<oKeyListener.text_array.length; ++i) {
    // oKeyListener.text_array[i].tabEnabled = true;
    oKeyListener.text_array[i].tabIndex = i;
    oKeyListener.oTextFields[oKeyListener.text_array[i]] = i;
}
oKeyListener.onKeyDown = function() {
    if (Key.getCode() == Key.ENTER) {
        var selected_txt = eval(Selection.getFocus());
        var nID = this.oTextFields[selected_txt];
        if (nID>=0) {
            var next_txt = this.text_array[++nID%this.text_array.length];
            Selection.setFocus(String(next_txt));
        }
    }
};
Key.addListener(oKeyListener);

引用:
sayuriさんは書きました:
質問は単純でただ、タブで行っているフォーカスの移動をENTERで行いたいだけです。

他のサイトで、以下のように3つのテキストをENTERで移動させるものがあり、この方法でもできないことはないと思うのですが、数が多かったりするととてもめんどうなので・・・
...[中略]...
test1_txt.tabEnabled = true;
test2_txt.tabEnabled = true;
test3_txt.tabEnabled = true;

test1_txt.tabIndex = 0;
test2_txt.tabIndex = 1;
test3_txt.tabIndex = 2;

test1_txt.tag = "test2_txt";
test2_txt.tag = "test3_txt";
test3_txt.tag = "test1_txt";

var keylistener = new Object();
keylistener.onKeyDown = function(){
  if(Key.isDown(Key.ENTER)){
    var fname = Selection.getFocus();
    var tag = eval(fname+".tag");
    if(tag.length > 0 && !_global.err){
      Selection.setFocus(tag);
    }
  }
}
Key.addListener(keylistener);


----------------
 

sayuri
Åê¹ÆNo.11065
投稿日時: 2004-9-24 17:20
新米
居住地:
投稿: 5
使用環境:
WinXP
FlashMX2004
Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
野中さん早速の返信ありがとうございます。

やはりこのようなやり方しかないようですね。
「効率的」というのはtabIndexと関連付けられたりできればなと、淡い期待をもっていたもので。。

とりあえずこの方法で強引にやってみたいと思います。
sayuri
Åê¹ÆNo.11067
投稿日時: 2004-9-24 20:05
新米
居住地:
投稿: 5
使用環境:
WinXP
FlashMX2004
Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
たびたびすみません。

先ほど教えていただいた方法でENTERでのフォーカス移動は実現できたのですが、1つまた問題が出てしまったのでよろしくお願いします。

たとえば、コンボボックスで選んだ値によってタブの順番や、タブで動けるオブジェクトを変化させようとしています。
コンボボックスで1のとき、
test1_txt→test2_txt
コンボボックスで2のとき
test1_txt→test3_txt→test4_txt
のような感じです。

そこで、下記の方法でコンボボックスの値がchangeするたびに配列内の値を変化させたのですが、addLisnerが2回きいているのか、1回ENTERをDownすると2回反応してしまいます。。
このスクリプトを呼ぶたびにonKeyDownを削除してみようとしたのですが、できませんでした・・・
どなたか2重登録を回避する方法を教えてください。

function setKeyEvent():Void{
  delete(this.onKeyDown);
  //delete(keylistener.onKeyDown);

  if(コンボボックス.data == 1){
    text_array = [test1_txt,test2_txt];
  }
  else{
    text_array = [test1_txt,test3_txt,test4_txt];
  }
  var keylistener = new Object();
以下省略???

野中文雄
Åê¹ÆNo.11070
投稿日時: 2004-9-24 21:04
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
引用:
野中文雄は書きました:
ご使用の環境は、プロフィールに記入しましょう。

? フォーカスの順序は、TextField.tabIndexプロパティの値と関連づけて変更していますけど...
引用:
sayuriさんは書きました:
「効率的」というのはtabIndexと関連付けられたりできればなと、淡い期待をもっていたもので。。

ご質問の状況やスクリプトの処理の流れが、わかりません。

Key.removeListener()メソッドで、登録したリスナーを削除していますか?
引用:
sayuriさんは書きました:
そこで、下記の方法でコンボボックスの値がchangeするたびに配列内の値を変化させたのですが、addLisnerが2回きいているのか、1回ENTERをDownすると2回反応してしまいます。。

onKeyDown」というのは、どこに設定したコールバック関数を指しているのでしょうか?
引用:
このスクリプトを呼ぶたびにonKeyDownを削除してみようとしたのですが、できませんでした・・・

つぎの登録をする前に、古いリスナーを削除すればよいはずです。
引用:
どなたか2重登録を回避する方法を教えてください。

以下のスクリプトは、どこに記述されたものですか?「this.onKeyDown」のthisは、どこを参照しているのでしょうか?
function setKeyEvent():Void{
  delete(this.onKeyDown);
  //delete(keylistener.onKeyDown);


----------------
 

sayuri
Åê¹ÆNo.11071
投稿日時: 2004-9-24 22:25
新米
居住地:
投稿: 5
使用環境:
WinXP
FlashMX2004
Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
野中さんありがとうございます。

引用:
? フォーカスの順序は、TextField.tabIndexプロパティの値と関連づけて変更していますけど...

んー、SetFocusなどを使わずにという期待だったのですが、とりあえずこれは気にしないでください。

「以下省略」のところに教えていただいたコードを記述してあります。そこにonKeyDownは記述してあります。同じfunction内にonKeyDownがあるのでthisで指定できると思っています。

setKeyEventはMCをクラス化し、そのMCのfunction(このなかでリスナー登録)です。
コンボボックスの値が変わるたびにこのfunctionを呼び出しています。
野中文雄
Åê¹ÆNo.11073
投稿日時: 2004-9-24 23:07
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
私の書いたスクリプトには、this.onKeyDownの定義は含まれていません。それを書き加えたということでしょうか?しかし、そうだとしても、this.onKeyDownの削除は、登録したリスナーを削除することにはなりません。
this.onKeyDown = function() {
	trace(Key.getCode());  // テスト用
};
var oKeyListener = new Object();
oKeyListener.onKeyDown = this.onKeyDown;
Key.addListener(oKeyListener);
trace(this.onKeyDown);  // 出力: [type Function]
delete this.onKeyDown;
trace(this.onKeyDown);  // 出力: undefined
// それでもキーを押せばコードは出力される

引用:
sayuriさんは書きました:
「以下省略」のところに教えていただいたコードを記述してあります。そこにonKeyDownは記述してあります。同じfunction内にonKeyDownがあるのでthisで指定できると思っています。

「MCをクラス化」といわれる意味が、わかりません。リスナーオブジェクトを作成せず、MovieClipにthis.onKeyDownを定義し、そのインスタンスをKeyクラスのリスナーに登録したということですか?
this.onKeyDown = function() {
	trace(Key.getCode());
};
Key.addListener(this);

引用:
setKeyEventはMCをクラス化し、そのMCのfunction(このなかでリスナー登録)です。
コンボボックスの値が変わるたびにこのfunctionを呼び出しています。


----------------
 

sayuri
Åê¹ÆNo.11075
投稿日時: 2004-9-25 1:43
新米
居住地:
投稿: 5
使用環境:
WinXP
FlashMX2004
Re: ENTERキーでフォーカス移動[from: 迷える子羊の部屋]
引用:
oKeyListener.onKeyDown = function() {

これを削除するのにdelete(oKeyListener.onKeyDown)やdelete(this.onKeyDown)を試しただけです。thisにこだわりはありません。
そのほかの考えうるターゲットパスでやりましたがダメでした。
とりあえずこの方法が間違っているのはわかりますが、試してみました。
MCをクラス化というのは、MCをリンケージし、識別子と同じ名前のクラスを外だししているという意味です。
class test extends UIComponent{
 init(){}
 test(){}
 draw(){
  コンボボックスのchange内でsetKeyEvent();
 }
 function setKeyEvent(){
  onKeyDownの記述
 }
}


ともあれこのクラスでkeylistenerを定義し、setKeyEventを呼ぶたびにkeylistenerを削除、登録を行ってできました。
ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops