Как вариант, в ClassDeclaration формы добавляется какой-либо флаг, например, переменная isSelected
В методе mouseDblClick (или прочих) дерева анализируем, выбрана ли конечная запись или родительская. Если выбрана конечная, то isSelected устанавливаем в true и closeSelect
А в closeSelect вызываем супер только если isSelected установлена в true. Кроме того, в canClose так же анализируем эту переменную.
В качестве примера:
Это в дереве:
X++:
public int mouseDblClick(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
{
int ret;
ret = super(_x, _y, _button, _Ctrl, _Shift);
element.selectItem();
return ret;
}
Все остальное в element
X++:
void selectItem()
{
str ret;
;
ret = this.selectedItem();
if (isSelected)
{
this.closeSelect(ret);
}
}
X++:
str selectedItem()
{
FormTreeItem item;
TMTable_OVK locTMTable;
AssLevelType_OVK levelType;
str result = '';
;
if (tree.visible())
{
item = tree.getItem(tree.getSelection());
locTMTable = TMTable_OVK::find(item.data());
}
else
{
locTMTable.data(TMTable);
}
levelType = locTMTable.TMLevelType;
if (levelType == AssLevelType_OVK::Children || (levelType == AssLevelType_OVK::ParentGroup && allowSelectGroup))
{
isSelected = true;
result = locTMTable.TMId;
}
return result;
}
X++:
public void closeSelect(str _selectString)
{
;
if (isSelected)
{
super(_selectString);
}
}
X++:
public boolean canClose()
{
boolean ret;
;
ret = super();
return ret && isSelected;
}
X++:
public int task(int _taskId)
{
#TASK
int ret;
ret = super(_taskId);
if (_taskId == #TASKENTER)
{
this.selectItem();
}
return ret;
}
Код не очень причесанный, но работает.