【问题标题】:How to copy multiple selected rows of listview into clipboard in Delphi如何将列表视图的多个选定行复制到Delphi中的剪贴板
【发布时间】:2011-07-23 16:31:37
【问题描述】:

我已将此代码从 lisview 中选择的行放在剪贴板中。

procedure TFmainViewTCP.Copy1Click(Sender: TObject);
 var
  Str:String;
  k  :Integer;
  lItem:TListItem;
 begin
   repeat
     lItem:=lvConnection.Selected;
     Str:=lItem.Caption;
     for k:=0 to lvConnection.Columns.Count-2 do
      begin
       Str:=Str+'  '+lItem.SubItems[k];
      end;
     Clipboard.AsText:=Clipboard.AsText+ sLineBreak +Str; {copy into clipboard}
   until lItem.Selected=True;
 end;

我不确定这是否正常工作,它不会为我复制所有行。有人可以帮我解决这个问题吗?

提前致谢

【问题讨论】:

    标签: delphi


    【解决方案1】:

    您的代码不会遍历所有选定的行。它只适用于第一个选择。您需要循环所有项目并处理选定的项目...

    procedure TFmainViewTCP.Copy1Click(Sender: TObject);
     var
      s, t: String;
      i: Integer;
      lItem: TListItem;
     begin
      t := '';
      lItem := lvConnection.GetNextItem(nil, sdBelow, [isSelected]);
      while lItem <> nil do
      begin
        s := lItem.Caption;
        for i := 0 to lItem.SubItems.Count-1 do
          s := s + '  ' + lItem.SubItems[i];
        t := t + s + sLineBreak;
        lItem := lvConnection.GetNextItem(lItem, sdBelow, [isSelected]);
      end;
      if t <> '' then Clipboard.AsText := t;
     end;
    

    【讨论】:

    • 吹毛求疵:我建议使用sLineBreak 而不是文字#13#10。 (很明显,还要通过格式化程序运行。:-P)
    • @PA:您还应该使用 ListView 的 GetNextItem() 方法,而不是一次遍历所有项目。我相应地编辑了示例。
    • 当我使用上面的代码时,我从 lvConnection.GetNextItem(nil,sdBelow, [isSelected]) 收到了一个 nil。如果我使用 lvConnection.Selected 为 lItem 播种,其余代码将按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2015-12-10
    • 2021-07-27
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多