ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
フォーラム一覧   -   トピック一覧
   Flex Builder 2.0
     htmlTextプロパティ設定時にエラー
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 トピック
gekotan
投稿日時: 2007-2-21 23:34
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
htmlTextプロパティ設定時にエラー
gekotanです。

間違えて別のフォーラムに投稿してしまいました。
改めてここに投稿させていただきます。


現在、RSSリーダーのような処理を実装してみようと試しているわけですが、どうしてもつぶせないエラーがあります。

TreeViewによく回るブログなどのサイトを表示
(dataProviderとしてXMLを使用し、URLにはそのサイトのRSS(Atom)配信元URLを記述

TreeView選択時にRSS(Atom)を読み込み、
下のListBoxに配信された記事一覧を表示

ListBox選択時に、TextAreaにサマリを、
更にダブルクリック時に記事のリンク先に飛ぶ

TextAreaのサマリにはAtomのcontentのようにhtmlを含むものも
表示したいので、htmlTextプロパティを利用しようと考えたのです
が、ListBoxを選択していると、どういうわけかたまにエラーが発生します。

以下がエラーの内容です。

<エラー:ここから>

ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。
at flash.text::TextField/set htmlText()
at mx.core::UITextField/set htmlText()[C:\dev\GMC\sdk\frameworks\mx\core\UITextField.as:316]
at mx.controls::TextArea/mx.controls:TextArea::commitProperties()[C:\dev\GMC\sdk\frameworks\mx\controls\TextArea.as:1787]
at mx.core::UIComponent/validateProperties()[C:\dev\GMC\sdk\frameworks\mx\core\UIComponent.as:5218]
at mx.managers::LayoutManager/mx.managers:LayoutManager::validateProperties()[C:\dev\GMC\sdk\frameworks\mx\managers\LayoutManager.as:517]
at mx.managers::LayoutManager/mx.managers:LayoutManager::doPhasedInstantiation()[C:\dev\GMC\sdk\frameworks\mx\managers\LayoutManager.as:658]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher2()[C:\dev\GMC\sdk\frameworks\mx\core\UIComponent.as:7789]
at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher()[C:\dev\GMC\sdk\frameworks\mx\core\UIComponent.as:7732]
at flash.utils::Timer/flash.utils:Timer::_timerDispatch()

<ここまで>


textプロパティに設定すると発生しないところを見ると、
htmlTextの設定で起こっているようなのですが、何故か、
htmlTextを設定しているところ、具体的には以下のような
場所なのですが、ここをtry、catchで括っても、エラーが拾えません。

// 単に設定しているだけ
txtDescription.htmlText = htmlText;

確実に起こるわけでもなく、リストボックスを選択しているとたまに起こるのがまた解らないところです。
このエラーについてどなたかご存知ありませんか?同様のことはTextコントロールのhtmlプロパティでも発生します。

以上です。よろしくお願いします。

gekotan
wolf
投稿日時: 2007-2-22 9:21
ご主人様
登録日: 2007-1-26
居住地: 千葉
投稿: 199
Re: htmlTextプロパティ設定時にエラー
htmlTextの内容をtrace()で追ってみて、使用できないタグがないか探してみたらどうでしょうか。
私もhtmltextを使おうとして、利用できるタグのあまりの少なさに閉口した覚えがあります(−−;
(このへんはApolloでは変わってくるのでしょうか・・・)
gekotan
投稿日時: 2007-2-22 20:31
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
Re: htmlTextプロパティ設定時にエラー
gekotanです。

うーん、同じ内容でも出るときと出ないときがあるので、タグの問題でもないような・・・

エラーの処理方法は未だわかりませんが、大体どういった状況で起こるかは判明しました。

どうも、TextAreaのサイズに収まりきらないような内容を表示したときに「たまに」出るエラーのようです。
以下、再現しやすいコードを載せてみます。
RssReader.asはmanagersというパッケージにありますので、フォルダをつくってそこに、RssItemはvalueObjectsというパッケージにありますので、フォルダをつくってそこにコピーしてください。

まずはアプリケーション

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="horizontal"
	creationComplete="init()">
	<mx:Script>
		<![CDATA[
			import valueObjects.RssItem;
			import mx.collections.ArrayCollection;
			import managers.RssReader;
			private var reader:RssReader;
			[Bindable]
			private var rssItems:ArrayCollection;

			private function init():void{
				reader = new RssReader();
	   			reader.addEventListener("dataLoaded",rssLoadHandler);			
			}
			private function rssLoadHandler(evt:Event):void{
				rssItems = new ArrayCollection(reader.itemList);				
			}
			
			private function btnSend_click(evt:MouseEvent):void{
    			reader.load(txtSite.text);				
			}
			
			private function lstItems_change(evt:Event):void{
				var selectedItem:RssItem= evt.target.selectedItem as RssItem;
				this.txaDescription.htmlText = selectedItem.rssDescription; 
				
				
			}			
		]]>
	</mx:Script>
	<mx:HBox width="100%" height="100%">
		<mx:VBox width="100%" height="100%">
			<mx:HBox width="100%" height="50%">
				<mx:Label text="サイトURL"/>
				<mx:TextInput id="txtSite" text="http://feeds.feedburner.jp/wbb"/>
				<mx:Button id="btnSend" label="送信" click="btnSend_click(event)"/>			
			</mx:HBox>

			<mx:List 
				id="lstItems" 
				width="100%" 
				height="200%" 
				dataProvider="{rssItems}"
				labelField="rssTitle"
				change="lstItems_change(event)"/>
		</mx:VBox>
		<mx:TextArea id="txaDescription" width="200%" height="50%"/>

	</mx:HBox>

</mx:Application>






次は、RssReader

package managers
{
	import flash.utils.*;
	import flash.net.URLRequest;
	import flash.net.URLLoader;
	import flash.events.*;
	import valueObjects.RssItem	

	[Event(name="dataLoaded")]		
	public class RssReader extends EventDispatcher
	{
		private var _title:String;
		private var _description:String;
		private var _itemList:Array;
		private var _loader:URLLoader;
		
		public var cardTag:String;
		
		// コンストラクタ
		public function RssReader(){
			_itemList = new Array();
			_loader = new URLLoader();
			// イベント登録
			_loader.addEventListener(Event.COMPLETE, loadHandler);
			_loader.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
			_loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
		}
		
		// プロパティ
		public function get itemList():Array{
			return _itemList;
		}
		
		public function get title():String{
			return _title;
		}
		
		public function get description():String{
			return _description;
		}
		
	
		public function load(urlString:String):void{
			var rssXMLURL:URLRequest = new URLRequest(urlString);
			_loader.load(rssXMLURL);	
		}
		// Atomにも対応したけど、系統多すぎて網羅できているか不安。仕様をはっきり決めて欲しい
		private function loadHandler(evt:Event):void{
			try{
				parse(_loader.data);
/* 				_itemList = new Array();
				var rssXML:XML = XML(_loader.data);

				if(isAtom(rssXML)){
					getAtomData(rssXML);
				}else{
					getRSSData(rssXML);
				}
 */				
 				XML.prettyPrinting = false;				
				this.dispatchEvent(new Event("dataLoaded", true));
			}catch(ex:Error){
				trace(ex.message);
				
			}			
	
		}
		
		private function ioErrorHandler(evt:IOErrorEvent):void{
			trace(evt.toString());
		}
		
		private function securityErrorHandler(evt:SecurityErrorEvent):void{
			trace(evt.toString());			
		}
		
		// RSS(Atom)のパース
		public function parse(rss:Object):void{
				_itemList = new Array();
				var rssXML:XML = XML(rss);

				if(isAtom(rssXML)){
					getAtomData(rssXML);
				}else{
					getRSSData(rssXML);
				}
			
		}
		
		private function getRSSData(rssXML:XML):void{
			if (rssXML.namespace("") != undefined) {
				default xml namespace = rssXML.namespace("");
			}
			for each (var item:XML in rssXML..item) {
				// linkのないものは表示しない
				if(item.link.toString() != ""){
					var rssItem:RssItem = new RssItem();
					rssItem.rssTitle = item.title.toString();
					rssItem.rssDescription = item.description.toString();
					rssItem.rssLink = item.link.toString();
					rssItem.tags = cardTag;
					_itemList.push(rssItem);
				}
			}
			_title = rssXML.channel.title.toString();
			_description = rssXML.channel.description.toString();
			
		}
		
		private function getAtomData(atomXML:XML):void{
			if (atomXML.namespace("") != undefined) {
				default xml namespace = atomXML.namespace("");
			}
			for each (var entry:XML in atomXML..entry) {
				// linkのないものは表示しない
				var link:String;
				if(entry.link.toString() == ""){
					link = entry.link.@href;
				}else{
					link = entry.link;
				}
				
				if(link != ""){
					var rssItem:RssItem = new RssItem();
					rssItem.rssTitle = entry.title.toString();
					rssItem.rssDescription = entry.content.toString();
					rssItem.rssLink = link;
					rssItem.tags = cardTag;
					_itemList.push(rssItem);
				}
			}
			_title = atomXML.title.toString();
			_description = atomXML.subtitle.toString();
			
		}
		// 暫定。w3cとpurl.orgのatomがあって厄介。
		// そのうち正式な判別方法に差し替え
		private function isAtom(xml:XML):Boolean{

			if(xml.name().toString().indexOf("::feed") != -1){
				return true;
			}else{
				return false;
			}
		
		}
	}
}


最後にRssItem

package valueObjects
{
	[Bindable]
	public class RssItem
	{
		private var _rssTitle:String;
		public var rssLink:String;
		public var rssDescription:String;
		public var tags:String;
		
		public function set rssTitle(target:String):void{
			var value:String;
			value = target.replace(/<\/??b>/gi,"");
			_rssTitle = value;
		}
		
		public function get rssTitle():String{
			return 	_rssTitle;
		}

	}
}


送信ボタンをクリックすると、配信先のリストがリストボックスに表示されます。

リストボックスにある記事を高速でぐりぐり選択しているとそのうちエラーで落ちます。

なお。インプットテキストには予めエラーの出やすいサイトを予め設定してあります。

結局、原因はまだよく解りません。

長文、大変申し訳ありません

gekotan
wolf
投稿日時: 2007-2-23 0:31
ご主人様
登録日: 2007-1-26
居住地: 千葉
投稿: 199
Re: htmlTextプロパティ設定時にエラー
現象を確認しました。
イベントのweakReferenceのせいかと思ったのですが、違うみたいですので発言を修正します。

私の環境では、大きなhtmltextをsetしたあと、次のhtmlTextをセットしようとするとエラーが起こるように見えましたが、画面サイズを十分に小さくして、どのRSSでもスクロールバーが表示されるようにすると、エラーがまったくでなくなりました。
同様に、verticalScrollPolicyをOnに設定しても、エラーが発生しなくなりました。

スクロールバーの表示・非表示の切り替えに関するバグのような気がします・・・。断言できませんが。
gekotan
投稿日時: 2007-2-23 20:43
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
Re: htmlTextプロパティ設定時にエラー
gekotanです。

なるほど、確かに画面サイズを小さくしたり、verticalScrollPolicyをOnにしたりすると出なくなりました。有難うございます。助かりました。

何となく、大きなhtmlを表示した後に出やすいなとは思っていたのですが、スクロールバーにまで頭が行きませんでした。

とりあえず、verticalScrollPolicyをOnにして運用してみて、またエラーが出たらその時考えることにします。

有難うございました。

gekotan
zono
投稿日時: 2007-4-22 5:08
やや お馴染みさん
登録日: 2007-1-21
居住地: Aichi/Japan
投稿: 4
Re: htmlTextプロパティ設定時にエラー
こん○○は。
FLEXビギナーですがtrial and errorで検証してみました(汗

恐らくですが...

ロードするHTMLの中にチルダ(~)があるとエラーが出るのでは

・RssReader.asの105行辺りにチルダ取るコード追加
引用:

private function getRSSData(rssXML:XML):void{
if (rssXML.namespace("") != undefined) {
default xml namespace = rssXML.namespace("");
}
for each (var item:XML in rssXML..item) {
// linkのないものは表示しない
if(item.link.toString() != ""){
var rssItem:RssItem = new RssItem();
rssItem.rssTitle = item.title.toString();
rssItem.rssDescription = item.description.toString() .replace(/~/gi, "");←これを追加
rssItem.rssLink = item.link.toString();
rssItem.tags = cardTag;
_itemList.push(rssItem);
}
}


こんな感じで試してみたところ、verticalScrollPolicyを記さなくとも取り急ぎエラー出ておりません。
ビギナーの見解ですのでご参考までに。。


----------------
****************************
WindowsXP(SP2)
IE(6.0)
Flex(2.0)
FlexBuilder(2.0)
****************************

wolf
投稿日時: 2007-4-22 18:30
ご主人様
登録日: 2007-1-26
居住地: 千葉
投稿: 199
Re: htmlTextプロパティ設定時にエラー
うーん(^^;

試してみましたが、「はてなブックマークに追加」の画像リンクボタンがガッツリ消えてます・・・。

この件についてですが、エラー報告スレで書いたCanvasの不具合と似たような原因ではないかと考えています。
そもそも、画像リンクまできちんと表示されるようにスクロール領域が設定されて欲しい・・・。

venzou
投稿日時: 2007-4-26 13:47
ご主人様
登録日: 2007-1-25
居住地: 穴の中
投稿: 101
Re: htmlTextプロパティ設定時にエラー
こんにちは

エラーの発生条件を絞り込んでみました。

TextAreaの場合
・wordWrap=true(デフォルト)
・画像が2つ以上含まれるhtmlを表示する
・スクロールバーが表示される
・上記の後、htmlText or textを変更するとエラー


継承元をTextFieldまで辿りました。

TextFieldの場合
・wordWrap=true
・画像が2つ以上含まれるhtmlを表示する
・上記の後、htmlText or textを変更するとエラー


TextFieldの問題らしい所までは分かりましたが、ここから先はお手上げです。


エラー再現用アプリ(画像ファイルtest.gifを用意してください)
test.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" >
    <mx:Script>
        <![CDATA[
            import flash.text.TextField;
            import mx.controls.TextArea;

            //エラーの条件
            //画像が2つ以上ある
            //test.gifを用意してください(内容は適当に)
            private var testHtml:String = ''
                +'<img id="img1" src="test.gif" height="100" width="200" />'
                +'<img id="img2" src="test.gif" height="100" width="200" />'
                +'<br>0<br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9'
                +'<br>0<br>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9'
                ;

            private var tf:TextField = new TextField;

            private function clickEvt1():void{
                //txaDescription.wordWrap = false;
                //↑wordWrap = falseだとエラーにならない(しかし、表示が乱れる)
                txaDescription.htmlText = testHtml;
            }

            private function clickEvt2():void{
                txaDescription.htmlText = '';
                //↑ここでエラー
                //txaDescription.text = '';
                //↑これでもエラー
            }

            private function clickEvt3():void{
                //エラーの条件
                //wordWrap=falseだとエラーにならない
                tf.wordWrap = true;

                tf.width = img.width;
                tf.height = img.height;
                tf.htmlText = testHtml;
                img.addChild(tf);
            }
            private function clickEvt4():void{
                tf.htmlText = '';
                //↑ここでエラー
                //tf.text = '';
                //↑これでもエラー
            }
        ]]>
    </mx:Script>
    <mx:HBox>
        <mx:VBox>
            <mx:TextArea id="txaDescription" width="200" height="200"/>
            <mx:Button label="TextAreaのエラー再現(1)" click="clickEvt1()" />
            <mx:Button label="TextAreaのエラー再現(2)" click="clickEvt2()" />
        </mx:VBox>
        <mx:VBox>
            <mx:Image id="img" width="200" height="200"/>
            <mx:Button label="TextFieldのエラー再現(1)" click="clickEvt3()" />
            <mx:Button label="TextFieldのエラー再現(2)" click="clickEvt4()" />
        </mx:VBox>
    </mx:HBox>
</mx:Application>


(1)(2)の順にボタンを押すと100%エラーになります。(SDK2.0.1で確認)

ArgumentError: Error #2025: 指定した DisplayObject は呼び出し元の子でなければなりません。
wolf
投稿日時: 2007-4-27 0:52
ご主人様
登録日: 2007-1-26
居住地: 千葉
投稿: 199
Re: htmlTextプロパティ設定時にエラー
自分も一度別の理由でTextFieldまで追ってみたことがあるんですが、そこから向こうはmx_internalの世界なんですよねぇ。
オープンソース化で明らかになるんだろうか。

アイデアとしては、スクロールバーなしで表示するようにしたTextFieldをContainerでラップしたカスタムコンポーネントを作成し、
スクロールバーはTextFieldの外側で表示させるようにする、っていうのが思い浮かびますが、試す気力が・・・(^^;
gekotan
投稿日時: 2007-4-28 23:03
やや 常連さん
登録日: 2007-1-21
居住地: 愛知県一宮市
投稿: 25
Re: htmlTextプロパティ設定時にエラー
gekotanです。

htmlTextのネタに便乗してもうひとつ
<img>タグで画像が表示されるのですが、この画像がリンク切れを起こしていたり、そもそもなかった場合、

Error #2044: ハンドルされていない IOErrorEvent : text=Error #2035: URL が見つかりません。

というエラーが表示されてしまうのですが、これってどうやって拾うんでしょう?

try catchで、囲んでも、
TextAreaにIOErrorEventを拾うリスナーを登録しても、
this(Application)にIOErrorEventを拾うリスナーを登録しても、
拾えません。うーん、ASやFlexを使い始めたのは今年からなんですが、なんか根本的にエラーに対する考えが間違っているのかな

gekotan
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を