Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.04;
Скачать: CL | DM;

Вниз

Поменять местами 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
7-10470
Pahsik
2003-05-24 04:12
2003.08.04
Добавление юзера к файлу


4-10497
Flex
2003-05-31 14:54
2003.08.04
/ Помогите понять Msg.Result:=1 /


1-10263
aaa3aaa
2003-07-21 09:51
2003.08.04
Печать отчета на подложке


14-10370
anod
2003-07-16 02:17
2003.08.04
Rave Reports


1-10277
Adam
2003-07-22 01:38
2003.08.04
Цвет пикселя