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

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

Две проблемки с TStringList [D5, Win95/98]


Страницы:   1 2 3

MegaVolt ©   (2005-01-10 16:32:00) 

Есть 2 проблемы при исспользовании TStringList:
1. При изменении размеров колонок автоматически происходит сортировка :( Как можно этого избежать?
Вот код:

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
 x1,y1:integer;
begin
 StringGrid1.MouseToCell(x,y,x1,y1);
 if y1=0
   then
     case x1 of
       1:Displ.Sort(SortName);
       2:Displ.Sort(SortSize);
       3:Displ.Sort(SortPath);
     end;
 UpdateDispl;
end;


2. Прокрутка колёсиком работает по разному в зависимости от того загружен драйвер мыши или нет. А так же от типа драйвера :( В одном случае прокрутка работает так как нужно в другом по StringGrid бежит полоска выделения :( Пользователи жалуются а как убрать я не знаю :( Может кто посодействует?

Заранее благодарен :)


MegaVolt   (2005-01-14 09:00:00) [1]

Упс... Это справка платная. Но EhGrid на сайте пока не нашел :(


MegaVolt   (2005-01-14 08:59:00) [2]

Какой дополнитеьный код? Одну птичку переключить?
EhLib денежек хочет. Зачем мне платить за то что есть в стандартной поставке и летает как самолёт?


MegaVolt   (2005-01-14 08:59:00) [3]

Какой дополнитеьный код? Одну птичку переключить?
EhLib денежек хочет. Зачем мне платить за то что есть в стандартной поставке и летает как самолёт?


Erik1   (2005-01-13 10:25:00) [4]

А в чем проблема, разумеется можно добовлять и отображать что добавлено. При этом пользоватся лучше EhGrid www.EhLib.com при этом решение абсолютно стандартное и всем понятное, нетребующее написания дополнительного кода. А MemDataSet можно любой выбирать, есть очень скоростные варианты.


MegaVolt   (2005-01-12 18:38:00) [5]

Короче от мерцания избавился так:
Вначале выставляю количество элементов очень большое (100000) далее добавляю элементы так
j:=Displ.Add(tRec);
if ((j-1)>=ListView1.TopItem.Index) and ((j-1)<=ListView1.TopItem.Index+ListView1.VisibleRowCount) then ListView1.UpdateItems(j-1,j);
и всё :) Красота да и только :) Скорость офигенная.
Доделаю пойду сишников дразнить :):)

begin...endограмадное вам спасибо за то что научили такой класной вещи :) Теперь придётся все проги так переделывать ведь не выдержу :):)


MegaVolt   (2005-01-12 17:52:00) [6]

А во время добавления будет можно просматривать то что уже добавлено?


Erik1   (2005-01-12 17:46:00) [7]

Помоему лучше найденые записи кидать в TMemTableEh и отображать все через тотже EhGrid. При большом количестве значений это самый удобный метод.


MegaVolt   (2005-01-12 17:35:00) [8]

