.replaceSelで文字列置換ができない問題の解決方法

このQ&Aのポイント
  • 「.replaceSel」でテキストフィールド内の選択された文字列が置換できない問題が発生しています。
  • スクリプトを書き、マッキントッシュの文字列を選択してボタンを押しても文字列が置換されず、代わりにウィンドウズの文字列が先頭に表示されてしまいます。
  • 問題の解決方法をご存知の方がいらっしゃいましたら、ご回答をお願いします。
回答を見る
  • ベストアンサー

「.replaceSel」でテキストフィールド内の選択された文字列が置換できません。

text_txt.text = "私のパソコンはマッキントッシュです。" button_btn.onRelease = function() {   t_txt.replaceSel ( "ウィンドウズ" ) }; このようなスクリプトを書き、マッキントッシュの文字列の部分を選択した後 ボタンを押しても文字列が置換できません。(ウィンドウズの文字列が先頭に来る) OS:WindowsXP SP2 SOFT:Flash MX 2004 Professional どうすれば個の問題を解決することができるのでしょうか ご存知の方がおられましたらご回答をよろしくお願いします。

  • Flash
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.2

#1です。 回答文のスクリプトをコピーして試してみましたが、問題ありませんでしたよ。 どこかに全角のスペースが残っていませんでしょうか? インデントが2つ分下がっているところは、全角のスペースが2つ入っています。(同様に、3つ下がっているところには3つ入っています) エラーが起きた行を中心に確認してみてください。 「アクション」パネルにある「置換」機能を利用して全角のスペースを半角のスペースに置き換えると、確実に削除できます。 #1のスクリプトをインデントなしで書き直しましたので、よろしければこちらもお試しください。 見辛くて申し訳ありませんが、コピーしてそのまま使えます。 動作も確認済みです。 //テキストフィールドに文字列を表示 text_txt.text = "私のパソコンはマッキントッシュです。"; //選択範囲の始点と終点を保持 //-1の時は何も選択されていない sel_begin = -1; sel_end = -1; //選択範囲を監視 _root.onEnterFrame = function() { //テキストフィールドにフォーカスがある場合のみ、選択範囲を記録 if( Selection.getFocus() == "_level0.text_txt" ) { sel_begin = Selection.getBeginIndex(); sel_end = Selection.getEndIndex(); } }; //ボタンが押された時、選択されている文字列を置き換える button_btn.onRelease = function() { //選択されている部分があれば、別の文字列に置き換える if( sel_begin != sel_end ) { text_txt.replaceText( sel_begin , sel_end , "ウィンドウズ" ); } //選択範囲をクリア sel_begin = -1; sel_end = -1; };

nana_watuki
質問者

お礼

上記をコピー&ペーストして再度やってみたところ問題なく動作しました。 どこかに全角のスペースが残っていたことが原因のようです。 お手数をおかけしてしまって申し訳ありませんでした。

その他の回答 (1)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

