Показать сообщение отдельно
Старый 22.08.2007, 08:12   #4  
AxDude is offline
AxDude
Участник
 
18 / 10 (1) +
Регистрация: 04.03.2005
Адрес: USA, Cincinnati, Ohio.
Сейчас FormTableControl сортируется по клику на любом заголовке столбца.
Правда, с некоторыми ограничениями: порядок сортировки только ascending, и растягивание столбцов не поддерживается. Но поскольку юзера полностью этим удовлетворились, то время тратить не стал.

Речь шла о форме Active Directory Import Wizard (SysUserADUserImportWizard) в 4.0, англ. версия.
Идея примерно такая:
1. Устанавливаем MessageProc для каждого заголовка столбцов. Здесь UserDetailsTable - это имя FormTableControl'а.

X++:
#define.WM_LBUTTONDOWN                  (0x0201)
    HWnd    tempHwnd;
    int         hdl;
     . . .
    headerHwnd =  winapi::getWindow(UserDetailsTable.hWnd(), #GW_CHILD);
    if (headerHwnd)
    {
       tempHwnd = headerHwnd;
       while (tempHwnd)
       {
          tempHwnd = winapi::getWindow(tempHwnd, #GW_HWNDNEXT);
          hdl = element.installMessageProc(#WM_LBUTTONDOWN,  tempHwnd, 'tableControlMessageProc');
       }
    }
2. Метод tableControlMessageProc - некая заглушка в нужном формате. Все попытки объявить здесь переменные приводили к рестарту Аксапты.

X++:
static int tableControlMessageProc() 
{
    element.sortTableControl();
    return 0;
}
3.В методе sortTableControl отслеживаем мышиные клики (координаты заголовков столбцов можно получить с помощью winapi::GetWindowRect() ) и смотрим, попадают ли они в заголовок столбца. Собственно сортировка сделана с помощью RecordSortedList.