Показать сообщение отдельно
Старый 19.05.2009, 13:52   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2480 (88) +++++++++
Регистрация: 20.08.2005
Для форм в тройке можно использовать такой код
X++:
#winapi
#define.VK_DOWN(0x28)
#define.VK_RIGHT(0x27)
#properties

void OpenControlInAOT()
{
    TreeNode        treeNode;
    TreeNode        treeNode1;
    int             wndHandle;
    str             name;
    FormBuildControl    contr;
    FormControl         control;
    FormBuildDesign     fbd;
    container           c;
    int                 i;
    int                 k;
    str                 s;
    Object  obj;
    ;
    obj = this.selectedControl();
    if (!obj || !SysDictClass::isEqualOrSuperclass(classIdget(obj), classNum(FormControl)))
        return;
    fbd = this.form().design();
    control = fbd.control(obj.id());

    while (control)
    {
        c += [control.name()];
        if (control.containerId())
            control = fbd.control(control.containerId());
        else
            break;
    }
    treeNode = this.form();
    treeNode = treeNode.AOTfindChild("Designs");
    treeNode = treeNode.AOTfindChild("Design");
    for (i=conlen(c);i>=1;i--)
    {
        if (!treeNode)
            break;
        treeNode1 = treeNode.AOTfirstChild();
        if (treeNode1)
        {
            s = treeNode1.AOTgetProperties();
            Name = findProperty(S,#PropertyName);
            while (treeNode1 && Name != conpeek(c, i))
            {
                treeNode1 = treeNode1.AOTnextSibling();
                if (treeNode1)
                {
                    s = treeNode1.AOTgetProperties();
                    Name = findProperty(S,#PropertyName);
                }
            }
        }
        treeNode = treeNode1;
    }
    if (!treeNode)
        return;
    s = treeNode.treeNodePath();
    s = strdel(s, strscan(s, "\\Forms\\", 1, strlen(s)), strlen("\\Forms\\"));

    wndHandle = treeNode::findNode(this.form().treeNodePath()).AOTnewWindow();

    wndHandle = winapi::getWindow(wndHandle, #GW_CHILD);
    while (wndHandle)
    {
        name = winapi::getWindowText(wndHandle);

        if (name == "TreePane")
        {
            for (i=1;i<=strlen(s);i++)
            {
                if (substr(s, i, 1) == "\\")
                {
                    winapi::sendMessageEx(wndHandle, #WM_KEYDOWN, #VK_RIGHT, 0);
                    if (i > 1)
                        winapi::sendMessageEx(wndHandle, #WM_KEYDOWN, #VK_DOWN, 0);
                }
                else
                    winapi::sendMessageEx(wndHandle, #WM_CHAR, char2num(substr(s, i, 1), 1), 0);
            }
        }
        wndHandle = winapi::getWindow(wndHandle, #GW_HWNDNEXT);
    }
}
Для формы открывается кусок ее ветки в AOT и позиционируется на выбранном контроле.
Можно повесить на какой-либо стандартный таск (к примеру, 295 - "Что это такое") в классе SysSetupFormRun этот метод, тогда можно будет использовать для любой формы
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: kashperuk (4).