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

Timing problem ?

Community Expert ,
Mar 22, 2016 Mar 22, 2016

Copy link to clipboard

Copied

Test, test, test...

In my script at the place where I find a string and replace it by a paragraph contens, it turns out that the very first operation is not performed.

I inserted an alert to find out whether the item can really be found - and voilà the function is OK.

Then I replace the alert by a Console command - and it still works.

Removing this line resuls in loosing the first find/replace.

What's going on here?

The following is just part of the function:

...

  findParams = GetFindParams (findString);        // Get the find parameters for finding string, case sensitive
//FA_errno = Constants.FE_Success;                // errno global, to be used to track the progress of the find and replace
  tr = targetDoc.Find(tr.beg, findParams);        // and do an initial find to get started.
// find and replace loop as long as we keep finding
Console ("textrange selected ?");
  while(FA_errno === Constants.FE_Success && loopCounter++ < 2*loopMax) {
    targetDoc.TextSelection = tr;                 // set up the text range to clear the original text
    targetDoc.Clear(0);                           // clear it
    app.ActiveDoc = sourceDoc;                    // switch to sourceDoc
    sourceDoc.TextSelection = trReplace;          // to be able to get the replacement text
    sourceDoc.Copy(0);
    app.ActiveDoc = targetDoc;                    // switch to targetDoc
    targetDoc.Paste(0);                           // and paste the replacement text
    ReApplyFontAndSize (targetDoc, tr);             // re-apply the current para format

...

TOPICS
Scripting

Views

623

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 , Mar 22, 2016 Mar 22, 2016

Hi Klaus,

the problem is:

Console ("textrange selected ?");


That leads to FA_errno = 0, so if an error occured before it is set to 0 and this line

while(FA_errno === Constants.FE_Success && loopCounter++ < 2*loopMax) {  


doesn't get the error.



Votes

Translate

Translate
Enthusiast ,
Mar 22, 2016 Mar 22, 2016

Copy link to clipboard

Copied

Hi Klaus,

the problem is:

Console ("textrange selected ?");


That leads to FA_errno = 0, so if an error occured before it is set to 0 and this line

while(FA_errno === Constants.FE_Success && loopCounter++ < 2*loopMax) {  


doesn't get the error.



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 ,
Mar 23, 2016 Mar 23, 2016

Copy link to clipboard

Copied

LATEST

Klaus, your remark confirm my findings:

Having replaced the assignments

FA_errno = Constants.FE_Success;

with

InitFA_errno ();

led to a correct behaviour of the script. The original logic is from Russ Ward at https://forums.adobe.com/thread/895626. BTW the small function is:

function InitFA_errno() {
// Reset FA_errno as it is write protected
// see https://forums.adobe.com/thread/962910
  app.GetNamedMenu("!MakerMainMenu");            //If this fails, you've got bigger problems
}

Before I had the idea to replace the assignment of the FA_errno I tried the 'various methods offered on the net' for setting a sleep timer. These all created a hanging FM, although cpu usage was very moderate.

So now the comple function FindAndReplacePara is this

function FindAndReplacePara (targetDoc, findString, sourceDoc, trReplace, loopMax) {
// ----------------------------------------------- Replace string by textrange (part of pgf)
// FindText, ConsiderCase; Function returns replacemtCounter
// Since we have collected only in doc.MainFlowInDoc, we replace only in this flow
// loopMax used as emergency back door - twice the # of initially found citations
// We do not have an initial TextSelection, hence start directly at the first para
// Source: script by Russ Ward in https://https://forums.adobe.com/thread/895626; 2081392
//        and Rick Quatro
  var tr = new TextRange();
  var restoreTR, frame = 0, loopCounter = 0, replacementCounter = 0;
  var findParams = new PropVals();
  var firstPgf = targetDoc.MainFlowInDoc.FirstTextFrameInFlow.FirstPgf;

  tr.beg.obj = tr.end.obj = firstPgf;            //  set up the starting text range as the very beginning
  tr.beg.offset = tr.end.offset = 0;              // of the flow. We'll move straight from beginning to end.
  trSaved = tr                                    // to come back after work
//Set up find parameters. We want to configure it to look for a string and perhaps be case sensitive.
//We don't need the find to wrap because we are controlling the flow from beginning to end.
  findParams = GetFindParams (findString);        // Get the find parameters for finding string, case sensitive

//  FA_errno = Constants.FE_Success;              // errno global, to be used to track the progress of the find and replace
  InitFA_errno ();                                // reset - it is write protected
  tr = targetDoc.Find(tr.beg, findParams);        // and do an initial find to get started.
                                                  // find and replace loop as long as we keep finding
  while(FA_errno === Constants.FE_Success && loopCounter++ < 2*loopMax) {
    targetDoc.TextSelection = tr;                // set up the text range to clear the original text
    targetDoc.Clear(0);                          // clear it
    app.ActiveDoc = sourceDoc;                    // switch to sourceDoc
    sourceDoc.TextSelection = trReplace;          // to be able to get the replacement text
    sourceDoc.Copy(0);
    app.ActiveDoc = targetDoc;                    // switch to targetDoc
    targetDoc.Paste(0);                          // and paste the replacement text
    ReApplyFontAndSize (targetDoc, tr);            // re-apply the current para format

//  FA_errno = Constants.FE_Success;              // ...  find the next instance. We'll reset FA_errno again just in case
    InitFA_errno ();                              // reset - it is write protected
    tr = targetDoc.Find(tr.beg, findParams);      // something screwy happened while we were replacing text.
  }
  targetDoc.ScrollToText(trSaved);                // we're done. Restore the document to it's original area of display
  replacementCounter = loopCounter;
  return replacementCounter;
} // --- end FindAndReplacePara

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