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

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

ListView с внешним скролом


Gu ©   (2010-10-31 17:03:00) 

На форме валяются ListView1 (из вкладки Win32) и ScrollBar1 (из стандартных компонент - вкладка Standart)

ListView заполняется 300и итемами от балды (в режиме просмотра list (с нижним скроллбаром)). Скроллбар отключаю через ShowScrollBar(ListView1.Handle, SB_HORZ, FShowHoriz); на листвиеве он пропадает.

Теперь вопрос: как прикрутить управление внешнего ScrollBar1 к ListView1?
Т.е. если я допустим кладу на форму кнопку и в ее клике пишу listview1.Scroll(-1,0); - то список скролится вверх и listview1.Scroll(1,0); - вниз. А как узнать текущую позицию скрола чтобы привязать к Scrollbar1.position - у Listview'a не вижу свойств про скролинг - типа макс\мин\куррент позитион

Т.е. надо чтобы листвиев скролился этим внешним скролбаром и соблюдались бы проц. отношения его бегунка относительно позиции в листвиеве при перемещении по списку.

Спасибо.


Gu   (2010-11-01 19:23:00) [1]

зеркало на всякий случай http://rapidshare.com/files/428325009/LvSt.zip


Gu   (2010-11-01 19:22:00) [2]

вот исходник (8кб)
http://files.mail.ru/XRN4WQ

1. заполняем
2. бегаем по списку стрелками - все ок, скролинг изменяется
3. изменяем скролинг маусом - скролин окна изменяется, а скролинг списка не происходит :(

помогите доделать плз!


Gu   (2010-10-31 22:36:00) [3]

да, помогло, спасиба

но терь не работает (вернее работает, но не так) обратная:

LPSCROLLINFO.fmask:=SIF_ALL;
getscrollinfo(form1.scrollbar1.Handle,SB_CTL,LPSCROLLINFO);
setscrollinfo(form1.listview1.Handle,SB_HORZ,LPSCROLLINFO,true);

при изменении скролбара1 список не скролится, а если у листвиева не отключать скрол, то при изменении скролбара1 видно, что бегунок у листвиевовского скрола ползает аналогично скролбару1, но при этом скролинга самого списка не происходит.
интересно что при form1.Caption:=..распечатка значений.. при изменении скролбара1 мышкой значение позиции nTrackPos=0, а изменяется только если с клавы вправо-влево двигать кнопками..
как быть?

p.s. вы мне специально по одной идейке подкидываете, чтобы больше думал? ;)


clickmaker   (2010-10-31 20:33:00) [4]


> а почему не работает
>
> setscrollinfo(form1.ScrollBar1.Handle,SB_HORZ,LPSCROLLINFO,
> true);

SB_CTL?


Gu   (2010-10-31 20:17:00) [5]

кстати маска может еще быть fmask:=SIF_ALL;

интересна, а почему не работает

setscrollinfo(form1.ScrollBar1.Handle,SB_HORZ,LPSCROLLINFO,true);

если вставить ее вместо

form1.ScrollBar1.Min:=LPSCROLLINFO.nMin;
form1.ScrollBar1.Max:=LPSCROLLINFO.nMax;
form1.ScrollBar1.Position:=LPSCROLLINFO.nTrackPos;

ведь значения правильные передаются?


Gu   (2010-10-31 19:16:00) [6]

угу, зафурычило, спасибо!

Procedure GSi;
var LPSCROLLINFO:tSCROLLINFO;
Begin
FillChar(LPSCROLLINFO,SizeOf(LPSCROLLINFO),0);
LPSCROLLINFO.cbsize:=SizeOf(LPSCROLLINFO);
LPSCROLLINFO.fmask:=SIF_RANGE+SIF_TRACKPOS;
getscrollinfo(form1.listview1.Handle,SB_HORZ,LPSCROLLINFO);
form1.ScrollBar1.Min:=LPSCROLLINFO.nMin;
form1.ScrollBar1.Max:=LPSCROLLINFO.nMax;
form1.ScrollBar1.Position:=LPSCROLLINFO.nTrackPos;
form1.Caption:=inttostr(LPSCROLLINFO.nTrackPos)+' '+inttostr(LPSCROLLINFO.nMin)+' '+inttostr(LPSCROLLINFO.nmax);
End;


clickmaker   (2010-10-31 19:11:00) [7]


> а все сразу оно запросить не может?

а про битовые операции слышали?


Gu   (2010-10-31 19:04:00) [8]

ааа.. дошло.
LPSCROLLINFO.fmask:=SIF_RANGE; надо ставить для min-max запроса.

блин, а все сразу оно запросить не может?


Gu   (2010-10-31 19:04:00) [9]

ааа.. дошло.
LPSCROLLINFO.fmask:=SIF_RANGE; надо ставить для min-max запроса.

блин, а все сразу оно запросить не может?


clickmaker   (2010-10-31 19:01:00) [10]

внимательней читай страничку по сцылке


Gu   (2010-10-31 18:59:00) [11]

добавил

FillChar(LPSCROLLINFO,SizeOf(LPSCROLLINFO),0);
LPSCROLLINFO.cbsize:=SizeOf(LPSCROLLINFO);
LPSCROLLINFO.fmask:=SIF_TRACKPOS;
getscrollinfo(listview1.Handle,SB_HORZ,LPSCROLLINFO);
form1.Caption:=inttostr(LPSCROLLINFO.nTrackPos)+' '+inttostr(LPSCROLLINFO.nMin)+' '+inttostr(LPSCROLLINFO.nmax);

nTrackPos отображается верно, а min-max = 0

где нетак?


clickmaker   (2010-10-31 18:27:00) [12]

cbSize
   UINT

   Specifies the size, in bytes, of this structure. The caller must set this to sizeof(SCROLLINFO).


Gu   (2010-10-31 18:14:00) [13]

так не работает, может не так юзаю?

procedure TForm1.ScrollBar1Change(Sender: TObject);
var LPSCROLLINFO:tSCROLLINFO;
begin
form1.Caption:=inttostr(scrollbar1.Position);
getscrollinfo(scrollbar1.Handle,SB_HORZ,LPSCROLLINFO);
setscrollinfo(listview1.Handle,SB_HORZ,LPSCROLLINFO,true);
end;


Gu   (2010-10-31 17:59:00) [14]

...мм, сложновато.. :_(
можно кусок кода на дельфях в качестве примера?


clickmaker   (2010-10-31 17:55:00) [15]

http://msdn.microsoft.com/ru-ru/library/bb787583.aspx


Наверх

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