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

Вниз

Обмен значениями элементов ListView   Найти похожие ветки 

 
DancerMan   (2007-11-13 10:05) [0]

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

Для обмена значениями элементов 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;


 
DVM ©   (2007-11-13 18:36) [1]


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

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


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


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

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


 
DVM ©   (2007-11-14 11:25) [3]


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

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;


 
ЮЮ ©   (2007-11-14 11:27) [4]

Причина - созданный, но не включенный в 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;


 
DancerMan ©   (2007-11-14 11:48) [5]

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


 
KSergey ©   (2007-11-14 18:02) [6]

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



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

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

Наверх




Память: 0.48 MB
Время: 0.017 c
15-1210168260
тимохов
2008-05-07 17:51
2008.06.22
Как передать кавычку в параметрах командной строки?


1-1194937505
DancerMan
2007-11-13 10:05
2008.06.22
Обмен значениями элементов ListView


15-1210713441
^-k2-^
2008-05-14 01:17
2008.06.22
А я их знаю :)


2-1211911307
AXL
2008-05-27 22:01
2008.06.22
копирование картинки из ворда в буфер...


15-1210461071
Basis
2008-05-11 03:11
2008.06.22
Как лучше сделать классу интерфейс?