TextFrameとPageItemについて

[8382]TextFrameとPageItemについて 投稿者:snl 投稿日:2014/09/20 14:13:22
いつもお世話になっております.
Windows7,CS6を使用しています.

スクリプトの質問です.

CS4まではTextFrameの親にPageItemがいて,
CS5からはTextFrameの親にPageItemがいなくなっていますが,
そもそもCS4以前でPageItemの子にTextFrameが作られることはあるのでしょうか?
[8383]Re: TextFrameとPageItemについて 投稿者:流星光輝 投稿日:2014/09/20 21:04:56
実際にCS6で1ページのドキュメントにテキストフレームを1つ用意して、
var a=app.selection[0];
alert(a.parent.pageItems.length);
してみると、1が返ります。

居なくなったというのは、どこの情報でしょうか?
ちなみにCS4とCS5の境目でということですから、
http://d.hatena.ne.jp/seuzo/20100724/1279906199
のことを仰っておられますでしょうか?
[8384]Re: TextFrameとPageItemについて 投稿者:あるふぁ 投稿日:2014/09/21 13:09:37
CS5からGraphicオブジェクト(画像をダイレクト選択ツールで選択した奴)がPageItemに仲間入りしたんですな。
GraphicはTextFrameを子に取れないので、オブジェクトモデルではTextFrameの親にPageItemがなくなったのでしょう。

Group等もPageItemの一種ですので当然PageItemの子にTextFrameがくることはCS4以前も以後もあります。
[8389]Re: TextFrameとPageItemについて 投稿者:snl 投稿日:2014/09/22 09:18:17
返答が遅くなり申し訳ありません.

流星光輝 様

TextFrameの親にPageItemがないと思ったのは
オブジェクトモデルのTextFrame.Parentの項目にPageItemがなかったためです.
またPageItemのインスタンスにもTextFramesがありませんでした.
オブジェクトモデルに掲載されていないというだけで,実は存在するのでしょうか?

あるふぁ 様

オブジェクトモデルに載らなかっただけで,PageItemにTextFramesは存在するのですね.
でも,PageItemがGraphicの場合は子にTextFramesがいないからエラーになりそうです….


おふたりとも今回はご返答いただき有り難うございました.
[8390]Re: TextFrameとPageItemについて 投稿者:流星光輝 投稿日:2014/09/22 11:09:32
前回レスのコードはSpread配下のpageItemの個数を取得していました。すみません。
ちょっと整理させてください。
テスト環境は前回同様CS6です。
ドキュメントを1つ作り、テキストフレームを1つ作ります。
作成したテキストフレーム内にテキストフレームをインラインオブジェクト(入れ子の状態)で張り込みます。(添付画像参照ください)

で、下記コードを実行しますと、
var a1=app.activeDocument.pageItems[0];
var a2=a1.textFrames[0];
alert(a2.parent.constructor.name);
当然なんですが、Characterが返ります。

「配下に持っているか?」と「親が何か?」は、全く別物と捉えたほうが理解しやすいのかなぁと思います。

ご質問の内容としては、「親を辿った場合に」ではなく、
「配下に持っているか?」でエラーになることを心配なさっているようですから、
constructor.name等を使って対応されればよいのではないかと思います。

attached image
[8391]Re: TextFrameとPageItemについて 投稿者:snl 投稿日:2014/09/22 15:02:35
流星光輝 様

>constructor.name等を使って対応されればよいのではないかと思います。
確かにそれが一番いい方法ですね.

PageItemになりうるオブジェクトが多いので,その判断が面倒そうですが….

ご回答ありがとうございました.
[8392]Re: TextFrameとPageItemについて 投稿者:あるふぁ 投稿日:2014/09/22 17:38:46
textFramesプロパティに限らず、
pageItemsから取得したオブジェクトはconstructor.nameはPageItemですが、その実体がたとえばテキストフレームであればTextFrameのすべてのプロパティを持ってます(ちゃんと全部確かめたわけじゃないですが、おそらく)。

PageItemについてはこちらでいろいろ検証なされてます→カネムーメモ: pageItemsとallPageItems http://blog.kanemu.net/2009/02/pageitemsallpageitems.html
constructor.nameで種類を取得しようと思ったら.getElements()[0]を噛まさないといけないってあたりがポイント

単純にエラーを回避するだけならin演算子かhasOwnPropertyを使うのが手っ取り早いですよ。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)