Difference between revisions of "TStringList-TStrings Tutorial/es"

From Free Pascal wiki
Jump to navigationJump to search
m
m (Fixed syntax highlighting; deleted category included in page template)
 
(9 intermediate revisions by 5 users not shown)
Line 3: Line 3:
 
==TStringList==
 
==TStringList==
  
   TStringList (o TStrings) se parece mucho a un gran matriz dinámica o a un conjunto de cadenas (un conjunto de cadenas no es posible en FPC). ¡Será muy útil al programar y yo te voy a enseñar el uso básico de TstringList!
+
   TStringList (o su padre TStrings) se parece mucho a una matriz dinámica o conjunto de cadenas (un conjunto de cadenas no es posible en FPC). ¡Será muy útil al programar y yo te voy a enseñar el uso básico de TstringList!
<syntaxhighlight> program StrList;
+
 
 +
Comencemos con un ejemplo sencillo:
 +
 
 +
<syntaxhighlight lang=pascal>
 +
program StrList;
 
  {$mode objfpc}
 
  {$mode objfpc}
 
   uses Classes, SysUtils;
 
   uses Classes, SysUtils;
   var ListaCadenas: TstringList;
+
   var ListaCadenas: TStringList;
 
   begin
 
   begin
   ListaCadenas := TStringList.Create; // Esto es necesario cuando se utiliza esta clase (y la mayoría de las clases)
+
   ListaCadenas := TStringList.Create; // Esto es necesario cuando se utiliza esta clase (o en otras clases)
 
   ListaCadenas.Add('¡Algo de texto!');
 
   ListaCadenas.Add('¡Algo de texto!');
   writeln('La lista de cadenas (tstringlist) contiene ' + IntToStr(ListaCadenas.Count) + ' cadena(s).');
+
   WriteLn('La lista de cadenas (tstringlist) contiene ' + IntToStr(ListaCadenas.Count) + ' cadena(s).');
   Readln;
+
   ReadLn;
 +
  ListaCadenas.Free; // Libera la memoria utilizada por esta instancia StringList
 
  end.</syntaxhighlight>
 
  end.</syntaxhighlight>
  
 
&nbsp;&nbsp;&nbsp;Este es un programa de consola simple que crea y agrega una cadena a una lista de cadenas. Ahora, he aquí algunas cosas que debes saber:
 
&nbsp;&nbsp;&nbsp;Este es un programa de consola simple que crea y agrega una cadena a una lista de cadenas. Ahora, he aquí algunas cosas que debes saber:
  
*'''Create''' - Creará la lista de cadenas para modificar.
+
*'''Create''' - Creará la lista de cadenas para modificar. Al utilizar Create hay que utilizar posteriormente Free para liberar la memoria que ocupa cuando ya no se utilice. Es importante porque aunque no hará cascar el programa si que contribuirá a dejarnos sin memoria en el sistema.
*'''Count''' - Es un contador para el número de cadenas en la Lista.
+
*'''Count''' - Esta propiedad es un contador para el número de cadenas en la Lista.
*'''Add''' - Permite añadir una cadena a la lista de cadenas. La función devolverá el índice de la cadena. Aquí es donde el contador viene muy bien.
+
*'''Add''' - Este método nos permite añadir una cadena a la lista de cadenas. La función devolverá el índice de la cadena. Aquí es donde el contador viene muy bien.
*'''Delete''' - Borra una cadena de la lista de cadenas. Debemos de saber que no debemos introducir la cadena, tenemos que introducir el índice de la cadena. Como he dicho: es como una matriz dinámica de lujo.
+
*'''Delete''' - Borra una cadena de la lista de cadenas. Debemos de saber que no debemos simplemente introducir la cadena, tenemos que introducir el índice de la cadena. Como he dicho: es como una matriz dinámica de lujo.
 
*'''IndexOf''' - Devolverá el índice de la cadena en la lista. Si no lo encuentra, devuelve -1.
 
