【问题标题】:Populate ListBox Using TDirectory.GetFiles Delphi XE8使用 TDirectory.GetFiles Delphi XE8 填充 ListBox
【发布时间】:2015-10-01 00:44:09
【问题描述】:

是否存在使用 TDirectory.GetFiles 中的文件名填充 ListBox 的更有效方法?

procedure PopListBox(var lb: TListBox; dir, ext: String; so: TSearchOption);
var
  i: Integer;
  iend: Integer;
  oc: TStringDynArray;
begin
  oc := TDirectory.GetFiles(dir, ext, so);
  iend := Length(oc);
  i := 0;
  repeat
    lb.Items.Add(oc[i]);
    Inc(i);
  until (i > (iend - 1));
end;

我希望社区就这种方法提供意见。

【问题讨论】:

  • 它有什么效率这么低?我唯一能想到的另一件事是 FindFirst / FindNext 使用起来比较棘手,因此实现了这个函数。这仅适用于 Windows 还是跨平台?
  • Jerry this if 最初用于 Windows。接下来是跨平台。强烈的批评只会让代码更紧凑。
  • 如果条目很多,添加 lb.Items.BeginUpdateEndUpdate 会有所帮助
  • GetFiles 只是效率低下。 IOUtils 执行不力。

标签: delphi listbox delphi-xe8


【解决方案1】:

它没有任何效率,但您可以删除几个变量和几行代码:

procedure PopListBox(var lb: TListBox; dir, ext: String; so: TSearchOption);
var
  oc: TStringDynArray;
  s: string;
begin
  oc := TDirectory.GetFiles(dir, ext, so);
  lb.Items.BeginUpdate;
  try
    for s in oc do
      lb.Items.Add(s);
  finally
    lb.Items.EndUpdate;
  end;
end;

【讨论】:

  • 如果列表框为空,我不确定为什么需要 BeginUpdate。根据文档,它是自动调用的。请进一步说明为什么要使用它。谢谢
  • @ArchBrooks:它会在添加每个项目后阻止 UI 更新(绘制),并且仅在调用 EndUpdate 时更新一次。重复(和不必要的)绘画非常缓慢;省略它是性能提升。 (在循环中将数百或数千个项目添加到列表框中,自己尝试一下。)
  • 感谢您的清晰说明,我一定会在填充列表框时插入并使用此方法。 .
  • 我自己在某些情况下对这个概念提出了质疑——因为重新绘制通常不会发生在线程队列继续处理之后。除非它是强制油漆,否则那是另一回事。但是,当绘制由 Windows 消息处理时,该消息将在代码退出之前不会被处理。尽管如此,我还是使用BeginUpdate/EndUpdate,因为在大多数情况下,它确实会有所改进。
  • @Jerry:Windows 本身提供了告诉列表框推迟绘制的消息,因此何时何地发送消息是无关紧要的。在某些时候它们会,并且将控件置于“您正在更新,所以在我们准备好之前不要绘画”模式是有意义的。阅读列表框控件上的 API 文档。
猜你喜欢
  • 2013-06-11
  • 1970-01-01
  • 2022-11-14
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多