MartinMarris Posted October 15, 2010 Report Share Posted October 15, 2010 When I create the more complex macros in MacExPro, I make one "main" macro that then calls a series of smaller macros to accomplish a series of tasks. However this also seems to result in problems with variables. Even if you declare and type all your variables at the start of the "main" macro, the "child" macros know nothing about those variables (even if they have been explicitly typed as Global) so you have to declare them all over again in each macro that will use the variable, and try to avoid typos in the process! Helpfully, MacExPro does warn you if you forget to do this. But am I right that there is no way to get around this? More generally, do the more experienced users on this forum agree that building a "modular" sequence of macros is the right way to go when addressing complex processes? Am I creating problems for myself by doing so? When I tried to stuff everything into a single macro, I was having quite a lot of trouble and in particular, it seemed that you cannot nest one "return" loop inside another. That seems rather unusual compared to other languages. Or perhaps I was doing something wrong. Thanks. Quote Link to comment Share on other sites More sharing options...
paul Posted October 15, 2010 Report Share Posted October 15, 2010 When I create the more complex macros in MacExPro, I make one "main" macro that then calls a series of smaller macros to accomplish a series of tasks. Good approach. However this also seems to result in problems with variables. Even if you declare and type all your variables at the start of the "main" macro, the "child" macros know nothing about those variables (even if they have been explicitly typed as Global) so you have to declare them all over again in each macro that will use the variable, and try to avoid typos in the process! Helpfully, MacExPro does warn you if you forget to do this. But am I right that there is no way to get around this? Try these 2 scripts - they work as I expected. xx1 initializes 3 variables, displays them, calls xx2, then redisplays them. xx2 displays the variables, then modifies them, then displays them again. xx2 displays the same values as xx1, and xx1's second display correctly displays the modified values. <VARIABLE SET INTEGER Option="\x00" Destination="%nVar1%" Value="125"/> <VARIABLE SET BOOL Destination="%bVar2%" Command="263" Value="TRUE"/> <VARIABLE SET STRING Option="\x00" Destination="%tVar3%" Value="This is some text"/> <TEXT BOX DISPLAY Content="{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang3081{\\fonttbl{\\f0\\fnil\\fcharset0 Tahoma;}{\\f1\\fnil Tahoma;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs16 xx1 1\r\n\\par \r\n\\par nVar1=%nVar1%\r\n\\par bVar2=%bVar2%\r\n\\par tVar3=%tVar3%\\f1 \r\n\\par }\r\n" Left="Center" Top="Center" Width="278" Height="200" Monitor="0" OnTop="FALSE" Keep_Focus="TRUE" Mode="\x00" Delay="0"/> <MACRO RUN Use_ID="FALSE" Name="xx2" ID="-1" Wait="TRUE"/> <TEXT BOX DISPLAY Content="{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang3081{\\fonttbl{\\f0\\fnil\\fcharset0 Tahoma;}{\\f1\\fnil Tahoma;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs16 xx1 2\r\n\\par \r\n\\par nVar1=%nVar1%\r\n\\par bVar2=%bVar2%\r\n\\par tVar3=%tVar3%\\f1 \r\n\\par }\r\n" Left="Center" Top="Center" Width="278" Height="200" Monitor="0" OnTop="FALSE" Keep_Focus="TRUE" Mode="\x00" Delay="0"/> <TEXT BOX DISPLAY Content="{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang3081{\\fonttbl{\\f0\\fnil\\fcharset0 Tahoma;}{\\f1\\fnil Tahoma;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs16 xx2 1\r\n\\par \r\n\\par nVar1=%nVar1%\r\n\\par bVar2=%bVar2%\r\n\\par tVar3=%tVar3%\\f1 \r\n\\par }\r\n" Left="Center" Top="Center" Width="278" Height="200" Monitor="0" OnTop="FALSE" Keep_Focus="TRUE" Mode="\x00" Delay="0"/> <VARIABLE SET INTEGER Option="\x00" Destination="%nVar1%" Value="112255"/> <VARIABLE SET BOOL Destination="%bVar2%" Command="263" Value="FALSE"/> <VARIABLE SET STRING Option="\x00" Destination="%tVar3%" Value="This is some more text"/> <TEXT BOX DISPLAY Content="{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang3081{\\fonttbl{\\f0\\fnil\\fcharset0 Tahoma;}{\\f1\\fnil Tahoma;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs16 xx2 2\r\n\\par \r\n\\par nVar1=%nVar1%\r\n\\par bVar2=%bVar2%\r\n\\par tVar3=%tVar3%\\f1 \r\n\\par }\r\n" Left="Center" Top="Center" Width="278" Height="200" Monitor="0" OnTop="FALSE" Keep_Focus="TRUE" Mode="\x00" Delay="0"/> More generally, do the more experienced users on this forum agree that building a "modular" sequence of macros is the right way to go when addressing complex processes? Am I creating problems for myself by doing so? Absolutely the right approach. When I tried to stuff everything into a single macro, I was having quite a lot of trouble and in particular, it seemed that you cannot nest one "return" loop inside another. That seems rather unusual compared to other languages. Or perhaps I was doing something wrong. I don't follow. You can have nested Repeat loops without any problems. What am I missing? Quote Link to comment Share on other sites More sharing options...
MartinMarris Posted October 16, 2010 Author Report Share Posted October 16, 2010 >>Try these 2 scripts - they work as I expected.<< I took your two scripts, created a new macro for each of them, with the macro names xx1 and xx2, and put them in the same Category in the editor. When I run xx1, I get this: Undefined variable or the variable is of the wrong type %nVar1% Macro Name xx2 Line Number 4 Not sure what I'm getting wrong ... it did ask me several times to define my variables when I tried to save xx2 in the first place (after saving xx1 first). This is precisely what I've been struggling with: I don't seem to be able to get the child macros to work properly unless I re-define the variables that were already defined in the main routine. >>I don't follow. You can have nested Repeat loops without any problems. What am I missing?<< I'm sure I'm just making another elementary blunder in logic or in the order of operations, but here is an example of something that triggers an infinite loop. The examples in my own code are more complex, so I've stripped it down to a bare example: <VARIABLE SET INTEGER Option="\x00" Destination="%x%" Value="1"/> <VARIABLE SET INTEGER Option="\x00" Destination="%y%" Value="1"/> <REPEAT UNTIL Variable="%x%" Condition="\x00" Value="5"/> <VARIABLE MODIFY INTEGER Option="\x00" Destination="%x%" Value1="%x%" Value2="1"/> <REPEAT UNTIL Variable="%y%" Condition="\x00" Value="10"/> <VARIABLE MODIFY INTEGER Option="\x00" Destination="%y%" Value1="%y%" Value2="1"/> <END REPEAT/> <END REPEAT/> Thanks again. Quote Link to comment Share on other sites More sharing options...
terrypin Posted October 16, 2010 Report Share Posted October 16, 2010 Yes, that result looks puzzling at first sight. But the answer lies in Help > Repeat Commands: Note: The macro commands between the Repeat Until and Repeat End commands are always executed at least once, because the Until condition is not evaluated until after the first iteration. I often resort with head-scratching situations like this to adding a Text Box Display command at key points. Such an amended macro might be: Variable Set Integer %x% to 1 Variable Set Integer %y% to 1 Repeat Until %x% Equals "5" Text Box Display: 1st (outer) loop Variable Modify Integer: %x% = %x% + 1 Repeat Until %y% Equals "10" Variable Modify Integer: %y% = %y% + 1 Text Box Display: 2nd (inner) loop End Repeat End Repeat Running that, you quickly realise that because the second loop is being run at least once, it will never stop! Note that even if that logical flaw wasn't present, your macro would have processed only 36 values, not 50, because you started incrementing an initial value of 1 instead of zero So one way of doing what I think you want would be this: Variable Set Integer %x% to 0 Variable Set Integer %y% to 0 Repeat Until %x% Equals "5" Variable Modify Integer: %x% = %x% + 1 Text Box Display: 1st (outer) loop Repeat Until %y% Equals "10" If Variable %y% Equals "10" Break Else Variable Modify Integer: %y% = %y% + 1 End If Text Box Display: 2nd (inner) loop End Repeat End Repeat -- Terry, East Grinstead, UK Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.