Главная страница
    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.037 c
15-1209750409
AEN
2008-05-02 21:46
2008.06.22
Лисп


15-1210504788
Nucer
2008-05-11 15:19
2008.06.22
Определения и сохранение изменений файла


2-1211656476
SiAVeL
2008-05-24 23:14
2008.06.22
Вообще не знаю Delphi помогите пожалуйста.


11-1190286937
Robt
2007-09-20 15:15
2008.06.22
PBitmap


2-1212043089
TUserClass
2008-05-29 10:38
2008.06.22
ЗаDisabl ить все формы кроме одной





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