*'''IndexOf''' - Devolverá el índice de la cadena en la lista. Si no lo encuentra, devuelve -1.
 
*'''Clear''' - Borrará la lista completa
 
*'''Clear''' - Borrará la lista completa
  
===Ejemplo===
+
===Ejemplo ampliado===
  
 
&nbsp;&nbsp;&nbsp;¿Qué tal un ejemplo más jugoso, ¿eh?
 
&nbsp;&nbsp;&nbsp;¿Qué tal un ejemplo más jugoso, ¿eh?
<syntaxhighlight> program StrList2;
+
<syntaxhighlight lang=pascal>
 +
program StrList2;
 
   {$mode ObjFPC}
 
   {$mode ObjFPC}
 
   uses Classes, SysUtils;
 
   uses Classes, SysUtils;
 
   var ListaCadenas: TstringList;
 
   var ListaCadenas: TstringList;
   C: String;
+
   Cadena: String;
 
   Contador: Integer;
 
   Contador: Integer;
 
   begin
 
   begin
  ListaCadenas := TstringList.Create;
+
    ListaCadenas := TstringList.Create;
  Writeln('Prueba de lista de cadenas');
+
    Writeln('Prueba de lista de cadenas');
  repeat
+
    repeat
    Writeln('Introduce la cadena a añadir');
+
        Writeln('Introduce la cadena a añadir');
    Readln(C);
+
          Readln(Cadena);
    if (C = 'Terminar') then Halt;
+
          if (Cadena = 'Terminar') then Halt; // Halt detiene inmediatamente la ejecución del programa.
    if not (C = '') then
+
            // Si observas atentamente, deducirás que esto lleva a una pérdida de memoria.
    begin
+
          if not (Cadena = '') then
      Contador := ListaCadenas.Add(C);
+
              begin
      Writeln('¡La cadena: ' + C + ' fue añadida!');
+
                Contador := ListaCadenas.Add(Cadena);
      Writeln('El índice es: ' + IntToStr(Contador)); // El contador siempre será el índice de la última adición.
+
                Writeln('¡La cadena: ' + Cadena + ' fue añadida!');
    end
+
                Writeln('El índice es: ' + IntToStr(Contador)); // El contador siempre será el índice de la última adición.
    else
+
              end
    begin
+
          else
      Writeln('No hay texto para añadir...');
+
              begin
    end;
+
                Writeln('No hay texto para añadir...');
  until (S = 'Terminar');
+
              end;
 +
    until (Cadena = 'Terminar');
 +
    WriteLn ('Contiene: '+ ListaCadenas.CommanText);
 +
    ListaCadenas.Free; // Libera la memoria asignada a ListaCadenas.
 
   end.</syntaxhighlight>
 
   end.</syntaxhighlight>
 +
 +
Sin embargo, para evitar posibles pérdidas de memoria, deberíamos utilizar el bloque try - finally siempre que sea posible. Pareciéndose a lo siguiente:
 +
 +
<syntaxhighlight lang=pascal>
 +
 
 +
var
 +
  slist: TStringList;
 +
 +
...
 +
 +
slist := TStringList.Create;
 +
try
 +
  ...
 +
  // realizar cosas con stringlist 
 +
  ...
 +
finally
 +
  if Assigned(slist) then
 +
    FreeAndNil(slist);
 +
end;
 +
</syntaxhighlight>
 +
 +
<syntaxhighlight lang=pascal>
 +
// Este otro funciona perfecto, no hay doble creación de Stringlist... cualquier comentario a edgarrod71@gmail.com
 +
function theStringList: TStringList;
 +
var
 +
J: integer;
 +
begin
 +
  result := TStringList.Create;
 +
  for J:=0 to 10 do  // son 11 elementos
 +
    result.add(intToStr(J));
 +
end;
 +
 +
procedure Caller;
 +
var
 +
  SL: TStringList;
 +
  K: integer;
 +
