« 2006年11月 | メイン | 2007年1月 »

という名前のメソッドはありません。(その1)

**エラー** /Users/yoshi/Documents/(省略)/NextCardDragDrop.as: 行 49:ClearDataPanel' という名前のメソッドはありません。
 PlayListDataPanel.ClearDataPanel();

さて、このエラーの原因はどこにあると推測できるでしょうか?

まず、このエラーメッセージから、エラーの場所がNextCardDragDrop.asファイルの49行目にあることがわかります。49行目には次のように書いてあるようです。
PlayListDataPanel.ClearDataPanel();
このエラーを解決するためにはNextCardDragDrop.asを開いてClearDataPanelを検索します。確かにこの行が見つかるでしょう。でも、これでは解決しません。
ClearDataPanelメソッドが見つからないのは、PlayListDataPanelクラスまたはPlayListDataPanelインスタンスです。通常の命名規則に従っているならばPlayListDataPanelは大文字から始まっているのでクラス名だと思われます。そこでPlayListDataPanel.asファイルを開いてClearDataPanelメソッドを探してみましょう。
すると次のような原因が見つかるでしょう。
1.本当にClearDataPanelという名前のメソッド(function定義)がない。
2. ClearDataPanelと似たメソッドはあったけど、大文字小文字が間違っているなどのスペルの違いがあった。たぶん、先頭小文字のclearDataPanelと定義してあるはず。

1の場合、捜索が完全ではありません。PlayListDataPanelクラス定義が別のクラスを継承していないかどうか確認する必要があります。継承しているクラスがあるならば、そのクラスを調べる必要があります。

*NextCardDragDrop.asの49行目のPlayListDataPanelがクラス名ではなくインスタンス名ならば、PlayListDataPanelインスタンスを作ったクラスを探す必要があります。こんなことがないように、先頭を大文字にするのはクラス名だけにしておくという命名規則を守りましょう。


投稿者 oshige : 12:56

という名前のメソッドはありません。(その2)

**エラー** /Users/yoshi/Documents/(省略)/NextCardDragDrop.as: 行 103:NextCard' という名前のメソッドはありません。
 NextCard.dropCard(cdObj);

さて、このエラーの原因はどこにあると推測できるでしょうか?

この場合、みつからないメソッドと言われている「NextCard」が本当にメソッドなのか?ということに気付く必要があります。式から推測するとNextCardはクラス名かインスタンス名のほうが自然です。正解はNextCardクラスが見つからないというバグです。
では、なぜNextCardクラスが見つからないのでしょう?原因は2つ考えられます。

1. NextCardのスペルがクラス定義ファイルと一致していない。つまり、NextCard.asという名前のクラスファイルがない。
2. NextCardのクラスパスが間違っている。

原因が2の場合、NextCard .asがflaファイルと別のフォルダに保存してある場合です。importでクラスパスの指定を行えば解決します。次のような式でcommonフォルダに入っているクラスを読み込めるようになります。

import com.oshige.common.*;

これは、flaファイルと同じフォルダにcomフォルダがあり、その中にoshigeフォルダ>commonフォルダと階層があって、commonフォルダにNextCard .asが入っている場合です。importの指定はclass{}より前に書きます。

import com.oshige.common.*;
class com.oshige.edit.EditPlayList extends PlayListSetter {
...
}

投稿者 oshige : 13:23

関数以外で関数の呼び出しが実行されました。

**エラー** /Users/yoshi/Documents/(省略)/PlayListSelector.as: 行 41:関数以外で関数の呼び出しが実行されました。
 return cardObjList(pos);

さて、このエラーの原因はどこにあるでしょうか?エラーメッセージは何が言いたいのでしょう?

このエラーは、エラーのステートメントをよく見るとわかります。とは言ってもコードを書いた本人でないとわからないんですけどね。cardObjList(pos)は、次の間違いなんですよ。

cardObjList[pos];

どこが違うかというと、カッコが[]の間違いです。そうです。配列の要素を取り出すためのブラケットアクセスです。ちょっとした書き間違いですが、「関数以外で関数の呼び出しが実行されました。」なんていうエラーメッセージが出るわけです。

投稿者 oshige : 13:26

TextAreaの文字が欠ける

TextAreaコンポーネントの文字の下側がちゃんと表示されずに欠けてしまうという不具合に出会った人はいませんか?次のように見えます。

textarea_bug.jpg

実際のswfを見る

実はこの現象はMacで見てもわかりません。Macで気付かないまま作っていって、最後のテストでWindowsで確認すると「おりょ?!」ってことになるわけです。
どうすれば解決できるのでしょうか?

文字の下が欠けるので行間の高さが不足していると考えられます。ということは、TextAreaコンポーネントのプロパティの・・・と調べていくとハマってしまうのですよ。
このバグの原因は思わぬ所にあります。それは、TextAreaを含んでいるムービークリップにフィルタが掛かっている、この例ではドロップシャドウが付いていることに原因があります。ドロップシャドウの設定を外せば文字の欠けがなくなります。

では、例に示すようなドロップシャドウ付きのムービークリップは諦めるしかないのでしょうか?そんなことはありません。ちょっとした発想の転換で解決します。それはムービークリップ内の背景をムービークリップにしてドロップシャドウを付けるのです。そうすれば、TextAreaを含んでいるムービークリップはフィルタをかけなくてもドロップシャドウ付きで見えます。
背景にドロップシャドウを付けた

投稿者 oshige : 17:43