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

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

Обмен значениями элементов ListView [D7, WinXP]


DancerMan ©   (2007-11-13 10:05:00) 

Всем доброе утро!

Для обмена значениями элементов ListView использую классическую процедуру (см. ниже).
ViewStyle:=vsReport;
CheckBoxes:=true;
Проблема в том, что если для i-ого item-а checked=false, то после выполнения процедуры ExchangeItems происходит инвертирование checked. Т.е. у всех элементов, у которых checked было true значение checked становится равным false.
А у i-ого item-а checked становится равным true. Если же у i-ого item-а checked было равным true, то все работает корректно.

Вопрос:Какие изменения нужно внести, что б процедура работала корректно с отмеченными и неотмеченными элементами?

procedure ExchangeItems(lv: TListView; const i, j: Integer);
var
 tempLI: TListItem;
begin
 lv.Items.BeginUpdate;
 try
   tempLI := TListItem.Create(lv.Items);
   tempLI.Assign(lv.Items.Item[i]);
   lv.Items.Item[i].Assign(lv.Items.Item[j]);
   lv.Items.Item[j].Assign(tempLI);
   tempLI.Free;
 finally
   lv.Items.EndUpdate
 end;
end;


KSergey   (2007-11-14 18:02:00) [1]

А я бы лично ручками все свойства во временные переменные подходящих типов покопировал и оттуда перенес.
А то как-то создавать временно лишний Item...


DancerMan   (2007-11-14 11:48:00) [2]

ЮЮ закрыл тему.
Спасибо!


ЮЮ   (2007-11-14 11:27:00) [3]

Причина - созданный, но не включенный в Items  TListItem. При присвоении такому пункту, например Caption, включаются виндовозные механизмы. А винда, похоже, не согласна, что некий TListItem считает себя частью ListView. По крайней мере, после tempLI.Assign(lv.Items.Item[i]); у всех абсолютно ListItem-ов Checked сбрасывается в False. (может это и не винды, а VCL, - не углублялся), а не "инвертирование checked", как тебе показалось.

Однако, если временный TListItem создавать как элемент листвью, то такого не происходит:

procedure ExchangeItems(lv: TListView; const i, j: Integer);
var
tempLI: TListItem;
begin
lv.Items.BeginUpdate;
try
  tempLI := lv.Items.Add;  tempLI.Assign(lv.Items.Item[i]);
  lv.Items.Item[i].Assign(lv.Items.Item[j]);
  lv.Items.Item[j].Assign(tempLI);
  lv.Items.Delete(lv.Items.Count - 1);finally
  lv.Items.EndUpdate
end;
end;


DVM   (2007-11-14 11:25:00) [4]


> Никаких нареканий нигде не было, пока сам не обнаружил.

tempLI := TListItem.Create(lv.Items);
try
 tempLI.Assign(lv.Items.Item[i]);
 lv.Items.Item[i].Assign(lv.Items.Item[j]);
 lv.Items.Item[j].Assign(tempLI);
finally
 tempLI.Free;
end;


DancerMan   (2007-11-14 10:05:00) [5]


> где ж ты эту классику нарыл то?

Изначально в Delphi World нашел, и потом неоднократно в ин-ете встречал.
Никаких нареканий нигде не было, пока сам не обнаружил.
Вроде бы все логично - сделано по аналогии обмена значениями между двумя переменными через третью. Но, похоже, особенности TListItem не учтены.


DVM   (2007-11-13 18:36:00) [6]


> использую классическую процедуру (см. ниже).

где ж ты эту классику нарыл то?


Наверх

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