PDA

Ver la Versión Completa : punteros o array dinámico


jonmendi
13-05-2010, 11:31:59
Hola!
estoy haciendo una pequeña aplicación que lee datos de tipo record de unos ficheros y luego tiene que interactuar con estos datos.
Mi duda es: ¿es mejor que cargue estos datos en un array dinámico o uso punteros? ¿Qué os sugiere vuestra experiencia?
Muchas gracias!

Un saludo,
Jon

Ñuño Martínez
13-05-2010, 13:12:50
Te recomiendo que uses las clases TList (http://delphi.wikia.com/wiki/TList_Class) o TObjectList (http://delphi.wikia.com/wiki/TObjectList_Class). Los punteros son liosos si no sabes perfectamente cómo funcionan, y aun así tienes que andarte con mil ojos para no meter la pata. Las listas dinámicas no ofrecen la flexibilidad de una clase ni por asomo. No es que TList ni TObjectList sean la panacea, pero funcionan muy bien, oyes.

Busca información sobre las dos clases que te recomiendo, que creo que por aquí las hemos comentado.

Neftali [Germán.Estévez]
13-05-2010, 14:05:36
También puedes utilizar un array dinámico, pero al igual que Ñuño, te desaconsejo los punteros, por lo lioso.

jonmendi
13-05-2010, 15:05:27
gracias a ambos!
yo he solido usar los punteros con frecuencia, pero a pesar de ello, creo que son un lío :D. Leeré sobre TList, y si no convence, array dinámico y a correr!

Muchas gracias monstruos!

Un saludo,
jon

Ñuño Martínez
13-05-2010, 16:50:43
Un pequeño apunte:

Si sólo vas a añadir elementos a la lista y sólo vas a destruirlos al final todos "a la vez", entonces con un array dinámico tienes de sobra. TList y TObjectList están diseñados más bien para cuando vas a estar añadiendo, quitando, moviendo, limpiando, ordenando, etc.

jonmendi
17-05-2010, 09:49:05
Gracias Ñuño!
efectivamente, van a ser "destruidos todos a la vez". Probaré con el array dinámico.

Muchas gracias,

Un saludo,
jon

rojo raton
03-10-2011, 06:42:29
he hecho una clase que permite administrar un array de Tobject utilizando punteros(similar a TobjectList). Mi idea era hacer un array dinámico que me permitiese almacenar objetos del mismo tipo, por ejemplo, una lista de botones, o una lista de labels, etc. Hasta ahí va bien el asunto, pero me he trabado en lo siguiente: supongamos que ya tengo generada la lista de botones, pero cuando quiero extraer o leer un item de la lista, que es un objecto de la clase(tobject) y almacenarlo en un objeto de la clase Tbutton, me lanza un error y dice que son tipos incompatibles.
Es decir, me permite almacenar una instancia de la clase Tbutton en una variable de tipo Tobject pero no me permite lo opuesto. Espero q se haya entendido , saludos.

ecfisa
03-10-2011, 09:01:46
Hola rojo raton y bienvenido a los foros de Club Delphi. :)

Siempre conviene abrir un nuevo hilo para tu consulta ya que incrementa las posibilidades de obtener respuestas.
También ayuda mucho agregar las declaraciónes y la parte del código que está generando el problema. (Demás está decir que exponer exáctamente el mensaje de error que estás recibiendo, es una de las mejores orientaciones a quién está leyendo tu mensaje)

Según entiendo de tu consulta, tenés declarado un array de TObject (llamémosle ObjArray), en el que has almacenado algunos TButtons y el problema se te presenta cuando queres trabajar con alguna propiedad de ObjArray[n] como si del TButton almacenado se tratara.

Si no te comprendí mál, creo que tendrías que moldear el elemento ObjArray[n] al tipo con el cuál querés trabajar. Es decir y simplificando mucho:

...
var
ObjArray: array of TObject;
// Se supone los TButtons ya cargados.

...
var
s: string;
begin
s:= TButton(ObjArray[n]).Caption;
TButton(ObjArray[n]).Caption:= 'Nuevo Caption';
...

Otro ejemplo:

var
bt: TButton;
begin
bt:= TButton.Create(Self);
try
bt:= TButton(ObjArray[n]);
bt.Caption:= 'Nuevo Caption';
...


Por último, como siempre aconsejamos a los recién llegados, te invito a que leas la Guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), un conjunto de sugerencias para que todos podamos entendernos mejor.

Un saludo.

rojo raton
03-10-2011, 15:15:27
Has entendido mi problema!!! y tu respuesta es correcta. Eternamente agradecido, no sabia de que forma moldear una instancia de Tobject a un objeto en particular.
Si, me olvidé de leer la guia de estilo :( ahora le echo un mirada.
Gracias ecfisa!!. un abrazo.

Ñuño Martínez
03-10-2011, 15:50:49
Hola.

Otra forma de "moldear" que me gusta más es usar "AS":
s:= (ObjArray[n] AS TButton).Caption;
Es exactamente lo mismo, pero a mi me gusta más. De la otra forma parece que estás llamando a una función. Pero esto ya son gustos personales.

rojo raton
03-10-2011, 17:07:15
Si, pareciera que estás llamando a una función pero me doy cuenta que en realidad es algo así como "mirar" una instancia de Tobject como si fuese un objeto Tbutton. Bueno ambas maneras de hacerlo funcionan de maravilla.