计数刷新到 TListView
Count refreshes to TListView
我有一个 TListView,根据用户从日志文件中选择的日期,我可以向其中添加从 none 到数百个项目的任何内容。我使用此代码来防止不必要的刷新:
listEvents.Items.BeginUpdate();
listEvents.Items.Clear();
// Add events
listEvents.Items.EndUpdate();
即便如此,在我快速开发的 PC 上,我还是可以看到列表的一些快速闪烁。在(慢得多的)生产 PC 上,闪烁很明显而且很难看。我的问题是有什么方法可以通过挂接到事件来计算 TListView 的刷新次数吗?然后我可以增加一个变量并在调试时在标签上显示变量的值。我尝试了 TListView::OnDrawItem 事件,但根本没有调用它。
我怀疑您没有使用虚拟列表视图。使用虚拟列表视图方法来显示数据。将 OwnerData 属性 设置为 true 并处理您在 OnData 事件中的显示。那应该可以防止闪烁。伪代码为:
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := FloatToStr(Item.Index + 1);
Item.SubItems.Add('Your data here');
end;
尝试这样的方法来避免闪烁:
// Disable
SendMessage(listEvents.Handle, WM_SETREDRAW, Integer(False), 0);
try
listEvents.Items.BeginUpdate();
listEvents.Items.Clear();
// Add events
listEvents.Items.EndUpdate();
finally
// enable
SendMessage(listEvents.Handle, WM_SETREDRAW, Integer(True), 0);
end;
您可能不再需要使用 BeginUpdate 和 EndUpdate。
此致。
我有一个 TListView,根据用户从日志文件中选择的日期,我可以向其中添加从 none 到数百个项目的任何内容。我使用此代码来防止不必要的刷新:
listEvents.Items.BeginUpdate();
listEvents.Items.Clear();
// Add events
listEvents.Items.EndUpdate();
即便如此,在我快速开发的 PC 上,我还是可以看到列表的一些快速闪烁。在(慢得多的)生产 PC 上,闪烁很明显而且很难看。我的问题是有什么方法可以通过挂接到事件来计算 TListView 的刷新次数吗?然后我可以增加一个变量并在调试时在标签上显示变量的值。我尝试了 TListView::OnDrawItem 事件,但根本没有调用它。
我怀疑您没有使用虚拟列表视图。使用虚拟列表视图方法来显示数据。将 OwnerData 属性 设置为 true 并处理您在 OnData 事件中的显示。那应该可以防止闪烁。伪代码为:
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := FloatToStr(Item.Index + 1);
Item.SubItems.Add('Your data here');
end;
尝试这样的方法来避免闪烁:
// Disable
SendMessage(listEvents.Handle, WM_SETREDRAW, Integer(False), 0);
try
listEvents.Items.BeginUpdate();
listEvents.Items.Clear();
// Add events
listEvents.Items.EndUpdate();
finally
// enable
SendMessage(listEvents.Handle, WM_SETREDRAW, Integer(True), 0);
end;
您可能不再需要使用 BeginUpdate 和 EndUpdate。
此致。