Apuntadores a Objetos

Respuesta de
a
Usuario
Hola: Charl Linssen

Mi problema es básicamente el siguiente:

Tengo que crear un componente en run time, dicho componente lo derivo de la clase TspeedButton y posteriormente lo agrego un par de cositas (como un label y un apuntador al siguiente elemento, y una par de variables más), pero no solo tengo que crearlo, siono que ademas debo de generar una lista enlazada de dichos componentes y seguirles la pista durante la ejecución, según yo se hace a travea de apuntadores, pero la verdad es de que ya me duele la cabeza intentado hacer esto y no lo logro, te mando algo del código que tengo y espero que me puedas ayudar en algo.

TMesa= Class(TSpeedButton)
Public
IdMesa : Integer;
Entrada : TTime;
Salida : Ttime;
Etiqueta : TLabel;
Siguiente: ^TMesa;
end;


For i := 1 To DataMod.TMesas.RecordCount Do
Begin
Mesa := Tmesa.Create(Self);
If i = 1 then
Begin
Primera := @Mesa;
Ultima := Addr(Mesa);
End
Else
Begin
Ultima^.siguiente := Addr(Mesa);
Ultima := Addr(Mesa);
End;

El problema es que primera siempre apunta a Mesa, bueno cuando trato de desreferenciar Primera y realizar algo, siempre lo realizo sobre mesa que es la ultima que se creo, quiero suponer que esto se debe a que en realidad Mesa es un apuntador a un objeto, ¿pero entonces como hago para que pueda crear una lista enlazada de estos objetos? .. Bueno de antemano mucha gracias por tu atención
Experto
Los problema basico es que el apuntador debes asignarlo una vez el objeto creado,
y veo que el apuntador a sido creado a una clase; cada vez que inicialices una clase va a apuntar
al ultimo objeto que haya creado; solucion? yo te recomiendo usar directamente los componentes de la forma;
¿Cómo así? ... Para el redibujado de componentes primeros usas el método invalidate self ( forma que va a ser redibujada)
Y luego aplicas el repaint; una vez adicionado el componente el ControlCount de la forma (ventana raíz) aunmentara en 1
y la Enumeración (vectores) del Objeto Controls contendrá los nuevos controles; por lo que la forma:
Self.controls[X].handle apuntara al controlq ue has creado y podras hacer loq ue tu quieras con el.

Éxitos.
Experto
En Delphi(>5) a igual que en java, el uso de lo sapuntadores es más que todo por estricta compatibilidad, es decir, un ejemplo algo sencillo, las dll de la cada de windows, las cuales no esta registradas, podemos pasarles PChar(Delphi) o simplemente WideString, el compilador forzá la compatibilidad, en la solución que os di, trabajando con delphi4, me paso algo muy similara lo tuyo pero estuve trabajando con TStream, y cuando almacenaba y buscaba los punteros siempre los tenia apuntando al ultimo creado, pregunte a algunos expertos y me dijeron el porque, la capa de administración de memoria de delphi en muy resumidos casos no depende del usuario, al menos que echemos manos de los procedimientos de petición y posterior liberación de recursos, caso curioso es que las dll escritas en Delphi para Visual designer no corren tan rapido y seguro como las diseñadas en C y sus derivados. Bueno seguimos en linea y éxito con la programación.


Luis Delgado.
Usuario
Ok. Muchísimas gracias, la verdad es de que fue de gran utilidad tu ayuda, pero mientras esperaba tu respuesta encontré una forma de hacer una lista enlazada de estos objetos, por cierto aquí pongo algo del código digo por si a alguien nle sirve y nuevamente muchas gracias por tu respuesta.

TMesa= Class(TSpeedButton)
Public
IdMesa : Integer;
Entrada : TTime;
Salida : Ttime;
Etiqueta : TLabel;
Siguiente : TMesa;
end;
Var

Paso,
Primera,
Ultima,
Mesa : TMesa;

For i := 1 To DataMod.TMesas.RecordCount Do
Begin
Mesa := Tmesa.Create(Self);
If i = 1 Then
Primera := Mesa

Else
Ultima.Siguiente :=Mesa;
Ultima := Mesa;
With Mesa Do
Begin
IdMesa := DataMod.TMesas.FieldValues['IdMesa'];
Name := 'Mesa'+IntToStr(DataMod.TMesas.FieldValues['IdMesa']);
...
...
Mesa.Siguiente := Nil;
End; // fin Do

DataMod.TMesas.Next;

Por cierto hay que recordar que los objetos en realidad son apuntadores solo que los manejamos de maneras diferentes
Usuario
Ok. Tu ayuda me sirvió de mucho, si bien no use el método que me indicaste, tu respuesta me aclaro algunas cosas, así que por le momento es todo, pero seguramente te estaré molestando muy pronto. Gracias por todo