2011-07-22 22 views
0

このコードをlisviewからクリップボードにまとめました。リストビューの選択した複数の行をDelphiのクリップボードにコピーする

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; 

私はこれが正しく動作している場合、それは私のためにすべての行をコピーしていないことを確認していません。誰かがこれで私を助けることができますか?

ありがとうございました

答えて

4

あなたのコードは選択された行のすべてを反復処理しません。それは最初に選択されたもので動作します。すべてのアイテムをループして選択したものを処理する必要があります。

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; 
+2

Nitpicking:リテラルの代わりに 'sLineBreak'を使用することをお勧めします。 (そしてフォーマッタを実行する、明らかに:-P) –

+0

@PA:一度に1つずつすべての項目をループするのではなく、ListViewの 'GetNextItem()'メソッドを使うべきです。私はそれに応じて例を編集しました。 –

+0

上記のコードを使用したとき、lvConnection.GetNextItem(nil、sdBelow、[isSelected])からnilを返しました。 lItemをlvConnection.Selectedでシードすると、残りのコードは期待通りに機能します。 –

関連する問題