Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.16;
Скачать: CL | DM;

Вниз

Поменять LVItems с наименьшими временными затратами...   Найти похожие ветки 

 
MTsv DN ©   (2007-01-23 14:16) [0]

Всем привет...

Дан ListView. Число колонок 4. Необходимо поменять местами две строки, естесссна все 4 колонки.

Первое, что пришло в голову:
procedure SwapLVItems(i, j : Integer);
var
 temp0, temp1, temp2, temp3 : KOLString;
begin
 temp0 := Form1.lv.LVItems[ i, 0 ];
 temp1 := Form1.lv.LVItems[ i, 1 ];
 temp2 := Form1.lv.LVItems[ i, 2 ];
 temp3 := Form1.lv.LVItems[ i, 3 ];
 Form1.lv.LVItems[ i, 0 ] := Form1.lv.LVItems[ j, 0 ];
 Form1.lv.LVItems[ i, 1 ] := Form1.lv.LVItems[ j, 1 ];
 Form1.lv.LVItems[ i, 2 ] := Form1.lv.LVItems[ j, 2 ];
 Form1.lv.LVItems[ i, 3 ] := Form1.lv.LVItems[ j, 3 ];
 Form1.lv.LVItems[ j, 0 ] := temp0;
 Form1.lv.LVItems[ j, 1 ] := temp1;
 Form1.lv.LVItems[ j, 2 ] := temp2;
 Form1.lv.LVItems[ j, 3 ] := temp3;
end;

Однако время смены оставляет желать лучшего... Может у кого-нибудь есть более конструктивные предложения???


 
Vladimir Kladov   (2007-01-23 15:37) [1]

BeginUpdate / EndUpdate - пробовали? Примерно то же самое, что положить поверх листвью окно без всякой отрисовки и стирания на время смены, и по завершения скрыть. И есть еще виртуальный список.


 
MTsv DN ©   (2007-01-23 19:27) [2]

> BeginUpdate / EndUpdate - пробовали? Примерно то же самое, что положить поверх листвью окно без всякой отрисовки и стирания на время смены, и по завершения скрыть.
Да мне, в принципе, и не нужно отображение LV.

> И есть еще виртуальный список.
Это Вы про PList???


 
MTsv DN ©   (2007-01-23 19:43) [3]

> > И есть еще виртуальный список.
> Это Вы про PList???

Сделал на PList. Реально быстрее. Спасибо за подсказку. Теперь от ЛистВью вообще можно избавиться...


 
MTsv DN ©   (2007-01-23 20:22) [4]

> Сделал на PList. Реально быстрее. Спасибо за подсказку. Теперь от ЛистВью вообще можно избавиться...

Владимир, посмотрите, пожалуйста проект:
http://www.uus4u.com/download/other/quicksort_plist.rar
Из-за чего "косяк"??? Может я где-то что-то не так делаю???


 
Vladimir Kladov   (2007-01-23 20:46) [5]

не, я сегодня уже пас.

Под виртуальным листвью я имел именно виртуальный листвью. См. MSDN и OnData, lvoOwnerData. Раз вам не надо отображать, зачем использовать контролы? Это же маразм... По крайней мере в винде точно.


 
ANTPro ©   (2007-01-23 22:30) [6]

> [0] MTsv DN ©   (23.01.07 14:16)

Вот код который поменяет 2 колонки в ListView:
procedure TForm1.btnQClick(Sender: PObj);
var
 i: integer;
 iCount: Integer;
 lpiArray: array[0..128] of integer;// Хватит
begin
 QuickSortPList(0, VB.Count - 1);

 for i := 0 to Max do
 begin
   lv.LVItemAdd("");
   lv.LVItems[lv.LVCount - 1, 0] := PDataList(VB.Items[i]).First;
   lv.LVItems[lv.LVCount - 1, 1] := PDataList(VB.Items[i]).Second;
   lv.LVItems[lv.LVCount - 1, 2] := PDataList(VB.Items[i]).Third;
   lv.LVItems[lv.LVCount - 1, 3] := PDataList(VB.Items[i]).Fourth;
 end;

 iCount := lv.LVColCount;
 SendMessage(lV.Handle, LVM_GETCOLUMNORDERARRAY, iCount, Integer(@lpiArray));
 i := lpiArray[0];
 lpiArray[0] := lpiArray[3];
 lpiArray[3] := i;
 SendMessage(lV.Handle, LVM_SETCOLUMNORDERARRAY, iCount, Integer(@lpiArray));
end;


 
MTsv DN ©   (2007-01-23 22:42) [7]

