![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы со скрулом в TListBox со стилем lbVirtual [D6, WinXP]
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]Так всетаки как же получить событие скрула, что неужели с хуком заморачиваться?