![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringGrid vs ScrollBar [D6, Win95/98]
Новичок © (2002-11-26 07:53:00)Привет всем!
Вопрос:
У меня есть StringGrid1 и есть ScrollBar1. Я хочу, чтобы StringGrid прокручивался не родным ScrollBarом, а при помощи ScrollBar1.
Новичок (2002-11-26 15:02:00) [1]>>Alx2
Спасибо попробую!
Alx2 (2002-11-26 10:46:00) [2]>Новичок (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)
SottNick (2002-11-26 09:09:00) [3]StringGrid1.ScrollBars:=ssNone;
и крути
а крутить - руки свернешь
все методы прокрутки у StringGrid"а скрыты
Song (2002-11-26 08:21:00) [4]Ловишь событие срола от TScrollBar и прокручиваешь TStringGrid