function ListView_DeleteItem(hWnd: HWND; i: Integer): Bool; begin Result := Bool( SendMessage(hWnd, LVM_DELETEITEM, i, 0) ); end; 直接调用函数不就行了 ListView_DeleteItem(ListView1.Handle, ListView1.Selected.Index)
看看为啥直接调用Item的Delete方法只删除一个?? procedure TListItem.Delete; begin if not FDeleting and (Self <> ListView.FTempItem) then Free; end;destructor TListItem.Destroy; begin FDeleting := True; if Owner.Owner.FLastDropTarget = Self then Owner.Owner.FLastDropTarget := nil; if ListView.HandleAllocated then ListView_DeleteItem(Handle, Index); FSubItems.Free; inherited Destroy; end;
begin
Result := Bool( SendMessage(hWnd, LVM_DELETEITEM, i, 0) );
end;
直接调用函数不就行了
ListView_DeleteItem(ListView1.Handle, ListView1.Selected.Index)
首先ListView是一个系统控件,它的数据实际上分为两部分,一部分存储由系统的API进行管理,另一部分由VCL控件TListView这个类进行管理。
当试图发送一个 LVM_DELETEITEM消息之后,首先响应该消息的是API,于是会把某一个Index删除掉,并且把内部的Index更新掉,然后通知TListView该消息,TListView收到消息之后,就通知相应的ListItem删除,而ListItem并不知道该消息已经触发了,以为是VCL内部删除,于是又发一个LVM_DELETEITEM消息。从而重复删除。实际上此时在TListView类管理的的数据当中,后面被删除的那个ListItem是存在于内存的,但是由于TListView的重绘是根据API当中的消息来重绘的,而在系统内部已经被删除掉了,所以就没有再通知重绘,自然被刷新之后就再也看不到了。
procedure TListItem.Delete;
begin
if not FDeleting and (Self <> ListView.FTempItem) then Free;
end;destructor TListItem.Destroy;
begin
FDeleting := True;
if Owner.Owner.FLastDropTarget = Self then
Owner.Owner.FLastDropTarget := nil;
if ListView.HandleAllocated then
ListView_DeleteItem(Handle, Index);
FSubItems.Free;
inherited Destroy;
end;
http://topic.csdn.net/u/20080630/09/5d6de97f-a684-426e-b02a-15e07f79caf6.html