begin
 +
  SL := theStringList;
 +
  for K:=0 to pred(SL.Count) do  // son 11 elementos
 +
    writeln(SL[K]);
 +
  if assigned(SL) then    // aquí se evita desperdicio de memoria
 +
    SL.Free;
 +
end;
 +
</syntaxhighlight>
  
 
==Usando archivos==
 
==Usando archivos==
Line 58: Line 111:
 
*''SaveToFile'' guardará todas las cadenas en la lista en un archivo.
 
*''SaveToFile'' guardará todas las cadenas en la lista en un archivo.
 
*''LoadFromFile'' abrirá el archivo y agregará los datos del archivo a la cadena de la lista de cadenas.
 
*''LoadFromFile'' abrirá el archivo y agregará los datos del archivo a la cadena de la lista de cadenas.
<syntaxhighlight> program StrListFile;
+
<syntaxhighlight lang=pascal>
 +
program StrListFile;
 
  {$mode objfpc}
 
  {$mode objfpc}
 
  uses
 
  uses
Line 64: Line 118:
 
  var
 
  var
 
   ListaCadenas: TStringList;
 
   ListaCadenas: TStringList;
begin
+
  begin
  ListaCadenas := TStringList.Create;
+
    ListaCadenas := TStringList.Create;
  ListaCadenas.LoadFromFile('Algo_de_Texto_en_Archivo.txt');
+
      try
  ListaCadenas.Add('Hola');
+
          ListaCadenas.LoadFromFile('Algo_de_Texto_en_Archivo.txt');
  ListaCadenas.SaveToFile('Algo_de_Texto_en_Archivo.txt');
+
          ListaCadenas.Add('Hola');
end.</syntaxhighlight>
+
          ListaCadenas.SaveToFile('Algo_de_Texto_en_Archivo.txt');
 +
      finally
 +
          ListaCadenas.Free;
 +
  end;
 +
end.</syntaxhighlight>
  
 
&nbsp;&nbsp;&nbsp;¡Acabamos de abrir un archivo, hemos editado el texto y lo hemos guardado de nuevo¡
 
&nbsp;&nbsp;&nbsp;¡Acabamos de abrir un archivo, hemos editado el texto y lo hemos guardado de nuevo¡
Line 75: Line 133:
 
==Comparación dinámica de matrices de cadenas==
 
==Comparación dinámica de matrices de cadenas==
  
&nbsp;&nbsp;&nbsp;TStringList es simplemente una versión avanzada, de objeto, de una matriz de cadena dinámica. Algunos métodos son análogos:
+
&nbsp;&nbsp;&nbsp;TStringList es simplemente una versión orientada a objetos  de una matriz de cadena dinámica. Algunos métodos son análogos:
  
 
{| border=1 cellspacing=0 cellpadding=3
 
{| border=1 cellspacing=0 cellpadding=3
Line 98: Line 156:
 
|}
 
|}
  
&nbsp;&nbsp;&nbsp;Pero TStringList ofrece mucha mas funcionalidad que una simple estructura como la matriz dinámica.
+
&nbsp;&nbsp;&nbsp;Sin embargo TStringList ofrece mucha mas funcionalidad que una simple estructura del tipo matriz dinámica.
  
 
==Sigue aprendiendo==
 
