删除ListView中的Item,并没有立即删除的问题? ( 积分: 20 )

  • 主题发起人 主题发起人 ucan1
  • 开始时间 开始时间
U

ucan1

Unregistered / Unconfirmed
GUEST, unregistred user!
Form上有一个ListView和一个“删除”按钮,点“删除”按钮时必须删除刚刚在ListView选中的Item。
这里的删除不是把该Item从ListView中删除,而是把该Item的字体颜色改变为红色。
部分代码如下:

procedure TMainForm.ListViewCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
ListView.Canvas.Font.Color := clRed;
end;

问题如下:
先在ListView选中要删除的Item,点“删除”按钮后,该Item的字体颜色并没有立即改变,而是必须让鼠标在ListView中单击
一下,该Item的字体颜色才会改变。

然后,我在“删除”按钮的代码中增加一个自动单击ListView的代码如下
....
ListView.OnClick(ListView);
运行的效果是该Item的字体颜色会立即改变,但是却弹出错误对话框说什么访问冲突之类的意思。

请问:
我应该如何做才能在点“删除”按钮后,该Item的字体颜色立即改变。
 
Form上有一个ListView和一个“删除”按钮,点“删除”按钮时必须删除刚刚在ListView选中的Item。
这里的删除不是把该Item从ListView中删除,而是把该Item的字体颜色改变为红色。
部分代码如下:

procedure TMainForm.ListViewCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
ListView.Canvas.Font.Color := clRed;
end;

问题如下:
先在ListView选中要删除的Item,点“删除”按钮后,该Item的字体颜色并没有立即改变,而是必须让鼠标在ListView中单击
一下,该Item的字体颜色才会改变。

然后,我在“删除”按钮的代码中增加一个自动单击ListView的代码如下
....
ListView.OnClick(ListView);
运行的效果是该Item的字体颜色会立即改变,但是却弹出错误对话框说什么访问冲突之类的意思。

请问:
我应该如何做才能在点“删除”按钮后,该Item的字体颜色立即改变。
 
你所说的删除意思是不是真的删除,而是改变颜色以示区别,可以给item一个标识,删除的时候只需要修改标识的值,然后在onCustomDrawItem事件中通过判断该标识就可以将其颜色改为想要的颜色了
 
不要用这个,用listview.RePaint;就行了
 
另外:你是把所有的Item都改为红色了。如果只改选中的:
if Item.Selected then
ListView.Canvas.Font.Color := clRed;
 
To:skyblue7080,
“删除的时候只需要修改标识的值,然后在onCustomDrawItem事件中通过判断该标识就可以将其颜色改为想要的颜色了”
关键是点“删除”按钮后,如何让它自动触发onCustomDrawItem事件?



To:Niker76
删除按钮改为以下代码,连颜色都不能改变了。
if ListView.Selected <> nil then
begin
ListView.Canvas.Font.Color:= clred;
ListView.Repaint;
end;
 
Niker76的if Item.Selected then
ListView.Canvas.Font.Color := clRed; 是可以实现你的功能的
to ucan1
你将ListView.Repaint;去掉看一下
 
Niker76的意思是不是不要在CustomDrawItem事件中写代码,而是写在删除按钮的OnClick事件里。
我是写在删除按钮的OnClick事件里,去掉ListView.Repaint;还是连颜色都不能改变。
 
listView.refresh;
 
感觉不是这样的,应该给每个Item一个标识,如用1表示未删除,用0表示已经删除,然后在OnCustomDrawItem事件中判断标识值.关键是用什么来做标识.
 
在 ListView 的 onchange 事件中加上
ListView.refresh;
 
我认为大家都错了,
ListView.Canvas.Font.Color := clRed这个代码还是应该写在ListViewCustomDrawItem事件中,
关键是点“删除”按钮后,如何让它自动触发onCustomDrawItem事件?
 
要写在CustomDrawItem这个事件里的,onCustomDrawItem这个事件好像一直都在处发的
 
这个问题应该很好解决,你自己思路混乱,把你的代码贴出来应该很容易改。
 
不能自动就手动嘛
procedure TForm1.Button1Click(Sender: TObject);
var
b: Boolean;
begin
ListView1.Selected.SubItems.Add('1');
//ShowMessage(ListView1.Selected.SubItems[0]);
ListView1CustomDrawItem(ListView1,ListView1.Selected,[],b);
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
try
if Item.SubItems[0] = '1' then
begin
Sender.Canvas.Font.Color := clRed;
end;
except//这里需要另外处理,因为有的item.SubItems[0]没有初始化
end;
end;
 
仅做参考,,具体功能自己还需重新设计
 
To;skyblue7080
ListView1CustomDrawItem(ListView1,ListView1.Selected,[],b);
这个到底怎么写啊?
 
非常感谢大家的帮助!
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
837
DelphiTeacher的专栏
D
D
回复
0
查看
843
DelphiTeacher的专栏
D
后退
顶部