Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-10094
Fast
2003-07-12 21:44
2003.08.04
ADOTable.Delete


1-10269
zolotov
2003-07-21 15:57
2003.08.04
Проблема с копированием и вырезанием данных в F1Book


14-10361
Кен
2003-07-13 05:45
2003.08.04
Как начинающему въезжать в базы данных ?


6-10332
vgkuser
2003-05-29 13:14
2003.08.04
как работать с IdFTP


1-10213
Still Swamp
2003-07-20 14:41
2003.08.04
Перехват cобытий и передача их в MyObject





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