listview进行封装时onCustomDrawItem进行Override不能成功 (50分)

  • 主题发起人 主题发起人 smilboy
  • 开始时间 开始时间
S

smilboy

Unregistered / Unconfirmed
GUEST, unregistred user!
listview进行封装时onCustomDrawItem进行Override不能成功
我是从CustomListview进行进程,想在onCustomDrawItem中加入代码,
可是声明都不行,请大家实验后在说,不要想当然
 
For Example:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); //OnCustomDrawItem
var
RC: TRect;
begin
RC := Item.DisplayRect(drIcon);
Frame3D(Sender.Canvas, RC, clBlue, clNavy, 2);
with Sender.Canvas do
if Assigned(Font.OnChange) then
Font.OnChange(Font);
end;
 
大哥,我说的是继承的方法,在窗体里写代码就不用说了
我要做的是封装到控件中
 
兄第呀你需要重载的是CustomDrawItem而不是OnCustomDrawItem,是过程不是属性!
 
没有人研究这些么

奇怪的他的CustomDrawItem居然是个函数,我OVERRIDE是可以
可是运行没效果,难道要用事件指针,可是过程指到函数能行么?
 
TMyListView = class(TListView)
private
procedure DoCustomDrawitem(...);自己写个CustomDrawitem函数
end;
然后override Create,在Create中inherited OnCustomDrawItem = DoCustomDrawItem
 
DoCustomDrawItem()是用来启动On……事件的!!!!
 
:203010

不知道你试过没有,我也是写过一些简单的控件的

但是这次很怪,建议你自己试试看,这种方法是绝对不行的

我觉得应该用事件指针
 
建议你把相关代码贴出来吧,让大家帮你分析一下

 
203010的方法是可行的。不过应该在Loaded过程中赋值
TMyListView = class(TListView)
private
FOldCustomDrawItem: TLVCustomDrawItemEvent;
procedure DoCustomDrawitem(...);自己写个CustomDrawitem函数
public
procedure Loaded;override;
end

procedure TMyListView.DoCustomDrawItem(........)
begin
if Assigned(FOldCustomDrawItem) then FOldCustomDrawItem(....);
.......
end;

procedure TMyListView.Loaded;
begin
inherited;
FOldCustomDrawItem := OnCustomDrawItem;
OnCustomDrawItem := DoCustomDrawItem;
end;
不过由于ListView在很多时候都要通过判断OnCustomDrawItem是否已赋值来决定自己的
行为,这样一来的话,就导致在Loaded之后Assigned(OnCustomDrawItem)一直为True,
所以是否满足要求还要看具体情况
 
接受答案了.
 

Similar threads

S
回复
0
查看
665
swish
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部