You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于TComboBox的自定义控件TLocalizedComboBox未触发OnDrawItem事件问题排查

自定义TComboBox的OnDrawItem事件未触发的问题解决

嘿,我一眼就瞅出问题所在了——你的自定义TLocalizedComboBox里MyDrawItem始终不执行,核心原因是构造函数的执行顺序搞反了!

错误根源分析

你现在的构造函数是先设置Style和绑定OnDrawItem,再调用inherited Create(AOwner)。但TComboBox的父类构造函数会初始化控件的默认属性和内部状态,这会把你提前设置的Style和事件绑定给覆盖掉,导致你的自定义绘制逻辑根本没被注册上。

修正后的构造函数

把执行顺序调换,先完成父类的基础初始化,再设置自定义属性和绑定事件:

constructor TLocalizedComboBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner); // 先让父类完成控件的基础初始化
  Style := csOwnerDrawFixed; // 再设置所有者绘制风格
  OnDrawItem := MyDrawItem; // 最后绑定自定义绘制事件
end;

额外的注意细节

除了构造函数的问题,还有几个点能让你的控件更稳定:

  • 确保Items集合里有数据,并且每个项都设置了Name属性(因为你在MyDrawItem里用了Items.Names[Index]),不然运行时可能会抛出索引越界或者空值错误。
  • 如果需要项高度可变,可以把Style改成csOwnerDrawVariable,但记得同时处理OnMeasureItem事件来指定每个项的高度。
  • 在MyDrawItem里,你可以直接用Self.Canvas(因为Control就是当前的TLocalizedComboBox实例),或者显式转换类型:(Control as TComboBox).Canvas,代码会更清晰。

内容的提问来源于stack exchange,提问作者Paul Sinnema

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:04:06