Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.052 c
4-1192181466
Dmitry S
2007-10-12 13:31
2008.06.22
Убрать кнопку с панели задач.


15-1210661850
Лимпопо
2008-05-13 10:57
2008.06.22
Учет трафика Firebird


2-1211853105
Slevin
2008-05-27 05:51
2008.06.22
Clipboard


2-1211854505
AlekseyB
2008-05-27 06:15
2008.06.22
DBGRID


3-1200847939
Ega23
2008-01-20 19:52
2008.06.22
FB + IBExpert





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