如何上移或下移 Listview 中在 Report 状态时的一项。(50分)

  • 主题发起人 主题发起人 乖乖兔
  • 开始时间 开始时间

乖乖兔

Unregistered / Unconfirmed
GUEST, unregistred user!
Listview 控件在 Report 并状态时,
如何将一项上移一行或下移一行。
 
这个问题我自己经解决,分数给哪位呀?
 
分可以不要,只想看看解决方法
 
无非是取得当前选中的节点的索引值,
然后将这个索引设置成不选中,再将上一个或者下一个设置成选中,OK。
 
这是我自己的解决方案

{上移一行}
procedure TmForm.SpeedButton5Click(Sender: TObject);
var Cap: string;
idx: integer;
begin
if (ListView1.Selected= nil) or (Listview1.Selected.Index=0) then exit;
Cap:= Listview1.Selected.Caption;
idx:= Listview1.Selected.Index;
Listview1.Selected.Delete;
with ListView1.Items.Insert(Idx-1) do
begin
Caption := Cap;
imageindex := 6;
Selected := true;
Makevisible(false);
end;
end;

{下移一行}
procedure TmForm.SpeedButton6Click(Sender: TObject);
var Cap: string;
idx: integer;
begin
if (ListView1.Selected= nil) or
(Listview1.Selected.Index=Listview1.Items.Count-1) then exit;
Cap:= Listview1.Selected.Caption;
idx:= Listview1.Selected.Index;
Listview1.Selected.Delete;
with ListView1.Items.Insert(Idx+1) do
begin
Caption := Cap;
imageindex := 6;
Selected := true;
Makevisible(false);
end;
end;
 
本不想出手:)。可你这段代码实在是不好,把几乎相同的东西写到两个过程里,
以后改点什么都费事,容易带来混乱,又没有通用性。

拿来全部的50分,呵呵

//这是个通用的过程
procedure ListViewItemMoveUpDown(lv : TListView; Item : TListItem; MoveUp, SetFocus : Boolean);
var
DestItem : TListItem;
begin
if (Item = nil) or
((Item.Index - 1 < 0) and MoveUp) or
((Item.Index + 1 >= lv.Items.Count) and (not MoveUp))
then Exit;
lv.Items.BeginUpdate;
try
if MoveUp then
DestItem := lv.Items.Insert(Item.Index - 1)
else
DestItem := lv.Items.Insert(Item.Index + 2);
DestItem.Assign(Item);
lv.Selected := DestItem;
Item.Free;
finally
lv.Items.EndUpdate;
end;
if SetFocus then lv.SetFocus;
DestItem.MakeVisible(False);
end;

//此为调用过程,可以任意指定要移动的Item,下面是当前(Selected)Item
ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True);//上移
ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移
 
接受答案了.
 
后退
顶部