Вниз
Скачать: CL | DM;

Перемещение 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.013 c
14-78088
KPY
2003-07-08 09:34
2003.07.24
как по 50 точкам вычислить функцию


1-77888
KPP
2003-07-14 09:55
2003.07.24
Как наиболее быстро сортировать файлы папки по имени, дате, и т.д


3-77754
Olivka
2003-06-29 16:11
2003.07.24
Использование макросов в FIBPlus


1-77831
LedWorm
2003-07-11 23:53
2003.07.24
как узнать полный путь к папке ???


7-78179
dim-
2003-05-14 21:28
2003.07.24
Как отследить из какой программы была послана печать и сколько ко




   Наверх