0

Flash CS5 と ActionScript 3 を使用して単純な Flash プロジェクトを作成しています。

私がやりたいことは、指定されたソースと宛先で TLF テキスト コンテナーを動的に更新しloadData(text_placeX, "markup.xml");たいということです。

それは魅力のように機能していますが、問題はテキストにスクロールバーを使用できないことです。テキスト コンテナーに を追加しましたUIScrollBar。テキスト コンテナーに入れた既定のテキストで動作していますが、自分のデータでコンテナーを更新すると動作しません。私は何が欠けていますか?

もう 1 つの質問は、テキスト コンテナーに新しいデータをロードする前に、テキスト コンテナーを空にするにはどうすればよいかということです。

私のコードは次のとおりです。

import fl.text.TLFTextField;
import flash.display.Loader;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.text.TextFieldAutoSize;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.conversion.TextConverter;
import fl.controls.ScrollBar;

var ldr:URLLoader = new URLLoader();
var flow:TextFlow = new TextFlow();

function loadData(text_place, fileURL:String):void {
    text_place.border = true;
    ldr.dataFormat = URLLoaderDataFormat.TEXT;
    ldr.addEventListener(Event.COMPLETE, function(evt:Event){ ldr_complete(text_place) }, false, 0, true);
    ldr.load(new URLRequest(fileURL));
    ldr.addEventListener(IOErrorEvent.IO_ERROR, loadError);
}

function ldr_complete(text_place:TLFTextField):void {
    ldr.removeEventListener(Event.COMPLETE, ldr_complete);
    ldr.removeEventListener(IOErrorEvent.IO_ERROR, loadError);
    initText(text_place, ldr.data);
}

function loadError(e:IOErrorEvent):void {
    trace("Error loading an external file. The server may be busy. Try refreshing the page.");
}

function initText(text_place:TLFTextField, fileContent):void {
    flow = TextConverter.importToFlow(fileContent, TextConverter.TEXT_FIELD_HTML_FORMAT);
    flow.flowComposer.addController(new ContainerController(text_place, text_place.width, text_place.height));
    flow.flowComposer.updateAllControllers();
}

更新:関数コンテンツの使用をスキップしてinitText、代わりに使用するtext_place.tlfMarkup = fileContent;と機能します。しかし、私のオプションがTextFlowありません。また、テキストフィールドにコンテンツを入れた後、「スクロールバーの更新」がありませんでした。

4

1 に答える 1

1

この行が問題になる可能性があると思います:

ldr.addEventListener(Event.COMPLETE, function(evt:Event){ ldr_complete(text_place) }, false, 0, true);

function(evt:Event){...オブジェクトtext_placeを関数に渡す無名関数 here( ) がありますldr_complete()text_placeただし、別のスコープ内で宣言された変数であるため、 にアクセスすることはできません。関数を名前付き関数にすると、そのアクセス権があると想定されなくなります。例えば、

function loadCompleteHnd(evt:Event):void{
[...]
}

ただし、 のオブジェクトにアクセスする必要がありますtext_place。したがって、text_placeクラスレベル (グローバル) 変数を作成し、その変数をいつでも設定できます。ただし、競合状態が発生するリスクがあります。読み込みが遅い場合は、一度に 2 つの場所からそのオブジェクトを変更しようとしている可能性があります。

別のオプションは、セットアップEventを拡張するまったく新しいものを作成することです。Event.COMPLETEその時点で、Event.COMPLETEリスナーが使用する別のパラメーターを作成できます。これは複雑で、少し習得に時間がかかりますが、イベントの用途が広がります。

どちらの場合でも、他の何かが同じオブジェクトを編集しているかどうかを知らせるフラグを設定したい場合があります。絶対確実というわけではありませんが、頭の痛い問題を解決できます。

于 2012-01-15T07:20:59.717 に答える