Сейчас 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.