ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   超ビギナー
     TextAreaで最後の改行が取れていないことがある
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
hidacchi
投稿日時: 2009-1-23 14:48
やや お馴染みさん
登録日: 2008-11-8
居住地:
投稿: 5
TextAreaで最後の改行が取れていないことがある
こんにちは。いつも参考にさせてもらっています。
現在、Flexの勉強をしているのですが、一つおかしな現象がおきています。皆様のところでも起きているのでしょうか?

私の環境:Flex 2.0.1 Hotfix 3(Eclipseの

Test.mxml ソースここから↓
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
public function alertMessage():void{
var str:String = test.text;
Alert.show(str.length.toString());
}
]]>
</mx:Script>
<mx:Box>
<mx:TextArea id="test" height="200" width="300"/>
<mx:Button click="alertMessage()"/>
</mx:Box>
</mx:Application>
↑ここまで

単純に、テキストエリアに入力した文字数をアラートで表示するだけのつもりでしたが、以下の手順で入力すると、最後の改行が見た目には存在していないのに、データ的には存在しているようです。

1.空のテキストエリアに「'a'[改行]'b'」と入れる。この時点でボタンを押すと「3」と表示される(正しい)。
2.上記1.に続き、「'b'」のみバックスペースで削除する。この時点でボタンを押すと「2」と表示される(正しい)。
3.上記2.に続き、二行目にカーソルを置いてバックスペースを一回たたく。見た目には「'a'」と表示され、改行も無いが、ここでボタンを押すと「2」と表示される(おかしい??)。
4.上記3.に続き、Ctrl+A→Ctrl+Xでテキストエリアの内容を全選択→切り取りし、そのままCtrl+Vで貼り付けてボタンを押すと、「1」と表示される(正しい・・・)。

デバッグ実行してみると、3.でバックスペースを押した時点では、まだ'\r'が残っているようです。これはもしやFlexのバグというやつなのでしょうか???また、回避策はあるのでしょうか??すみませんよろしくお願いします。
fujita
投稿日時: 2009-1-26 13:27
ご主人様
登録日: 2006-7-11
居住地: 日本一暑いところの近く。
投稿: 128
Re: TextAreaで最後の改行が取れていないことがある
こんにちは。
私も同じ問題に悩まされました。
今は一応、回避策として、TextAreaのカスタムで逃げております。

textプロパティの改行が残っている場合でも、実はTextAreaのtextFieldの値は正しく更新されているので、
そこを同期するように処理を入れて回避しております。

対応はこんな感じです。

override protected function createChildren():void {
  super.createChildren();
  // textFieldのBackSpace,Deleteキー操作に対し、文字列終端改行削除後のハンドラを設定する。
  textField.addEventListener(KeyboardEvent.KEY_UP, textFieldKeyUpHandler);
}

/* 
 * 終端の改行文字が"削除"された場合に現象が発生するので、BackSpaceキーとDeleteキーのイベントを拾う
 */
private function textFieldKeyDownHandler(event:KeyboardEvent):void {
  if (event.keyCode == Keyboard.BACKSPACE || event.keyCode == Keyboard.DELETE) {
    // 押下直後はまだ文字が消えないのでcallLaterで処理を遅らせる。
    callLater(textUpdate);
  }
}

private function textUpdate():void {
  // textプロパティに改行が残っている場合、textFieldの値をtextに通知。
  //また、この設定だけだとテキスト変更イベントが発生しないので変更を通知。
  if (textField.text != this.text) {
    this.text = textField.text;
    // 値の変更を参照先に通知
    dispatchEvent(new Event(Event.CHANGE));
  }
}
hidacchi
投稿日時: 2009-1-26 15:33
やや お馴染みさん
登録日: 2008-11-8
居住地:
投稿: 5
Re: TextAreaで最後の改行が取れていないことがある
fujitaさん、コメントいただきありがとうございました。
私だけではなかったのですね。。早速この方式を試したところ、
BackSpaceにDelete、ばっちりうまくいきました!ありがとう
ございました。

ただ、右クリックメニューやCtrl+Xで、最後の改行だけ切り取る、
というアクションでもどうやら同じ問題が発生するようなので、
いただいたソースを参考にさせていただいてもうちっと突っ込ん
でみます。ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を