Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
10 / 7 / 3
Регистрация: 14.07.2015
Сообщений: 284
1

Как синхронно прокручивать два скроллбокса?

16.08.2016, 09:31. Просмотров 1170. Ответов 4


Можно ли отловить какое-то событие прокручивания TScrollBox?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2016, 09:31
Ответы с готовыми решениями:

Одним скроллом прокручивать два TextBox
Привет форумчане! я новичек в программировании и мне нужна ваша помощь) вообщем пишу обучающую...

Как управлять прокрутками скроллбокса тачпадом?
Обычный ноут, с функцией вертикальной/горизонтальной прокрутки тачпадом. В моей программе -...

Как прокручивать форму
Допустим я переместил кнопку за форму command1.left=50000 на форме ее уже не видно как теперь...

Как прокручивать текст в TextBox
как связать textbox и scroll,чтоб если в textbox выводилось много информации можно было ее...

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30856 / 20179 / 7873
Регистрация: 22.10.2011
Сообщений: 35,036
Записей в блоге: 6
16.08.2016, 10:03 2
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Класс-перехватчик перед классом формы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
uses ..., LMessages;
type
  { TScrollBox }
  TScrollExEvent = procedure(Sender: TObject; var ScrollPos: Integer) of object;
  TScrollBox = class(Forms.TScrollBox)
  strict private
    FOnVScroll: TScrollExEvent;
    FOnHScroll: TScrollExEvent;
  protected
    procedure WMHScroll(var Message : TLMHScroll); message LM_HScroll;
    procedure WMVScroll(var Message : TLMVScroll); message LM_VScroll;
    procedure DoHScroll(var aScrollPos: integer);
    procedure DoVScroll(var aScrollPos: integer);
  published
    property OnVScroll: TScrollExEvent read FOnVScroll write FOnVScroll;
    property OnHScroll: TScrollExEvent read FOnHScroll write FOnHScroll;
  end;
 
// дальше идет класс формы без изменений
  { TForm1 }
  TForm1 = class(TForm)
  // ...
 
 
// реализация методов после Implementation
{ TScrollBox }
procedure TScrollBox.WMHScroll(var Message: TLMHScroll);
begin
  inherited;
  DoHScroll(Message.Pos);
end;
 
procedure TScrollBox.WMVScroll(var Message: TLMVScroll);
begin
  inherited;
  DoVScroll(Message.Pos);
end;
 
procedure TScrollBox.DoHScroll(var aScrollPos: integer);
begin
  if Assigned(FOnHScroll) then FOnHScroll(Self, aScrollPos);
end;
 
procedure TScrollBox.DoVScroll(var aScrollPos: integer);
begin
  if Assigned(FOnVScroll) then FOnVScroll(Self, aScrollPos);
end;
Ну, и в классе формы добавляешь:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  TForm1 = class(TForm)
  // этой секцией рулит Лазарус
  private
    { private declarations }
  public
    { public declarations }
    procedure MakeVScroll(Sender: TObject; var ScrollPos: Integer); // Вот это !!!
  end;
 
// ...
procedure TForm1.FormCreate(Sender: TObject);
begin
  // связываем между собой оба ScrollBox-а и назначаем им обработчики OnVScroll
  // если нужно - то по той же схеме можно реализовать и обработку горизонтальной прокрутки
 
  ScrollBox1.OnVScroll := @MakeVScroll;
  ScrollBox2.OnVScroll := @MakeVScroll;
  ScrollBox1.Tag := PtrInt(ScrollBox2);
  ScrollBox2.Tag := PtrInt(ScrollBox1);
end;
 
// собственно, самое главное:
procedure TForm1.MakeVScroll(Sender: TObject; var ScrollPos: Integer);
var box : TScrollBox;
begin
  box := Sender as TScrollBox;
  TScrollBox(box.Tag).VertScrollBar.Position := box.VertScrollBar.Position; // выставляем одинаковые позиции
end;
Вот и все... Ничего сложного.
1
10 / 7 / 3
Регистрация: 14.07.2015
Сообщений: 284
16.08.2016, 11:35  [ТС] 3
volvo, а как работает данный механизм:
Delphi
1
2
3
ScrollBox1.Tag := PtrInt(ScrollBox2);
...
TScrollBox(box.Tag)
Добавлено через 33 секунды
Цитата Сообщение от volvo Посмотреть сообщение
Вот и все... Ничего сложного.
ага, как же))
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30856 / 20179 / 7873
Регистрация: 22.10.2011
Сообщений: 35,036
Записей в блоге: 6
16.08.2016, 12:17 4
Цитата Сообщение от ПраПрапорщик Посмотреть сообщение
а как работает данный механизм
У каждого компонента есть свойство Tag, которое может использоваться программистом для собственных нужд (мало ли что понадобится с компонентом связать. Так вот можно всю нужную информацию занести в класс, а указатель на экземпляр класса, хранящий нужные данные, занести в Tag, и использовать потом по мере надобности). Вот я и использую: если мне нужно при прокрутке первого скроллбокса автоматически прокручивать второй, и наоборот, значит, я запоминаю в ScrollBox1.Tag указатель на ScrollBox2, и, соответственно, в ScrollBox2.Tag - указатель на ScrollBox1. Но просто так указатель в целочисленное свойство я записать не могу, Паскаль - строго типизированнный язык, он такого не пропустит. Значит, нужно явное преобразование указателя к типу PtrInt. Вот тебе и ответ на первый вопрос.

А потом - наоборот, мне нужно из целочисленного свойства получить хранящееся там значение, да не просто так, а в виде указателя на TScrollBox, который я туда и записывал. Вот и обратное преобразование: TScrollBox(box.Tag) пригодилось.

Я же говорю, что тут ничего сложного.
1
10 / 7 / 3
Регистрация: 14.07.2015
Сообщений: 284
16.08.2016, 15:06  [ТС] 5
Цитата Сообщение от volvo Посмотреть сообщение
запоминаю в ScrollBox1.Tag указатель на ScrollBox2
вот понятно
Цитата Сообщение от volvo Посмотреть сообщение
обратное преобразование: TScrollBox(box.Tag)
вот что меня смутило. странно как целочисленное tag можно просто привести к tscrollbox. Спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2016, 15:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как вызываются слоты? Синхронно или асинхронно?
Здравствуйте, товарищи! Возник такой вопрос: Например, у меня в файле есть 2 слота... Они будут...

Как программно прокручивать текст в RichTextBox
Есть RichTextBox, нужно сделать 2 метода (или объединить в один) ScrollUp и ScrollDown. Первый...

WPF. Как правильно прокручивать DataGrid
Всем добрый день. У меня в окне такая структура контролов: Window Grid с тремя строками: два...

Как синхронно по дате создания извлекать данные из firestore в RV?
Нужно расположить данные от новых к старым. + нужно размещать 50 элементов RV на одной странице, а...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.