Текущий архив: 2002.12.05;
Скачать: CL | DM;
Вниз
StringGrid vs ScrollBar Найти похожие ветки
← →
Новичок (2002-11-26 07:53) [0]Привет всем!
Вопрос:
У меня есть StringGrid1 и есть ScrollBar1. Я хочу, чтобы StringGrid прокручивался не родным ScrollBarом, а при помощи ScrollBar1.
← →
Song © (2002-11-26 08:21) [1]Ловишь событие срола от TScrollBar и прокручиваешь TStringGrid
← →
SottNick © (2002-11-26 09:09) [2]StringGrid1.ScrollBars:=ssNone;
и крути
а крутить - руки свернешь
все методы прокрутки у StringGrid"а скрыты
← →
Alx2 © (2002-11-26 10:46) [3]>Новичок (26.11.02 07:53)
вот часть описания класса формы TForm1:
TForm1 = class(TForm)
............
.........
ScrollBar1: TScrollBar; // Тот, чем будем крутить
StringGrid1: TStringGrid; // То, что будем крутить
public
{ Public declarations }
SaveProc: TWndMethod; // Переменная для хранения старого обработчика сообщений ScrollBar
procedure MakeScroll(var Mesg: TMessage); // Новый обработчик сообщений для ScrollBar
end;
//////////////////
Теперь за дело:
procedure TForm1.FormCreate(Sender: TObject); // Прежде всего подменим родной обработчик сообщений для ScrollBar
begin
SaveProc := ScrollBar1.WindowProc; // Запоминаем старье в переменной для хранения старого обработчика сообщений ScrollBar
ScrollBar1.WindowProc := MakeScroll; // Назначаем на работу наш собственный обработчик сообщений
end;
procedure TForm1.MakeScroll(var Mesg: TMessage);
// наш собственный обработчик сообщений. Он будет обрабатывать сообщения для ScrollBar
var SI: TScrollInfo;
Posted: TWMVScroll;
begin
SaveProc(Mesg); // Сначала позволим ScrollBarу сохранить стандартное поведение
if Mesg.msg = SBM_SETSCROLLINFO then // Если нас скроллируют, то мы - непротив
begin
SI := PScrollInfo(Pointer(Mesg.LParam))^; // Смотрим как именно нас скроллируют
if si.fMask and SIF_POS <> 0 // Если меняется положение ползунка то рассказываем о сем событии нашему StringGrid
then
begin
Posted.Msg := wm_Vscroll; // Готовим почту для грида - говорим что сейчас мы тебя проскроллируем
Posted.ScrollBar := 0; // "Анонимное" скроллирование (пусть думает, что это его собственный скроллбар достает)
Posted.ScrollCode := SB_THUMBPOSITION; // Говорим, что ползунок у нас переехал на нгекоторую позицию
Posted.Pos := SI.nPos; // Говорим на какую именно позицию переехал ползунок
with TMessage(Posted) do // Шлем посылку гриду
StringGrid1.Perform(Msg, wParam, lParam);
end;
end;
end;
PS
Проверил. Все работает.
PPS
Конечно, вместо грида можно воткнуть все, что умеет скроллироваться (обрабатывать сообщение WM_VScroll)
← →
Новичок (2002-11-26 15:02) [4]>>Alx2
Спасибо попробую!
Страницы: 1 вся ветка
Текущий архив: 2002.12.05;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.022 c