Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

Перемещение Item ов в TListView, как?   Найти похожие ветки 

 
reer   (2003-07-11 13:20) [0]

Казалось бы ничего не должно быть проще, НО просто не получается.
Ситуация: есть кнопки Вверх, Вниз, которые должны перемещать выделенный итем в списке именно TListView. Есть у кого-нибудь идеи? (Или я пропусил какой-то готовый метод для этого)


 
reer   (2003-07-11 13:41) [1]

Это что, так сложно что ли?
В общем-то есть идеи - запоминать во временных переменных, к сожалению не TListItem, поскольку их хрен сделаешь независимыми от того же ListView"а, но неужели нельзя проще ничего придумать?


 
mrcat   (2003-07-11 13:57) [2]

>к сожалению не TListItem, поскольку их хрен сделаешь
>независимыми от того же ListView"а,

откуда такие сведения???

procedure ListMove(const aItem, bItem: Integer);
var
ItemIdx: Integer;

begin
with LstView, Items do
begin
BeginUpdate;
Add;
ItemIdx := Pred(Count);
Item[ItemIdx] := Item[aItem];
Item[aItem] := Item[bItem];
Item[bItem] := Item[ItemIdx];
Delete(ItemIdx);
EndUpdate;
end;
end;


Надеюсь, комментарии не нужны?


 
reer   (2003-07-12 00:29) [3]

>mrcat © (11.07.03 13:57)
Проверить смогу к сожалению только в понедельник, но сразу вижу
1. Мерцание будет в табличке как минимум
2. А представьте себе, если строк несколько, тогда чистая цветомузыка :)))

Я написал код, по-громозже он конечно, но за-то работает стабильно (как в общем-то и думал): через временные переменные
сначала запоминаю, потом удаляю, затем вставляю сразу все строки


 
Fenik   (2003-07-12 00:46) [4]

procedure TListForm.UpBtnClick(Sender: TObject);
var s: string;
i: Integer;
begin
i := List.ItemIndex;
if i > 0 then begin
s := List.Items[i];
List.Items[i] := List.Items[i - 1];
List.Items[i - 1] := s;
List.ItemIndex := i - 1;
end;
end;

procedure TListForm.DownBtnClick(Sender: TObject);
var s: string;
i: Integer;
begin
i := List.ItemIndex;
if i < List.Items.Count - 1 then begin
s := List.Items[i];
List.Items[i] := List.Items[i + 1];
List.Items[i + 1] := s;
List.ItemIndex := i + 1;
end;


 
Fenik   (2003-07-12 00:48) [5]

Это был пример для TListBox.


 
Германн   (2003-07-12 01:46) [6]

2 reer (12.07.03 00:29)
А чем обоснована твоя уверенность в
"1. Мерцание будет в табличке как минимум"?


 
Spawn   (2003-07-12 05:14) [7]

А почему не сделать ImageList1.Replace()???


 
b-Ars   (2003-07-14 12:17) [8]

>Fenik © (12.07.03 00:46) спасибо, что-то типа этого и пришлось делать

>Германн © (12.07.03 01:46)
А вы попробыйте ради интереса :)))

>Spawn © (12.07.03 05:14)
Это не ImageList с ним-то как раз и нет проблем, впрочем как и с TListBox"ом Replace тут просто напросто нет

В общем вот код кнопки Down, кому интересно:

procedure TFrm_Main.Act_DownExecute(Sender: TObject);
Var
i, Count, Idx: Integer;
TmpItems: array of MyTmpItem;
CurrItm: TListItem;
begin
If (List_RunList.Selected=nil) then Exit;
//Если находимся на последней строке Выходим
If (List_RunList.Selected.Index=List_RunList.Items.Count-1) then Exit;

Count:=List_RunList.SelCount;

//Если находимся на последней строке для нескольких строк Выходим
If (List_RunList.Selected.Index+Count=List_RunList.Items.Count) then Exit;

//И если выбрана хоть одна строка
If not (Count=0) then
Begin
List_RunList.Items.BeginUpdate;
SetLength(TmpItems, Count);
Idx:=List_RunList.Selected.Index;
//Вырезаем строки
For i:=0 to Count-1 do
Begin
TmpItems[i].Caption:=List_RunList.Items.Item[Idx+i].Caption;
TmpItems[i].IconIndex:=List_RunList.Items.Item[Idx+i].ImageIndex;
TmpItems[i].Checked:=List_RunList.Items.Item[Idx+i].Checked;
End;
List_RunList.DeleteSelected;
//Вставляем строки
For i:=Count-1 downto 0 do
Begin
CurrItm:=List_RunList.Items.Insert(Idx+1);
CurrItm.Caption:=TmpItems[i].Caption;
CurrItm.Checked:=TmpItems[i].Checked;
CurrItm.ImageIndex:=TmpItems[i].IconIndex;
List_RunList.ItemIndex:=Idx+1;
End;
End;
List_RunList.Items.EndUpdate;
SetLength(TmpItems, 0);
end;



 
b-Ars   (2003-07-14 12:19) [9]

Тут есть только одна глюка, при помещении во временные переменные надо пользоваться GetNextItem


 
mrcat   (2003-07-14 12:34) [10]

reer (12.07.03 00:29)
>1. Мерцание будет в табличке как минимум

чтобы "пропало": достаточно для контрола установить DoubleBuffered := True


 
reer   (2003-07-14 12:44) [11]

>mrcat © (14.07.03 12:34)
О, действительно, спасибо :)))


 
Семен Сорокин   (2003-07-14 12:51) [12]

можно через:
ListView_GetItem и ListView_SetItem из CommCtrl



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

Форум: "Основная";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.014 c
14-78071
KDS
2003-07-07 19:14
2003.07.24
dephi тут вообще непричем!


1-77829
warrior
2003-07-09 22:58
2003.07.24
Delphi & Excel


11-77815
Bartov
2002-11-21 20:50
2003.07.24
Кто-нибудь фильтрует сообщения в форуме?


14-78076
Е-Моё имя
2003-07-07 17:21
2003.07.24
работа в МоскваСити


7-78180
MGA
2003-05-05 13:34
2003.07.24
Как отключить Ctrl+Alt+Del в WinXP





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