![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обмен значениями элементов 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]
> использую классическую процедуру (см. ниже).
где ж ты эту классику нарыл то?