![]() |
Pregunta Básica TStrings
Hola foro estuve tratando de llenar los items de un combobox a travez de una variavle algo asi
algo asi pero me mandaba error, luego en la creacion del objeto TStrings utilize la clase TStringList y funcionó
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 |
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. |
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 |
david_uh,
Cita:
Cita:
Cita:
Espero sea útil :) Nelson. |
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... |
Hola,
Ciertamente. Metí la pata porque, en Delphi, el error es desde luego más claro que en Lazarus. :( |
Además de lo comentado, no se si te interesaría realizar esto:
En lugar de esto:
Dependiendo de dónde esté definida la variable de tipo TStrings y lo que hagas con ella, lo segundo puede provocarte errores. |
Cita:
|
Cita:
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. |
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
|
Cita:
|
Cita:
|
La franja horaria es GMT +2. Ahora son las 09:04:00. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi