Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2013
Avatar de david_uh
david_uh david_uh is offline
Miembro
 
Registrado: may 2007
Ubicación: Arequipa, Perú
Posts: 227
Poder: 17
david_uh Va por buen camino
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
__________________
Yo se que muchas veces te paso ESTO
Responder Con Cita
  #2  
Antiguo 28-11-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 30-11-2013 a las 15:52:38.
Responder Con Cita
  #3  
Antiguo 28-11-2013
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
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
Responder Con Cita
  #4  
Antiguo 28-11-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 28-11-2013 a las 22:36:14.
Responder Con Cita
  #5  
Antiguo 29-11-2013
Avatar de david_uh
david_uh david_uh is offline
Miembro
 
Registrado: may 2007
Ubicación: Arequipa, Perú
Posts: 227
Poder: 17
david_uh Va por buen camino
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...
__________________
Yo se que muchas veces te paso ESTO
Responder Con Cita
  #6  
Antiguo 29-11-2013
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Ciertamente. Metí la pata porque, en Delphi, el error es desde luego más claro que en Lazarus.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 29-11-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #8  
Antiguo 29-11-2013
Avatar de david_uh
david_uh david_uh is offline
Miembro
 
Registrado: may 2007
Ubicación: Arequipa, Perú
Posts: 227
Poder: 17
david_uh Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
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
__________________
Yo se que muchas veces te paso ESTO
Responder Con Cita
  #9  
Antiguo 30-11-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por david_uh Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 30-11-2013
Avatar de david_uh
david_uh david_uh is offline
Miembro
 
Registrado: may 2007
Ubicación: Arequipa, Perú
Posts: 227
Poder: 17
david_uh Va por buen camino
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
__________________
Yo se que muchas veces te paso ESTO
Responder Con Cita
  #11  
Antiguo 03-12-2013
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Cita:
Empezado por Neftali Ver Mensaje
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.
Responder Con Cita
  #12  
Antiguo 04-12-2013
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Caminante Ver Mensaje
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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consulta SQL Basica Cowky SQL 4 17-05-2011 05:31:32
Consulta basica Albano SQL 4 02-07-2005 09:24:49
pregunta basica sobre sockets Jan_polero Internet 2 23-02-2005 16:51:49
Pregunta básica. Como saber si un valor está activo o no. gluglu Varios 3 16-09-2004 19:34:53
Pregunta Básica! Update en InterBase 7.1 con D8 gluglu Conexión con bases de datos 0 16-09-2004 18:23:11


La franja horaria es GMT +2. Ahora son las 10:00:26.


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
Copyright 1996-2007 Club Delphi