关于ListBox的鼠标操作(100分)

  • 主题发起人 主题发起人 fwd
  • 开始时间 开始时间
F

fwd

Unregistered / Unconfirmed
GUEST, unregistred user!
在ListBox中有‘张三、李四、王五...’等几个项目,请教如何用鼠标将列表中一项拖动到其它位置,
如第一条位置。必须用鼠标。
 
赫赫,这个问题以前有人回答过,要在listbox的OnDragDrop,OnDragOver,OnEndDock加以下代码:
还要加一个全局变量 OldRect:Trect;
procedure TFrmSaveToExcel.lbFieldSaveDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
P_move:Tpoint;
begin
{通过坐标获得ITEM}
P_move.x:=x;
p_move.y:=y;
with lbFieldSave do
begin
if (ItemIndex<>-1) and (ItemAtPos(P_move,true)<>-1) then
begin
Items.Insert(ItemAtPos(P_move,True)+1,Items.Strings[ItemIndex]);
Items.Delete(ItemIndex);
end;
//Items.Exchange(ItemIndex,ItemAtPos(P_move,true));//互换ITEM
//拖放不成功的时候要去掉最后画的那个FOCUS框
if ItemAtPos(P_move,true)=-1 then
Canvas.DrawFocusRect(OldRect);
end;
end;
procedure TFrmSaveToExcel.lbFieldSaveDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
APos:Tpoint;
begin
if Source=lbFieldSave then
accept:=true;
APos.x:=x;
APos.y:=y;
with lbFieldSave do
if ItemAtPos(APos,true)<>-1 then //选取了一个Item
begin
Canvas.DrawFocusRect(OldRect); //通过‘异或’去掉上次的框框
Canvas.DrawFocusRect(ItemRect(ItemAtPos(Apos,true)));//画上本次的框框
OldRect:=ItemRect(ItemAtPos(Apos,true));
end;
end;
procedure TFrmSaveToExcel.lbFieldSaveEndDock(Sender, Target: TObject; X,
Y: Integer);
begin
if target=nil then
lbFieldSave.Canvas.DrawFocusRect(oldrect);
oldrect.Bottom:=0; //拖放完之后把矩形变量清空
end;

祝好运![:)]
 
接受答案了.
 

Similar threads

D
回复
0
查看
767
DelphiTeacher的专栏
D
D
回复
0
查看
809
DelphiTeacher的专栏
D
D
回复
0
查看
392
DelphiTeacher的专栏
D
D
回复
0
查看
639
DelphiTeacher的专栏
D
后退
顶部