Показать сообщение отдельно
Старый 06.01.2010, 09:06   #6  
Timofey_k is offline
Timofey_k
Microsoft Dynamics
Аватар для Timofey_k
Соотечественники
Сотрудники Microsoft Dynamics
 
20 / 50 (2) ++++
Регистрация: 04.07.2006
Адрес: Sydney, Australia
Поиск по тексту - это как-то не элегантно :-)

Я для тех же целей когда-то вот такой скриптик нарисовал. Скрип строит перекрестные ссылки для всего AOT объекта (если вызван из статического метода, то только по данному методу) и для всех его предков (если объект - класс). Потом показывает сслыки в форме и фильтрует записи по названию-типу-предку выделенной переменной. Если выделения нет, то показывает все ссылки. Удобно тем, что можно быстро найти где переменная объявлена или инициализирована. Некоторый недостаток в том, что код статических методов тоже попадет в перекрестные ссылки и если названия переменных совпадут, то будут найдены лишние вхождения (при поиске по тексту естественно будет то же самое).

Наглядный пример: откройте в редакторе \Classes\InventUpd_Reservation\updateNow, выделите переменную movement и вызовите скрипт. Вхождения из \Classes\InventUpd_Reservation\updateReserveFromForm не будут относиться к выделенной переменной, но особых проблем не вызовут.

X++:
//Show cross-references, complete or filtered by selection, for a class and its super classes
#TreeNodeSysNodeType
void addIns_CrossReferencesSelected(Editor e)
{
    xRefUpdateTmpReferences     xTmpReferences = new xRefUpdateTmpReferences();
    TreeNode                    currentNode    = TreeNode::findNode(e.path());

    SysDictClass                sysDictClass;

    Args                        formRunArgs;
    FormRun                     formRun;
    FormDataSource              fds;

    xRefTmpReferences           refTable;

    xRefName                    selectedText;
    xRefPath                    currentNodePath;

    int                         startLine = e.selectionStartLine();
    int                         startCol  = e.selectionStartCol();
    int                         endCol    = e.selectionEndCol();
    ;
    if (e.selectionStartLine() == e.selectionEndLine() && startCol != endCol)
    {
        e.firstSelectedLine();
        selectedText = strLRTrim(subStr(e.getLine(), e.selectionStartCol(), endCol-startCol));
    }

    currentNodePath = currentNode.treeNodePath();
    if (currentNode.applObjectType() != UtilElementType::ClassStaticMethod &&
        currentNode.applObjectType() != UtilElementType::TableStaticMethod)
    {
        while(! currentNode.AOTObjectNode())
        {
            currentNode = currentNode.AOTparent();
        }
    }

    xTmpReferences.fillTmpxRefReferences(currentNode);

    while (currentNode && currentNode.sysNodeType() == #NT_CLASS)
    {
        sysDictClass = new SysDictClass(new SysDictClass(currentNode.applObjectId()).extend());
        currentNode  = sysDictClass ? sysDictClass.treeNode() : null;

        if (currentNode)
        {
            xTmpReferences.fillTmpxRefReferences(currentNode);
        }
    }

    formRunArgs = new Args(formstr(xRefTmpReferences));
    formRunArgs.parmObject(xTmpReferences);
    formRun     = classfactory.formRunClass(formRunArgs);
    formRun.init();

    if (selectedText)
    {
        refTable = xTmpReferences.allTmpxRefReferences();

        select firstonly refTable
            where refTable.line   == startLine
               && refTable.Column == startCol
               && refTable.name   == selectedText
               && refTable.Path   == currentNodePath;

        fds = formRun.dataSource();
        fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, Kind)).value(queryValue(refTable.Kind));
        fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, name)).value(queryValue(refTable.name));
        fds.query().dataSourceNo(1).addRange(fieldNum(xRefTmpReferences, ParentName)).value(queryValue(refTable.ParentName));

        formRun.design().caption(strfmt("Complete cross-reference for %1 '%2'", refTable.Kind, refTable.name));
    }

    formRun.run();
    formRun.detach();
}
За это сообщение автора поблагодарили: mazzy (5), alex55 (5), Kabardian (3).