2

ダイアグラムに純粋なテキストとして大量のデータを出力するプロジェクトで、ActionScript3に問題があります。ただし、これは問題ではありません。問題は、ユーザーが表示したいデータの種類を変更したときに発生することです。次に、図に現在表示されている列を削除し、新しい列を追加します。しかし、私のコードはすべての列を削除するので、図はまったくありません!

すべてFlashCS5で実行しました。列は、作成したオブジェクト(長方形)のインスタンスであり、ステージに追加するだけです。すべてのインスタンスがコンテナ「コンテナ」に追加されます。それらを削除し、使用する新しいものを追加したい場合:

var container = new Sprite(); // The container for my diagram
function emptyContainer() {
if (container.numChildren > 0) {
    container.removeChildAt(0); 
  }
}

どちらが機能しますか。

ユーザー入力に基づいてさまざまな列を追加するswitchステートメントがあります。オブジェクト(長方形)の名前は「soyle」です。インスタンスの名前は「stolpe」です(ちなみに私はノルウェー人なので、これらの奇妙な言葉を扱っています)

  function fChange(event:Event) {
textToBeReturned = ""; 

  switch (treCbox.selectedItem.label) {
case "Furu":
    for (var a = 1; a < table.length; a++ ){
        textToBeReturned += "I år: " + table[a][0] + " - " + table[a][1] + " millioner trær." + "\n";
        // Diagram
        var stolpe = new soyle;
        stolpe.width = table[a][1];
        stolpe.x = 20;
        stolpe.y = 100 + (a * 30);
        container.addChild(stolpe);

        // Description for the columns
        var textbox = new TextField;
        textbox.text = "År " + table[a][0];
        textbox.x = stolpe.width + 30;
        textbox.y = stolpe.y;
        container.addChild(textbox);
    }
    break;
case "Gran":
    for (var b = 1; b < table.length; b++ ){
        textToBeReturned += "I år: " + table[b][0] + " - " + table[b][2] + " millioner trær." + "\n" ;

        var stolpe = new soyle;
        stolpe.width = table[b][1];
        stolpe.x = 20;
        stolpe.y = 100 + (b * 30);
        container.addChild(stolpe);

        // Description for the columns
        var textbox = new TextField;
        textbox.text = "År " + table[b][0];
        textbox.x = stolpe.width + 30;
        textbox.y = stolpe.y;
        container.addChild(textbox);
    }
    break;
case "Lauvtre":
    for (var c = 1; c < table.length; c++ ){
        textToBeReturned += "I år: " + table[c][0] + " - " + table[c][3] + " millioner trær." + "\n" ;

        var stolpe = new soyle;
        stolpe.width = table[c][1];
        stolpe.x = 20;
        stolpe.y = 100 + (c * 30);
        container.addChild(stolpe);

        // Description for the columns
        var textbox = new TextField;
        textbox.text = "År " + table[c][0];
        textbox.x = stolpe.width + 30;
        textbox.y = stolpe.y;
        container.addChild(textbox);
    }
    break;
}   
txtReturn.text = textToBeReturned; 
};

以前に追加された子だけを削除するために、すべての子を削除するための関数をどこに配置するのか疑問に思います。関数をどこに配置するか(fChangeの開始時、各ケースの開始時)に関係なく、新しい図も古い図も表示されません。

もちろんデータの配列もありますが、関係ないので投稿しません。

お時間をいただき、ありがとうございました。:)

4

1 に答える 1

2

ここにいくつかの問題があります。スイッチ内に新しい子を追加する前に、コンテナMCからすべての子を削除したいとします。(次回のヒントとして、使用しているコードのみを投稿してみてください。ここでのswitchステートメントは大きくて圧倒的です。また、実際には関係ありません)

関数emptyContainerは、実際にはすべての子を削除するのではなく、インデックス0の子を1つだけ削除します。これはループ内にある必要があります。

function emptyContainer() {
   while (container.numChildren > 0) { //changed the if to a while. This will run until there are no children left in container
      container.removeChildAt(0); 
  }
}

fChanged関数内でこの最初のものを呼び出したいと思うでしょう

function fChange(event:Event) {
     emptyContainer()

  /* rest of function */

}

これを試してみて、どのように機能するか教えてください。

于 2012-04-11T21:44:13.880 に答える