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

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

Проблемы со скрулом в TListBox со стилем lbVirtual [D6, WinXP]


Страницы:   1 2

leonidus ©   (2008-09-17 21:36:00) 

Загружаю большой объем информации в TListBox используя его в режиме lbVirtual. Все отлично, кроме того, что после загрузки данных в компоненте перестает работать вертикальный скрул колесом мыши, хотя при стиле lbStandard все нормально. Что тут можно сделать?


leonidus   (2008-09-20 19:49:00) [1]

Не надо ссорится, ORD(Mes.WParamHi<>120) решило проблему. Господину {RASkov} отдельная благодарность!


{RASkov}   (2008-09-20 18:17:00) [2]

> [20] GrayFace ©   (20.09.08 18:11)
> соответственно понятный код лучше.

Ну я не против, только "понятный" - наверное у всех по разному :)


GrayFace   (2008-09-20 18:11:00) [3]

ой, уже ответили.
{RASkov}, скорости тут не нужно, соответственно понятный код лучше.


GrayFace   (2008-09-20 18:10:00) [4]

Только не SB_TOP и SB_BOTTOM, а SB_LINEUP и SB_LINEDOWN.

Д С   (20.09.08 16:50) [13]
Читая  ORD(Mes.WParamHi<>120) нужно открывать документацию, как минимум, чтобы понять, что должно произойти

Как минимум, документацию и Windows.pas на нужных константах.


Д С   (2008-09-20 18:00:00) [5]


> если посмотреть их значения

нехорошо )


{RASkov}   (2008-09-20 17:16:00) [6]

> [16] Д С   (20.09.08 17:00)

Тогда уж лучше так:
 if Mes.WParamHi=120 then ListBox1.Perform(WM_VSCROLL, SB_LINEUP, 0)
   else ListBox1.Perform(WM_VSCROLL, SB_LINEDOWN, 0)

(возможно опять перепутал SB_LINEUP и SB_LINEDOWN, но не в этом суть)
Но тут видим, если посмотреть их значения(SB_LINEUP и SB_LINEDOWN), то это тоже самое, что и у меня, только одной строчкой.
Ну и где понятнее? :)


Д С   (2008-09-20 17:00:00) [7]

Вполне ясно, что в качестве wparam передается, в отличии от твоего способа


{RASkov}   (2008-09-20 16:55:00) [8]

> [13] Д С   (20.09.08 16:50)
> А ты не понял?
>
> Читая  ORD(Mes.WParamHi<>120) нужно открывать документацию,
> как минимум, чтобы понять, что должно произойти

т.е. хочешь сказать, что читая

> ORD(Mes.WParamHi=120)*SB_TOP + ORD(Mes.WParamHi=-120)*SB_BOTTOM

не нужно никакой документации, ибо все как дважды два?
:о) Ужасно :)


{RASkov}   (2008-09-20 16:53:00) [9]

> [13] Д С   (20.09.08 16:50)
> А ты не понял?

Честно? Вообще что-то ничего не понял :(
Толи ты специально голову автору морочишь, чтоб он вник в суть и читал хэлп, толи сам запутался и предлогаешь фик знает что...
Мне как-то понятнее когда меньше всяких вычислений делать, а тут:
ORD(Mes.WParamHi=120)*SB_TOP + ORD(Mes.WParamHi=-120)*SB_BOTTOM
не сразу и сообразишь, а я вообще нифика не понял :(
:о)


Д С   (2008-09-20 16:50:00) [10]

А ты не понял?

Читая  ORD(Mes.WParamHi<>120) нужно открывать документацию, как минимум, чтобы понять, что должно произойти


{RASkov}   (2008-09-20 16:47:00) [11]

> [11] Д С   (20.09.08 16:46)
> Ужасно? Я бы сказал понятно.

Сам же не понял, что написал

> Если направление не поменяется, поменяй местами SB_TOP и SB_BOTTOM

а говоришь понятно :)


Д С   (2008-09-20 16:46:00) [12]


> {RASkov} ©   (20.09.08 16:42) [10]

Ужасно? Я бы сказал понятно.


{RASkov}   (2008-09-20 16:42:00) [13]

> [9] Д С   (20.09.08 16:12)

Как все ужасно :)

> замени
> ORD(Mes.WParamHi=120)
> на

ORD(Mes.WParamHi <>120)


Д С   (2008-09-20 16:12:00) [14]

замени
ORD(Mes.WParamHi=120)
на
ORD(Mes.WParamHi=120)*SB_TOP + ORD(Mes.WParamHi=-120)*SB_BOTTOM

Если направление не поменяется, поменяй местами SB_TOP и SB_BOTTOM


leonidus   (2008-09-20 16:03:00) [15]

ок, а с чем тогда связано неверное направление скроллинга?


Д С   (2008-09-20 15:25:00) [16]

ORD(Mes.WParamHi=120)
Если то что в скобках истина, то орд=1, если ложь, то орд=0


leonidus   (2008-09-20 15:13:00) [17]

{RASkov} а что за заначение передается здесь " ORD(Mes.WParamHi=120)" ?
Дело в том, что код работает, только вот скрулинг происходит в противоположенную сторону, т.е. кручу колесо на себя, а текст едет вверх.


leonidus   (2008-09-19 22:43:00) [18]

большое спасибо, попробую


{RASkov}   (2008-09-19 22:35:00) [19]

Я сначало попробывал с Count=10000 все скролилось замечательно, и уж было хотел написать, что все нормально работает, но решил еще ноль добавить и да, скрол пропал... Разбираться особо не стал из-за чего это, но вот попробуй так:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   procedure ListBox1Data(Control: TWinControl; Index: Integer; var Data: String);
   procedure FormCreate(Sender: TObject);
 private
   OldWndProc: TWndMethod;
   procedure NewWndProc(var Mes: TMessage);
   { Private declarations }
 public
   { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ListBox1.Style:=lbVirtual;
 ListBox1.Count:=100000{000};//и 100000000 тоже работает :)
 OldWndProc:=ListBox1.WindowProc;
 ListBox1.WindowProc:=NewWndProc;
end;

procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer; var Data: String);
begin
 Data:='Item № '+IntToStr(Index);
end;

procedure TForm1.NewWndProc(var Mes: TMessage);
begin
 if Mes.Msg <> WM_MOUSEWHEEL then OldWndProc(Mes) else
  ListBox1.Perform(WM_VSCROLL, ORD(Mes.WParamHi=120), 0);
end;

end.

Всё бы вам хуки :)


leonidus   (2008-09-19 21:43:00) [20]

Так всетаки как же получить событие скрула, что неужели с хуком заморачиваться?


Страницы:   1 2

Наверх

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