> array[0..128] of integer;// Хватит
К сожалению, нет... До 100000 элементов...

Но я уже разобрался с PList... Всем спасибо... Сортировка занимает всего несколько секунд...

2 ANTPro ©
Кстати, косяк не здесь был... Этот код, что Вы привели, только для отслеживания правильности сортировки... "Косяк" был в процедуре сортировки и в при заполнении PList...


 
ANTPro ©   (2007-01-23 23:03) [8]

> [7] MTsv DN ©   (23.01.07 22:42)

Чем не устраивает PStrList ?


> [7] MTsv DN ©   (23.01.07 22:42)
> Этот код, что Вы привели


> [6] ANTPro ©   (23.01.07 22:30)
> поменяет 2 колонки в ListView:


 
Vladimir Kladov   (2007-01-24 15:22) [9]

уже все, смотреть не надо?

Кстати, что касается сортировки, которую я сделал в KOL. Похоже, она кривоватая. И есть случаи, когда тормозит неимоверно по сравнению с простым QSort, например, если массив(список) большой, но состоит из очень небольшого числа одинаковых значений. В других случаях практически не опережает. Наверное, надо вернуться к классике, как считаете?


 
MTsv DN ©   (2007-01-24 20:16) [10]

> уже все, смотреть не надо?
Да... Сам разобрался. Неправильно заполнял PList, отсюда и "косяк"...

> Наверное, надо вернуться к классике, как считаете?
Если, честно... Я начал писать "свою" сортировку, вот из-за какого "недоразумения".

program test;

uses KOL;

var
Form, LV, Button : PControl;

procedure OnClickCol( Dummy : Pointer; Sender: PControl; Idx: Integer);
begin
LV.LVSortColumn(Idx);
end;

procedure OnClick_( Dummy : Pointer; Sender: PControl);
var
i : integer;
begin
Randomize;
for i := 0 to 99 do
 begin
  LV.LVItemAdd("");
  LV.LVItems[ LV.LVCount - 1, 0] := int2str(Random(100));
  LV.LVItems[ LV.LVCount - 1, 1] := int2str(Random(100));
  LV.LVItems[ LV.LVCount - 1, 2] := int2str(Random(100));
 end;
// LV.LVOptions := [lvoSortAscending];
end;

begin
Form := NewForm(nil, "").SetSize(250, 250);
Form.CenterOnParent;
LV := NewListView(Form, lvsDetail, [ lvoRowSelect, lvoSortAscending ], nil, nil, nil ).SetSize(245, 200);
LV.LVColAdd("Col1", taLeft, 70);
LV.LVColAdd("Col2", taLeft, 70);
LV.LVColAdd("Col3", taLeft, 70);
LV.OnColumnClick := TOnLVColumnClick(MakeMethod(nil, @OnClickCol));
Button := NewButton(Form, "Click").SetAlign(caBottom);
Button.OnClick := TOnEvent(MakeMethod(nil, @OnClick_));
Run(Form);
end.

При таком раскладе (раскомментировано выделенное lvoSortAscending)... заполнение LV невозможно!!! Попробуйте сами... А если его заккомментировать и раскомментировать строку LV.LVOptions := lvoSortAscending];, то все в порядке, и заполнение возможно и сортировка...но это я только щас до этого дошел :(

Пробовал сделать "свою" сортировку на KOL.SortData. Проигрыш по сравнению с "классическим" QuickSort есть, чем больше элементов, тем он (проигрыш) значимее...


 
MTsv DN ©   (2007-01-24 20:34) [11]

> Проигрыш по сравнению с "классическим" QuickSort есть, чем больше элементов, тем он (проигрыш) значимее...
Правда, проигрыш заметен на очень большом числе элементов. А так результаты практически равны...

> Наверное, надо вернуться к классике, как считаете?
Может сделать 2е сортировки??? Хотя бы в следующих версиях, а потом уже выбрать та которая больше "прижилась"...


 
Vladimir Kladov   (2007-01-24 20:36) [12]

LVItemAdd / LVItemInsert возвращают индекс вставленного элемента. Так что все возможно.



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

Текущий архив: 2007.09.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
2-1187608348
yaJohn
2007-08-20 15:12
2007.09.16
размер nchar поля в MSSQL


1-1183888184
hgd
2007-07-08 13:49
2007.09.16
Сохранить как картинку


1-1183551722
Bel
2007-07-04 16:22
2007.09.16
Запустить службу в Vista


2-1188151129
hprx
2007-08-26 21:58
2007.09.16
ListBox


1-1183989165
Inna_Z
2007-07-09 17:52
2007.09.16
Пропадают точки в письмах :-)