Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
2-1205396612
San1
2008-03-13 11:23
2008.04.06
ScrollBox


3-1195200106
Tonich
2007-11-16 11:01
2008.04.06
ADO Access


2-1205409024
dumka
2008-03-13 14:50
2008.04.06
Запросы


15-1203923348
Настёна
2008-02-25 10:09
2008.04.06
ос перезагружается?


2-1204986634
Sokolov
2008-03-08 17:30
2008.04.06
Как распечатать результат выполнения SQL запроса (одну запись)?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский