【问题标题】:How to set custom ticks on a TTrackBar in Delphi 2010?如何在 Delphi 2010 中的 TTrackBar 上设置自定义刻度?
【发布时间】:2011-01-21 15:06:13
【问题描述】:
我尝试将刻度样式设置为 tsManual,将最小和最大位置分别设置为 1 和 100,并在 9、19、79 和 89 处添加刻度,除了控件的 detault first 和 last 之外,根本没有显示任何刻度自动显示。我尝试了其他值,但没有显示。我的代码是:
TrackBar1.TickStyle := tsManual;
TrackBar1.Min := 1;
TrackBar1.Max := 100;
TrackBar1.SetTick( 9 );
TrackBar1.SetTick( 19 );
TrackBar1.SetTick( 79 );
TrackBar1.SetTick( 89 );
有什么建议吗?我确定我遗漏了一个重要的细节,而且文档非常稀少。这是在 Delphi 2010 中的一个新的空 VCL Forms 项目中,带有更新 4。
提前谢谢你。
【问题讨论】:
标签:
delphi
delphi-2010
vcl
trackbar
【解决方案1】:
如果 Handle 属性当前未分配,TTrackBar.SetTick() 不会发送 TBM_SETTIC 消息:
procedure TTrackBar.SetTick(Value: Integer);
begin
if HandleAllocated then // <-- here
SendMessage(Handle, TBM_SETTIC, 0, Value);
end;
在第一次读取 Handle 属性之前,不会分配窗口句柄,而不是在最初创建组件时。因此,在调用 SetTick() 之前调用 HandleNeeded():
TrackBar1.TickStyle := tsManual;
TrackBar1.Min := 1;
TrackBar1.Max := 100;
TrackBar1.HandleNeeded; // <-- here
TrackBar1.SetTick( 9 );
TrackBar1.SetTick( 19 );
TrackBar1.SetTick( 79 );
TrackBar1.SetTick( 89 );
【解决方案2】:
我不知道为什么程序 TrackBar1.SetTick 不起作用,但如果您以与该程序相同的方式发送消息,它将起作用。您需要将单元 CommCtrl 添加到您的 uses 子句以解析 TBM_SETTIC,如图所示...
implementation
Uses CommCtrl;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
TrackBar1.TickStyle := tsManual;
TrackBar1.Min := 0;
TrackBar1.Max := 100;
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 9);
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 19);
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 79);
SendMessage(TrackBar1.Handle, TBM_SETTIC, 0, 89);
end;
希望这会有所帮助!
【解决方案3】:
除了 handle 准备就绪和 TickStyle = tsManual 之外,frequency 属性必须设置为倍数,或者更容易设置为 1。