对于ListView中的Delphi中的拖放系统我是一个新手。我在互联网上找到了一个简单的解决方案,可以在ListView中拖放项目。问题是代码只显示拖动第一列,我想显示并拖动整行。
您可以在下图中查看我得到的内容以及我想要的内容。
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
DragItem, DropItem, CurrentItem, NextItem: TListItem;
begin
if Sender = Source then
with TListView(Sender) do
begin
DropItem := GetItemAt(X, Y);
CurrentItem := Selected;
while CurrentItem <> nil do
begin
NextItem := GetNextItem(CurrentItem, SdAll, [IsSelected]);
if DropItem = nil then DragItem := Items.Add
else
DragItem := Items.Insert(DropItem.Index);
DragItem.Assign(CurrentItem);
CurrentItem.Free;
CurrentItem := NextItem;
end;
end;
end;
procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Sender = ListView1;
end;
self.ListView1.DragMode := dmAutomatic;
答案 0 :(得分:0)
我不知道你如何获得所选当前行的快照,但它的拖放部分是这样的:
// you need a TDragControlObject:
TPlainDragControlObject = class(TDragControlObject)
protected
function GetDragImages: TDragImageList; override;
End;
.....
Implementation
function TPlainDragControlObject.GetDragImages: TDragImageList;
var
images : TDragImageList;
begin
images := TDragImageList.create(self);
// ToDo: add images - how the drag object will look like
Result := images; // you can return Nil here if you want just the drag cursor with no image at all
end;
procedure TMainForm.lvStartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
If Sender = ListView1 Then Begin
DragObject := TPlainDragControlObject.Create(Sender as TListView);
End;
end;
您可以创建位图并手动绘制其中的项目。
或者以下是如何制作整个列表视图(或任何其他组件)的屏幕截图: http://delphidabbler.com/tips/24 您可以找出项目坐标并将其从屏幕截图复制到新的位图。