Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Copiar de un ListView al clipboard (https://www.clubdelphi.com/foros/showthread.php?t=88964)

Olenkaguilar 04-09-2015 05:20:10

Copiar de un ListView al clipboard
 
Buenas tengo un listview y con un PopupMenu tengo 2 opciones: de copiar toda la fila y copiar todas las filas obviamente con contenido.
Código 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;
Ese code me funciona no también, no sé cuando antes tengo algo en el clipboard copiado y copio la fila seleccionada del listview, al pegar en un block de notas pega lo que tenía copiado( cualquier cosa) y lo de la fila del listview, por eso digo que no me funciona muy bien.. bueno y al pegar en el block de notas me queda de la siguiente forma:
Arroz costeño 12kg 20unid

Al pegar en un block de notas como puedo hacer para que me salga de esta forma :
PRODUCTO : Arroz , MARCA : costeño , PESO : 12kg , CANTIDAD : 20unid
Cabe mencionar que lo agregado osea lo que está en mayúscula es cada columna del listview

ecfisa 04-09-2015 10:34:47

Hola Olenkaguilar.
Cita:

Empezado por Olenkaguilar (Mensaje 496271)
...
Al pegar en un block de notas como puedo hacer para que me salga de esta forma :
PRODUCTO : Arroz , MARCA : costeño , PESO : 12kg , CANTIDAD : 20unid
Cabe mencionar que lo agregado osea lo que está en mayúscula es cada columna del listview

Fijate si este ejemplo hace lo que buscas:
Código Delphi [-]
...
implementation

uses Clipbrd;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  ListView1.RowSelect   := True;
  ListView1.MultiSelect := True;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  if ListView1.SelCount = 0 then
    Abort;
end;

procedure TForm1.CopySelect1Click(Sender: TObject);
var
  c,f,k : Integer;
  lv: TListView;
  s : string;
begin
  lv := ListView1;
  Clipboard.Clear;
  s := '';
  for f := 0 to lv.Items.Count - 1 do
  begin
    k := 0;
    if lv.Items[f].Selected then
    begin
      s := s + Format('%s : %s, ',[lv.Columns[k].Caption, lv.Items[f].Caption]);
      for c := 0 to lv.Items[f].SubItems.Count - 1 do
      begin
        Inc(k);
        s := s + Format('%s : %s, ',[lv.Columns[k].Caption, lv.Items[f].SubItems[c]]);
      end;
      SetLength(s, Length(s) - 2); 
      s := s + #$D#$A;
    end;
  end;
  Clipboard.AsText := s;
end;

Salida:


Saludos :)

Olenkaguilar 04-09-2015 16:55:24

ecfisa muchas gracias por el código, funciona muy bien con la fila seleccionada y las filas seleccionadas, pero también me da el caso que hay 100 o más filas; con otra opción del popup como puedo copiar todo sin estar seleccionando fila por fila . Muchas gracias por su ayuda

ecfisa 04-09-2015 17:06:10

Hola de nuevo.

Agrega un item mas al TPopupMenu (vg.: Copiar todo) y quedaría mas o menos así:
Código Delphi [-]
...
implementation

uses Clipbrd;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Clear;
  ListView1.RowSelect   := True;
  ListView1.MultiSelect := True;
end;

procedure TForm1.Copiar1Click(Sender: TObject);
var
  c,f,k : Integer;
  lv: TListView;
  s : string;
begin
  lv := ListView1;
  if lv.SelCount = 0 then Exit;
  Clipboard.Clear;
  s := '';
  for f := 0 to lv.Items.Count - 1 do
  begin
    k := 0;
    if lv.Items[f].Selected then
    begin
      s := s + Format('%s : %s, ',[lv.Columns[k].Caption, lv.Items[f].Caption]);
      for c := 0 to lv.Items[f].SubItems.Count - 1 do
      begin
        Inc(k);
        s := s + Format('%s : %s, ',[lv.Columns[k].Caption, lv.Items[f].SubItems[c]]);
      end;
      SetLength(s, Length(s)-2);
      s := s + #$D#$A;
    end;
  end;
  Clipboard.AsText := s;
end;

procedure TForm1.Copiartodo1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
    Listview1.Items[i].Selected := True;
  Copiar1Click(Sender);
end;
...

Saludos :)


La franja horaria es GMT +2. Ahora son las 21:20:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi