void __fastcall TSyncListBox::HandleVScroll(
TMessage& msg )
{
// Let the default occur
TCustomListBox::Dispatch( &msg );
// Now, sync the two if necessary
if ( pSyncBox )
pSyncBox->TopIndex = TopIndex;
}
В действительности обработка не сложная. Во-первых, вы позволяете основному списку вызвать событие как обычно - которое позволяет прокручивать список в любом направлении. Если это сделано, то вы просто заставляете синхронизируемый список прокручиваться в таком же направлении.
Нет необходимости заботится о направлении прокрутки или даже о самой прокрутке. TopIndex класса TListBox позволяет вам контролировать позицию строки, которая окажется на самом верху. Всё что не хватает в коде, это заставить синхронизировать основной список с другим.
Вам необходимо добавить в класс переменную-член представляющую другой список, и также метод, позволяющий программисту установить значений этой переменной. Этот код содержится в заголовочном файле компонента. Листинг А содержит законченный заголовочный файл класса.
Листинг A: TSyncListBox.h
//---------------------------------------------
#ifndef TSyncListBoxH
#define TSyncListBoxH
//---------------------------------------------
#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>
#include <vcl\StdCtrls.hpp>
//---------------------------------------------
class TSyncListBox : public TCustomListBox
{
private:
virtual void __fastcall HandleVScroll(
TMessage& msg );
TCustomListBox *pSyncBox;
protected:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_VSCROLL, TMessage,
HandleVScroll)
END_MESSAGE_MAP(TCustomListBox)
public:
__fastcall TSyncListBox(TComponent* Owner);
void SetSyncListBox(
TCustomListBox *pListBox )
{
pSyncBox = pListBox;
}
__published:
};
//---------------------------------------------
#endif