Ищутся файлы совпадающие с условием. Т.е.
if Rec.Name='*.avi' then отобразить
Само собой проверка условия не так сделана ;) Сам поиск вылизан круче некуда. Программеры на си пока не в состоянии сделать быстрее. А вот с интерфейсом я проигрываю :(
Сделал так если добавляемый элемент лежит на экране то вызываю invalidate или Repain один фиг. Пока заполняется первый экран моргает безумно :( А путь вы верный дали. Мне очень понравилось. Осталось поправить мелкие баги.


begin...end   (2005-01-12 17:28:00) [9]

> [35] MegaVolt ©   (12.01.05 17:25)

Так ищутся файлы или записи в файле? Код можно увидеть?

Хотя в обоих случаях поиск может быть долгим, конечно.

Я Вас, наверное, по неверному пути повёл.


MegaVolt   (2005-01-12 17:25:00) [10]

Прога ищет в файле с 2милионами записей. Каждая запись 1 файл найденый в локалке с инфой о нём. Поиск по маске в этом файле занимает около минуты :(


begin...end   (2005-01-12 17:14:00) [11]

> MegaVolt

А чего у Вас там за поиск? Почему так долго? Может, тоже ускорить можно? :-)


MegaVolt   (2005-01-12 17:11:00) [12]

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


MegaVolt   (2005-01-12 15:10:00) [13]

Я бы тоже отказался но пользователи жаждют. Пролистывают они мышью. Т.е. нужно сделать так чтобы добавление шло в фоне и юзверь этого не замечал. Т.е. он бы мог работать с результатами поиска с самых первых строк.


begin...end   (2005-01-12 14:50:00) [14]

> [29] MegaVolt ©   (12.01.05 14:21)
> [30] MegaVolt ©   (12.01.05 14:30)

Скроллировать можно с помощью метода TListView.Scroll, например:

ListView.Scroll(0, {высота одного item'а} * (ListView.Items.Count - 1))

Но я бы отказался от идеи отображения результатов в процессе поиска.


MegaVolt   (2005-01-12 14:30:00) [15]

если ListView1.Items.Count задать достаточно большим то вроде всё нормально но пока не прокрутишь первая страница не видна :(


MegaVolt   (2005-01-12 14:21:00) [16]

При каждом ListView1.Items.Count := ItemsCount; прыгает на самое начало :( Пролистать не даёт :(


begin...end   (2005-01-12 13:48:00) [17]

> [27] MegaVolt ©   (12.01.05 13:36)

> как сделать так чтобы при добавлении пользователь мог просматривать
> то что уже добавлено

Устанавливайте значение свойства TListView.Items.Count в нужное, т.е. делайте его равным текущему количеству найденных элементов. Только не слишком часто.


MegaVolt   (2005-01-12 13:36:00) [18]

Обязательно посмотрю. Заодно если не сложно подскажите как сделать так чтобы при добавлении пользователь мог просматривать то что уже добавлено. Т.к. процесс поиска занимает до пару минут пользоваетель мог бы уже просматривать то что найдено.


begin...end   (2005-01-12 13:30:00) [19]

> [25] MegaVolt ©   (12.01.05 12:37)

> 1. Почему если рисовать стандартными средствами ListView
> отображение на порядок медленнее?

В обычном ListView содержатся данные обо всех элементах. Виртуальный ListView, напротив, самих элементов не содержит: он хранит только данные об их количестве, текущем выделении и т.д. Другими словами, виртуальный список не является контейнером данных- данные хранятся в другом месте (например, в TList или массиве, которые с ListView никак не связаны).

Когда возникает необходимость отобразить какой-то элемент (например, при показе списка или его прокручивании), срабатывает обработчик события OnData - там мы узнаём, какиеэлементы в данный момент нужно отобразить, и указываем, чтонужно отображать.

Подчеркну: в OnData запрашивается информация не обо всехэлементах (их может быть очень много), а только о тех, которые нужно прорисовать сейчас(ведь обычно в списке одновременно видны всего 20-30 элементов), - отсюда и прирост производительности.

Более того, используя список в виртуальном режиме, мы получаем ещё ряд приятных возможностей. Например, непосредственно перед срабатыванием обработчика OnData сработает обработчик OnDataHint. В него тоже передаётся диапазон индексов элементов, которые сейчас надо показать. Так вот - этот обработчик можно использовать для подготовки(например, обновления) данных перед показом - опять же, не всехданных, а только тех, которые нужны сейчас.

> 2. Как вы нашли этот способ.

Посмотрел справку по свойству OwnerData, а затем - пример из Delphi.

См. в справке: TListView.[OnData, OnDataFind, OnDataHint].
И обязательно посмотрите пример: {Delphi}\Demos\Virtual Listview.


MegaVolt   (2005-01-12 12:37:00) [20]

Блеск :):) Я в полном восторге :) ListView в 35 раз быстрее!!!
Если не сложно теперь пару вопросов:
1. Почему если рисовать стандартными средствами ListView отображение на порядок медленнее?
2. Как вы нашли этот способ. Я лично до сих пор считал что OwnerDraw нужно для каких то моих способов отрисовки и сообтветственно OwnerData для чего то сильно навороченного и отличного от вывода простого текста.

Большушая вам благодарность вы мне очень помогли :)


Страницы:   1 2 3

Наверх

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