トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ComboBoxのListコンポーネントが後ろに隠れてしまう
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
takac
Åê¹ÆNo.9750
投稿日時: 2004-8-6 19:58
新米
居住地: 横浜
投稿: 6
使用環境:
Windows2000,Flash MX2004
ComboBoxのListコンポーネントが後ろに隠れてしまう
初めて投稿させていただきます。よろしくお願いします。

ComboBoxを持つシンボルを最前面に表示するために、以下のように
getNextHighestDepth()によるdepthで配置したところ、ComboBoxが
持つListコンポーネントが、そのシンボルが持つ他のデータの後ろに
なってしまうのです。


↓"MyClip"が、ComboBoxを持つシンボルです。
var depth = getNextHighestDepth();
createEmptyMovieClip("mc", depth);
mc.attachMovie("MyClip", "myClip", 1);


そこでいろいろ試したあげく、
var depth = getNextHighestDepth();
createEmptyMovieClip("mc", depth);
mc.attachMovie("MyClip", "myClip", 1);

onEnterFrame = function() {
  if (mc.myClip.myCombo.dropdown != undefined) {
    mc.myClip.myCombo.dropdown.swapDepths(mc);
    this.onEnterFrame = undefined;
  }
}

という方法で、myComboが持つListコンポーネントを
無理やり前に出しました。

ところが、上記サンプルはComboBoxがひとつですが、
実際に開発しているシンボルは、ComboBoxを多数持っているので、
もっと簡単な方法はないものかと調べているところです。

根本的にdepthの使い方をよく理解していないのかもしれませんが、
どなたかアドバイスいただければ幸いです。
newborn
Åê¹ÆNo.9789
投稿日時: 2004-8-9 19:07
常連
居住地: StoneRiverPrefecture
投稿: 170
使用環境:
MAC OSX panther/ WIN XP, Flash MX2004 pro,
Re: ComboBoxのListコンポーネントが後ろに隠れてしまう
動作するかどうかは分かりませんが、

引用:
var depth = getNextHighestDepth();
createEmptyMovieClip("mc", depth);
mc.attachMovie("MyClip", "myClip", 1);




var depth = getNextHighestDepth();
createEmptyMovieClip("mc", depth);
mc.attachMovie("MyClip", "myClip", 1);
var depth = getNextHighestDepth();
mc.myClip.myCombo.swapDepths(depth)


としてはどうでしょう?動かなかったらごめんなさい。
takac
Åê¹ÆNo.9797
投稿日時: 2004-8-10 11:23
新米
居住地: 横浜
投稿: 6
使用環境:
Windows2000,Flash MX2004
Re: ComboBoxのListコンポーネントが後ろに隠れてしまう
newbornさん、お返事ありがとうございます!
newbornさんの書かれたコードで、

引用:
mc.myClip.myCombo.swapDepths(depth)


をみて、swapDepthsの使い方として、引数にdepthを与えることが
できることを見落としており、初めて知りました。
ありがとうございました。

早速試したところ、残念ながらこの方法でもComboBoxのList
コンポーネント(ドロップダウン部分)を前面に出すことが
できませんでした。

調査結果としては、

var depth = getNextHighestDepth();
trace("myClip depth : " + depth);
attachMovie("MyClip", "myClip", depth);
var depth = getNextHighestDepth();
trace("combobox depth : " + depth);
myClip.myCombo.swapDepths(depth);
onEnterFrame = function() {
  if (myClip.myCombo.dropdown != undefined) {
    trace("dropdown depth : " + myClip.myCombo.dropdown.getDepth());
    this.onEnterFrame = undefined;
  }
}

を実行すると、

myClip depth : 1048576
combobox depth : 1048577
dropdown depth : 100


となり、やはりdropdownのdepthは、前に出てこないことが
わかりました。(前回のサンプルで、createEmptyMovieClip()は
無駄な処理だったので消しました)
getNextHighestDepth()が1048575を超えて生成するのもちょっと
疑問です。。。

