【问题标题】:XE7 copy text to clipboardXE7 将文本复制到剪贴板
【发布时间】:2014-12-19 09:23:27
【问题描述】:

http://www.swissdelphicenter.com/torry/showcode.php?id=640 有一个将列表项复制到剪贴板的示例。该代码适用于 WIN-XP 和 Delphi 7。它不适用于 XE7。我猜测 16 位字符或字符串类型会导致问题,因为列表中的数据来自使用 8 位字符的 USB 外围设备。 但是代码看起来是正确的。

【问题讨论】:

  • 那个代码很糟糕。它使用短字符串。不要使用该代码。

标签: delphi clipboard delphi-xe7


【解决方案1】:

复制到剪贴板的代码应如下所示:

procedure ListBoxToClipboard(ListBox: TListBox; CopyAll: Boolean);
var
  i: Integer;
  s: string;
begin
  s := '';
  for i := 0 to ListBox.Items.Count - 1 do
  begin
    if CopyAll or ListBox.Selected[i] then
      s := s + ListBox.Items[i] + sLineBreak;
  end;
  ClipBoard.AsText := s;
end;

注意:我从原始代码更改了 CopyAll 逻辑,因为它对我没有多大意义。要么所有项目都必须复制到剪贴板,要么只复制选定的项目。 ListBox 是否有 MultiSelect 应该没有任何区别。

【讨论】:

  • @jc 你可能想知道是否值得保留if not Assigned(ListBox)。我知道我不会。
  • @David 同意,这个分配是多余的。
【解决方案2】:

为了将 ListBox 内容复制到剪贴板,您可以使用以下代码:

uses
  Vcl.Clipbrd;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Clipboard.AsText := ListBox1.Items.Text;
end;

【讨论】:

  • 添加一些关于这段代码的作用的解释,代码只回答最有可能被删除的风险。
  • 我认为这不需要解释。它不做的是只复制选定的文本。如果列表框有 1000 行,而您只想要最后 5 行,那就有问题了。但除此之外,这是一个非常简单的解决方案。
【解决方案3】:
procedure ListBoxToClipBoard(lb:TListBox; copyAll:Boolean);
var
  i: integer;
  sb: TStringBuilder;
begin
  sb := TStringBuilder.Create;
  try
    for i := 0 to lb.Items.Count -1  do
      if copyAll or lb.Selected[i] then
        sb.AppendLine(lb.Items[i]);
    Clipboard.AsText := sb.ToString;
  finally
    sb.Free;
  end;
end;

【讨论】:

  • 欢迎来到 SO。代码可能会回答这个问题,但更多的解释可能会帮助其他程序员了解它是如何工作的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多