ボタンをクリックすると、テキストフィールドからフォーカスが外れます。 画面上はテキストフィールド内の文字が反転していて選択されているように見えますが、Flash の内部では選択されている箇所はないものと見なされます。 この状態で replaceSel を実行すると、選択されている箇所がないのですから、文字列は先頭にしか挿入されません。 フォーカスや選択範囲・文字入力カーソルに関する仕事を担当している、Selection というクラスがあります。 要するに、テキストフィールドからフォーカスが外れても選択されていた範囲の情報を残せればいいので、Selection クラスで選択範囲を取得し、これを変数に保存しておきます。 先述の通り、ボタンをクリックした途端に選択範囲がクリアされてなくなってしまうため、replaceSel を使うとなると、フォーカスを合わせて選択範囲を復元する( Selection クラスにはそのようなメソッドもあるので、このようなことも一応できます)といったひと手間が必要になります。 今回は選択範囲を変数にして保持しますから、特定の範囲の文字列を置き換える replaceText の方が簡単です。 選択範囲は、ムービークリップの enterFrame イベントを利用して常時監視します。 普通に考えると、文字を選択するにはドラッグしますから、マウスボタンが押された時に選択範囲の始点を、マウスボタンが離された時に終点を保存しておけばいいような気もします。 ですが、マウスイベントでは右クリック→「すべて選択」が実行された時やキーボードで文字列を選択された時に対応できません。 ただ、enterFrame イベントはムービークリップがステージに存在している間はフレームレート分の1秒ごとに発生します。 この時に無条件に選択範囲を取得して変数に入れていたのでは、選択範囲がない時にも位置( -1 )が記録されてしまい、これでは意味がありません。 そこで条件を付けて、テキストフィールドにフォーカスが当たっている時だけ選択範囲を記録することにします。 スクリプトにしますと、大体、次のようになります。 仮に、ステージにテキストフィールド(選択可能なダイナミックテキスト、またはテキスト入力)の” text_txt ”と、ボタンシンボルのインスタンス” button_btn ”があるものとします。 このスクリプトはフレームに設定してください。 (↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)  //テキストフィールドに文字列を表示  text_txt.text = "私のパソコンはマッキントッシュです。";  //選択範囲の始点と終点を保持  //-1の時は何も選択されていない  sel_begin = -1;  sel_end = -1;  //選択範囲を監視  _root.onEnterFrame = function()  {   //テキストフィールドにフォーカスがある場合のみ、選択範囲を記録   if( Selection.getFocus() == "_level0.text_txt" )   {    sel_begin = Selection.getBeginIndex();    sel_end = Selection.getEndIndex();   }  };  //ボタンが押された時、選択されている文字列を置き換える  button_btn.onRelease = function()  {   //選択されている部分があれば、別の文字列に置き換える   if( sel_begin != sel_end )   {    text_txt.replaceText( sel_begin , sel_end , "ウィンドウズ" );   }   //選択範囲をクリア   sel_begin = -1;   sel_end = -1;  }; フォーカスのある対象は Selection.getFocus で取得できます。 このメソッドの戻り値はレベルからの絶対パスです。通常はステージは _level0 ですから、ステージにあるテキストフィールド” text_txt ”にフォーカスがある時は、” _level0.text_txt ”という文字列が返されます。 選択範囲は、同じく Selection クラスの getBeginIndex と getEndIndex で取得できます。インデックスがない、またはテキストフィールドにフォーカスがない時は -1 が返されます。 なお、選択範囲を監視するのに、上記のスクリプトでは _root の enterFrame イベントを借りています。 何か不都合がありましたらダミーのムービークリップを作るなどして対処してください。 ボタンがクリックされた時のスクリプトで、変数に保存してある選択範囲を元に、replaceText で文字列を置き換えます。 変数に選択範囲の情報が残っていると、続けてボタンをクリックされた場合に不必要な部分まで置き換わってしまいますから、1度置き換えた後は選択範囲の情報を -1 に戻し、2回目は無効にしています。 例えば文字列の先頭をクリックすると、最初の文字(インデックスで言うと0番)が選択されていることになります。 テキストフィールドの表示が  |私のパソコンはマッキントッシュです。 (↑ ” | ”は文字入力のカーソルです) となっている状態の時は、getBeginIndex と getEndIndex メソッドはともに0を返すので、変数 sel_begin と sel_end にも0が入ります。 ”私”の1文字が反転している状態は、選択範囲は始点が0、終点が1です。 挿入ではなく置換えですと、1文字も反転していない状態で文字が挿入されるのは少々不自然ではないでしょうか。 そこで、文字を置き換える前に if 文で条件を判断し、選択範囲の始点と終点が等しくない場合、つまり、1文字でも選択されて文字が反転している場合に限り replaceText を実行するようにしています。 ざっと試しただけなので、何か穴があるかもしれません。 不明な点・不具合がありましたら、補足してください。

nana_watuki
質問者

補足

コピー&ペーストしたあと、余分な空白を削除して実行したところ 以下のようなエラーが発生して実行できませんでした。 **エラー** シーン = シーン 1, レイヤー = レイヤー 2, フレーム = 1 :行 8:シンタックスエラー    sel_begin = Selection.getBeginIndex(); **エラー** シーン = シーン 1, レイヤー = レイヤー 2, フレーム = 1 :行 9:シンタックスエラー    sel_end = Selection.getEndIndex(); **エラー** シーン = シーン 1, レイヤー = レイヤー 2, フレーム = 1 :行 10:予期しない '}' があります。 } ActionScript エラー数 :3 報告済みエラー :3