※余談ですが、Macromediaのサイトにある「Macromedia Flash(SWF)
File Format Specification」をみたところ、インスタンスの配置と
思われる(?)PlaceObject2に、DepthはUnsigned 16bit integerと
あり、-16384?1048575はいったいどこで決められているのかな、
と疑問に思った次第です。ActionScriptで生成されたインスタンスは、
SWFの中のPlaceObject2とは別ものなのでしょうか。。。

本件は、もともとAlertのようなモーダルウィンドウを生成しよう
というところから生じた問題なので、Alertの処理を真似ようと考え、
PopUpManagerのcreateModalWindow()あたりから読んで、以下の
ようにルートタイムラインに記述しました。

import mx.managers.DepthManager;

var dt:Array = buildDepthTable();
var depth:Number = getDepthByFlag(DepthManager.kTopmost, dt);
attachMovie("MyClip", "myClip", depth);


実はいろいろ試しているうちに偶然動いたので、内容が理解できていないのです。
上記の、buildDepthTable()と、getDepthByFlag()は、なぜDepthManagerの
インスタンス無しでこれらのメソッドが呼び出せるのかがわからないのです。
_rootがDepthManagerを継承しているような動きにも見えるのですが、一行目の
「import mx.managers.DepthManager;」を記述しないとこれらのメソッドが動かない
ようなので、中でいったいどのような処理が行われているのか検討がつきません。

そもそもこんなコーディングはしてはいけないのかと思ったりもしています。

ActionScriptの勉強中で、まだ初歩的なことがわかっていないのかもしれませんが、
どなたかご教授お願い致します。
newborn
Åê¹ÆNo.9798
投稿日時: 2004-8-10 12:26
常連
居住地: StoneRiverPrefecture
投稿: 170
使用環境:
MAC OSX panther/ WIN XP, Flash MX2004 pro,
Re: ComboBoxのListコンポーネントが後ろに隠れてしまう
こんにちわ。
newbornです。

確かに僕の書いたコードでは動きませんでしたね。ごめんなさい
getNextHighestDepth()の使い方が間違っていたようです。
ムービークリップ内の一番高い深度を求めるコマンドのようです。

引用:
Flash Player 7

シンタックス

my_mc.getNextHighestDepth()

パラメータ

なし。

戻り値

my_mc 内で、同一レベル、同一レイヤー上に存在する他のすべてのムービークリップの 前面に表示できる深度インデックスを示す整数。


takacさんはmyClipを一番最前面に出したいようなので以下のスクリプトではどうでしょうか?

var depth = 1048573;
_root.attachMovie("MyClip","myClip",depth)
var depth = 1048574;
myClip.MyCombo.swapDepths(depth)
youich
Åê¹ÆNo.9800
投稿日時: 2004-8-10 14:22
職人
居住地: kobe
投稿: 349
使用環境:
Tiger
Re: ComboBoxのListコンポーネントが後ろに隠れてしまう
引用:

調査結果としては、

var depth = getNextHighestDepth();
trace("myClip depth : " + depth);
attachMovie("MyClip", "myClip", depth);
var depth = getNextHighestDepth();
trace("combobox depth : " + depth);
myClip.myCombo.swapDepths(depth);
onEnterFrame = function() {
  if (myClip.myCombo.dropdown != undefined) {
    trace("dropdown depth : " + myClip.myCombo.dropdown.getDepth());
    this.onEnterFrame = undefined;
  }
}

を実行すると、

myClip depth : 1048576
combobox depth : 1048577
dropdown depth : 100


となり、やはりdropdownのdepthは、前に出てこないことが
わかりました。(前回のサンプルで、createEmptyMovieClip()は
無駄な処理だったので消しました)

ComboBox.__dropdownは_level0や_rootにできます。
なので、takacさんのサンプルではmyClipの方がdropdownより
上位の深度になっていることになるので、dropdownはmyClipの下に表示されるということになりますね。
var depth = getNextHighestDepth();
trace("myClip depth : "+depth);
attachMovie("MyClip", "myClip", depth);

var depth = getNextHighestDepth();
trace("combobox depth : "+depth);
myClip.myCombo.swapDepths(depth);

onEnterFrame = function () {
	if (myClip.myCombo.dropdown != undefined) {
		var dd = myClip.myCombo.dropdown;
		trace('dropdown: '+dd+'  depth: '+dd.getDepth());
		trace('MyClip  : '+myClip+'  depth: '+myClip.getDepth());
		this.onEnterFrame = undefined;
	}
};

