Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Вниз

Проблемы со скрулом в TListBox со стилем lbVirtual   Найти похожие ветки 

 
leonidus   (2008-09-17 21:36) [0]

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


 
KilkennyCat ©   (2008-09-17 23:30) [1]

при lbStandart имеется хранение ListBox"om строк.
в режиме lbVirtual ListBox сам строки не хранит, манипулирование ими - Ваших рук будущее дело.


 
Германн ©   (2008-09-18 00:30) [2]


> leonidus   (17.09.08 21:36)
>
> Загружаю большой объем информации в TListBox используя его
> в режиме lbVirtual.

Чтение справки не барское дело?
lbVirtual The list box is virtual, but all items are strings with the same height. You must indicate the number of items in the list box by setting the Count property. You must supply the items in the list box using an OnData event handler. If the items have associated objects, you must supply them using an OnDataObject event handler. In addition, you must supply an OnDataFind event handler to provide the mapping from the strings in the list box to their indexes.


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

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


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

Я сначало попробывал с 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 22:43) [5]

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


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

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


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

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


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

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


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

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

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


 
{RASkov} ©   (2008-09-20 16:42) [10]

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

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

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

ORD(Mes.WParamHi<>120)


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


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

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


 
{RASkov} ©   (2008-09-20 16:47) [12]

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

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

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

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


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

А ты не понял?

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


 
{RASkov} ©   (2008-09-20 16:53) [14]

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

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


 
{RASkov} ©   (2008-09-20 16:55) [15]

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

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

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

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


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

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


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

> [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 18:00) [18]


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

нехорошо )


 
GrayFace ©   (2008-09-20 18:10) [19]

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

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

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


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

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


 
{RASkov} ©   (2008-09-20 18:17) [21]

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

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


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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.046 c
2-1251976660
timekiller
2009-09-03 15:17
2009.10.25
Файл - Из консоли


15-1250886604
Юрий
2009-08-22 00:30
2009.10.25
С днем рождения ! 22 августа 2009 суббота


15-1250873687
Student
2009-08-21 20:54
2009.10.25
WIN32.INDUC - шо за такое?


1-1220027304
Afonya
2008-08-29 20:28
2009.10.25
Определение размеров страницы в Word е


6-1207567582
Real
2008-04-07 15:26
2009.10.25
FTP индикация закачки больших файлов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский