Главная страница
    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.007 c
1-77875
Дома
2003-07-13 23:08
2003.07.24
2 вопроса (RichEdit и TabControl)


3-77758
big_bugzy
2003-07-01 20:06
2003.07.24
Помогите разобраться Insufficient key column information


1-77935
Oleg__
2003-07-10 15:34
2003.07.24
Компонент


3-77721
Ildar
2003-06-30 16:06
2003.07.24
Выборка из двух ODBC баз.


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





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