`
Templates: Detecting template instances 1998-09-11 -- Robert Fred, Meyer Newsgroups: topspeed.products.c4 Editors note: Please note that some lines may wrap in the template code. ===================================================================== When you have a PROCEDURE EXTENSION template that may be included in more than one procedure and you want only one occurrence of CODE or DATA generated regardless of the number of procedures that template is included in, the following template code seems to ensure that only one occurrence of the DATA or CODE is generated. -------------------------------------------------------------------- #EXTENSION(My_Extension,'My Extension'),PROCEDURE #! #AT(%CustomGlobalDeclarations) #!===> Include only once per template #DECLARE(%ThisProcedure) #DECLARE(%ThisTemplate) #DECLARE(%ThisInstance) #DECLARE(%ThisExit) #SET(%ThisProcedure,%Procedure) #SET(%ThisTemplate,%ActiveTemplate) #SET(%ThisInstance,%ActiveTemplateInstance) #ENDAT #! #AT(%GlobalData) #! or #AT(%GlobalMap), #AT(%ProgramSetup), etc. #SET(%ThisExit,1) #FOR(%PROCEDURE),WHERE(%ThisExit = 1) #FOR(%ActiveTemplate),WHERE(%ThisTemplate = %ActiveTemplate) #IF(%ThisInstance = %ActiveTemplateInstance) #! ! The DATA or CODE here will only generate once regardless ! of the number of procedures that include this template. #! #ENDIF #SET(%ThisExit,0) #ENDFOR #ENDFOR #FIX(%Procedure,%ThisProcedure) #FIX(%ActiveTemplate,%ThisTemplate) #FIX(%ActiveTemplateInstance,%ThisInstance) #EDNAT --------------------------------------------------------------------- With the exception of #AT(%CustomGlobalDeclarations) to the #ENDAT, all of the above code must be included #AT every place you want only one occurrence of DATA or CODE and that DATA or CODE must be placed where indicated above. ===================================================================== If you want a first occurrence and last occurrence for purposes of building such things as CASE or IF structures use the following: --------------------------------------------------------------------- #EXTENSION(My_Extension,'My Extension'),PROCEDURE #! #AT(%CustomGlobalDeclarations) #!===> Include only once per template #DECLARE(%ThisProcedure) #DECLARE(%ThisTemplate) #DECLARE(%ThisInstance) #DECLARE(%ThisExit) #SET(%ThisProcedure,%Procedure) #SET(%ThisTemplate,%ActiveTemplate) #SET(%ThisInstance,%ActiveTemplateInstance) #ENDAT #! #AT(%GlobalData) #! or #AT(%GlobalMap), #AT(%ProgramSetup), etc. #SET(%ThisExit,1) #FOR(%PROCEDURE),WHERE(%ThisExit = 1) #FOR(%ActiveTemplate),WHERE(%ThisTemplate = %ActiveTemplate) #IF(%ThisInstance = %ActiveTemplateInstance) #! ! The DATA or CODE here will only generate for the first occurrence. #! #ENDIF #SET(%ThisExit,0) #ENDFOR #ENDFOR #FIX(%Procedure,%ThisProcedure) #FIX(%ActiveTemplate,%ThisTemplate) #FIX(%ActiveTemplateInstance,%ThisInstance) #! ! The DATA or CODE here will generate for all occurrences. ! This includes the frist and last occurrence. #! #SET(%ThisExit,1) #FOR(%PROCEDURE),WHERE(%ThisExit = 1),REVERSE #FOR(%ActiveTemplate),WHERE(%ThisTemplate = %ActiveTemplate),REVERSE #IF(%ThisInstance = %ActiveTemplateInstance) #! ! The DATA or CODE here will only generate for the last occurrence. #! #ENDIF #SET(%ThisExit,0) #ENDFOR #ENDFOR #FIX(%Procedure,%ThisProcedure) #FIX(%ActiveTemplate,%ThisTemplate) #FIX(%ActiveTemplateInstance,%ThisInstance) #ENDAT --------------------------------------------------------------------- With the exception of #AT(%CustomGlobalDeclarations) to the #ENDAT, all of the above code must be included #AT every place you want a first and last occurrence. Printed November 23, 2024, 5:12 pm This article has been viewed/printed 35209 times. Google search has resulted in 14 hits on this article since January 25, 2004. |