3 返信 最新の回答 日時: Jan 9, 2006 12:50 PM ユーザー:(four)

    InDesignCSスクリプト searchの結果のcountが勝手に変わってしまう。

    Level 1
      InDesign CS でスクリプトを書いています。
      ある段落スタイルを適用してあるテキスト内の文字を置換したいのですが、置換している途中で、検索結果のInDesign.Lines.Countが勝手に変わってしまい、エラーになります。

      InDesign.Lines.Count は read-onlyな
      はずなのですが、なぜ変わってしまうのでしょうか。

      検索結果で返される InDesign.Objects
      は、400 object ぐらいあります。
      検索結果が大きいためにメモリ領域を
      壊すということはあり得るのでしょうか。

      ちなみに検索結果で返される
      InDesign.Objects の数が 200 以下だと
      この問題はおきません。

      下記にプログラムを示します。

      ===============

      Dim myInDesign As InDesign.Application
      myInDesign = CreateObject("InDesign.Application.3.0J")
      Dim myDocument As InDesign.Document = myInDesign.ActiveDocument

      myInDesign.FindPreferences = idNothingEnum
      myInDesign.ChangePreferences = idNothingEnum
      myInDesign.FindPreferences.AppliedParagraphStyle = "Normal1"

      Dim myFoundItem As InDesign.Text
      Dim myLine, myNextLine As InDesign.Line
      Dim myString As String
      Dim i, iMax As Integer

      Dim myFoundItems As InDesign.Objects
      myFoundItems = myDocument.Search()

      For Each myFoundItem In myFoundItems
      iMax = myFoundItem.Lines.Count - 1
      For i = 1 To iMax
      myLine = myFoundItem.Lines.Item(i)
      myNextLine = myFoundItem.Lines.Item(i + 1)
      myString = myNextLine.Contents
      If Not (myString.StartsWith("Example") Or myString.StartsWith(vbTab)) Then
      myLine.Search("^p", , , , , "^n")
      End If
      Next

      Next myFoundItem

      ===============
      よろしくお願いします。
        • 1. Re: InDesignCSスクリプト searchの結果のcountが勝手に変わってしまう。
          Lineプロパティは paragraphと違って見た目の行数をカウントします。

          ・paragraphは改行ごとの段落。
          ・Lineは見た目の段落。折り返しで改行されたら1行は2行とカウントされる。

          置換した結果、フレームの幅に納まる文字数をオーバーして折り返しが発生し lineのカウントが増えたのです。

          >ちなみに検索結果で返される
          >InDesign.Objects の数が 200 以下だと
          >この問題はおきません。

          このあたりが私にはわかりません。
          200以下だと問題が発生しないのは、たまたま200以下にすると折り返し行が発生しない条件になったのかもしれません。

          私はAppleScriptしか使ったことがないので、見当違いかもしれませんが、"InDesign.Lines.Count"、"置換" と書かれているところから推測しています。
          • 2. Re: InDesignCSスクリプト searchの結果のcountが勝手に変わってしまう。
            Level 1
            four さん、

            ありがとうございます。

            「置換した結果、フレームの幅に納まる文字数をオーバーして折り返しが発生し lineのカウントが増えたのです。 」とのことですが、この恐れはありますね。
            たまたま私が扱っている文章では、このようなことはおきない構造になっていますが、これに対処するには、後ろから置換しなければいけないようですね。
            ご指摘をありがとうございます。

            この問題を米国のhttp://www.adobeforums.com/に投げかけたところ、答えを得ることが
            できましたので、ご説明させていただきます。

            今回の問題は、For Each...Next ループ でした。InDesign は、For Each...Next ループで返すオブジェクトの数を256に制限しているとのことです。これを超えてしまう恐れがある場合は、For...Next ループを使わなければいけないということです。

            というわけで、この修正と four さんのご指摘を反映した(ループを逆にまわす)コードは下記のようになります。

            ==================

            Dim myInDesign As InDesign.Application
            myInDesign = CreateObject("InDesign.Application.3.0J")
            Dim myDocument As InDesign.Document = myInDesign.ActiveDocument

            myInDesign.FindPreferences = idNothingEnum
            myInDesign.ChangePreferences = idNothingEnum
            myInDesign.FindPreferences.AppliedParagraphStyle = "Normal1"

            Dim myFoundItem As InDesign.Text
            Dim myLine, myNextLine As InDesign.Line
            Dim myString As String
            Dim i, iMax As Integer

            Dim myFoundItems As InDesign.Objects
            myFoundItems = myDocument.Search()

            For myCounter = myFoundItems.Count To 1 Step -1
            myFoundItem = myFoundItems.Item(myCounter)
            iMax = myFoundItem.Lines.Count - 1
            For i = iMax To 1 Step -1
            myLine = myFoundItem.Lines.Item(i)
            myNextLine = myFoundItem.Lines.Item(i + 1)
            myString = myNextLine.Contents
            If Not (myString.StartsWith("Example") Or myString.StartsWith(vbTab)) Then
            myLine.Search("^p", , , , , "^n")
            End If
            Next
            Next

            ==================

            どうもありがとうございました。
            • 3. Re: InDesignCSスクリプト searchの結果のcountが勝手に変わってしまう。
              Level 1
              >今回の問題は、For Each...Next ループ でした。InDesign は、For Each...Next ループで返すオブジェクトの数を256に制限しているとのことです。これを超えてしまう恐れがある場合は、For...Next ループを使わなければいけないということです。

              そうだったんですか。解決されて何よりです。

              For Each...Next ループは AppleScriptの
              ==================
              repeat with theItem in lists
               ......
              end repeat
              ==================
              に相当しそうですね。

              今までオブジェクトの数の制限を経験したことがなかったので気がつきませんでした。