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

Вниз

Поменять 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 вся ветка

Форум: "KOL";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.043 c
9-1159867542
codent
2006-10-03 13:25
2007.09.16
Как делать игры


15-1187766946
koha
2007-08-22 11:15
2007.09.16
Все ли GSM устройства имеют аймиай?


15-1187354276
_andrews_
2007-08-17 16:37
2007.09.16
Установить компоненты FastScript под .NET


15-1187613383
pasha_golub
2007-08-20 16:36
2007.09.16
SYN flood: как побороть?


2-1187544827
Bast
2007-08-19 21:33
2007.09.16
Криптовщик





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