Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

перемещение содержимого ScrollBox


San1 ©   (2008-03-13 14:05:00) 

Здравствуйте! Буду признателен за помощь.
Мне необходимо прокручивать содержимое скролбокса перетаскиванием содержимого зажатой клавишой мышки (пример такой реализации - программа InfarView).

Есть два варианта решения  (которые я нашел):

1 вариант. Программное изменение свойства тор и left у вложенного в скролбокс компонента:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SX := X;  // X start co-ordinate
SY := Y;  // Y start co-ordinate
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

var NX: Integer;
  NY: Integer;
begin

if not (ssLeft in Shift) then
Exit;

NX := Image1.Left + X - SX;
NY := Image1.Top + Y - SY;

if (NX < 0) and (NX > LX) then
Image1.Left := NX;

if (NY < 0) and (NY > LY) then
Image1.Top := NY;

end;

Но в результате этого автоматичечки изменяются диапазоны полос прокруток(range), что в моем случае неприемлемо.

2 вариант. Программного изменения свойства positions у скролбаров, как раз то что мне нужно:

procedure TMineScrollPole.MouseDownInPole(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button<>mbMiddle then Exit;
FOldX:=X; FOldY:=Y;

end;

procedure TMineScrollPole.MouseMoveInPole(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin

if not (ssMiddle in Shift) then Exit;

HorzScrollBar.Position:=HorzScrollBar.Position+(FOldX-X); FOldX:=X;
VertScrollBar.Position:=VertScrollBar.Position+(FOldY-Y); FOldY:=Y;

end;

Все работает, но возникает проблемма с тем, что скролы при перетаскивании начинают дико дрожать. Подскажите пожалуйста как от этого избавиться.


San1   (2008-03-13 15:00:00) [1]

Спамить больше не буду.
Спасибо за пример, буду разбираться.

Путь решения примерно ясен. Т.е., собрать новый компонент из ТPaintBox и два TScrollControls, получиться некое подобие TScrollBox, только меньше ресурсов ест.


{RASkov}   (2008-03-13 14:53:00) [2]

Спамить не хорошо
http://www.delphimaster.ru/forums.shtml#ruleпункт 7
http://www.delphimaster.ru/cgi-bin/forum.pl?n=18&id=1205396612


Наверх

Титульная страница Поиск, карта сайта Написать письмо