関連するQ&A

  • textファイルにある文字列の置換について

    すみません。 PERL初心者のものですが教えてください。 例えば、a.txtに以下の文字があるとします。 1234567,1111,9,8 1234568,1122,0,5 .... この時、「9」と「0」を文字列 9を"あいうえお" 0を"さしすせそ" と置換したい場合、どのように文字列を置換すれば良いのか ご教授いただけると幸いです。 既に他の方が質問済みでしたら済みません。

    • ベストアンサー
    • Perl
  • テキスト置換ソフトで、特定の文字列が●個出てくるごとに置換できるもの知りませんか?

    以下のような機能をもつ テキストファイルの置換ソフトを探しています。 特定の文字列が●個出てくるごとに、 その●個目の部分だけを置換する機能です。 たとえば、 abc abc abc abc abc abc abc abc という文字列があるとして、 手動ではなく一括で以下のように置換をしたいのです。 abc ABC abc ABC abc ABC abc ABC この例では、abcが2つ登場するごとに、ABCという文字列に置換されていますね。このように特定の文字列(この例ではabc)が●個出てくるごとに、その●個目の部分だけを置換するというような機能を持つ(できれば)フリーソフトなどをご紹介いただければありがたいです。 秀丸エディタなどのテキストエディタでは、おそらくできないと思うのですが、もしできるのであれば、そのやり方を教えていただいても構いません。 よろしくお願いいたします。

  • cshの文字列置換

    ヤマトです。 cshでファイル文字列を置換したいのですが、分かりません。 環境はRed Had Linux7.2です。 hoge1.txt の中の 'HIDUKE' という文字列を今日の日付に置換し、 hoge2.txt に出力するようなシェルを作りましたが、正常に動作しません。 ====hoge1.txt(置換前)==== 今日はHIDUKEです。 ====hoge1.txt(置換前)==== 今日は030814です。 ====SAMPLE.sh(一部抜粋)==== set TODAY = `date +"%y%m%d"` sed 's/HIDUKE/$TODAY/g' < hoge1.txt > hoge2.txt 以上のようなシェルを作りました。 結果として、hoge2.txtには出力されるのですが、 「今日は$TODAYです」 となってしまいます。 変数の値を置換するにはどのようにしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • ファイル名からテキスト内文字列の置換

    フォルダ内に tokyo.txt、nagoya.txt、osaka.txt… といったファイル名のテキストファイルがあり そのテキストファイルの中に 地名リンクという文字列があります。 この地名リンクという文字列を各々のファイル名 tokyo.txt、nagoya.txt、osaka.txt…(できれば.txtなしのtokyo,nagoya,osaka) に一括置換したいのですが、何かいい方法はありませんか。

  • EXELで文字列の先頭に文字を挿入したい(置換)

    EXEL2003です。 セルに文字列が並んでいます。 それの先頭にある文字を挿入するにはどうしたらよいのでしょうか? 「置換」で先頭とか、末尾を指定する方法がありますか? よろしくお願いします。

  • VBSで文字列の置換

    VBSまったくの初心者で、「そんなもんWebで調べろ」とお叱りを受けるのを承知でお聞きします。 C:¥置換¥あああ.txt のテキストファイル内にある文字列"ABC"を"DEF"に置換するVBSはどのように記述すればよいでしょうか?。 よろしくお願いいたします。

  • テキストフィールドの入力文字の制限に関する質問(ActionScript)

    text_txt.restrict = "+\\-*/"; 上記のアクションスクリプトで入力文字を「+-*/」に制限することができるのですが \\がないと「+/」のみしか入力ができない理由がわかりません。 \\がエスケープ文字だということはわかるのですが だとしたら、なぜ\\がないと「*」まで入力できなくなるのかがわかりません。 OS:WindowsXP SP2 SOFT:Flash MX 2004 Professional ご存知の方がおられましたらご回答をよろしくお願いします。

    • ベストアンサー
    • Flash
  • ファイルを開かずにテキストファイルの文字列置換

    続けての投稿で申し訳ないのですが、複数のフォルダ中のテキストファイルすべての中身を検索してある文字列を置換する方法を教えてください。 行いたい作業例ですが、 1)ABC- → ABC-   ある特定の半角文字列+"-"を全角に変換 2)2ー → 2-      ある特定の文字列+"ー(全角の長音)"を文字列+"-(全角のマイナス)"に 3)192.168.0.?? → ABC0?? にしたいです。 フォルダは複数あるため、一階層上から作業できる方がいいです。 AAAというフォルダ下に先のABCというフォルダ以外にDEFやGHIといったフォルダがあり、その下に001-00.txtや001-01.txtというフォルダがあるということです。 よろしくお願いします。

  • テキストファイルの一部置換したファイルをたくさん作りたい

    テキストファイル(a.txt)があるのですが このファイルの一部の文字列aaaをbbbに置換したファイル(b.txt)を作りたいです。 また文字列aaaをcccに置換したファイル(c.txt)も作りたいです。 続けてd.txtやe.txt・・・と作っていきたいですが簡単にできるフリーソフトはないでしょうか? 現状はa.txtを開いてaaaをbbbに置換して、別名で保存するのを繰り返し(10回以上)するので大変です。 このようなことが楽にできるフリーソフトがあれば教えてください。

  • $textの文字列の中にある & を ■ に変えたいです。

    <? $text ="u&ampampfayv&ampin&ampe6&rna6uinv"; ///////////////////////////// print $text."<br>"; print "<XMP>".$text."</XMP><br>"; ///////////////////////////////正規表現で置換 $text = preg_replace('/&[^amp]/', "■", $text); ////////////////////////////// print $text."<br>"; print "<XMP>".$text."</XMP><br>"; ////////////////////////////// print "u&ampampfayv&ampin&ampe6■rna6uinv"; print "<XMP>u&ampampfayv&ampin&ampe6■rna6uinv</XMP>"; ?> $textの文字列の中にある & を ■ に変えたいです。 amp という文字列の前についている & は ■ に置換してはいけません。 &ampamp という文字列の前についている & も ■ に置換してはいけません。 現在の正規表現では r が消えてしまっています。 ブラウザで見た場合に結果が u&ampfayv&in&e6■rna6uinv になるようにして下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう