Текущий архив: 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.48 MB
Время: 0.05 c