<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://labviewwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Playerm1</id>
	<title>LabVIEW Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://labviewwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Playerm1"/>
	<link rel="alternate" type="text/html" href="https://labviewwiki.org/wiki/Special:Contributions/Playerm1"/>
	<updated>2026-04-21T05:15:05Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=LabVIEW_configuration_file/Getting_Started_Window&amp;diff=32232</id>
		<title>LabVIEW configuration file/Getting Started Window</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=LabVIEW_configuration_file/Getting_Started_Window&amp;diff=32232"/>
		<updated>2024-01-02T18:36:14Z</updated>

		<summary type="html">&lt;p&gt;Playerm1: GSW_RSSCheckEnabled, corrected &amp;quot;FALS&amp;quot; to &amp;quot;FALSE&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of LabVIEW ini File settings relating to the Getting Started Window.&lt;br /&gt;
&lt;br /&gt;
{{TOCright}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =GSW_filter&lt;br /&gt;
| example =GSW_filter=0&lt;br /&gt;
| datatype =i&lt;br /&gt;
| description =Filter on files to show in recent list.&lt;br /&gt;
| permitted_values ={0 = All, 1 = Recent Projects, 2 = Recent VIs, 3 = Other Recent Files}&lt;br /&gt;
| default = 0&lt;br /&gt;
| LV1 = 2012+&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =GSW_Pinned_Files&lt;br /&gt;
| example =GSW_Pinned_Files=&amp;quot;C:\Projects\Project 1\Project 1.lvproj;C:\Projects\Project 2\VI2.vi&amp;quot;&lt;br /&gt;
| datatype =s&lt;br /&gt;
| description =The paths of recently opened files.&lt;br /&gt;
| permitted_values =Paths, semi-colon separated.&lt;br /&gt;
| default = &amp;lt;blank&amp;gt; or no key&lt;br /&gt;
| LV1 = 2012+&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =GSW_Pinned_Templates&lt;br /&gt;
| example =GSW_Pinned_Templates=&amp;quot;C:\Program Files (x86)\National Instruments\LabVIEW 2019\ProjectTemplates\Source\Delacor\Delacor QMH&amp;quot;&lt;br /&gt;
| datatype =s&lt;br /&gt;
| description =The paths of recently opened templates.&lt;br /&gt;
| permitted_values =Paths, semi-colon separated.&lt;br /&gt;
| default = &amp;lt;blank&amp;gt; or no key&lt;br /&gt;
| LV1 = 2012+&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =GSW_Pinned_Templates_names&lt;br /&gt;
| example =GSW_Pinned_Templates_names=&amp;quot;Delacor QMH&amp;quot;&lt;br /&gt;
| datatype =s&lt;br /&gt;
| description =The names of recently opened Project Templates.&lt;br /&gt;
| permitted_values =Strinngs, semi-colon separated.&lt;br /&gt;
| default = &amp;lt;blank&amp;gt; or no key&lt;br /&gt;
| LV1 = 2012+&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =GSW_RSSCheckEnabled&lt;br /&gt;
| example =GSW_RSSCheckEnabled=FALSE&lt;br /&gt;
| datatype =b&lt;br /&gt;
| description =Stop LabVIEW from checking ni.com for updates to the &amp;quot;Latest from ni.com&amp;quot;, &amp;quot;Online Support&amp;quot; and &amp;quot;Help&amp;quot; lists.&lt;br /&gt;
| permitted_values =TRUE or FALSE&lt;br /&gt;
| default =TRUE&lt;br /&gt;
| LV1 = 2009&lt;br /&gt;
| LV2 = 2010&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =MaxGSWRecentProjects&lt;br /&gt;
| example =MaxGSWRecentProjects=5&lt;br /&gt;
| datatype =i&lt;br /&gt;
| description =Set the number of recently opened projects in the &amp;quot;Open&amp;quot; list of the Getting Started Window&lt;br /&gt;
| permitted_values =0...&lt;br /&gt;
| default =2&lt;br /&gt;
| LV1 = 2009&lt;br /&gt;
| LV2 = 2010&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =NI_GSWPosition&lt;br /&gt;
| example =NI_GSWPosition=&amp;quot;505,196,1416,844&amp;quot;&lt;br /&gt;
| datatype =s&lt;br /&gt;
| description =List of position points &amp;quot;Top, Left, Bottom, Right&amp;quot;&lt;br /&gt;
| permitted_values =&amp;quot;Number,Number,Number,Number&amp;quot;&lt;br /&gt;
| default =2&lt;br /&gt;
| LV1 = 2012+&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =RecentFiles.pathList&lt;br /&gt;
| example =RecentFiles.projectPathList=&amp;quot;C:\Projects\Project 1\VI1.vi;C:\Projects\Project 2\VI2.vi&amp;quot;&lt;br /&gt;
| datatype =s&lt;br /&gt;
| description =The paths of recently opened VIs, CTLs.&lt;br /&gt;
| permitted_values =Paths to *.vi, *.ctl&lt;br /&gt;
| default = &amp;lt;blank&amp;gt; or no key&lt;br /&gt;
| LV1 = 8&lt;br /&gt;
| LV2 = 20xx&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =RecentFiles.projectPathList&lt;br /&gt;
| example =RecentFiles.projectPathList=&amp;quot;C:\Projects\Project 1\Project 1.lvproj;C:\Projects\Project 2\Project 2.lvproj&amp;quot;&lt;br /&gt;
| datatype =s&lt;br /&gt;
| description =The paths of recently opened projects.&lt;br /&gt;
| permitted_values =Paths to *.lvproj&lt;br /&gt;
| default = &amp;lt;blank&amp;gt; or no key&lt;br /&gt;
| LV1 = 8&lt;br /&gt;
| LV2 = 20xx&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =u&lt;br /&gt;
| notes =None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Configuration File]]&lt;/div&gt;</summary>
		<author><name>Playerm1</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=LabVIEW_configuration_file/Block_Diagram&amp;diff=32231</id>
		<title>LabVIEW configuration file/Block Diagram</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=LabVIEW_configuration_file/Block_Diagram&amp;diff=32231"/>
		<updated>2024-01-02T16:06:55Z</updated>

		<summary type="html">&lt;p&gt;Playerm1: minor updates to resizeObjectsOnBlockDiagram entry. LV version update, note update.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of LabVIEW ini File settings relating to Block Diagram behaviour.&lt;br /&gt;
