Показать сообщение отдельно
Старый 27.12.2010, 10:27   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,430 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Синхронизация двух гридов
Подниму ка я в очередной раз давнюю тему синхронизации двух гридов.
Итак, имеем два грида связанных с одним источником данных. Общий источник данных обеспечивает синхронность выделения соответствующих строк, но не гарантирует сохранение взаимного расположения выделенных строк друг на против друга. Т.е. синхронизация данных есть (а это на мой взгляд самое главное), не хватает всего лишь синхронизации их отображения. Для этого достаточно отловить событие прокрутки одного грида и в нём прокрутить второй грид. что может быть проще . Тут у меня возникли непонятные трудности с перехватом события #WM_VSCROLL при помощи formRun.installMessageProc(). Пока сделал синхронизацию через таймер.
X++:
void timer()
{
    #WinAPI
    int NewPos = WinAPI::getScrollPos(Grid1.hWnd(), #SB_VERT);
    ;

    if (NewPos != pos)
    {
        pos = NewPos;

        WinAPI::setScrollPos(Grid2.hWnd(), #SB_VERT, pos, true);
        WinAPI::sendMessageEx(Grid2.hWnd(), #WM_VSCROLL, (pos << 16) | #SB_THUMBTRACK, 0);
        WinAPI::sendMessageEx(Grid2.hWnd(), #WM_VSCROLL, (pos << 16) | #SB_THUMBPOSITION, 0);
    }

    this.setTimeOut(identifierstr(timer), #delay, false);
}
Если кто подскажет как можно поймать #WM_VSCROLL, буду очень признателен.

P.S.: Делал на AX2009
За это сообщение автора поблагодарили: Ace of Database (3).