TextInput入力終了時に、編集前の値と編集後の値を取得したい。
DataGridのitemEditEndみたいなイベント。
changeイベントとかで出来るかと思ったら、1文字変更するごとにイベントが発生するらしい。
用途が違ったから、自分で作った。
フォーカスを当てられた時に、itemEditBeginイベントを発生させる。
フォーカスが外れた時に、itemEditEndイベントを発生させる。
編集中にエスケープが押されたら、編集前の状態に戻して、フォーカスを外す。
編集中にエンターが押されたら、タブを押されたイベントを発生させて、次のオブジェクトにフォーカスを移す。
使い方
itemEditEndに、直に式を入れる方法が解らない。
clickイベントみたいな奴。
ActionScriptはEval出来ないし、どうやってるんだろう。
<eth0:EditTextInput id="input1" width="200" itemEditEnd="{function(){input1_edit_end(this);}}" />
public function input1_edit_end(input:EditTextInput):void { if (input.isCancel || input.oldValue==input.newValue) { return; } Alert.show("編集前:" + input.oldValue + " 編集後:" + input.newValue); }
jp.eth0.EditTextInput.as
TextInputの継承クラスとイベント用のクラス、別々にすればよかった。
package jp.eth0 { import mx.controls.TextInput; import flash.events.FocusEvent; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; public class EditTextInput extends TextInput { public const ITEM_EDIT_BEGIN:String = "ITEM_EDIT_BEGIN"; public const ITEM_EDIT_END:String = "ITEM_EDIT_END"; public var oldValue:String; public var newValue:String; public var isCancel:Boolean; public var itemEditBegin:Function; public var itemEditEnd:Function; // コンストラクタ public function EditTextInput():void { addEventListener(KeyboardEvent.KEY_DOWN, _keyDownHandler); addEventListener(FocusEvent.FOCUS_IN, _focusInHandler); addEventListener(FocusEvent.FOCUS_OUT, _focusOutHandler); super(); } // キーが押された private function _keyDownHandler(event:KeyboardEvent):void { // Escape // 編集前の状態に戻す if (event.keyCode==Keyboard.ESCAPE) { isCancel = true; text = oldValue; this.stage.focus = null; return; } // Enter // 次のオブジェクトにフォーカスを当てる if (event.keyCode==Keyboard.ENTER) { var tabKeyEvent:FocusEvent = new FocusEvent(FocusEvent.KEY_FOCUS_CHANGE, true, false, null, event.shiftKey, Keyboard.TAB); dispatchEvent(tabKeyEvent); return; } } // フォーカスが当てられた private function _focusInHandler(event:FocusEvent):void { oldValue = super.text; newValue = ""; isCancel = false; dispatchEvent(new Event(ITEM_EDIT_BEGIN)); itemEditBegin(new Event(ITEM_EDIT_BEGIN)); } // フォーカスが外れた private function _focusOutHandler(event:FocusEvent):void { newValue = super.text; dispatchEvent(new Event(ITEM_EDIT_END)); itemEditEnd(new Event(ITEM_EDIT_END)); } } }