Форум: "Основная";
Текущий архив: 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