Показать сообщение отдельно
Старый 12.08.2009, 17:34   #11  
Denicce is offline
Denicce
Участник
 
62 / 54 (2) ++++
Регистрация: 22.03.2005
Адрес: Москва
Вариант решения.
Писал на коленке на 3.0, перевел на 4.0

\Classes\SysImportElements\compareNodes
X++:
private boolean compareNodes(FormTreeControl _formTreeControl, FormTreeItem _formTreeItem)
{
    TreeNode                        treeNodeAOT;
    TreeNode                        treeNodeImport  = NULL;
    int                             exportId;
    int                             flag            = (#impGetCompareNode + #impKeepIds);
    boolean                         ret;
    ;

    if (_formTreeItem &&
        _formTreeItem.stateBold())
    {
        select firstonly tmpImportAot
            where tmpImportAot.TreeNodePath == _formTreeItem.data();

        if (tmpImportAot)
        {
            treeNodeAOT = infolog.findNode(tmpImportAot.TreeNodePath);
            if (treeNodeAot)
            {
                ret = true;
                exportId        = infolog.startImport(filename, flag);
                treeNodeImport  = infolog.getImportedNode(
                                        exportId,
                                        tmpImportAot.UtilFileType,
                                        tmpImportAot.UtilElementType,
                                        tmpImportAot.treeNodeName,
                                        tmpImportAot.FilePos,
                                        flag);
                ret = SysCompare::silentCompare(SysTreeNode::newTreenode(treeNodeAOT), SysTreeNode::newTreenode(treeNodeImport));

                infolog.endImport(exportId, 1);
            }
        }
    }
    return ret;
}
\Classes\SysImportElements\markDifferentObjects
X++:
public void markDifferentObjects(FormTreeControl _ftc)
{
    int idx;
    FormTreeControl     t = _ftc;
    FormTreeItem        i;
    TreeItemIdx     treeItemIdx;
    boolean checked, res;
    ;

    i = t.getItem(t.getRoot());
    SysFormTreeControl::expandTree(t, i.idx());

    while (i)
    {
        // KDV анализируем только конечные узлы дерева (листы - объекты АОТ):
        if (! strFind(i.data(), '\\', strLen(i.data()), -1))
        {
            // KDV сравниваем последний слой в АОТ и слой XPO:
            res = this.compareNodes(t, i);

            if (res)
                SysFormTreeControl::deselectedTreeItem_checkBox(t, i.idx());
            else
                SysFormTreeControl::selectedTreeItem_checkBox(t, i.idx());

            while select forUpdate firstonly tmpImportAot
                where tmpImportAot.TreeNodePath == i.data()
            {
                tmpImportAot.Import = ! res;
                tmpImportAot.update();
            }
        }
        else
            SysFormTreeControl::deselectedTreeItem_checkBox(t, i.idx());
        i = t.getItem(t.getNextVisible(i.idx()));
    }
}
\Forms\SysImportDialog\Methods\markDifferentObjects
X++:
void markDifferentObjects()
{
    ;
    sysImportElements.markDifferentObjects(AOTtree);
    tmpImportLabel_ds.executeQuery();
}
Добавляем кнопку на форму:
\Forms\SysImportDialog\Designs\Design\[Group:BottomGrp]\[ButtonGroup:ButtonGroup]\Button:MarkDifferentObjects\Methods\clicked
X++:
void clicked()
{
    element.markDifferentObjects();
}
минус - перед нажатием на кнопку нужно включить "Отобразить подробости". Да не особо шустро работает...
За это сообщение автора поблагодарили: Dron AKA andy (4), Small Den (1), Logger (5), leva (1),  (1).