出力

myClip depth : 1048576
combobox depth : 1048577
dropdown: _level0.depthChild0  depth: 100
MyClip  : _level0.myClip  depth: 1048576

で、なぜにvar depth = getNextHighestDepth();がこんな高い
数値を返すかというとmx.managers.DepthManagerがreservedという
名前で_rootに1048575の深度でムービークリップを作っているから
でしょうね。
class mx.managers.DepthManager
{
	// highest allowed depth is reserved for tooltips and cursors
	static var reservedDepth:Number = 1048575;
//
//
	private static var holder:MovieClip = _root.createEmptyMovieClip("reserved", DepthManager.reservedDepth);

だから、たとえば
attachMovie("MyClip", "myClip", 1);
などとしてみれば、__dropdownは前面に出ると思います。
引用:

本件は、もともとAlertのようなモーダルウィンドウを生成しよう
というところから生じた問題なので、Alertの処理を真似ようと考え、
PopUpManagerのcreateModalWindow()あたりから読んで、以下の
ようにルートタイムラインに記述しました。

import mx.managers.DepthManager;

var dt:Array = buildDepthTable();
var depth:Number = getDepthByFlag(DepthManager.kTopmost, dt);
attachMovie("MyClip", "myClip", depth);


実はいろいろ試しているうちに偶然動いたので、内容が理解できていないのです。


これはDepthManager.getDepthByFlahのコードを見ていただければ解ると思いますが、
DepthManager.highestDepth(1048574)以下を対象に
深度の探索をしているから適正な深度が返されるのだと思います。
if (i.getDepth()<=DepthManager.highestDepth) {
	depth = Math.max(depth, i.getDepth());
}

引用:

上記の、buildDepthTable()と、getDepthByFlag()は、なぜDepthManagerの
インスタンス無しでこれらのメソッドが呼び出せるのかがわからないのです。
_rootがDepthManagerを継承しているような動きにも見えるのですが、一行目の
「import mx.managers.DepthManager;」を記述しないとこれらのメソッドが動かない
ようなので、中でいったいどのような処理が行われているのか検討がつきません。


解りにくいですけどDepthManagerのコンストラクタでMovieClipのprototypeに
DepthManagerのメソッドを参照させてるからですね。
function DepthManager()
	{
		//略
		MovieClip.prototype.getDepthByFlag = getDepthByFlag;
		MovieClip.prototype.buildDepthTable = buildDepthTable;
              
		// applyDepthSpaceProtection();
	}


----------------
- yo

takac
Åê¹ÆNo.9805
投稿日時: 2004-8-11 0:03
新米
居住地: 横浜
投稿: 6
使用環境:
Windows2000,Flash MX2004
Re: ComboBoxのListコンポーネントが後ろに隠れてしまう
newbornさん、お返事ありがとうございます。

newbornさんのとおり実行してみると、swapDepthsはやらなくても前面に出ますね。
ありがとうございました!
takac
Åê¹ÆNo.9807
投稿日時: 2004-8-11 0:26
新米
居住地: 横浜
投稿: 6
使用環境:
Windows2000,Flash MX2004
Re: ComboBoxのListコンポーネントが後ろに隠れてしまう
youichさん、お返事ありがとうございます。

数々のご指摘のお陰で、大変勉強になりました。
特に最後の、
引用:

解りにくいですけどDepthManagerのコンストラクタでMovieClipのprototypeに
DepthManagerのメソッドを参照させてるからですね。

は、最も不明な点だったので、とても嬉しいです。

私は一点間違ったことを書いてしまったのですが、

引用:

「import mx.managers.DepthManager;」を記述しないとこれらのメソッドが動かない
ようなので、


は、ウソでした。この行は書かなくても、youichさんのとおりDepthManagerのコンストラクタが呼ばれれば、buildDepthTable()も
getDepthByFlag()も使えました。

お陰様で自分が知らないことが多すぎることを痛感しましたので、コンポーネントやDepthManager、PopUpManager
についてもう少し勉強しようと思います。

ありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops