Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: 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 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
3-77808
Шапранов Сергей Николаевич
2003-07-03 12:03
2003.07.24
Не работает UpDate


3-77717
OlegKrt
2003-06-30 13:56
2003.07.24
TQuery в OleAutomation server. Win 2000


1-77874
Shishalov
2003-07-13 13:04
2003.07.24
Глюк с Cursor у TChart


1-77849
Checist [root]
2003-07-12 19:37
2003.07.24
Сортировка в FileListBox е


1-77891
lex7
2003-07-14 10:39
2003.07.24
Как послать сообщение TLabel?