Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
ВнизПоменять местами Items в TListView Найти похожие ветки
← →
R (2003-07-22 03:24) [0]Мастера как TListView поменять местами выделенный Items с соседним и чтобы фокус перешел к соседнему Items
← →
R (2003-07-22 08:43) [1]?
← →
R (2003-07-22 09:21) [2]Неужели мастера еще не проснулись!
← →
dataMaster (2003-07-22 09:32) [3]Не знаю насчет фокуса, но местами меняет:
procedure LV_Replace(LV : TListView; ItemSource, ItemTarget : integer);
var
k:integer;
s:string;
begin
if ItemSource<=LV.Items.Count-1 then
if ItemTarget<=LV.Items.Count-1 then
for k:=0 to LV.Columns.Count-1 do
begin
s:=LV_Read(LV, k, ItemSource);
LV_Write(LV, k, ItemSource, LV_Read(LV, k, ItemTarget));
LV_Write(LV, k, ItemTarget, s);
end;
end;
← →
Digitman (2003-07-22 09:34) [4]фокус устанавливается либо ListItem.Focused := True либо ListView.ItemFocused := ListItem
А поменять местами эл-ты "в лоб" не удастся - ListItem.Index property is ReadOnly
1. Организуй свой список данных, требуемых к отображению компонентом TListView, в котором менять местами можно все что угодно и как угодно
2. Устанавливай вирт.режим ListView.OwnerData := True
цитата :
Specifies whether the list view control is virtual.
property OwnerData: Boolean;
Description
Set OwnerData to True to specify that the list view is virtual. A virtual list view can contain a huge number of items (specifically, up to a DWORD). However, you must manage the items of a virtual list view using the OnData, OnDataFind, OnDataHint, and OnDataStateChange event handlers. For example, you must explicitly provide a value to a list item’s StateIndex property if it is to display a check box.
When creating a virtual list view, you must set the Count property for the Items to the number of items in the virtual list.
The only information contained in a virtual list view control is the selection and focus information.
To improve the peformance of a virtual list view control, cache items for quick retrieval. The OnDataHint event can help optimize retrieval from the cache.
Note: Virtual list views need not be owner-drawn. The OnData, OnDataFind, OnDataHint, and OnDataStateChange events enable the list view’s default drawing, if desired.
← →
AlexandrN (2003-07-22 09:38) [5]void __fastcall TForm1::Up(TObject *Sender)
{
// Перемещаем выбранный элемент вверх на один
// пока он не станет первым
if ( ListView->Selected != NULL )
{
if ( ListView->Selected->Index == 0 ) return;
AnsiString Name = ListView->Selected->Caption;
int old_index = ListView->Selected->Index;
ListView->Items->Item[old_index]->Delete();
int new_index = old_index - 1;
TListItem *Item;
Item = ListView->Items->Insert(new_index);
Item->Caption = Name;
SelItem(Sender,new_index);
}
}
void __fastcall TForm1::Down(TObject *Sender)
{
// Перемещаем выбранный элемент вниз на один
// пока он не станет последним
if ( ListView->Selected != NULL )
{
if ( ListView->Selected->Index == ListView->Items->Count - 1 ) return;
AnsiString Name = ListView->Selected->Caption;
int old_index = ListView->Selected->Index;
ListView->Items->Item[old_index]->Delete();
int new_index = old_index + 1;
TListItem *Item;
Item = ListView->Items->Insert(new_index);
Item->Caption = Name;
Item->Selected = true;
Item->Focused = true;
SelItem(Sender,new_index);
}
}
← →
AlexandrN (2003-07-22 09:40) [6]Звиняй, что на C++, просто времени нет сейчас переписывать под Delphi, но по исходникам смысл и так понятен, думаю разберёшься... ;-)
← →
Digitman (2003-07-22 10:56) [7]
> AlexandrN
но ведь подход-то в твоем алгоритме - проктологический)
это и понятно, что удалив эл-т и создав-вставив его в нужной позиции задача решаема) ... а вот поменять местами без операций удаления-вставки - это похитрей будет ... я бы таки воспользовался именно виртуальным режимом упомянутого контрола : минимум "хитростей" и решение соответствует условиям задачи - именно смена индекса, а не удаление с последующей вставкой
← →
mrcat (2003-07-22 12:11) [8]Digitman © (22.07.03 09:34)
>А поменять местами эл-ты "в лоб" не удастся - ListItem.Index
>property is ReadOnly
А такое решение "в лоб" чем плохо?
procedure ListMove(const aItem, bItem: Integer);
var
ItemIdx: Integer;
begin
with LstView, Items do
try
BeginUpdate;
Add;
ItemIdx := Pred(Count);
Item[ItemIdx] := Item[aItem];
Item[aItem] := Item[bItem];
Item[bItem] := Item[ItemIdx];
Delete(ItemIdx);
finally
EndUpdate;
end;
end;
← →
mrcat (2003-07-22 12:17) [9]Digitman © (22.07.03 09:34)
сори, не прочитал предыдущий пост :)
← →
Digitman (2003-07-22 12:22) [10]
> А такое решение "в лоб" чем плохо?
так это ж не соответствует условиям задачи).. опять же - вставка с последующим удалением)
← →
R (2003-07-23 02:51) [11]Всем спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c