==Sigue aprendiendo==
&nbsp;&nbsp;&nbsp;Para aprender los diferentes procedimientos, funciones y propiedades, puedes ver [http://www.freepascal.org/docs-html/rtl/classes/tstringlist.html Documentación de TStringList]
+
&nbsp;&nbsp;&nbsp;
 +
 
 +
TStringList tiene algunas características interesantes adicionales:
 +
 
 +
* 1. Permite ordenar las cadenas.
 +
* 2. Permite limitar el listado a solamente cadenas únicas (no repetidas).
 +
* 3. Se puede obtener el texto de las cadenas como una simple cadena utilizando la propiedad Text;
 +
* 4. Se puede almacenar un objeto u otro dato próximo a la cadena.
 +
 
 +
Para aprender los diferentes procedimientos, funciones y propiedades, puedes ver [http://www.freepascal.org/docs-html/rtl/classes/tstringlist.html Documentación de TStringList]
  
 
&nbsp;&nbsp;&nbsp;Si sientes que podría haber dejado algo fuera,'' 'modificalo a voluntad!'''  
 
&nbsp;&nbsp;&nbsp;Si sientes que podría haber dejado algo fuera,'' 'modificalo a voluntad!'''  
Line 107: Line 174:
 
&nbsp;&nbsp;&nbsp;¡Espero que sea de  ayuda!
 
&nbsp;&nbsp;&nbsp;¡Espero que sea de  ayuda!
  
[[Category:Tutorials/es]]
+
==Ver además:==
 +
 
 +
* [[Character and string types]]

Latest revision as of 02:45, 2 March 2020

Deutsch (de) English (en) español (es) suomi (fi) français (fr) polski (pl) русский (ru)

TStringList

   TStringList (o su padre TStrings) se parece mucho a una matriz dinámica o conjunto de cadenas (un conjunto de cadenas no es posible en FPC). ¡Será muy útil al programar y yo te voy a enseñar el uso básico de TstringList!

Comencemos con un ejemplo sencillo:

 program StrList;
 {$mode objfpc}
  uses Classes, SysUtils;
  var ListaCadenas: TStringList;
  begin
   ListaCadenas := TStringList.Create; // Esto es necesario cuando se utiliza esta clase (o en otras clases)
   ListaCadenas.Add('¡Algo de texto!');
   WriteLn('La lista de cadenas (tstringlist) contiene ' + IntToStr(ListaCadenas.Count) + ' cadena(s).');
   ReadLn;
   ListaCadenas.Free; // Libera la memoria utilizada por esta instancia StringList
 end.

   Este es un programa de consola simple que crea y agrega una cadena a una lista de cadenas. Ahora, he aquí algunas cosas que debes saber:

  • Create - Creará la lista de cadenas para modificar. Al utilizar Create hay que utilizar posteriormente Free para liberar la memoria que ocupa cuando ya no se utilice. Es importante porque aunque no hará cascar el programa si que contribuirá a dejarnos sin memoria en el sistema.
  • Count - Esta propiedad es un contador para el número de cadenas en la Lista.
  • Add - Este método nos permite añadir una cadena a la lista de cadenas. La función devolverá el índice de la cadena. Aquí es donde el contador viene muy bien.
  • Delete - Borra una cadena de la lista de cadenas. Debemos de saber que no debemos simplemente introducir la cadena, tenemos que introducir el índice de la cadena. Como he dicho: es como una matriz dinámica de lujo.
  • IndexOf - Devolverá el índice de la cadena en la lista. Si no lo encuentra, devuelve -1.
  • Clear - Borrará la lista completa

Ejemplo ampliado

   ¿Qué tal un ejemplo más jugoso, ¿eh?

 program StrList2;
  {$mode ObjFPC}
  uses Classes, SysUtils;
  var ListaCadenas: TstringList;
   Cadena: String;
   Contador: Integer;
  begin
     ListaCadenas := TstringList.Create;
     Writeln('Prueba de lista de cadenas');
     repeat
        Writeln('Introduce la cadena a añadir');
           Readln(Cadena);
           if (Cadena = 'Terminar') then Halt;  // Halt detiene inmediatamente la ejecución del programa.
            // Si observas atentamente, deducirás que esto lleva a una pérdida de memoria.
           if not (Cadena = '') then
              begin
                 Contador := ListaCadenas.Add(Cadena);
                 Writeln('¡La cadena: ' + Cadena + ' fue añadida!');
                 Writeln('El índice es: ' + IntToStr(Contador)); // El contador siempre será el índice de la última adición.
              end
           else
              begin
                 Writeln('No hay texto para añadir...');
              end;
     until (Cadena = 'Terminar');
     WriteLn ('Contiene: '+ ListaCadenas.CommanText);
     ListaCadenas.Free; // Libera la memoria asignada a ListaCadenas.
  end.

Sin embargo, para evitar posibles pérdidas de memoria, deberíamos utilizar el bloque try - finally siempre que sea posible. Pareciéndose a lo siguiente:

 
  
var
  slist: TStringList;
 
...
 
slist := TStringList.Create;
try
  ...
  // realizar cosas con stringlist  
  ...
finally
  if Assigned(slist) then
    FreeAndNil(slist);
end;
// Este otro funciona perfecto, no hay doble creación de Stringlist... cualquier comentario a edgarrod71@gmail.com
function theStringList: TStringList;
var
 J: integer;
begin
  result := TStringList.Create;
  for J:=0 to 10 do  // son 11 elementos
    result.add(intToStr(J));
end;
 
procedure Caller;
var
  SL: TStringList;
  K: integer;
begin
  SL := theStringList;
  for K:=0 to pred(SL.Count) do   // son 11 elementos
    writeln(SL[K]);
  if assigned(SL) then    // aquí se evita desperdicio de memoria
    SL.Free;
end;

Usando archivos

   Cuando se utiliza TStringList tenemos dos procedimientos de manipulación de archivos: SaveToFile y LoadFromFile.

  • SaveToFile guardará todas las cadenas en la lista en un archivo.
  • LoadFromFile abrirá el archivo y agregará los datos del archivo a la cadena de la lista de cadenas.
 program StrListFile;
 {$mode objfpc}
 uses
 Classes, SysUtils;
 var
  ListaCadenas: TStringList;
   begin
    ListaCadenas := TStringList.Create;
       try
          ListaCadenas.LoadFromFile('Algo_de_Texto_en_Archivo.txt');
          ListaCadenas.Add('Hola');
          ListaCadenas.SaveToFile('Algo_de_Texto_en_Archivo.txt');
       finally
          ListaCadenas.Free;
   end;
end.

   ¡Acabamos de abrir un archivo, hemos editado el texto y lo hemos guardado de nuevo¡

Comparación dinámica de matrices de cadenas

   TStringList es simplemente una versión orientada a objetos de una matriz de cadena dinámica. Algunos métodos son análogos:

Operación                      Matriz de cadenas TStringList
Declaración de Variable ListaCadenas: array of string; ListaCadenas: TStringList;
Inicialización constructor implícito ListaCadenas := TStringList.Create
Dimensionar SetLength(ListaCadenas, X); ListaCadenas.Size := X;
Obtener dimensión X := Length(ListaCadenas); X := ListaCadenas.Count;
Añadir elemento SetLength(ListaCadenas, Length(ListaCadenas) + 1); ListaCadenas[Length(ListaCadenas) - 1] := X; ListaCadenas.Add(X);
Borrar item for I := Index to Length(ListaCadenas) - 2 do ListaCadenas[I] := ListaCadenas[I + 1]; SetLength(ListaCadenas, Length(ListaCadenas) - 1); ListaCadenas.Delete(Index);             
Eliminar todos los items SetLength(ListaCadenas, 0); ListaCadenas.Clear;
Terminación destructor implícito ListaCadenas.Free;

   Sin embargo TStringList ofrece mucha mas funcionalidad que una simple estructura del tipo matriz dinámica.

Sigue aprendiendo

   

TStringList tiene algunas características interesantes adicionales:

  • 1. Permite ordenar las cadenas.
  • 2. Permite limitar el listado a solamente cadenas únicas (no repetidas).
  • 3. Se puede obtener el texto de las cadenas como una simple cadena utilizando la propiedad Text;
  • 4. Se puede almacenar un objeto u otro dato próximo a la cadena.

Para aprender los diferentes procedimientos, funciones y propiedades, puedes ver Documentación de TStringList

   Si sientes que podría haber dejado algo fuera, 'modificalo a voluntad!'

   ¡Espero que sea de ayuda!

Ver además: