-
Здравствуйте! Буду признателен за помощь. Мне необходимо прокручивать содержимое скролбокса перетаскиванием содержимого зажатой клавишой мышки (пример такой реализации - программа 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;
Все работает, но возникает проблемма с тем, что скролы при перетаскивании начинают дико дрожать. Подскажите пожалуйста как от этого избавиться.
-
-
Спамить больше не буду. Спасибо за пример, буду разбираться.
Путь решения примерно ясен. Т.е., собрать новый компонент из ТPaintBox и два TScrollControls, получиться некое подобие TScrollBox, только меньше ресурсов ест.
|