Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизScrollBox Найти похожие ветки
← →
San1 (2008-03-13 11:23) [0]Здравствуйте! Буду признателен за помощь.
Мне необходимо прокручивать содержимое скролбокса перетаскиванием содержимого зажатой клавишой мышки (пример такой реализации - программа 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;
Все работает, но возникает проблемма с тем, что скролы при перетаскивании начинают дико дрожать. Подскажите пожалуйста как от этого избавиться.
← →
Джо © (2008-03-13 11:28) [1]А ScrollBox.ScrollBy пробовал?
← →
San1 (2008-03-13 12:54) [2]метод ScrollBy передвигает содержимое скролбокса с всеми его компонентами, т. е. тор и left содержащегося в скролбоксе компонента меняются. Мне нужно чтобы сам компонент оставался на месте.
← →
{RASkov} © (2008-03-13 14:29) [3]> метод ScrollBy
Этот метод вообще никуда ничего не двигает... просто перерисовывает канву со смещением...
> [0] San1 (13.03.08 11:23)
> но возникает проблемма с тем, что скролы при перетаскивании
> начинают дико дрожать
Здесь так происходит из-за неоптимальной реализации алгоритма MouseMoveInPole.... я тебе привел это в качестве примера и предупредил, что нужно еще думать, а не тупо копировать...
А вообще я бы сделал по другому: GraphicControl(TPaintBox) без TScrollBox"a ...рисовал бы на нем текущую видимую часть поля... хочешь могу демо-проект тебе кинуть с перетаскиванием картинки по форме в определенной области...
← →
{RASkov} © (2008-03-13 14:32) [4]> [0] San1 (13.03.08 12:54)
http://webfile.ru/1800625
← →
{RASkov} © (2008-03-13 14:49) [5]> Этот метод вообще никуда ничего не двигает... просто перерисовывает
> канву со смещением...
что-то я погорячился :)
← →
San1 (2008-03-13 15:10) [6]Спасибо за пример, буду разбираться.
Путь решения примерно ясен. Т.е., собрать новый компонент из ТPaintBox и два TScrollControls, получиться некое подобие TScrollBox, только меньше ресурсов ест.
Но вот только один момент. Под содержимым скролбокса я имел в виду компонент (наследник ТGraphicControl), который реагирует на события мыши.
Если будет отрисовываться "мертвая картинка" (т.е., часть изображения компонента), как мне отслеживать все необходимые события.
← →
{RASkov} © (2008-03-13 15:20) [7]> [6] San1 (13.03.08 15:10)
> Но вот только один момент. Под содержимым скролбокса я имел
> в виду компонент (наследник ТGraphicControl), который реагирует
> на события мыши.
> Если будет отрисовываться "мертвая картинка" (т.е., часть
> изображения компонента), как мне отслеживать все необходимые
> события.
?... Ничего не понял... :( сорри
← →
{RASkov} © (2008-03-13 15:24) [8]Наверное понял :)
Обрати внимание на заголовок формы в демке которую я кинул.
Там есть X и Y Так вот если текущие координаты мыши к ним прибавить, то и получаться глобальные координаты на поле(картинке).....
ну события все как обычно :)
← →
San1 (2008-03-13 15:27) [9]компонент который был помещен в скролбокс как я говорил это поле игры морской бой, т.е. клетки (они подсвечиваются при наведении на них курсора мыши и реагируют на нажатие)...
Действительно, я наверно больше рассуждаю, надо попробывать.
← →
San1 (2008-03-13 15:29) [10]Да действительно, зря я запониковал.
Спасибо большое, буду пробовать.
← →
San1 (2008-03-13 15:48) [11]Бывают же "чудеса"...
Моя вина, потому-что просто тупо скопировал Ваш код и не подумал.
Там оказалисть две лишние строчки, из-за которых скролы и дрожали при перетаскивании.
-----------------------------------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);
VertScrollBar.Position:=VertScrollBar.Position+(FOldY-Y);
FOldX:=X;
FOldY:=Y;
end;
--------------------------------------
← →
{RASkov} © (2008-03-13 16:48) [12]> [11] San1 (13.03.08 15:48)
> Бывают же "чудеса"...
Ну вот видешь.... это как говорится: -"Дело было не в бабине..." ;)
Одно дело "накидать пример за пять минут" - другое дело в нем разобраться)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c