Progress does not hide (SelectByDate Command side thread)

Thanks @Leo for offering help. I tried to condense the script (SelectByDate) as much as possible while maintaining the call structure and created a button to test the behaviour. I hope this is fine :innocent:

Methods get called like this

  • OnClick (originally command entry point), progress is created from func.command.progress
  • ShowSelectionDetailsDialog hands progress object over to ...
  • QueryFileDates progress is initialized, shown and used. Afer enumeration progress.Hide() gets called but progress still is shown
  • ShowSelectionDetailsDialog tries to hide progress again, returns to ...
  • OnClick where progress gets restarted and handed over to ...
  • SelectFiles where it is shown again

When Onclick returns, the progress is finally gone.
progress.Hide() gets called in lines

  • 140
  • 32
  • 172
<?xml version="1.0"?>
<button backcol="none" display="both" label_pos="right" textcol="none">
	<label>SelectByDateSample</label>
	<icon1>#newcommand</icon1>
	<function type="script">
		<instruction>@script JScript</instruction>
		<instruction>function OnClick(clickData)</instruction>
		<instruction>{</instruction>
		<instruction>	var cmd = clickData.func.command;</instruction>
		<instruction>	var progress = clickData.func.command.progress;</instruction>
		<instruction>	progress.abort = progress.pause = true;</instruction>
		<instruction>	</instruction>
		<instruction>	var dateSelectorFunction = function(item){return item.create;};</instruction>
		<instruction>	var result = ShowSelectionDetailsDialog(clickData.func.sourcetab, dateSelectorFunction, &quot;create&quot;, progress, &quot;all&quot;, false, &quot;bydate&quot;);</instruction>
		<instruction />
		<instruction>	if(!result)</instruction>
		<instruction>		return;</instruction>
		<instruction />
		<instruction>	progress.abort = progress.pause = false;</instruction>
		<instruction>	progress.Restart();</instruction>
		<instruction>	</instruction>
		<instruction>	var filesToSelect = SelectFiles(clickData.func.sourcetab, result.selectorFunction, result.cachedDates, result.fileCount, progress);</instruction>
		<instruction>	if(filesToSelect)</instruction>
		<instruction>	{</instruction>
		<instruction>		cmd.SetFiles(filesToSelect);</instruction>
		<instruction>		cmd.RunCommand(&quot;Select FROMSCRIPT EXACT MAKEVISIBLE SETFOCUS&quot;);</instruction>
		<instruction>	}</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>function ShowSelectionDetailsDialog(tab, dateSelectorFunction, dateSource, progress, itemType, selectOnlyFromSelectedItems, defaultSelector)</instruction>
		<instruction>{</instruction>
		<instruction>	var fileQueryResult = QueryFileDates(tab, dateSelectorFunction, dateSource, progress, itemType, selectOnlyFromSelectedItems);</instruction>
		<instruction>	if(!fileQueryResult)</instruction>
		<instruction>		return null;	</instruction>
		<instruction />
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	progress.Hide(); // 2nd call HERE IT SHOULD BE GONE</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	</instruction>
		<instruction>	var dlg = DOpus.Dlg;</instruction>
		<instruction>	dlg.window = tab;</instruction>
		<instruction>		</instruction>
		<instruction>	if(fileQueryResult.validFileCount == 0)</instruction>
		<instruction>	{</instruction>
		<instruction>		dlg.message = &quot;No files found in \&quot;&quot; + tab.path + &quot;\&quot; with &apos;&quot; + dateSource + &quot;&apos; property.&quot;;</instruction>
		<instruction>		dlg.buttons = &quot;OK&quot;;</instruction>
		<instruction>		dlg.title = &quot;No files found&quot;;</instruction>
		<instruction>		dlg.Show();</instruction>
		<instruction>		return null;</instruction>
		<instruction>	}</instruction>
		<instruction />
		<instruction>	dlg.template = &quot;SelectionDetailsDialog&quot;;</instruction>
		<instruction>	dlg.detach = true;</instruction>
		<instruction>	dlg.title = &quot;How should the files be selected by &apos;&quot; + dateSource + &quot;&apos; date selector&quot;;</instruction>
		<instruction>	dlg.Create();</instruction>
		<instruction>		</instruction>
		<instruction>	</instruction>
		<instruction>	dlg.Show();</instruction>
		<instruction>	</instruction>
		<instruction>	while (true) </instruction>
		<instruction>	{</instruction>
		<instruction>        var msg = dlg.GetMsg();</instruction>
		<instruction>        if (!msg.result) </instruction>
		<instruction>			break;</instruction>
		<instruction />
		<instruction>		//Log(&quot;Msg Event = &quot; + msg.event + &quot; by &quot; + msg.control);</instruction>
		<instruction>		if (msg.event == &quot;click&quot;)</instruction>
		<instruction>		{</instruction>
		<instruction>			if(msg.control == &quot;buttonOK&quot;)</instruction>
		<instruction>			{</instruction>
		<instruction>				var selectorFunction = function(date)</instruction>
		<instruction>				{</instruction>
		<instruction>					return dateSelectorFunction(date) != null;</instruction>
		<instruction>				}</instruction>
		<instruction>				return {selectorFunction : selectorFunction, fileCount : fileQueryResult.validFileCount, cachedDates : fileQueryResult.cachedDates };</instruction>
		<instruction>			}</instruction>
		<instruction>		}</instruction>
		<instruction>	}</instruction>
		<instruction>	return null;</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>//Enumerate the dates in a specified tab</instruction>
		<instruction>function QueryFileDates(tab, dateSelector, dateSource, progress, itemType, selectOnlyFromSelectedItems)</instruction>
		<instruction>{</instruction>
		<instruction>	var path = tab.path;</instruction>
		<instruction>	var minDate = DOpus.Create.Date();</instruction>
		<instruction>	var maxDate = DOpus.Create.Date();</instruction>
		<instruction>	var dates = [];</instruction>
		<instruction>	var dateTimes = [];</instruction>
		<instruction>	var cachedDates = {};</instruction>
		<instruction>	//var files = selectOnlyFromSelectedItems ? tab.selected : tab.all;</instruction>
		<instruction>	var items = tab.all;</instruction>
		<instruction />
		<instruction>	</instruction>
		<instruction>	progress.Init(tab, &quot;Querying date information in &apos;&quot; + tab.path + &quot;&apos;&quot;);</instruction>
		<instruction>	progress.SetStatus(&quot;Querying 0/&quot; + items.count + &quot; items&quot;);</instruction>
		<instruction>	progress.SetFiles(items.count);</instruction>
		<instruction>	DOpus.Delay(200);</instruction>
		<instruction>	progress.Show();</instruction>
		<instruction>		</instruction>
		<instruction>	var processedFilesCount = 0;</instruction>
		<instruction>	var validFileCount = 0;</instruction>
		<instruction>	var fileEnum = new Enumerator(items);</instruction>
		<instruction>	while (!fileEnum.atEnd())</instruction>
		<instruction>	{</instruction>
		<instruction>		var abortState = progress.GetAbortState();</instruction>
		<instruction>	    if (abortState == &quot;a&quot;)</instruction>
		<instruction>	    {</instruction>
		<instruction>	    	return null;</instruction>
		<instruction>	    }</instruction>
		<instruction>	    else if (abortState == &quot;p&quot;)</instruction>
		<instruction>	    {</instruction>
		<instruction>	        DOpus.Delay(500);</instruction>
		<instruction>	        continue;</instruction>
		<instruction>	    }</instruction>
		<instruction />
		<instruction>		var item = fileEnum.item();</instruction>
		<instruction>		var date = dateSelector(item);</instruction>
		<instruction>		if(date)</instruction>
		<instruction>		{</instruction>
		<instruction>			if(maxDate &lt; date)</instruction>
		<instruction>				maxDate = date;</instruction>
		<instruction>			else if(date &lt; minDate)</instruction>
		<instruction>				minDate = date;</instruction>
		<instruction>			</instruction>
		<instruction>			var datePart = date.Format(&quot;D#yyyy.MM.dd&quot;)</instruction>
		<instruction>			if(!ArrayIncludes(dates, datePart))</instruction>
		<instruction>				dates.push(datePart);</instruction>
		<instruction>			</instruction>
		<instruction>			var dateTime = date.Format(&quot;D#yyyy.MM.dd T#HH:mm:ss&quot;);</instruction>
		<instruction>			if(!ArrayIncludes(dateTimes, dateTime))</instruction>
		<instruction>				dateTimes.push(dateTime);</instruction>
		<instruction>			</instruction>
		<instruction>			cachedDates[item] = date;</instruction>
		<instruction>			</instruction>
		<instruction>			validFileCount++;</instruction>
		<instruction>		}</instruction>
		<instruction>		fileEnum.moveNext();</instruction>
		<instruction>		progress.SetStatus(&quot;Querying &quot; + ++processedFilesCount + &quot;/&quot; + items.count + &quot; items (&quot; + validFileCount + &quot; items with &apos;&quot; + dateSource + &quot;&apos;)&quot;);</instruction>
		<instruction>		progress.SetFilesProgress(processedFilesCount);</instruction>
		<instruction>	}</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	progress.Hide(); // 1st call HERE IT SHOULD BE GONE</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	</instruction>
		<instruction>	dates = dates.sort();</instruction>
		<instruction>	dateTimes = dateTimes.sort();</instruction>
		<instruction>	return { minDate: minDate, maxDate: maxDate, dates: dates, dateTimes: dateTimes, validFileCount: validFileCount, cachedDates : cachedDates };</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>//Select files in source</instruction>
		<instruction>function SelectFiles(tab, selectorFunction, cachedDates, fileCount, progress)</instruction>
		<instruction>{</instruction>
		<instruction>	var selectedFilesResultVector = DOpus.Create.Vector();</instruction>
		<instruction />
		<instruction>	progress.SetStatus(&quot;Selecting 0/&quot; + fileCount + &quot; files&quot;);</instruction>
		<instruction>	progress.SetFiles(fileCount);</instruction>
		<instruction>	DOpus.Delay(200);</instruction>
		<instruction>	progress.Show();</instruction>
		<instruction>		</instruction>
		<instruction>	var processedFilesCount = 0;	</instruction>
		<instruction />
		<instruction>	for(var file in cachedDates) </instruction>
		<instruction>	{</instruction>
		<instruction>		var date = cachedDates[file];</instruction>
		<instruction>		if(selectorFunction(date))</instruction>
		<instruction>		{</instruction>
		<instruction>			//Log(&quot;Select &quot; + file);</instruction>
		<instruction>			selectedFilesResultVector.push_back(file);</instruction>
		<instruction>		}</instruction>
		<instruction>		progress.SetStatus(&quot;Selecting &quot; + processedFilesCount + &quot;/&quot; + fileCount + &quot; files&quot;);</instruction>
		<instruction>		progress.SetFilesProgress(processedFilesCount++);</instruction>
		<instruction>	}</instruction>
		<instruction>	progress.Hide();</instruction>
		<instruction>	return selectedFilesResultVector;</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>function ArrayIncludes(array, item)</instruction>
		<instruction>{</instruction>
		<instruction>	for(var i = 0; i &lt; array.length; i++)</instruction>
		<instruction>		if(array[i] == item)</instruction>
		<instruction>			return true;</instruction>
		<instruction>	return false;</instruction>
		<instruction>}</instruction>
		<instruction>==SCRIPT RESOURCES</instruction>
		<instruction>&lt;resources&gt;</instruction>
		<instruction>	&lt;resource name=&quot;SelectionDetailsDialog&quot; type=&quot;dialog&quot;&gt;</instruction>
		<instruction>		&lt;dialog fontsize=&quot;8&quot; height=&quot;98&quot; lang=&quot;english&quot; title=&quot;How should the items be selected&quot; width=&quot;287&quot;&gt;</instruction>
		<instruction>			&lt;control height=&quot;10&quot; name=&quot;radioAllItemsMatching&quot; title=&quot;All items matching&quot; type=&quot;radio&quot; width=&quot;262&quot; x=&quot;5&quot; y=&quot;4&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;10&quot; name=&quot;radioDate&quot; title=&quot;By date&quot; type=&quot;radio&quot; width=&quot;39&quot; x=&quot;5&quot; y=&quot;23&quot; /&gt;</instruction>
		<instruction>			&lt;control checked=&quot;yes&quot; height=&quot;10&quot; name=&quot;radioDateRange&quot; title=&quot;By date range&quot; type=&quot;radio&quot; width=&quot;59&quot; x=&quot;5&quot; y=&quot;41&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;10&quot; name=&quot;radioDateTimeRange&quot; title=&quot;By time range&quot; type=&quot;radio&quot; width=&quot;60&quot; x=&quot;5&quot; y=&quot;58&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDate&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;67&quot; y=&quot;21&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateStart&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;67&quot; y=&quot;39&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateEnd&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;179&quot; y=&quot;39&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateTimeStart&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;67&quot; y=&quot;56&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateTimeEnd&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;179&quot; y=&quot;56&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;14&quot; name=&quot;buttonOK&quot; title=&quot;OK&quot; type=&quot;button&quot; width=&quot;50&quot; x=&quot;179&quot; y=&quot;80&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;14&quot; name=&quot;buttonOK&quot; title=&quot;OK&quot; type=&quot;button&quot; width=&quot;50&quot; x=&quot;179&quot; y=&quot;80&quot; /&gt;</instruction>
		<instruction>			&lt;control close=&quot;0&quot; height=&quot;14&quot; name=&quot;buttonCancel&quot; title=&quot;Cancel&quot; type=&quot;button&quot; width=&quot;50&quot; x=&quot;233&quot; y=&quot;80&quot; /&gt;</instruction>
		<instruction>			&lt;control halign=&quot;left&quot; height=&quot;8&quot; name=&quot;static1&quot; title=&quot;-&quot; type=&quot;static&quot; valign=&quot;top&quot; width=&quot;4&quot; x=&quot;173&quot; y=&quot;41&quot; /&gt;</instruction>
		<instruction>			&lt;control halign=&quot;left&quot; height=&quot;8&quot; name=&quot;static2&quot; title=&quot;-&quot; type=&quot;static&quot; valign=&quot;top&quot; width=&quot;4&quot; x=&quot;173&quot; y=&quot;59&quot; /&gt;</instruction>
		<instruction>		&lt;/dialog&gt;</instruction>
		<instruction>	&lt;/resource&gt;</instruction>
		<instruction>&lt;/resources&gt;</instruction>
	</function>
</button>

I reduced it even more so its really just progress and dialog related code. The window now gets hidden but it does not seem to be related to the progress of the progress (it gets hidden even if it did not reach 100%). I'll try to investigate more.

<?xml version="1.0"?>
<button backcol="none" display="both" label_pos="right" textcol="none">
	<label>SelectByDateSample</label>
	<icon1>#newcommand</icon1>
	<function type="script">
		<instruction>@script JScript</instruction>
		<instruction>function OnClick(clickData)</instruction>
		<instruction>{</instruction>
		<instruction>	var cmd = clickData.func.command;</instruction>
		<instruction>	var progress = clickData.func.command.progress;</instruction>
		<instruction>	progress.abort = progress.pause = true;</instruction>
		<instruction>	</instruction>
		<instruction>	ShowSelectionDetailsDialog(clickData.func.sourcetab, progress);</instruction>
		<instruction />
		<instruction>	progress.abort = progress.pause = false;</instruction>
		<instruction>	progress.Restart();</instruction>
		<instruction>	</instruction>
		<instruction>	SelectFiles(clickData.func.sourcetab, progress);</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>function ShowSelectionDetailsDialog(tab, progress)</instruction>
		<instruction>{</instruction>
		<instruction>	QueryFileDates(tab, progress);</instruction>
		<instruction />
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	progress.Hide(); // 2nd call HERE IT SHOULD BE GONE</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	</instruction>
		<instruction>	var dlg = DOpus.Dlg;</instruction>
		<instruction>	dlg.window = tab;</instruction>
		<instruction>	dlg.template = &quot;SelectionDetailsDialog&quot;;</instruction>
		<instruction>	dlg.detach = true;</instruction>
		<instruction>	dlg.title = &quot;How should the files be selected by &apos;&apos; date selector&quot;;</instruction>
		<instruction>	dlg.Create();</instruction>
		<instruction>	dlg.Show();</instruction>
		<instruction>	</instruction>
		<instruction>	while (true) </instruction>
		<instruction>	{</instruction>
		<instruction>        var msg = dlg.GetMsg();</instruction>
		<instruction>        if (!msg.result) </instruction>
		<instruction>			break;</instruction>
		<instruction>		if (msg.event == &quot;click&quot;)</instruction>
		<instruction>		{</instruction>
		<instruction>			if(msg.control == &quot;buttonOK&quot;)</instruction>
		<instruction>			{</instruction>
		<instruction>				return;</instruction>
		<instruction>			}</instruction>
		<instruction>		}</instruction>
		<instruction>	}</instruction>
		<instruction>	return null;</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>//Enumerate the dates in a specified tab</instruction>
		<instruction>function QueryFileDates(tab, progress)</instruction>
		<instruction>{</instruction>
		<instruction>	progress.Init(tab, &quot;Querying date information in &apos;&quot; + tab.path + &quot;&apos;&quot;);</instruction>
		<instruction>	progress.SetStatus(&quot;Querying 0/&quot; + 100 + &quot; items&quot;);</instruction>
		<instruction>	progress.SetFiles(100);</instruction>
		<instruction>	DOpus.Delay(200);</instruction>
		<instruction>	progress.Show();</instruction>
		<instruction>		</instruction>
		<instruction>	var processedFilesCount = 0;</instruction>
		<instruction>	for(var i = 0; i &lt; 98; i++)</instruction>
		<instruction>	{</instruction>
		<instruction>		var abortState = progress.GetAbortState();</instruction>
		<instruction>	    if (abortState == &quot;a&quot;)</instruction>
		<instruction>	    {</instruction>
		<instruction>	    	return null;</instruction>
		<instruction>	    }</instruction>
		<instruction>	    else if (abortState == &quot;p&quot;)</instruction>
		<instruction>	    {</instruction>
		<instruction>	        DOpus.Delay(50);</instruction>
		<instruction>	        continue;</instruction>
		<instruction>	    }</instruction>
		<instruction />
		<instruction>		DOpus.Delay(50);</instruction>
		<instruction>		progress.SetStatus(&quot;Querying &quot; + ++processedFilesCount);</instruction>
		<instruction>		progress.SetFilesProgress(processedFilesCount);</instruction>
		<instruction>	}</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	progress.Hide(); // 1st call HERE IT SHOULD BE GONE</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction>	///////////////////////////////////////////////////</instruction>
		<instruction />
		<instruction>	return;</instruction>
		<instruction>}</instruction>
		<instruction />
		<instruction>//Select files in source</instruction>
		<instruction>function SelectFiles(tab, selectorFunction, cachedDates, fileCount, progress)</instruction>
		<instruction>{</instruction>
		<instruction>	progress.SetStatus(&quot;Selecting 0/&quot; + fileCount + &quot; files&quot;);</instruction>
		<instruction>	progress.SetFiles(100);</instruction>
		<instruction>	DOpus.Delay(200);</instruction>
		<instruction>	progress.Show();</instruction>
		<instruction>		</instruction>
		<instruction>	var processedFilesCount = 0;	</instruction>
		<instruction>	for(var i = 0; i &lt; 98; i++)</instruction>
		<instruction>	{</instruction>
		<instruction>		DOpus.Delay(500);</instruction>
		<instruction>		progress.SetStatus(&quot;Selecting &quot; + processedFilesCount);</instruction>
		<instruction>		progress.SetFilesProgress(processedFilesCount++);</instruction>
		<instruction>	}</instruction>
		<instruction>	progress.Hide();</instruction>
		<instruction>	return null;</instruction>
		<instruction>}</instruction>
		<instruction>==SCRIPT RESOURCES</instruction>
		<instruction>&lt;resources&gt;</instruction>
		<instruction>	&lt;resource name=&quot;SelectionDetailsDialog&quot; type=&quot;dialog&quot;&gt;</instruction>
		<instruction>		&lt;dialog fontsize=&quot;8&quot; height=&quot;98&quot; lang=&quot;english&quot; title=&quot;How should the items be selected&quot; width=&quot;287&quot;&gt;</instruction>
		<instruction>			&lt;control height=&quot;10&quot; name=&quot;radioAllItemsMatching&quot; title=&quot;All items matching&quot; type=&quot;radio&quot; width=&quot;262&quot; x=&quot;5&quot; y=&quot;4&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;10&quot; name=&quot;radioDate&quot; title=&quot;By date&quot; type=&quot;radio&quot; width=&quot;39&quot; x=&quot;5&quot; y=&quot;23&quot; /&gt;</instruction>
		<instruction>			&lt;control checked=&quot;yes&quot; height=&quot;10&quot; name=&quot;radioDateRange&quot; title=&quot;By date range&quot; type=&quot;radio&quot; width=&quot;59&quot; x=&quot;5&quot; y=&quot;41&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;10&quot; name=&quot;radioDateTimeRange&quot; title=&quot;By time range&quot; type=&quot;radio&quot; width=&quot;60&quot; x=&quot;5&quot; y=&quot;58&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDate&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;67&quot; y=&quot;21&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateStart&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;67&quot; y=&quot;39&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateEnd&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;179&quot; y=&quot;39&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateTimeStart&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;67&quot; y=&quot;56&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;40&quot; name=&quot;comboDateTimeEnd&quot; type=&quot;combo&quot; width=&quot;104&quot; x=&quot;179&quot; y=&quot;56&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;14&quot; name=&quot;buttonOK&quot; title=&quot;OK&quot; type=&quot;button&quot; width=&quot;50&quot; x=&quot;179&quot; y=&quot;80&quot; /&gt;</instruction>
		<instruction>			&lt;control height=&quot;14&quot; name=&quot;buttonOK&quot; title=&quot;OK&quot; type=&quot;button&quot; width=&quot;50&quot; x=&quot;179&quot; y=&quot;80&quot; /&gt;</instruction>
		<instruction>			&lt;control close=&quot;0&quot; height=&quot;14&quot; name=&quot;buttonCancel&quot; title=&quot;Cancel&quot; type=&quot;button&quot; width=&quot;50&quot; x=&quot;233&quot; y=&quot;80&quot; /&gt;</instruction>
		<instruction>			&lt;control halign=&quot;left&quot; height=&quot;8&quot; name=&quot;static1&quot; title=&quot;-&quot; type=&quot;static&quot; valign=&quot;top&quot; width=&quot;4&quot; x=&quot;173&quot; y=&quot;41&quot; /&gt;</instruction>
		<instruction>			&lt;control halign=&quot;left&quot; height=&quot;8&quot; name=&quot;static2&quot; title=&quot;-&quot; type=&quot;static&quot; valign=&quot;top&quot; width=&quot;4&quot; x=&quot;173&quot; y=&quot;59&quot; /&gt;</instruction>
		<instruction>		&lt;/dialog&gt;</instruction>
		<instruction>	&lt;/resource&gt;</instruction>
		<instruction>&lt;/resources&gt;</instruction>
	</function>
</button>

For me, the dialog does close, in terms of no longer being on the screen or taskbar.

It remains on the Jobs Bar (if it is open) until the script completes, but it does close.

Is that what you are seeing as well? Or something different?


A much more minimal repro script:

function OnClick(clickData)
{
	var tab = clickData.func.sourcetab;
	var cmd = clickData.func.command;
	var progress = cmd.progress;

	progress.Init(tab, "Test");
	progress.SetFiles(100);
	progress.Show();

	for(var i = 0; i < 100; i++)
	{
		progress.SetStatus("File " + i);
		DOpus.Delay(20);
		progress.SetFilesProgress(i);
	}
	progress.Hide();

	// Progress dialog is minimised to Jobs Bar but not completely hidden during this delay.
	DOpus.Delay(5000);
}

Your code works for me aswell. I have a now even more minimal code snippet triggering the wrong progress behaviour, but i cant track it down any further. My previous call structure did not have an effect. I tried removing different calls on progress (as GetAbortState(), SetStatus() or SetFilesProgress()) and a while and for loop, but those changes also did not have an effect.
The progress stays when the dialog gets shown. I guess that there might be a bug. Tested on 12.25.1 and 12.25.2.
image

function OnClick(clickData)
{
	var progress = clickData.func.command.progress;
	//progress.abort = progress.pause = true; //No effect
	
	var tab = clickData.func.sourcetab;
	var path = tab.path;
	var items = tab.all;
	var processedFilesCount = 0;
	var validFileCount = 0;

	//progress.Init(tab, "Querying date information in '" + tab.path + "'"); //No effect
	progress.Init(tab, "Querying date information ");
	progress.SetStatus("Querying 0/items");
	//progress.SetFiles(items.count); //No effect
	//DOpus.Delay(200); //No effect
	progress.Show();
		

	//var fileEnum = new Enumerator(items); neither while
	//while (!fileEnum.atEnd())
	
	//for (var fileEnum = new Enumerator(items); !fileEnum.atEnd(); fileEnum.moveNext() ) //nor for loop makes a difference
	for (var fileEnum = new Enumerator(items); !fileEnum.atEnd(); )
	{
		/* Also no effect
		var abortState = progress.GetAbortState();
	    if (abortState == "a")
	    {
	    	return null;
	    }
	    else if (abortState == "p")
	    {
	        DOpus.Delay(500);
	        continue;
	    }
		*/

		//progress.SetStatus("Querying " + ++processedFilesCount + "/" + items.count + " items (" + validFileCount + " items with 'create')"); //No effect
		progress.SetFilesProgress(processedFilesCount); //Also No effect
		fileEnum.moveNext();
	}

	progress.Hide(); // 1st call HERE IT SHOULD BE GONE
	progress.Hide(); // 2nd call HERE IT SHOULD BE GONE

	
	var dlg = clickData.func.Dlg; //DOpus.Dlg;
	dlg.window = tab;
	dlg.GetString("Test", "", 256, "OK", "title");
}

Dialogs will have the progress dialog as their parent so they may cause it to reappear.

I was able to hide it with a call to DOpus.Delay(1500) before progress.Hide(); then the progress disappeared. But a delay of <1000ms was too short and the progress did not disappear.
Is this recommended/intended like calling dopus delay before progress.Show()?

function OnClick(clickData)
{
	var progress = clickData.func.command.progress;
	var tab = clickData.func.sourcetab;
	var path = tab.path;
	var items = tab.all;
	var processedFilesCount = 0;
	var validFileCount = 0;

	progress.Init(tab, "Querying date information ");
	progress.SetStatus("Querying 0/items");
	DOpus.Delay(200);
	progress.Show();
	for (var fileEnum = new Enumerator(items); !fileEnum.atEnd(); )
	{
		progress.SetFilesProgress(processedFilesCount);
		fileEnum.moveNext();
	}

	//progress.Hide(); // 1st call HERE IT SHOULD BE GONE
	DOpus.Delay(1500);
	progress.Hide(); // 2nd call HERE IT SHOULD BE GONE

	var dlg = clickData.func.Dlg; //DOpus.Dlg;
	dlg.window = tab;
	dlg.GetString("Test", "", 256, "OK", "title");
}

Strange. You shouldn't ever need to use Delay.

AFAIK I saw calling delay before progress somewhere here in the forum and then I used it as my default code snippet when dealing with progress objects.
Then it sounds like a bug for me but at least there is a workaround :wink: