Форум: "Основная";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];
ВнизОбмен значениями элементов 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c