&lt;br /&gt;
{{TOCnestright}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  allowDragDropFromFileDlg&lt;br /&gt;
| example = allowDragDropFromFileDlg=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables drag and drop functionality from the file dialog to the block diagram of a vi&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 8.5&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = This functionality existed in LV 5.0 -&amp;gt; LV 7.1, was removed in LV 8.x, and added back in as an ini setting in 8.5&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  allowOpenFPOfInstanceVIs&lt;br /&gt;
| example = allowOpenFPOfInstanceVIs=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Changes the behavior of the Convert Instance VI to Standard VI menu option when right-clicking a malleable VI on the block diagram to instead open the instance VI&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 2019 onwards&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| notes =&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  autoWireMax&lt;br /&gt;
| example = autoWireMax=24&lt;br /&gt;
| datatype = i&lt;br /&gt;
| description = Maximum distance between nodes for autowiring to be active&lt;br /&gt;
| permitted_values = 1 to 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;&lt;br /&gt;
| default = 16&lt;br /&gt;
| LV1 =6&lt;br /&gt;
| LV2 =7&lt;br /&gt;
| LV3 =8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = This setting is only effective if [[#enableAutoWire|enableAutoWire]] is set to TRUE&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  autoWireMin&lt;br /&gt;
| example = autoWireMin=8&lt;br /&gt;
| datatype = i&lt;br /&gt;
| description = Minimum distance between nodes for autowiring to be active&lt;br /&gt;
| permitted_values = 1 to 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;&lt;br /&gt;
| default = 4&lt;br /&gt;
| LV1 = 6&lt;br /&gt;
| LV2 = 7&lt;br /&gt;
| LV3 = 8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = This setting is only effective if [[#enableAutoWire|enableAutoWire]] is set to TRUE&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  copyDeleteFPDCOFromFPTerm&lt;br /&gt;
| example = copyDeleteFPDCOFromFPTerm=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Delete front panel terminals from diagram&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =&lt;br /&gt;
| LV2 = 4&lt;br /&gt;
| LV3 = 5&lt;br /&gt;
| LV4 = 6&lt;br /&gt;
| LV5 = 7&lt;br /&gt;
| LV6 = 8&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = enableAutoWire&lt;br /&gt;
| example = enableAutoWire=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables automatic wire routing. This key is set by the [[Options dialog]] for &#039;&#039;Enable automatic wire routing&#039;&#039; in section [[Block Diagram options#Wiring|Wiring]] under category [[Block Diagram options|Block Diagram]].&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 = 6&lt;br /&gt;
| LV2 = 7&lt;br /&gt;
| LV3 = 8&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = FancyFPTerms&lt;br /&gt;
| example = FancyFPTerms=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables placing front panel terminals as icons. This key is set by the [[Options dialog]] for &#039;&#039;Place front panel terminals as icons&#039;&#039; in section [[Block Diagram options#General|General]] under category [[Block Diagram options|Block Diagram]].&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = (Depends on LV Version)&lt;br /&gt;
| LV1 = 7&lt;br /&gt;
| LV2 = 8&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  funkyErrClustWire&lt;br /&gt;
| example = funkyErrClustWire=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Change Error Cluster wires color from the standard cluster pink to a more distinctive brown/green color&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = LabVIEW 5.1, 6.x, 7.x: FALSE,  LabVIEW 8.x: TRUE&lt;br /&gt;
| LV1 = 5&lt;br /&gt;
| LV2 = 6&lt;br /&gt;
| LV3 = 7&lt;br /&gt;
| LV4 = 8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  inlineSubVIEnabled&lt;br /&gt;
| example = inlineSubVIEnabled=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Allows the context menu item &amp;quot;Inline SubVI&amp;quot; on any SubVI which inserts the code directly into the block diagram containing the SubVI.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 6&lt;br /&gt;
| LV2 = 7&lt;br /&gt;
| LV3 = 8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  maxUndoSteps&lt;br /&gt;
| example = maxUndoSteps=50&lt;br /&gt;
| datatype = i&lt;br /&gt;
| description = Maximum undo steps per VI&lt;br /&gt;
| permitted_values = 1 to 99&lt;br /&gt;
| default = 8&lt;br /&gt;
| LV1 = 5&lt;br /&gt;
| LV2 = 6&lt;br /&gt;
| LV3 = 7&lt;br /&gt;
| LV4 = 8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  resizeObjectsOnBlockDiagram&lt;br /&gt;
| example = resizeObjectsOnBlockDiagram=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables &amp;quot;Resize Objects&amp;quot; functionality on the block diagram of a vi.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 2015 onward&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| notes = Mainly useful for resizing objects on the structures palette, comment boxes, and labels.&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showBDConstName&lt;br /&gt;
| example = showBDConstName=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show Constant Label with name of terminal when creating from a terminal&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = ShowRedXOnWire&lt;br /&gt;
| example = ShowRedXOnWire=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Shows a red &amp;quot;X&amp;quot; (and directional arrows) on top of a broken wire.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showSubVIName&lt;br /&gt;
| example = showSubVIName=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show subVI names when dropped&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showTipStringsOnTerms&lt;br /&gt;
| example = showTipStringsOnTerms=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show tip-strips over terminals&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showWireDots&lt;br /&gt;
| example = showWireDots=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show dots at wire junctions&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =7&lt;br /&gt;
| LV2 =8&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showWireGuides&lt;br /&gt;
| example = showWireGuides=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show dashed line while wiring&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  structuresFadeToDiagramBeneath&lt;br /&gt;
| example = structuresFadeToDiagramBeneath=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Makes the diagram of structures semi-transparent so that you can see objects behind them.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =6&lt;br /&gt;
| LV2 =7&lt;br /&gt;
| LV3 =8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = Enabling this setting will slow down the development environment on large Block Diagrams. Feature disabled in LabVIEW 2014 onwards.&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  transparentBDLabels&lt;br /&gt;
| example = transparentBDLabels=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Use transparent name labels&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =5&lt;br /&gt;
| LV2 =6&lt;br /&gt;
| LV3 =7&lt;br /&gt;
| LV4 =8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = UseNumbersForNewVIIcons&lt;br /&gt;
| example = UseNumbersForNewVIIcons=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Tells LabVIEW whether to automatically include a number (1-9) in the lower-right corner of each new VI&#039;s icon.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 = 8.6&lt;br /&gt;
| LV2 =&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =&lt;br /&gt;
| notes = This key replaces [[#UseNumbersForNewVIIconsInLibs|UseNumbersForNewVIIconsInLibs]] from LabVIEW 8.5.&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = UseNumbersForNewVIIconsInLibs&lt;br /&gt;
| example = UseNumbersForNewVIIconsInLibs=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Tells LabVIEW whether to automatically include a number (1-9) in the lower-right corner of each new VI&#039;s icon for VIs created inside libraries (.lvlib, .lvclass, .xctl, .lvsc, etc).&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 = 8.5&lt;br /&gt;
| LV2 =&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =&lt;br /&gt;
| notes = This key was replaced by [[#UseNumbersForNewVIIcons|UseNumbersForNewVIIcons]] in LabVIEW 8.6.&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  viCaptionTipStrings&lt;br /&gt;
| example = viCaptionTipStrings=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Use control captions for subVI tip-strips&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =5&lt;br /&gt;
| LV2 =6&lt;br /&gt;
| LV3 =7&lt;br /&gt;
| LV4 =8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = SourceOnlyEnvironment&lt;br /&gt;
| example = SourceOnlyEnvironment=True&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = The option &amp;quot;Separate Compiled Code from Source&amp;quot; is turned on by default&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =10&lt;br /&gt;
| LV2 =&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = &lt;br /&gt;
| OS3 = &lt;br /&gt;
| OS4 = &lt;br /&gt;
| notes = Currently this causes &amp;quot;uncomfortably&amp;quot; slow load times when opening a large number of VIs which this option enabled.  Reference, [https://decibel.ni.com/content/groups/large-labview-application-development/blog/2010/09 NI forums]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Configuration File|Block Diagram]]&lt;/div&gt;</summary>
		<author><name>Playerm1</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=LabVIEW_configuration_file/Block_Diagram&amp;diff=32229</id>
		<title>LabVIEW configuration file/Block Diagram</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=LabVIEW_configuration_file/Block_Diagram&amp;diff=32229"/>
		<updated>2024-01-02T14:51:57Z</updated>

		<summary type="html">&lt;p&gt;Playerm1: added entry for LabVIEW.ini token &amp;quot;resizeObjectsOnBlockDiagram&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of LabVIEW ini File settings relating to Block Diagram behaviour.&lt;br /&gt;
&lt;br /&gt;
{{TOCnestright}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  allowDragDropFromFileDlg&lt;br /&gt;
| example = allowDragDropFromFileDlg=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables drag and drop functionality from the file dialog to the block diagram of a vi&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 8.5&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = This functionality existed in LV 5.0 -&amp;gt; LV 7.1, was removed in LV 8.x, and added back in as an ini setting in 8.5&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  allowOpenFPOfInstanceVIs&lt;br /&gt;
| example = allowOpenFPOfInstanceVIs=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Changes the behavior of the Convert Instance VI to Standard VI menu option when right-clicking a malleable VI on the block diagram to instead open the instance VI&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 2019 onwards&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| notes =&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  autoWireMax&lt;br /&gt;
| example = autoWireMax=24&lt;br /&gt;
| datatype = i&lt;br /&gt;
| description = Maximum distance between nodes for autowiring to be active&lt;br /&gt;
| permitted_values = 1 to 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;&lt;br /&gt;
| default = 16&lt;br /&gt;
| LV1 =6&lt;br /&gt;
| LV2 =7&lt;br /&gt;
| LV3 =8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = This setting is only effective if [[#enableAutoWire|enableAutoWire]] is set to TRUE&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  autoWireMin&lt;br /&gt;
| example = autoWireMin=8&lt;br /&gt;
| datatype = i&lt;br /&gt;
| description = Minimum distance between nodes for autowiring to be active&lt;br /&gt;
| permitted_values = 1 to 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;&lt;br /&gt;
| default = 4&lt;br /&gt;
| LV1 = 6&lt;br /&gt;
| LV2 = 7&lt;br /&gt;
| LV3 = 8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = This setting is only effective if [[#enableAutoWire|enableAutoWire]] is set to TRUE&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  copyDeleteFPDCOFromFPTerm&lt;br /&gt;
| example = copyDeleteFPDCOFromFPTerm=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Delete front panel terminals from diagram&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =&lt;br /&gt;
| LV2 = 4&lt;br /&gt;
| LV3 = 5&lt;br /&gt;
| LV4 = 6&lt;br /&gt;
| LV5 = 7&lt;br /&gt;
| LV6 = 8&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = enableAutoWire&lt;br /&gt;
| example = enableAutoWire=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables automatic wire routing. This key is set by the [[Options dialog]] for &#039;&#039;Enable automatic wire routing&#039;&#039; in section [[Block Diagram options#Wiring|Wiring]] under category [[Block Diagram options|Block Diagram]].&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 = 6&lt;br /&gt;
| LV2 = 7&lt;br /&gt;
| LV3 = 8&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = FancyFPTerms&lt;br /&gt;
| example = FancyFPTerms=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables placing front panel terminals as icons. This key is set by the [[Options dialog]] for &#039;&#039;Place front panel terminals as icons&#039;&#039; in section [[Block Diagram options#General|General]] under category [[Block Diagram options|Block Diagram]].&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = (Depends on LV Version)&lt;br /&gt;
| LV1 = 7&lt;br /&gt;
| LV2 = 8&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  funkyErrClustWire&lt;br /&gt;
| example = funkyErrClustWire=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Change Error Cluster wires color from the standard cluster pink to a more distinctive brown/green color&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = LabVIEW 5.1, 6.x, 7.x: FALSE,  LabVIEW 8.x: TRUE&lt;br /&gt;
| LV1 = 5&lt;br /&gt;
| LV2 = 6&lt;br /&gt;
| LV3 = 7&lt;br /&gt;
| LV4 = 8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  inlineSubVIEnabled&lt;br /&gt;
| example = inlineSubVIEnabled=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Allows the context menu item &amp;quot;Inline SubVI&amp;quot; on any SubVI which inserts the code directly into the block diagram containing the SubVI.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 6&lt;br /&gt;
| LV2 = 7&lt;br /&gt;
| LV3 = 8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  maxUndoSteps&lt;br /&gt;
| example = maxUndoSteps=50&lt;br /&gt;
| datatype = i&lt;br /&gt;
| description = Maximum undo steps per VI&lt;br /&gt;
| permitted_values = 1 to 99&lt;br /&gt;
| default = 8&lt;br /&gt;
| LV1 = 5&lt;br /&gt;
| LV2 = 6&lt;br /&gt;
| LV3 = 7&lt;br /&gt;
| LV4 = 8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  resizeObjectsOnBlockDiagram&lt;br /&gt;
| example = resizeObjectsOnBlockDiagram=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Enables &amp;quot;Resize Objects&amp;quot; functionality on the block diagram of a vi.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 = 2018 onward&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| notes = Tested with 2018 SP1, Windows 10&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showBDConstName&lt;br /&gt;
| example = showBDConstName=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show Constant Label with name of terminal when creating from a terminal&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = ShowRedXOnWire&lt;br /&gt;
| example = ShowRedXOnWire=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Shows a red &amp;quot;X&amp;quot; (and directional arrows) on top of a broken wire.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showSubVIName&lt;br /&gt;
| example = showSubVIName=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show subVI names when dropped&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showTipStringsOnTerms&lt;br /&gt;
| example = showTipStringsOnTerms=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show tip-strips over terminals&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showWireDots&lt;br /&gt;
| example = showWireDots=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show dots at wire junctions&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =7&lt;br /&gt;
| LV2 =8&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  showWireGuides&lt;br /&gt;
| example = showWireGuides=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Show dashed line while wiring&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =4&lt;br /&gt;
| LV2 =5&lt;br /&gt;
| LV3 =6&lt;br /&gt;
| LV4 =7&lt;br /&gt;
| LV5 =8&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  structuresFadeToDiagramBeneath&lt;br /&gt;
| example = structuresFadeToDiagramBeneath=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Makes the diagram of structures semi-transparent so that you can see objects behind them.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =6&lt;br /&gt;
| LV2 =7&lt;br /&gt;
| LV3 =8&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = Enabling this setting will slow down the development environment on large Block Diagrams. Feature disabled in LabVIEW 2014 onwards.&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  transparentBDLabels&lt;br /&gt;
| example = transparentBDLabels=TRUE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Use transparent name labels&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =5&lt;br /&gt;
| LV2 =6&lt;br /&gt;
| LV3 =7&lt;br /&gt;
| LV4 =8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = UseNumbersForNewVIIcons&lt;br /&gt;
| example = UseNumbersForNewVIIcons=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Tells LabVIEW whether to automatically include a number (1-9) in the lower-right corner of each new VI&#039;s icon.&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 = 8.6&lt;br /&gt;
| LV2 =&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =&lt;br /&gt;
| notes = This key replaces [[#UseNumbersForNewVIIconsInLibs|UseNumbersForNewVIIconsInLibs]] from LabVIEW 8.5.&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = UseNumbersForNewVIIconsInLibs&lt;br /&gt;
| example = UseNumbersForNewVIIconsInLibs=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Tells LabVIEW whether to automatically include a number (1-9) in the lower-right corner of each new VI&#039;s icon for VIs created inside libraries (.lvlib, .lvclass, .xctl, .lvsc, etc).&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 = 8.5&lt;br /&gt;
| LV2 =&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 =w&lt;br /&gt;
| OS2 =m&lt;br /&gt;
| OS3 =l&lt;br /&gt;
| OS4 =&lt;br /&gt;
| notes = This key was replaced by [[#UseNumbersForNewVIIcons|UseNumbersForNewVIIcons]] in LabVIEW 8.6.&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname =  viCaptionTipStrings&lt;br /&gt;
| example = viCaptionTipStrings=FALSE&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = Use control captions for subVI tip-strips&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = TRUE&lt;br /&gt;
| LV1 =5&lt;br /&gt;
| LV2 =6&lt;br /&gt;
| LV3 =7&lt;br /&gt;
| LV4 =8&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = m&lt;br /&gt;
| OS3 = l&lt;br /&gt;
| OS4 = u&lt;br /&gt;
| notes = None&lt;br /&gt;
}}&lt;br /&gt;
{{ labviewconfigurationkey&lt;br /&gt;
| keyname = SourceOnlyEnvironment&lt;br /&gt;
| example = SourceOnlyEnvironment=True&lt;br /&gt;
| datatype = b&lt;br /&gt;
| description = The option &amp;quot;Separate Compiled Code from Source&amp;quot; is turned on by default&lt;br /&gt;
| permitted_values = TRUE or FALSE&lt;br /&gt;
| default = FALSE&lt;br /&gt;
| LV1 =10&lt;br /&gt;
| LV2 =&lt;br /&gt;
| LV3 =&lt;br /&gt;
| LV4 =&lt;br /&gt;
| LV5 =&lt;br /&gt;
| LV6 =&lt;br /&gt;
| OS1 = w&lt;br /&gt;
| OS2 = &lt;br /&gt;
| OS3 = &lt;br /&gt;
| OS4 = &lt;br /&gt;
| notes = Currently this causes &amp;quot;uncomfortably&amp;quot; slow load times when opening a large number of VIs which this option enabled.  Reference, [https://decibel.ni.com/content/groups/large-labview-application-development/blog/2010/09 NI forums]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Configuration File|Block Diagram]]&lt;/div&gt;</summary>
		<author><name>Playerm1</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Design_Pattern_Case_Study:_A_Simple_Counter&amp;diff=6922</id>
		<title>Design Pattern Case Study: A Simple Counter</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Design_Pattern_Case_Study:_A_Simple_Counter&amp;diff=6922"/>
		<updated>2019-04-10T14:20:38Z</updated>

		<summary type="html">&lt;p&gt;Playerm1: /* Queued Message Handler (QMH) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;by Quentin&amp;quot;Q&amp;quot; Alldredge, Q Software Innovations, LLC&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;What design pattern should I choose?&#039;&#039;&#039; The design pattern you choose is highly dependent on the project requirements. Here is a case study implementing a simple counter in many of the design patterns described in the [[Design Patterns Overview]] page.&lt;br /&gt;
[[File:Design Pattern Scale.png|800x800px|frameless|center|Design Pattern Scale]]&lt;br /&gt;
&lt;br /&gt;
== Source code ==&lt;br /&gt;
All of the source code is available at:&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/QSI_Shared_Code/simple-counter-case-study.git QSI Shared Code on GitLab for LabVIEW 2018]&lt;br /&gt;
[https://gitlab.com/QSI_Shared_Code/simple-counter-case-study/tree/LabVIEW2015Version For LabVIEW 2015]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
The Program Shall:&lt;br /&gt;
* Provide a way to allow the user to choose between &#039;&#039;&#039;Increment&#039;&#039;&#039; and &#039;&#039;&#039;Decrement&#039;&#039;&#039;&lt;br /&gt;
* Provide a way to allow the user to Stop the program&lt;br /&gt;
* Provide an I32 Numeric Input called &#039;&#039;&#039;Amount&#039;&#039;&#039;&lt;br /&gt;
* Provide an I32 Numeric Output called &#039;&#039;&#039;Count&#039;&#039;&#039;&lt;br /&gt;
* When &#039;&#039;&#039;Increment &#039;&#039;&#039;is clicked, add &#039;&#039;&#039;Amount&#039;&#039;&#039; to the &#039;&#039;&#039;Count&#039;&#039;&#039;&lt;br /&gt;
* When &#039;&#039;&#039;Decrement&#039;&#039;&#039; is clicked, subtract &#039;&#039;&#039;Amount&#039;&#039;&#039; from the &#039;&#039;&#039;Count&#039;&#039;&#039;&lt;br /&gt;
* The UI must look like this (title can be different):&lt;br /&gt;
[[File:Design Pattern Case Study - Simple Counter UI.png|528x528px|thumb|center|Simple Counter User Interface]]&lt;br /&gt;
&lt;br /&gt;
== State Machine ==&lt;br /&gt;
The &#039;&#039;&#039;[[State Machine]]&#039;&#039;&#039; polls for user input which changes the state to &#039;&#039;Increment&#039;&#039; or &#039;&#039;Decrement&#039;&#039;.  If both are FALSE the state is transitioned to &#039;&#039;Idle&#039;&#039;.  A &#039;&#039;Wait&#039;&#039; is required but was made small to prevent any lag which the user could see.  Undefined states cause an error and the loop to stop.&lt;br /&gt;
[[File:Design Pattern Case Study - State Machine.png|700x700px|thumb|center|Simple Counter implemented using the State Machine Design Pattern]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+State Machine Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Simple to map flow in a flowchart and create&lt;br /&gt;
|Either used with no UI or has to poll for user interactions which requires a Wait function to keep from taxing the processor&lt;br /&gt;
|-&lt;br /&gt;
|Simple to extend by adding cases and modifying state transitions&lt;br /&gt;
|Not meant for multiple processes that have to run at different rates&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|Can&#039;t handle the window close button (disabled in this example) so there has to be something else to end program&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|UI becomes unresponsive if code takes a long time to execute&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|If using Strings to define state, the default case must be handled.  It would be better to implement with an enum.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Event Handler ==&lt;br /&gt;
The &#039;&#039;&#039;[[Event Handler]]&#039;&#039;&#039; operates only when there is user interaction.  In this case it is when the user clicks &#039;&#039;&#039;Increment&#039;&#039;&#039;, &#039;&#039;&#039;Decrement&#039;&#039;&#039;, &#039;&#039;&#039;Stop&#039;&#039;&#039; or the Windows Close button, &amp;quot;X&amp;quot;.  The code for each operates inside of the Event Structure.&lt;br /&gt;
[[File:Design Pattern Case Study - Event Handler.png|700x700px|thumb|center|Simple Counter implemented using the Event Handler Design Pattern]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+Event Handler Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Does not have to poll for user interactions which reduces processor resources&lt;br /&gt;
|Completely dependent on user interactions&lt;br /&gt;
|-&lt;br /&gt;
|Can handle the windows close button event&lt;br /&gt;
|Not meant for multiple processes that have to run at different rates&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
|UI becomes unresponsive if code takes a long time to execute                       &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Master/Slave ==&lt;br /&gt;
The &#039;&#039;&#039;[[Master/Slave]]&#039;&#039;&#039; separates the Event Handling into the Master Loop and the Data Processing into the Slave Loop.  All the Master Loop does is issue commands while the Slave Loop executes those commands.  If the Slave receives a command it doesn&#039;t know how to do it does nothing.  The communication between them is a Notifier which is lossy, it can only send one command at a time.  If a command is sent too quickly, it could be lost.&lt;br /&gt;
[[File:Design Pattern Case Study - Master-Slave.png|700x700px|thumb|center|Simple Counter implemented using the Master/Slave Design Pattern]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+Master/Slave Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Does not have to poll for user interactions which reduces processor resources&lt;br /&gt;
|Commands issued too quickly can be lost&lt;br /&gt;
|-&lt;br /&gt;
|Can handle the windows close button event&lt;br /&gt;
|If using Strings to define commands, the default case must be handled.  It would be better to implement with an enum.&lt;br /&gt;
|-&lt;br /&gt;
|Separates UI from code execution to keep it responsive&lt;br /&gt;
|                       Commands do not have data or what to execute.  It is up to the Slave Loop about what to do with each command.&lt;br /&gt;
|-&lt;br /&gt;
|Can have multiple Slave Loops&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Producer/Consumer ==&lt;br /&gt;
The &#039;&#039;&#039;[[Producer/Consumer]]&#039;&#039;&#039; is closely related to the Master/Slave but instead of issuing commands the Producer/Consumer produces data in the Producer Loop which is the used, or consumed, in the Consumer Loop.  The communication between them is a Queue which is will buffer the data so that none of it is lost.&lt;br /&gt;
[[File:Design Pattern Case Study - Producer-Consumer.png|700x700px|thumb|center|Simple Counter implemented using the Producer/Consumer Design Pattern]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+Producer/Consumer Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Does not have to poll for user interactions which reduces processor resources&lt;br /&gt;
|Can&#039;t have multiple Consumer Loops&lt;br /&gt;
|-&lt;br /&gt;
|Can handle the windows close button event and other events&lt;br /&gt;
|The structure of data is set for the Consumer Loop.&lt;br /&gt;
|-&lt;br /&gt;
|Separates UI from code execution to keep it responsive&lt;br /&gt;
|                       It is up to the Consumer Loop about what to do with the data.&lt;br /&gt;
|-&lt;br /&gt;
|Buffers data so that none is lost&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
== Action Engine (AE) ==&lt;br /&gt;
The &#039;&#039;&#039;[[Functional global variable|Action Engine (AE)]]&#039;&#039;&#039; implementation is similar to the State Machine design pattern.  It uses an uninitialized shift register as a memory space for its data (the current count in this case study) and contains the actions to carryout (&amp;quot;Initialize&amp;quot;, &amp;quot;Increment&amp;quot;, &amp;quot;Decrement&amp;quot;, &amp;quot;Stop&amp;quot;, and Default&#039;&#039;)&#039;&#039;.  It does not implement the UI requirements and has to be used in an owning program which implements another design pattern.  (However, if the above example of a QMH left the Count State shift-register uninitialized, the bottom Message Handling Loop could act as an Action Engine of sorts.)&lt;br /&gt;
[[File:Design Pattern Case Study - Action Engine-While Loop.png|700x700px|thumb|center|Simple Counter implemented using the Action Engine Design Pattern (While Loop)]]&lt;br /&gt;
&lt;br /&gt;
[[File:Design Pattern Case Study - Action Engine-For Loop.png|700x700px|thumb|center|Simple Counter implemented using the Action Engine Design Pattern (For Loop)]]&lt;br /&gt;
&lt;br /&gt;
[[File:Design Pattern Case Study - Action Engine-Feedback Node.png|700x700px|thumb|center|Simple Counter implemented using the Action Engine Design Pattern (Feedback Node)]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+Action Engine Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Extensible Can add more actions.&lt;br /&gt;
|If using Strings to define action, the default case must be handled.  It would be better to implement with an type definition enum.&lt;br /&gt;
|-&lt;br /&gt;
|Encasulates code to be used in multiple places but operates on the same data&lt;br /&gt;
|                       Not usually used as a stand alone design pattern. Usually doesn&#039;t contain UI&lt;br /&gt;
|}&lt;br /&gt;
== Queued Message Handler (QMH) ==&lt;br /&gt;
The &#039;&#039;&#039;[[Queued Message Handler|Queued Message Handler (QMH)]]&#039;&#039;&#039; design pattern is a combination of Producer/Consumer, Event Handler and State Machine architectures together.  It combines the command and data into a Message Queue that serve as the communication between the Event Loop and the Message Handling Loop.  The QMH also defines communication back the other direction, from the Message Handling Loop to the Event Loop, through the use of User Events.  Unhandled messages cause an error that stops the program.&lt;br /&gt;
[[File:Queued Message Handler Design Pattern.png|centre|thumb|700x700px|Simple Counter implemented using the Queued Message Handler Design Pattern]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+QMH Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Does not have to poll for user interactions which reduces processor resources&lt;br /&gt;
|Can&#039;t have multiple Message Handler Loops&lt;br /&gt;
|-&lt;br /&gt;
|Can handle the windows close button event and other events&lt;br /&gt;
|If using Strings to define command, the default case must be handled.  It would be better to implement with an enum.&lt;br /&gt;
|-&lt;br /&gt;
|Separates UI from code execution to keep it responsive&lt;br /&gt;
|                       &lt;br /&gt;
|-&lt;br /&gt;
|Bi-directional communication between loops&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Each command can have a different structure of data associated with it.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Object-Oriented QMH ==&lt;br /&gt;
The &#039;&#039;&#039;Object-Oriented QMH&#039;&#039;&#039; uses Objects as the messages.  These objects are defined by the Message class and include a must override method called Action.  The Message Queue, Update Count User Event and Stop User Event are created in the State Initialize Method.  Messages are sent using the Message Queue from the Event Loop to the Message Handling Loop where they are dequeued.  The dequeued Message then calls its Action Method by dynamic dispatch which performs an Action on the State.&lt;br /&gt;
[[File:Design Pattern Case Study - OO QMH.png|center|thumb|700x700px|Simple Counter implemented using the Object-Oriented QMH Design Pattern]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+OO QMH Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Extensible.  It is easy to extend functionality by adding a new child of the Message Class.&lt;br /&gt;
|Lots of files to manage.  Every message is at least three files (Class, Action Method and Send Method).&lt;br /&gt;
|-&lt;br /&gt;
|Messages contain the command (Class), the data (Class Private Data), and the action (Action Method).&lt;br /&gt;
|Does not handle communication between modules without adding another communication method.&lt;br /&gt;
|-&lt;br /&gt;
|Does not use strings to define commands.  &lt;br /&gt;
|                       &lt;br /&gt;
|}&lt;br /&gt;
== Delacor QMH ==&lt;br /&gt;
The &#039;&#039;&#039;[[Delacor Queued Message Handler (DQMH)]]&#039;&#039;&#039; design pattern is an extension of the QMH.  Each module uses the same structure for messages as the QMH (cluster of command string, called &#039;&#039;Message&#039;&#039;, and data variant, called Message Data) but this time the queue is wrapped in an class called Message Queue.  The DQMH also adds external communication between asynchronously running modules by using User Events.  Adding new modules and new events are accomplished through built in scripting tools.  A stand alone tester is also created along side each module.&lt;br /&gt;
&lt;br /&gt;
When implementing this example the UI could have been part of the module. However, it seemed more correct to use a variation of the tester that was created as the UI.  In this way it shows the user event communication.  The design pattern of the tester and subsequently the UI VI is the Event Handler design pattern.&lt;br /&gt;
&lt;br /&gt;
This requires the [http://sine.ni.com/nips/cds/view/p/lang/en/nid/213286 DQMH Tools from the LabVIEW Tools Network].&lt;br /&gt;
[[File:Design Pattern Case Study - Simple Counter Module.png|center|thumb|700x700px|Simple Counter implemented using the Delacor QMH Design Pattern (Business Logic Code)]]&lt;br /&gt;
[[File:Design Pattern Case Study - Event Handler UI.png|thumb|center|700x700px|Simple Counter implemented using the Delacor QMH Design Pattern (UI Logic Code, Event Handler)]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+DQMH Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Extensible.  Extend functionality using built in scripting tools executed from the Tools Menu.&lt;br /&gt;
|Lots of auto-generated code with notes not to touch.  Accidentally editing some things could break the scripting tools. &lt;br /&gt;
|-&lt;br /&gt;
|Message creation and handling is managed via the tools.&lt;br /&gt;
|Uses strings to define Messages.&lt;br /&gt;
|-&lt;br /&gt;
|Provides a lot of in code documentation to help know how and where to modify.  &lt;br /&gt;
|It can be confusing when starting with this framework to know where to add your custom code. Be sure to follow documentation bookmarks.&lt;br /&gt;
|-&lt;br /&gt;
|Adds external messaging between modules above that of the regular QMH.  Which allows for multiple asynchronous processes.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Adds easy testing because a Tester API is created along side all modules&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
== Actor Framework ==&lt;br /&gt;
The &#039;&#039;&#039;[[Actor Framework]]&#039;&#039;&#039; design pattern is very similar to the Object-Oriented QMH.  It also uses Objects as the Messages, inheriting from a special Message Class.  The Messages also define the command (the message object itself), the data (the private data of the class), the action to carry out (the DO Method), and the way to send the message (the Send Method).  The Message Handling Loop is completely abstracted away as the Call to Parent Actor Core Method.  Main UI and the State is defined in the override of the Actor Core, shown below.&lt;br /&gt;
[[File:Design Pattern Case Study - Actor Framework.png|thumb|center|700x700px|Simple Counter implemented using the Actor Framework Design Pattern]]&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+Actor Framework Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Extensible.  It is easy to extend functionaily by adding a new child of the Message Class.&lt;br /&gt;
|Lots of files to manage.  Every message is at least three files (Class, Do Method and Send Method).&lt;br /&gt;
|-&lt;br /&gt;
|Messages contain the command (Class), the data (Class Private Data), and the action (Do Method).&lt;br /&gt;
|Difficult to debug.  Using [http://www.mooregoodideas.com/actor-framework/monitored-actor/monitored-actor-2-0/ MGIs Monitored Actor] helps.&lt;br /&gt;
|-&lt;br /&gt;
|Does not use strings to define commands.  &lt;br /&gt;
|                       If editing the method a Message is based on, it doesn&#039;t update the message.  This is fixed with [http://www.mooregoodideas.com/actor-framework/AF-Message-maker/ MGIs Improved Actor Framework Message Maker].&lt;br /&gt;
|-&lt;br /&gt;
|Similar to the OO QMH but adds external messaging between modules.  Which allows for multiple asynchronous processes.&lt;br /&gt;
|It can be confusing when starting with this framework to know where to add your custom code.&lt;br /&gt;
|-&lt;br /&gt;
|Only one communication route. External modules can send the same Messages to a module that it can send to itself.&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== QControls ==&lt;br /&gt;
This is definitely not the best use case for a QControl.  &#039;&#039;&#039;[[QControls]]&#039;&#039;&#039; are Object-Oriented replacements for XControls.  However, for science lets try it.&lt;br /&gt;
&lt;br /&gt;
Like the FGV a QControl is not a stand alone operator; therefore, it needs to be in another VI to function.  The Increment, Decrement, Amount changing, and the actual Count is handled by the QControl.  The Stop button is handled by the owning UI.  Count is updated via a User Event started by the QControl.  Under the hood its just two Event Handlers; one for the QControl and one for the owning VI.  The owning VI could be any design pattern.  The QControl should not need anything more than an Event Handler but it could probably be a QMH if necessary.&lt;br /&gt;
[[File:Design Pattern Case Study - QControl Event Handler.png|thumb|center|700x700px|QControl, Event Handler]]&lt;br /&gt;
[[File:Design Pattern Case Study - QControl Owning VI.png|thumb|center|700x700px|Owning VI, another Event Handler]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin-left: auto; margin-right: auto; border: none;&amp;quot;&lt;br /&gt;
|+QControls Pros and Cons&lt;br /&gt;
!Pros&lt;br /&gt;
!Cons&lt;br /&gt;
|-&lt;br /&gt;
|Replaces XControls&lt;br /&gt;
|It can be confusing, when starting, to know where to add your custom code.  See Help-&amp;gt;QSI-&amp;gt;QControl Toolkit Help...&lt;br /&gt;
|-&lt;br /&gt;
|Did I mention it replaces XControls?&lt;br /&gt;
|Again, not the best use case for QControls.&lt;br /&gt;
&lt;br /&gt;
[[Category:Design patterns]]&lt;br /&gt;
[[Category:Object-Oriented Programming]]&lt;br /&gt;
[[Category:Actor Framework]]&lt;br /&gt;
[[Category:QControl]]&lt;/div&gt;</summary>
		<author><name>Playerm1</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=VI_Icon&amp;diff=6054</id>
		<title>VI Icon</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=VI_Icon&amp;diff=6054"/>
		<updated>2019-03-03T17:04:09Z</updated>

		<summary type="html">&lt;p&gt;Playerm1: /* How to Make icons smaller than the entire square */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{update}}&lt;br /&gt;
&lt;br /&gt;
== VI Icon Importance ==&lt;br /&gt;
The icon you use to represent your subVI can tell you or other developers a lot about what the subVI does without ever having to open the subVI.  Taking the time to create at least simple text VI icon is a requirement when sharing code between developers.  The use of images in VI icons can also enhance their meaning when text can&#039;t be used because of length or in cases where code is shared across different spoken languages.  National Instruments keeps an [http://www.ni.com/devzone/idnet/library/icon_art_glossary.htm Icon Art Glossary] to help developers who are less experienced making easy to recognize icons.&lt;br /&gt;
&lt;br /&gt;
== How to Make icons smaller than the entire square ==&lt;br /&gt;
Sometimes it is desirable to make a LabVIEW subVI&#039;s icon smaller than the normal 32x32 pixels.  National Instruments has done this with several primitives and has made it possible for end users to make custom icons of any size for a subVI.  It is good practice to ensure that terminals used line up logically with the borders of the smaller VI created.&lt;br /&gt;
&lt;br /&gt;
Starting with a typical icon editor&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Image:Typical_icon_editor.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Clear the default icon from the 256 icon, then click on the &amp;quot;Show Terminals&amp;quot; checkbox.  Draw a box, around the terminals you wish to have displayed on your custom icon.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Image:Icon_editor_with_small_icon.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
Fill the 256 color icon with a color of your choice, as well as any words or symbols you wish to use to describe your subVI&#039;s work, then copy the subVI to the black and white icon by selecting the black and white icon and pressing the copy from 256 color button on the right.&amp;lt;br /&amp;gt;&lt;br /&gt;
[[Image:Icon_editor_with_all_small_icons.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can even make irregularly shaped icons. The white area outside will be transparent in your diagrams. Interestingly, if the border you define is not contiguous, the inside of your icon will also be transparent (you can see a wire go all the way to its connection point (visible as a little cross in the &amp;quot;show terminals&amp;quot; icon view). You can actually have multiple non-transparent areas in your icons if you wish.&lt;br /&gt;
&amp;lt;br&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; White space icon transparency is lost if a VI edited in this way is used from within a Packed Project Library (PPL) distribution.  The icon placed on a block diagram from a PPL reverts to its original 32x32 icon area with white fill in place of transparencies.  This is the case for LabVIEW IDE versions as recent as 2017 SP1.&lt;br /&gt;
&lt;br /&gt;
== Other icon tricks ==&lt;br /&gt;
===Double Click===&lt;br /&gt;
There are certain tools in the icon editor that are &amp;quot;double-clickable&amp;quot;.  Double clicking on the selection, filled box, and empty box tool icons in the editing palette will apply that tool to the entire icon square. Double clicking on the font tool will bring up a font dialog for selecting font name, size, color, justification, and style (bold, italics, etc). &lt;br /&gt;
 &lt;br /&gt;
[[Image:Double_Clickable_Icon_Editor_tools.png]]&lt;br /&gt;
&lt;br /&gt;
===Move text===&lt;br /&gt;
While typing a text into the  Icon Editor the text is movable by using the arrow keys on the keyboard.&lt;br /&gt;
&lt;br /&gt;
== Alternative Icon Editors ==&lt;br /&gt;
As of LabVIEW 8.0 a custom icon editor could be built and called from LabVIEW to edit icons of VIs.  The relevant information to replace the built in VI icon editor is available [http://forums.lavag.org/index.php?s=&amp;amp;showtopic=3320&amp;amp;view=findpost&amp;amp;p=12920 here].&lt;br /&gt;
&lt;br /&gt;
[[Category:LabVIEW fundamentals]]&lt;br /&gt;
[[Category:Calling a VI]]&lt;/div&gt;</summary>
		<author><name>Playerm1</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Tree_View&amp;diff=6053</id>
		<title>Tree View</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Tree_View&amp;diff=6053"/>
		<updated>2019-03-03T16:39:28Z</updated>

		<summary type="html">&lt;p&gt;Playerm1: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setting the icons of an ActiveX tree view control ==&lt;br /&gt;
First, create two ActiveX containers on the front panel. Place the TreeView in one and put an ImageList in the other. Second, right-click on the ImageList and bring up the editing dialog by selecting either Property Browser or ImageList|Properties (I suggest the latter). Thirdly, use the editing dialog to paste in the images you want and set any other properties. Fourthly, on the block diagram set the ImageList property of the TreeView to be the ImageList. Lastly, select the images by name or number for each Tree node.&lt;br /&gt;
&lt;br /&gt;
[[Category:User interface]]&lt;/div&gt;</summary>
		<author><name>Playerm1</name></author>
	</entry>
	<entry>
		<id>https://labviewwiki.org/w/index.php?title=Actor_Framework_is_not_as_hard_as_you_think_and_here_is_why%E2%80%A6&amp;diff=6008</id>
		<title>Actor Framework is not as hard as you think and here is why…</title>
		<link rel="alternate" type="text/html" href="https://labviewwiki.org/w/index.php?title=Actor_Framework_is_not_as_hard_as_you_think_and_here_is_why%E2%80%A6&amp;diff=6008"/>
		<updated>2019-02-13T19:37:43Z</updated>

		<summary type="html">&lt;p&gt;Playerm1: /* 3. Override the Actor Core, Pre-Launch Init, Handle Error, and Stop Core */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;by Quentin&amp;quot;Q&amp;quot; Alldredge, Q Software Innovations, LLC&#039;&#039;&amp;lt;blockquote&amp;gt;This started due to a conversation I had at a Users&#039; Group.  I stated during my presentation that the Actor Framework is not as hard as everyone makes it and that it really is just an Object-Oriented implementation of the Queued Message Handler Design Pattern (this is an oversimplification but the concepts are the same, see [[Actor Oriented Design Patterns]]).  One colleague then asked how to make the transition. Hopefully this article will answer that question. &amp;lt;/blockquote&amp;gt;&amp;lt;blockquote&amp;gt;If you are familiar with the [[Queued Message Handler|Queued Message Handler (QMH) Design Pattern]] and [[Object-Oriented Programming|Object-Oriented Programming (OOP)]] then you already know everything you need to start with [[Actor Framework]].  The purpose of this article is to show the parts of the Actor Framework that are comparable to the QMH Design Pattern and provide a step-by-step procedure for converting a QMH project to an Actor Framework project.&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Queued Message Handler (QMH) ==&lt;br /&gt;
First let’s define the basic parts of the [[Queued Message Handler|QMH Design Pattern]].&lt;br /&gt;
&lt;br /&gt;
The basic components of a QMH is:&lt;br /&gt;
* The Message Cluster&lt;br /&gt;
* The Event Handler Loop (EHL)&lt;br /&gt;
* The Message Handler Loop (MHL)&lt;br /&gt;
* A Queue to communicate Messages from the EHL to the MHL&lt;br /&gt;
* User Events to communicate back from the MHL to the EHL&lt;br /&gt;
Below is a basic program created using the QMH Design Pattern.&lt;br /&gt;
[[File:Queued Message Handler Design Pattern.png|centre|thumb|700x700px|Queued Message Handler Design Pattern]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The Message Cluster ===&lt;br /&gt;
The Message Cluster is the structure of a Message to be sent&lt;br /&gt;
from the EHL to the MHL.  The Message&lt;br /&gt;
Cluster contains two parts: &lt;br /&gt;
# something to define the Message Type (usually a string or enum)&lt;br /&gt;
# something to define the Message Data (usually a variant)&lt;br /&gt;
It is this cluster that defines the data type of the Message Queue.&lt;br /&gt;
&lt;br /&gt;
=== The Event Handler Loop (EHL) ===&lt;br /&gt;
The&lt;br /&gt;
Event Handler Loop (EHL) enqueues the Messages based on the execution UI Events&lt;br /&gt;
or User Events.  The EHL consist of a&lt;br /&gt;
standard Event Handler Design Pattern with an Event Structure and While&lt;br /&gt;
Loop.  The Event Structure could register&lt;br /&gt;
for User Events that serve as communication back from the MHL.&lt;br /&gt;
&lt;br /&gt;
=== The Message Handler Loop (MHL) ===&lt;br /&gt;
The Message Handler Loop (MHL) dequeues the Messages and executes the Message based on Message Type.  Inside of the case for the Message Type, the Message Data is unflattened accordingly and used to execute the case.&lt;br /&gt;
&lt;br /&gt;
==== EHL to MHL Communication ====&lt;br /&gt;
Communication from the EHL to the MHL is through a queue created with the Message Cluster as the data type.  This queue created in the initialization step before the EHL and MHL are started.&lt;br /&gt;
&lt;br /&gt;
==== MHL to EHL Communication ====&lt;br /&gt;
Communication from the MHL to the EHL is through one or more User Events of whatever data type is needed.  These User Events are created in the initialization step before the EHL and MHL are started.&lt;br /&gt;
&lt;br /&gt;
== Actor Framework (AF) ==&lt;br /&gt;
The Actor Framework is just the QMH without having to create your own MHL and Message Queue.&lt;br /&gt;
[[File:QMH to AF Components.png|577x577px|thumb|center|Comparison of QMH to AF Components]]&lt;br /&gt;
Your main code will exist in a Class you create and inherit from the Actor Class.  The main code exists in the Actor Core Method which is an override of the method in the parent Actor Class.&lt;br /&gt;
&lt;br /&gt;
Translating the QMH code to AF code now looks like this:&lt;br /&gt;
[[File:Design_Pattern_Case_Study_-_Actor_Framework.png|centre|thumb|700x700px|Actor Framework QMH Design Pattern]]&lt;br /&gt;
&lt;br /&gt;
=== The Message Class ===&lt;br /&gt;
The Message Cluster becomes the Message Class.  Each Message Type becomes its own class that inherits from the parent Message Class.  The Message Data becomes the Private Data of these classes.&lt;br /&gt;
&lt;br /&gt;
Message Classes includes two main methods:&lt;br /&gt;
# The Do Method contains the code executed when the Message is sent&lt;br /&gt;
# The Send Method is the code that enqueues the Message&lt;br /&gt;
&lt;br /&gt;
=== The Event Helper Loop ===&lt;br /&gt;
The EHL becomes the Event Helper Loop in the Actor Core Method.  It still enqueues Messages based on the execution UI Events or User Events and still consists of a standard Event Handler Design Pattern with an Event Structure and While Loop.  The only difference is the queue that is used.&lt;br /&gt;
&lt;br /&gt;
=== The Call to Parent Actor Core and Do Methods ===&lt;br /&gt;
Under the Hood in the Actor Framework the parent Actor Core Method consists of a loop that dequeues incoming Messages and dynamically dispatches the Do Method.&lt;br /&gt;
&lt;br /&gt;
The code in the Case Structure that would have been in the MHL becomes overridden methods in the Message Classes.  These methods are called the Do Method.  The Do Method wraps a method of the Actor Class that executes the code based on the Message.&lt;br /&gt;
&lt;br /&gt;
To enqueue a message do the following:&lt;br /&gt;
# Read the queue from the Actor Class using the built-in method “Read Self Enqueuer”&lt;br /&gt;
# Use the Send Method created for each Message to enqueue the Message&lt;br /&gt;
If updated data is sent with the Message, there will be inputs for it in the Send Methods&lt;br /&gt;
&lt;br /&gt;
=== Event Helper Loop to Parent Actor Core Communication ===&lt;br /&gt;
Communication from the Event Helper Loop to Parent Actor Core is through a queue that is created by the Actor Framework (AF).  Its data type is the parent Message Class where any child of the Message Class can also be enqueued.  The Message queue is obtained by the AF method “Read Self Enqueuer”.&lt;br /&gt;
&lt;br /&gt;
=== Parent Actor Core to Event Helper Loop Communication ===&lt;br /&gt;
Communication from the Parent Actor Core to Event Helper Loop Communication is through one or more User Events of whatever data type is needed, just like the QMH Design Pattern.  These User Events can be created in the overridden Actor Core Method before the EHL and MHL are started, or in another method called the “Pre-Launch Init” Method which is guaranteed to run before the Actor Core Method.&lt;br /&gt;
&lt;br /&gt;
== Converting QHM to AF ==&lt;br /&gt;
So now, I have a QMH Program that I want to convert to AF.  What should I do?&lt;br /&gt;
&lt;br /&gt;
Well, it is probably easier to start with AF that to convert but here are the steps to take if you were to do this:&lt;br /&gt;
&lt;br /&gt;
=== 1. Create your Actor Class ===&lt;br /&gt;
This has become significantly easier in LabVIEW 2018 (before LabVIEW 2018 view documentation).  To create an Actor simply right-click on My Computer in the Project Explorer and select &#039;&#039;&#039;New--&amp;gt;Actor&#039;&#039;&#039;.&lt;br /&gt;
[[File:QMH_to_AF_Step_1a.png|centre|thumb|314x314px|New Actor Shortcut Menu Item]]&lt;br /&gt;
Next, give your actor a name.&lt;br /&gt;
[[File:QMH_to_AF_Step_1b.png|centre|thumb|420x420px|Give Actor a Name]]&lt;br /&gt;
Select where to inherit from.  Most likely you will only have one choice unless you have other tools installed.  (I like using MGI’s Monitored Actor for debugging purposes.)&lt;br /&gt;
[[File:QMH_to_AF_Step_1c.png|centre|thumb|420x420px|Select where to inherit from.]]&lt;br /&gt;
Click OK. &lt;br /&gt;
&lt;br /&gt;
A library, class and two virtual folders will be created for you.&lt;br /&gt;
[[File:QMH_to_AF_Step_1d.png|centre|thumb|360x360px|Project after Actor is created.]]&lt;br /&gt;
&lt;br /&gt;
=== 2. Add your QMH VI and all SubVIs to the Class ===&lt;br /&gt;
Find your code for your QMH and add it to the Actor.  You can organize SubVIs later.&lt;br /&gt;
[[File:QMH_to_AF_Step_2.png|centre|thumb|360x360px|Add original code to Actor]]&lt;br /&gt;
&lt;br /&gt;
=== 3. Override the Actor Core, Pre-Launch Init, Handle Error, and Stop Core ===&lt;br /&gt;
Right-click on your Actor and select &#039;&#039;&#039;New--&amp;gt;VI for Override…&#039;&#039;&#039;&lt;br /&gt;
[[File:QMH_to_AF_Step_3a.png|centre|thumb|436x436px|Select New VI from Override Shortcut Menu Item]]&lt;br /&gt;
Select Actor Core, Pre-Launch Init, Handle Error, and Stop Core and click OK.  A VI will be created for each of these which we’ll edit in the next steps.&lt;br /&gt;
[[File:QMH_to_AF_Step_3b.png|centre|thumb|346x346px|Select VIs to Override]]&lt;br /&gt;
&lt;br /&gt;
=== 4. Edit Pre-Launch Init ===&lt;br /&gt;
Edit the Pre-Launch Init Method to add the Create User Event code.  Add the User Event references to the Actor Class Private Data so they can be bundled into the class.  The Private Data and code should look like this:&lt;br /&gt;
[[File:QMH_to_AF_Step_4a.png|centre|thumb|155x155px|Add User Event References to Class Private Data]]&lt;br /&gt;
[[File:QMH_to_AF_Step_4b.png|centre|thumb|601x601px|Create the User Event Reference and Bundle into Class]]&lt;br /&gt;
&lt;br /&gt;
=== 5. Edit Stop Core ===&lt;br /&gt;
Edit the Stop Core to send the Stop Event and close the User Event references.&lt;br /&gt;
[[File:QMH_to_AF_Step_5.png|centre|thumb|618x618px|Stop User Events in Stop Core]]&lt;br /&gt;
&lt;br /&gt;
=== 6. Add State Data to Actor Private Data ===&lt;br /&gt;
Your state data, if you have any, should be stored in the Actor and only manipulated in the Actor’s methods.&lt;br /&gt;
&lt;br /&gt;
For this example, my state data was the “Count” and was stored in a shift register in the MHL.&lt;br /&gt;
[[File:QMH_to_AF_Step_6a.png|centre|thumb|398x398px|State data in QMH]]&lt;br /&gt;
I’ll add this to my Class Private Data.&lt;br /&gt;
[[File:QMH_to_AF_Step_6b.png|centre|thumb|197x197px|Added &amp;quot;Count&amp;quot; to Class Private Data]]&lt;br /&gt;
&lt;br /&gt;
=== 7. Create the Message Methods ===&lt;br /&gt;
This might be the only real tricky part because this is the main business logic of your code.  For this example, my MHL had four cases in it:&lt;br /&gt;
# Default – for unhandled string commands (won’t be needed in the AF version)&lt;br /&gt;
# Increment – for adding amount to the number&lt;br /&gt;
# Decrement – for subtracting amount from the number&lt;br /&gt;
# Stop – stopping the MHL and sending user event to the EHL (won’t be needed in the AF version because the “Stop Core.vi” handles this)&lt;br /&gt;
So, I need to create two methods for Increment and Decrement.  These methods are almost identical.  Make sure to include “Amount” as an input in the Connector Pane.&lt;br /&gt;
[[File:QMH_to_AF_Step_7a.png|centre|thumb|579x579px|Front Panel of Increment.vi (Decrement.vi is exactly the same)]]&lt;br /&gt;
[[File:QMH_to_AF_Step_7b.png|centre|thumb|700x700px|Block Diagram of Increment.vi]]&lt;br /&gt;
[[File:QMH_to_AF_Step_7c.png|centre|thumb|700x700px|Block Diagram of Decrement.vi]]&lt;br /&gt;
These VIs perform the operation on the state data and the send a User Event to update the count in the UI.  This is exactly how the MHL cases performed.&lt;br /&gt;
&lt;br /&gt;
=== 8. Create the Messages ===&lt;br /&gt;
Creating Messages from the Increment and Decrement methods is accomplished through the Message Maker in the Tools Menu (&#039;&#039;&#039;Tools--&amp;gt;Actor Framework Message Maker&#039;&#039;&#039;,  I use MGI’s version of this tool because of the added features or better icons and the ability to update previously created messages).&lt;br /&gt;
[[File:QMH_to_AF_Step_8a.png|centre|thumb|288x288px|Message Creation Tool]]&lt;br /&gt;
In the Actor Framework Message Marker (MGI) Dialog, select the methods and click &#039;&#039;&#039;Build/Update Selected Message(s)&#039;&#039;&#039;.&lt;br /&gt;
[[File:QMH_to_AF_Step_8b.png|centre|thumb|505x505px|Select Methods to make into Messages]]&lt;br /&gt;
The Message Classes, the Do Methods, and the Send Methods will be created.&lt;br /&gt;
&lt;br /&gt;
Click “X” to close the dialog.&lt;br /&gt;
&lt;br /&gt;
=== 9. Edit the Actor Core ===&lt;br /&gt;
My Project now looks like this:&lt;br /&gt;
[[File:QMH_to_AF_Step_9a.png|centre|thumb|574x574px|Project after Messages were created.]]&lt;br /&gt;
Now it is time to create the Event Helper Loop in the Actor Core.vi.  You can copy over the EHL into the “Actor Core.vi”.  Shown below with some organization.&lt;br /&gt;
[[File:QMH_to_AF_Step_9b.png|centre|thumb|700x700px|Copying the EHL from the QMH]]&lt;br /&gt;
Now add in the Message Queue by using the AF method “Read Self Enqueuer” and add the User Event Registration.&lt;br /&gt;
[[File:QMH_to_AF_Step_9c.png|centre|thumb|700x700px|Adding Message Queue and Event registration]]&lt;br /&gt;
Next change the Message enqueuing to the Send methods of the Message Classes for the Increment and Decrement event.  For the Stop and Panel Close Events use the built-in AF method, “Send Normal Stop”.&lt;br /&gt;
[[File:QMH_to_AF_Step_9d.png|centre|thumb|700x700px|Change Increment Message Cluster to &amp;quot;Send Increment.vi&amp;quot;]]&lt;br /&gt;
[[File:QMH_to_AF_Step_9e.png|centre|thumb|700x700px|Change Stop Message Cluster to &amp;quot;Send Normal Stop&amp;quot;]]&lt;br /&gt;
&lt;br /&gt;
=== 10. Create the Launcher ===&lt;br /&gt;
An Actor cannot launch itself, so the last part of an AF project is the “Launcher.vi”.  This can be named something else and can be disguised as a splash screen or whatever.  Use the built-in AF method, “Launch Root Actor” with the “Show Actor Core Front Panel” flag set to TRUE.  Run it and everything should run as you would expect.&lt;br /&gt;
[[File:QMH_to_AF_Step_10.png|centre|thumb|124x124px|Launch Root Actor]]&lt;br /&gt;
&lt;br /&gt;
== Why use AF over QMH? ==&lt;br /&gt;
Bottomline Up Front: Extensibility, Readability, and Maintainability.&lt;br /&gt;
&lt;br /&gt;
Sure Actor Framework had it hang-ups in the beginning like:&lt;br /&gt;
* How do I find it to inherit from it?&lt;br /&gt;
* How do I create/update Messages?&lt;br /&gt;
* How do I debug AF code?&lt;br /&gt;
A lot of these problems have been solved in the newer versions of LabVIEW and in addons like the:&lt;br /&gt;
* Created Actors from the “New” Shortcut Menu Option&lt;br /&gt;
* Message Maker (AF Original or MGI’s)&lt;br /&gt;
* MGI’s Monitored Actor&lt;br /&gt;
The Main Consideration is This…&lt;br /&gt;
&lt;br /&gt;
When you start to have more that one module in an application or more operations that must happen in parallel or asynchronously then you need a more expandable framework.  The Actor Framework is made just for this purpose.  Other addon tools expand this further like MGI’s Panel Manager.&lt;br /&gt;
&lt;br /&gt;
[[Category:Design patterns]]&lt;br /&gt;
[[Category:Actor Framework]]&lt;br /&gt;
[[Category:Object-Oriented Programming]]&lt;/div&gt;</summary>
		<author><name>Playerm1</name></author>
	</entry>
</feed>