• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Invalid text location

Community Expert ,
Feb 26, 2018 Feb 26, 2018

Copy link to clipboard

Copied

Dear all,

Int he following script I want to place a variable at a particular position in a paragraph.

Obviously my method to define a TextLocation in line 11 is wrong. Line 26is never executed and hence no variable inserted.

TestInsertVariable ();

function TestInsertVariable () {
  var paraText = "Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts."
  var  oDoc = app.ActiveDoc, sValue, sVarName, oTextLoc, oPgf;

  if(oDoc.ObjectValid()) {
    oPgf = oDoc.MainFlowInDoc.FirstTextFrameInFlow.FirstPgf;
    oTextLoc = new TextLoc(oPgf, 0);
    oDoc.AddText(oTextLoc, paraText);              // create a paragraph
    oTextLoc = new TextLoc(oPgf, 17);              // arbitrary place
    sVarName = "GugusVariable";
    sValue   = "--- Anything I want to see in my variable ---";
    InsertVariable (oDoc, oTextLoc, sVarName, sValue);

  } else {
    alert ("Document does not exist or is invalid");
  }
} //--- end TestInsertVariable

function InsertVariable (oDoc, oTextLoc, sVarName, sValue) { //=== Insert variable at location ====
var oVar;
$.bp(true);
  oVar = oDoc.NewAnchoredFormattedVar (sVarName, oTextLoc);
  if (oVar.ObjectValid ()) {
    oVar.Fmt = sValue;
  }
} //--- end InsertVariable

Do I need the detour with TextSelection, etc. ?

TOPICS
Scripting

Views

360

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Enthusiast , Feb 26, 2018 Feb 26, 2018

Hi Klaus,

you just forgot to create the variable in the second function

function InsertVariable (oDoc, oTextLoc, sVarName, sValue) { //=== Insert variable at location ==== 

    var oVar; 

   

    var loCellVar = oDoc.NewNamedVarFmt(sVarName);  // NEW

    loCellVar.Fmt = sValue; // NEW

   

    oVar = oDoc.NewAnchoredFormattedVar (loCellVar.Name, foTextLoc);  // CHANGED FIRST PARAM to loCellVar.Name

    

   /*

       You don't need that

      if (oVar.ObjectValid())

        { 

        oVar.Fmt = sValue; 

...

Votes

Translate

Translate
Enthusiast ,
Feb 26, 2018 Feb 26, 2018

Copy link to clipboard

Copied

Hi Klaus,

you just forgot to create the variable in the second function

function InsertVariable (oDoc, oTextLoc, sVarName, sValue) { //=== Insert variable at location ==== 

    var oVar; 

   

    var loCellVar = oDoc.NewNamedVarFmt(sVarName);  // NEW

    loCellVar.Fmt = sValue; // NEW

   

    oVar = oDoc.NewAnchoredFormattedVar (loCellVar.Name, foTextLoc);  // CHANGED FIRST PARAM to loCellVar.Name

    

   /*

       You don't need that

      if (oVar.ObjectValid())

        { 

        oVar.Fmt = sValue; 

        } 

*/

    } //--- end InsertVariable 


    } //--- end InsertVariable 

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 26, 2018 Feb 26, 2018

Copy link to clipboard

Copied

You can make this a little more general with a "helper" function:

function getVarFmt (varName, varDef, doc) {

  

    // Get a variable format from the document; if it doesn't exist, create it.

    var varFmt = doc.GetNamedVarFmt (varName);

    if (varFmt.ObjectValid () === 0) {

        varFmt = doc.NewNamedVarFmt (varName);

        varFmt.Fmt = varDef;

    }

    return varFmt;

}

This ensures that, if the variable format already exists, it will be used; if it doesn't exist, it will be created. In the function above, I am passing in a "varDef" argument but that won't be used if the variable format already exists; it will only be used if the function has to create the format. In the example below, I don't pass in a definition argument, but set a generic string if the cross-reference format doesn't exist (line 08):

function getXRefFmt (name, doc) {

   

    var xrefFmt;

   

    xrefFmt = doc.GetNamedXRefFmt (name);

    if (!xrefFmt.ObjectValid ()) {

        xrefFmt = doc.NewNamedXRefFmt (name);

        xrefFmt.Fmt = "*** XRefFmt needs to be defined ***";

    }

    return xrefFmt;

}

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 26, 2018 Feb 26, 2018

Copy link to clipboard

Copied

LATEST

Rick, thanks for this additional information.

I already expanded my InsertVariable function analogous to your getVarFmt - the variable may be already defined or needs to be defined.

I'll put Your examples into my 'private database'.

Klaus

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Feb 26, 2018 Feb 26, 2018

Copy link to clipboard

Copied

Thanks, Klaus!

I forgot that I do not insert an already known variable, but also need to define the new variable …

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines