Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pegar texto en una columna de StringGrid desde una fila determinada (https://www.clubdelphi.com/foros/showthread.php?t=92938)

rrf 21-03-2018 12:53:41

Pegar texto en una columna de StringGrid desde una fila determinada
 
Hola.

Quería pegar un texto en una columna de un StringGrid (cada línea es una celda) y lo logré aplicando este código de Ecfisa (que he adaptado) que encontré en este enlace de los foros: https://www.clubdelphi.com/foros/showthread.php?t=81684 (es el comentario #3):

Código Delphi [-]
var
  TS: TStrings;
begin
  if Clipboard.HasFormat(CF_TEXT)
  then
    begin
      TS := TStringList.Create;
      try
        TS.Text := clipboard.AsText;
        StringGrid1.Cols[ 1 ]:= TS;
      finally
        TS.Free;
      end;
    end
  else
    ShowMessage('No hay texto en el PortaPapeles');
end;

Asi se pega el contenido del portapapeles en la columna 1 (la segunda), que es donde quiero.

Ahora bien, el texto empieza a pegarse desde la fila 0 y, aunque me puede servir, lo que realmente quiero es que se pegue desde la fila 1. ¿Es posible hacerlo? ¿Cómo se hace?.

Gracias de antemano y saludos.

ecfisa 21-03-2018 14:38:35

Hola rrf.

Podrías hacer:
Código Delphi [-]
...
var
  TS: TStrings;
  i : Integer;
begin
  if Clipboard.HasFormat(CF_TEXT)
  then
    begin
      TS := TStringList.Create;
      try
        TS.Text := clipboard.AsText;
        for i := 0 to TS.Count-1 do 
          StringGrid1.Cols[1].Strings[i+1] := TS[i];
      finally
        TS.Free;
      end;
    end
  else
    ShowMessage('No hay texto en el PortaPapeles');
end;

Saludos :)

ecfisa 21-03-2018 15:14:34

Hola de nuevo.

Y mas reusable sería:
Código Delphi [-]
procedure PasteInColRow(SG: TStringGrid; const aCol, aRow: Integer);
var
  TS: TStrings;
  i : Integer;
begin
  if Clipboard.HasFormat(CF_TEXT)
  then
    begin
      TS := TStringList.Create;
      try
        TS.Text := clipboard.AsText;
        for i := 0 to TS.Count-1 do
          SG.Cols[aCol].Strings[aRow+i] := TS[i];
      finally
        TS.Free;
      end;
    end
  else
    ShowMessage('No hay texto en el PortaPapeles');
end;

Ej. uso:
Código Delphi [-]
   PasteInColRow(StringGrid1, 3, 2);  // ( índice base-cero y sin comprobación de desborde )

Saludos :)

rrf 21-03-2018 17:23:45

Muchas gracias Ecfisa.

He probado el código de tu comentario anterior y funciona como un reloj (es decir, muy bien).

Y con ello, has resuelto la duda que tenía.

De nuevo, muchas gracias por tu ayuda.

Saludos.

rrf 23-03-2018 15:00:07

Aunque no lo pregunté, pensaba también añadir la opción de leer una lista de nombres desde un archivo de texto y añadirlos en una columna del StringGrid, a partír de la 2 fila.

Usando el código de Ecfisa (gracias de nuevo), hice una adaptación y aquí lo adjunto por si le puede ayudar a alguien. Con pequeños cambios puede adaptarse para que el texto se escriba desde una celda determinada, según las necesidades de cada cual.

Código Delphi [-]
procedure TCreaLista1.Button2Click(Sender: TObject);
var
  ff: TStrings;
  i : integer;
begin
      // Leer archivo de texto con una lista de nombres
      //-------------------------------------------------

  if OpenDialog1.Execute
  then
    begin

      ff:= TStringList.Create ;
      try
        ff.LoadFromFile( OpenDialog1.FileName );

          // escribe el archivo leido en la 2ª columna, desde la 2ª fila hacia abajo
        for i := 0 to ff.Count-1 do
          StringGrid1.Cols[1].Strings[1+i] := ff[i];

      finally
        ff.Free;
      end;

    end
  else
    begin
      ShowMessage( 'No se seleccionó un archivo de texto.');
      exit ;
    end ;

end;

Saludos.

egostar 23-03-2018 15:24:08

Hola

Y porque no usar directamente la propiedad Cells del StringGrid.

Código Delphi [-]
procedure TForm1.actualizaGrid(Texto: string; Registros, Columna: integer; grid: TStringGrid);
var
  Renglon: Integer;
begin
  for Renglon := 1 to Registros do
  begin
    grid.Cells[Columna, Renglon] := Texto;
  end;
end;

Saludos

rrf 23-03-2018 17:24:54

Hola Egostar.
He leido tu código y creo que copia un texto en varias celdas consecutivas de una columna.
Aunque siempre copia el mismo String (texto) en cada celda.
Lo que no se ajusta a lo que buscaba:
Cita:

... pegar un texto en una columna de un StringGrid (cada línea es una celda) ...
, donde cada línea es diferente a las otras, pues se quiere incluir en el StringGrid una lista de nombres de personas.
Es posible que esté equivocado, puesto que no lo he probado.
De cualquier manera, gracias por tu aportación.
Saludos.

egostar 23-03-2018 19:39:13

Cita:

Empezado por rrf (Mensaje 525238)
Hola Egostar.
He leido tu código y creo que copia un texto en varias celdas consecutivas de una columna.
Aunque siempre copia el mismo String (texto) en cada celda.
Lo que no se ajusta a lo que buscaba:

, donde cada línea es diferente a las otras, pues se quiere incluir en el StringGrid una lista de nombres de personas.
Es posible que esté equivocado, puesto que no lo he probado.
De cualquier manera, gracias por tu aportación.
Saludos.

Claro, es un proceso genérico que pasa un dato fijo, pero que ejemplifica que se puede asignar a la Celda correspondiente el valor que necesites.

Utilizando tu requerimiento podría ser de ésta forma

Código Delphi [-]
:::::
  ff.LoadFromFile( OpenDialog1.FileName );
  // escribe el archivo leido en la 2ª columna, desde la 2ª fila hacia abajo
  for i := 0 to ff.Count-1 do
    StringGrid1.Cells[1, I+1] := ff[i];
:::::

Saludos

rrf 24-03-2018 12:17:56

Egostar, tienes toda la razón.
Se puede hacer así perfectamente.
Cada problema se puede resolver por muchos caminos distintos. Y seguro que habrán más formas de hacerlo.
Pues el tema está listo y claramente resuelto.
Muchas gracias de nuevo y saludos.


La franja horaria es GMT +2. Ahora son las 18:18:19.

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