Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pregunta Básica TStrings (https://www.clubdelphi.com/foros/showthread.php?t=84730)

david_uh 28-11-2013 20:54:11

Pregunta Básica TStrings
 
Hola foro estuve tratando de llenar los items de un combobox a travez de una variavle algo asi
Código Delphi [-]
var items:TStrings;
begin  

  ds.Open; //datasource cualquiera
  items := TString.Create;
  while not(ds.EOF) do
  begin
      items.AddObject('algo',nil);
      ds.next;
  end; 
...
combobox1.items = items// la UI cambia y necesito restablecer la lista sin tener que consultar de nuevo la db
algo asi pero me mandaba error, luego en la creacion del objeto TStrings utilize la clase TStringList y funcionó
Código Delphi [-]
 items := TStringList.Create;

Asi qeu mi pregunta es por que se declara con TStrings y luego se tiene que crear con TStringList, y si no se hace así lanza error

nota.- estoy usando Lazarus 1.0.12 (32 bits) asumo que esto tambien pasa en delphi ya que es lenguaje pascal en ambos casos

Me despido de ustedes agradeciendoles de antemano cualquier respuesta

dec 28-11-2013 21:20:48

Hola,

La clase "TStrings" es una clase "abstracta", esto es, sólo declara métodos virtuales que deben implementar las clases derivadas, como por ejemplo "TStringList". Me juego algo a que el error que obtenías era ese: "No se puede instanciar una clase abstracta". No me queda muy claro qué ventaja tiene una clase abstracta sobre una interface, sobre todo en Delphi, puesto que en otros lenguajes como PHP uno puede declarar una clase directamente como abstracta, mientras que en Delphi los que se declaran como tales son los métodos. Quizá sea porque en las interfaces no pueden declararse variables o propiedades mientras que en una clase abstracta sí que es posible hacer esto.

Caminante 28-11-2013 21:22:41

La clase TStrings es una clase abstracta de ahi que te de un "ERROR" aunque no has dicho cual...
La clase Tstringlist es una clase concreta lista para el manejo de cadenas y se puede usar asi gracias al polimorfismo.
Echa un ojo aqui

Saludos

nlsgarcia 28-11-2013 21:26:55

david_uh,

Cita:

Empezado por david_uh
...por que se declara con TStrings y luego se tiene que crear con TStringList...

Cita:

Empezado por docwiki.embarcadero
TStrings is the base class for objects that represent a list of strings. Derive a class from TStrings to store and manipulate a list of strings. TStrings contains abstract or, in C++ terminology, pure virtual methods and should not be directly instantiated.

Revisa estos links:
Cita:

System.Classes.TStrings : http://docwiki.embarcadero.com/Libra...asses.TStrings

Introducing Type Inheritance - Delphi OOP Part 6 - Chapter 14 : http://delphi.about.com/od/oopindelp...lphi_oop14.htm
En resumen: Una clase abstracta no puede ser instanciada directamente, debe serlo a través de una clase descendiente.

Espero sea útil :)

Nelson.

david_uh 28-11-2013 23:36:50

quedo claro señores
 
gracias por sus aportes realmente no sabia que TStrings era una clase abstracta y mas con el error que me marcaba no me daba mucha información. bueno creo que en delphi si te dice que es un clase abstracta pero en lazarus manda este aviso

bueno gracias por sacarme de la duda que no dejaba de incomodar

Saludos...

dec 29-11-2013 01:45:34

Hola,

