リストビューコントロールにアイテムを上下に移動する機能はありますか?
2557 次
2 に答える
4
TListView をあまり使用していなかったので (私は主にデータベース グリッドを使用しています)、何かを学ぶ機会としてあなたの質問を取り上げました。次のコードは結果です。David の回答よりも視覚的に重視されています。いくつかの制限があります。最初に選択したアイテムのみを移動し、アイテムを移動している間、移動後に vsIcon と vsSmallIcon の表示がおかしくなります。
procedure TForm1.btnDownClick(Sender: TObject);
var
Index: integer;
temp : TListItem;
begin
// use a button that cannot get focus, such as TSpeedButton
if ListView1.Focused then
if ListView1.SelCount>0 then
begin
Index := ListView1.Selected.Index;
if Index<ListView1.Items.Count then
begin
temp := ListView1.Items.Insert(Index+2);
temp.Assign(ListView1.Items.Item[Index]);
ListView1.Items.Delete(Index);
// fix display so moved item is selected/focused
ListView1.Selected := temp;
ListView1.ItemFocused := temp;
end;
end;
end;
procedure TForm1.btnUpClick(Sender: TObject);
var
Index: integer;
temp : TListItem;
begin
// use a button that cannot get focus, such as TSpeedButton
if ListView1.Focused then
if ListView1.SelCount>0 then
begin
Index := ListView1.Selected.Index;
if Index>0 then
begin
temp := ListView1.Items.Insert(Index-1);
temp.Assign(ListView1.Items.Item[Index+1]);
ListView1.Items.Delete(Index+1);
// fix display so moved item is selected/focused
ListView1.Selected := temp;
ListView1.ItemFocused := temp;
end;
end;
end;
于 2011-03-13T17:02:25.113 に答える
3
2つのオプションがあります。
- それらを削除してから、新しい場所に再挿入します。
- 仮想リストビューを使用して、データ構造内でそれらを移動します。
これらのオプションの最初を実行するための私のルーチンは次のようになります。
procedure TBatchTaskList.MoveTasks(const Source: array of TListItem; Target: TListItem);
var
i, InsertIndex: Integer;
begin
Assert(IsMainThread);
BeginUpdate;
Try
//work out where to move them
if Assigned(Target) then begin
InsertIndex := FListItems.IndexOf(Target);
end else begin
InsertIndex := FListItems.Count;
end;
//create new items for each moved task
for i := 0 to high(Source) do begin
SetListItemValues(
FListItems.Insert(InsertIndex+i),
TBatchTask(Source[i].Data)
);
Source[i].Data := nil;//handover ownership to the new item
end;
//set selection and focus item to give feedback about the move
for i := 0 to high(Source) do begin
FListItems[InsertIndex+i].Selected := Source[i].Selected;
end;
FBatchList.ItemFocused := FListItems[InsertIndex];
//delete the duplicate source tasks
for i := 0 to high(Source) do begin
Source[i].Delete;
end;
Finally
EndUpdate;
End;
end;
このメソッドSetListItemValues
は、リストビューの列にデータを入力するために使用されます。
これは、仮想コントロールが非常に優れている理由の完璧な例です。
于 2011-03-13T13:36:52.000 に答える