Как скопировать строки всего Listview в буфер обмена в Delphi? - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу скопировать все строки и столбцы в буфер обмена из списка.Я попытался использовать Clipboard.Astext := SavedDataLb.Items.Text, но это, очевидно, не работает, потому что Listviews не имеют свойства Text.Я также подумал об использовании встроенной функции CopyToClipboard из ListView, но ее, к сожалению, тоже не существует.Есть ли способ сделать это?

1 Ответ

0 голосов
/ 06 февраля 2019

Вам нужно написать собственную функцию, которая для вида списка VCL может выглядеть так:

procedure ListViewCopyToClipboard(ListView: TListView);
// Copy the list view contents to the clipboard, as text with one tab-delimited line per row.

  function ReplaceString(const s, Old, New: string): string;
  begin
    Result := StringReplace(s, Old, New, [rfReplaceAll]);
  end;

  procedure AddString(Strings: TStringList; s: string);
  begin
    // Ensure we get one line per row by by replacing any cr's & lf's with spaces.
    s := ReplaceString(s, sLineBreak, ' ');
    s := ReplaceString(s, #13, ' ');
    s := ReplaceString(s, #10, ' ');
    Strings.Add(s);
  end;

  function GetHeaderCaptionsAsString: string;
  var
    Col: Integer;
  begin
    Assert(ListView.ViewStyle=vsReport);
    Result := '';
    for Col := 0 to ListView.Columns.Count-1 do begin
      Result := Result + ListView.Columns[Col].Caption;
      if Col<ListView.Columns.Count-1 then begin
        Result := Result + #9;
      end;
    end;
  end;

  function GetItemAsString(Row: Integer): string;
  var
    Index: Integer;
    Item: TListItem;
  begin
    Item := ListView.Items[Row];
    Result := Item.Caption;
    for Index := 0 to Item.SubItems.Count-1 do begin
      Result := Result + #9 + Item.SubItems[Index];
    end;
  end;

var
  Row: Integer;
  OutputAll: Boolean;
  Strings: TStringList;

begin
  Strings := TStringList.Create;
  try
    if ListView.ViewStyle=vsReport then begin
      AddString(Strings, GetHeaderCaptionsAsString);
    end;
    OutputAll := not ListView.MultiSelect or (ListView.SelCount=0);
    for Row := 0 to ListView.Items.Count-1 do begin
      if OutputAll or ListView.Items[Row].Selected then begin
        AddString(Strings, GetItemAsString(Row));
      end;
    end;
    Clipboard.AsText := Strings.Text;
  finally
    FreeAndNil(Strings);
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...