Ciertamente. Metí la pata porque, en Delphi, el error es desde luego más claro que en Lazarus. :(

Neftali [Germán.Estévez] 29-11-2013 16:18:14

Además de lo comentado, no se si te interesaría realizar esto:

Código Delphi [-]
  combobox1.items.AddStrings(items);

En lugar de esto:

Código Delphi [-]
  combobox1.items = items/

Dependiendo de dónde esté definida la variable de tipo TStrings y lo que hagas con ella, lo segundo puede provocarte errores.

david_uh 29-11-2013 17:55:30

Cita:

Empezado por Neftali (Mensaje 470237)
Además de lo comentado, no se si te interesaría realizar esto:

Código Delphi [-]
  combobox1.items.AddStrings(items);

En lugar de esto:

Código Delphi [-]
  combobox1.items = items/

Dependiendo de dónde esté definida la variable de tipo TStrings y lo que hagas con ella, lo segundo puede provocarte errores.

bueno en este caso como quiero sobreescribir me conviene la primera forma, con la segunda tendria que borrar lo anterior y luego agregar, sin embargo le veo la utilidad en otras situaciones

Neftali [Germán.Estévez] 30-11-2013 13:04:01

Cita:

Empezado por david_uh (Mensaje 470255)
bueno en este caso como quiero sobreescribir me conviene la primera forma, con la segunda tendria que borrar lo anterior y luego agregar, sin embargo le veo la utilidad en otras situaciones

No se trata sólo de sobreescribir o agregar.
Estás trabajando con objetos, así que la primera manera, lo que hace es sustituir el objeto Items del combobox, por el objeto items que tú has creado.

El apuntador a Items que hay en TComboBox lo has redirigido a Items (TStrings). El apuntador al anterior Items (el que originalmente era del combobox) lo has perdido y la consiguiente memoria también. Ahora hay que ver qué haces con la variable Items (TStrings). ¿Dónde está definida? ¿Si la destuyes o no?

Te lo comentaba por si entiendes la diferencia de ambas cosas. Si eres consciente, bien, pero si no lo eres te puede dar problemas a posteriori dependiendo de lo que hagas.

david_uh 30-11-2013 15:15:55

si bien el termino sobreescribir no el adecuado aquí como bien dices estoy cambiando la referencia al puntero de items lo cual me deja algunas dudas, si digamos listbox1 tienes unos determinado items digamos 100 productos mostrando, luego mediante código le asigno una nueva referencia a un objeto TStrngs, que hay de los anteriores osea los que tenia anteriormente, esta claro que ya no existe referencia a ellos per aun están en memoria, tal vez habría que hacer un FreeAndNil antes de asignar la nueva referencia, con respecto al objeto TString creado si es controlado su ciclo de vida y al ya no ser usado es liberado con un FreeAndNil

Caminante 03-12-2013 18:06:02

Cita:

Empezado por Neftali (Mensaje 470291)
No se trata sólo de sobreescribir o agregar.
Estás trabajando con objetos, así que la primera manera, lo que hace es sustituir el objeto Items del combobox, por el objeto items que tú has creado.

El apuntador a Items que hay en TComboBox lo has redirigido a Items (TStrings). El apuntador al anterior Items (el que originalmente era del combobox) lo has perdido y la consiguiente memoria también. Ahora hay que ver qué haces con la variable Items (TStrings). ¿Dónde está definida? ¿Si la destuyes o no?

Te lo comentaba por si entiendes la diferencia de ambas cosas. Si eres consciente, bien, pero si no lo eres te puede dar problemas a posteriori dependiendo de lo que hagas.

Yo tenia entendido que al ser items una propiedad no se hace ninguna asignacion de punteros sino se implementa con el metodo assign.

Neftali [Germán.Estévez] 04-12-2013 09:27:30

Cita:

Empezado por Caminante (Mensaje 470368)
Yo tenia entendido que al ser items una propiedad no se hace ninguna asignacion de punteros sino se implementa con el metodo assign.

En realidad el método Assign está definido en su ancestro (TStrings), y tienes razón, sería la otra forma de hacer lo que hemos comentado aquí. Si miras la implementación, verás que este método al final acaba realizando un AddStrings, tal y como hemos dicho antes, no crea un nuevo objeto TStrings y lo asigna.


La franja horaria es GMT +2. Ahora son las 03:05:03.

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