FrameMaker 10のスクリプトで(whileループ内にいると思いねえ)、
//アンカー枠の先頭グラフィック
var oGraphic = oAframe.FirstGraphicInFrame;
if (oGraphic == null || oGraphic.constructor.name == "InvalidObject") break;//FMObject.ObjectValid()はない
//グラフィックがテキスト枠でないなら除外
if (oGraphic.constructor.name != "TextFrame") break;
//テキスト枠の先頭段落
var oParaFrame = oGraphic.FirstPgf;
if (oParaFrame == null || !oParaFrame.ObjectValid()) break;
とするとoParaFrameはInvalidObjectになってしまう。
これはいわば、AFrame.FirstGraphicInFrameがジェネリックなFMObject型であるため、具体型TextFrameのFirstPgfを正しく返せていない状態と言えるのだと思う。
以下のようにすると解決できた。
//アンカー枠の先頭グラフィック
var oGraphic = oAframe.FirstGraphicInFrame;
if (oGraphic == null || oGraphic.constructor.name == "InvalidObject") break;//FMObject.ObjectValid()はない
//グラフィックがテキスト枠でないなら除外
if (oGraphic.constructor.name != "TextFrame") break;
var qGraphic = oGraphic.Unique;
var oTextframe = oDoc.GetUniqueObject(Constants.FO_TextFrame, qGraphic);
if (oTextframe == null || !oTextframe.ObjectValid()) break;
//テキスト枠の先頭段落
var oParaFrame = oTextframe.FirstPgf;
if (oParaFrame == null || !oParaFrame.ObjectValid()) break;
できたときは思わず拍手してしまった。
文書オブジェクトを介して間接的に「キャスト」してるっていうか…。
文書オブジェクトを介して間接的に「キャスト」してるっていうか…。
もっとエレガントな、あるいは教科書的な、やり方があったら教えてください。
0 件のコメント:
コメントを投稿