Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como hacer una lista enlazada dinamica en delphi (https://www.clubdelphi.com/foros/showthread.php?t=60433)

rgstuamigo 02-10-2008 00:15:54

Como hacer una lista enlazada dinamica en delphi
 
Hola queridos amigos foristas necesito sugerencias y opiniones de como poder implementar una lista dinamica en delphi que sea dinamica y generica, de acuerdo a lo siguiente:
Mi estructura Nodo seria:

*Que tenga un variable Elemento, este elemento debe ser generico, es decir puede tomar cualquier tipo de dato,objeto,variable;(perece ser que en C++ esto se logra con template).
*Bueno(es logico) el otro elemento es un link o enlace de tipo Nodo.
De esa forma lograria tener un lista dinamica generica.:eek:
Cualquier ayudita o sugerencia es bien recibida.
Muchas gracias de antemano.:)

Neftali [Germán.Estévez] 02-10-2008 08:51:50

Cita:

Empezado por rgstuamigo (Mensaje 317595)
*Que tenga un variable Elemento, este elemento debe ser generico, es decir puede tomar cualquier tipo de dato,objeto,variable;(perece ser que en C++ esto se logra con template).

*Bueno(es logico) el otro elemento es un link o enlace de tipo Nodo.

No acabo de entender que quieres decir con dinámica y genérica. ¿Algo así como un ObjectList?
Supongo que para lo primero puedes crear un Pointer, similar a como tienen los ObjectList; Con ese apuntador podrás almacenar/apuntar a lo que quieras. Y tal vez otro apuntador para el siguiente nodo.

Insisto, antes de seguir revisa TList, TObjectList,...

coso 02-10-2008 09:28:28

Hola, seria algo asi como

Código:


typedef struct Nodo {
            variant (?) elemento;
            Nodo *conexion; };

no recuerdo bien bien la sintaxis de C, algo de este estilo seria...Todo y eso, las listas dinamicas para que sean correctas tienen conexión con el anterior y con el siguiente...

Código:


typedef struct Nodo {
            Nodo *anterior,*siguiente;
            variant (?) elemento };

igualmente, como te dice Neftali, en C++ y ya en OOP en general, este tipo de estructuras ya estan implementadas (el mismo TObjectList...) saludos.

rgstuamigo 02-10-2008 19:43:30

Gracias por sus respuestas amigos.
La idea de implementar una lista enlazada dinamica generica es que a veces necesito esta estructura de datos para utilizar en cualquier aplicacion que necesite, estoy tratando de entender Las clases ya implementadas TList,TObjectList; la primera es generica pero guardas solo punteros de objetos;la segunda guarda Objeto,pero cuando le mando que adicione por decir un Record creado por mi, me sale que es incompatiple los datos; que yo sepa, en programcion solo se puede hacer casting de una clase padre hacia una clase hija, o de hija a hija,y nunca de hija a padre,(Bueno eso es en java) por tanto: ¿Cómo hago un casting de un record a un TObject?.
En cuanto a lo que dice coso, yo he implementado algo parecido en c++Builder y en Java,pero pense que en delphi seria mas facil; lo que tenia duda es como se hace en Delphi.
Tengo una duda;lei por ahi que delphi en pura referencia,entonces me pregunte si es pura referencia es identico a hacerlo en java, pero queria comprobar si esto era verdad.
No se si alguien me puede aclarar el asunto...¡¡¡:confused:¡¡¡¡¡

coso 02-10-2008 21:31:05

ah en delphi seria algo como

Código Delphi [-]
type
     nodo = class
     valor : variant;
     anterior, posterior : nodo;
end;

ya te digo q este tipo de estructura esta muy manido. Seguro q si miras bien los objetos TList o TObjectList, encuentras una solución ya hecha. Saludos.

coso 02-10-2008 21:40:57

Cita:

¿Cómo hago un casting de un record a un TObject?.
en vez de usar un record, puedes crear una clase descendiente de TObject.

Lepe 02-10-2008 21:54:07

hablando en plata:
Código Delphi [-]
type MiObjeto = class(TObject)  // ya está, ya tienes un objeto con esta linea
  public
     valor : variant;
     anterior, posterior : TObject;
end;

Saludos

coso 02-10-2008 21:55:43

bueno, corrigiendo a Lepe...
Código Delphi [-]
type MiObjeto = class(TObject)  // ya está, ya tienes un objeto con esta linea  
  public     
      valor : variant;     
      anterior, posterior : MiObjeto;
end;

saludos.

roman 03-10-2008 00:20:43

Y ¿para qué quiere hacer un casting de un record a un TObject, si con un Pointer puede hacer referencia a uno y otro? Yo creo que un TList es más que suficiente para casi todo.

Por otro lado, usar un Variant puede ser útil para tipos simples, pero para tipos estructurados no es posible usarlos directamente, y hay que hacer demasiado moldeo:

Código Delphi [-]
V := Integer(UnObjeto);

...

TUnbjeto(Integer(V)).UnMetodo();

// Saludos

gatosoft 03-10-2008 00:48:54

Román tiene razón, Además un Tlist o un TObjectList fueron diseñados con el propòsito de simplificar el manejo de listas enlzadas...

además, amigo "rgstuamigo", si te empeñas en hacer una lista enlazada "a la antigua" tendrás que implementar toda su funcionalidad a mano,... ya sabes: Insertar, eliminar, ir hacia adelante, ir hacia a atras... etc, etc... ¿Por que no intentar con los objetos que te proponen? tienen muchas ventajas y muy probablemente sean menos dolores de cabeza...

Por otro lado si de todas formas utilizas un objeto del tipo:
Código Delphi [-]
type MiObjeto = class(TObject)  
  public     
      valor : variant;     
      anterior, posterior : MiObjeto;
end;


pues mejor haces:

Código Delphi [-]
type MiObjeto = class(TObject)  
  public     
      valor : variant;     
end;

y dejas el trabajo de anterior y posterior al TObjectList....


Como comentario adicional... no se que peinsen uds. pero creo que con la POO, el uso de Records es menos eficiente... es decir, si saca de apuros y para proyectos rápidos es funcional, pero por principio, si un grupo de variables se puede agrupar es muy probable que sea candidato a objeto...



Saludos,

Delphius 03-10-2008 02:28:11

Opino igual que ustedes: si las clases están usemoslas. Pero, he aquí que tal vez no conocemos en profundidad que es lo que se busca.
Quizás rgstuamigo es un estudiante y recién está viendo sobre los tipos abstractos de datos y a modo de tarea le pidieron que implementace una lista doble encadenada.
Es un ejercicio bastante común, al menos cuando fuí estudiante se nos los pedía. En caso de que se trate de esto... tal vez sería más productivo para él que nuestra ayuda se focalize en asistirlo en como llevar a cabo la implementación de los procedimientos y funciones necesarios.

Saludos,

roman 03-10-2008 05:37:05

Al principio pensé lo mismo, Delphius, pero entonces, ¿para qué la genericidad? Para aprender y realizar el típico ejercicio de listas, no hace falta irse por las ramas, se hace una lista de enteros y ya estuvo.

Por cierto, me parece que Tiburón ya traerá los famosos templates estilo C++ ¿no? Y, de hecho, creo que FreePascal ya los tiene.

// Saludos

Lepe 03-10-2008 05:37:09

Cita:

Empezado por coso (Mensaje 317808)
bueno, corrigiendo a Lepe...

No es una corrección, es una mejora :p

Sí, tenéis razón, fué un tecleado rápido (sin pensar mucho...) :o

coso 03-10-2008 17:52:38

no no, es una correcion :D...el nodo anterior y el siguiente (al menos, tengo entendido) tienen q ser del mismo tipo, para crear la 'cadena', aunque seguro q hay variedades con la clase inicial. Saludos ;)

coso 03-10-2008 18:05:18

Cita:

pero entonces, ¿para qué la genericidad? Para aprender y realizar el típico ejercicio de listas, no hace falta irse por las ramas, se hace una lista de enteros y ya estuvo.

antes de usar OOP, estas listas con struct eran muy comunes (y tambien un nido de bugs). Claro esta, que el struct (el record) no tenia unicamente un solo tipo de dato. Este tipo de cadenas se hacian cuando se necesitaban arrays dinamicos de estructuras (si bien tambien se podia hacer con un unico puntero a una variable de ese tipo, aunque no hubiese 'contacto' entre los nodos), pero ahora en delphi se puede dejar un array sin determinar la longitud y cambiarlo con setlenght directamente en el momento que te plazca. Por lo tanto, la lista dinamica quedaria anterior te quedaria como...

Código Delphi [-]
var
v : array of variant;
begin
   setlength(v,19);
end;

o bien de un record...

Código Delphi [-]
type 
  Estruct = record
  v1 : variant;
  dato1 : integer;
  ...
end;
 
var
  v : array of Estruct
begin
  setlength(v,19);
  ...
end;

que creo que es lo q comenta roman. Lo que vengo a decir es que si bien las listas dinamicas genericas se creaban de esa manera, indicando el puntero al nodo siguiente y al anterior, ahora es una tipo de estructura mas que desfasada (o ya implementada en el propio lenguaje). Saludos y a ver si te sirve la información ;)

rgstuamigo 03-10-2008 20:43:28

Gracias por los comentarios amigos, quisiera aclarar unos puntos:

Cita:

además, amigo "rgstuamigo", si te empeñas en hacer una lista enlazada "a la antigua" tendrás que implementar toda su funcionalidad a mano,... ya sabes: Insertar, eliminar, ir hacia adelante, ir hacia a atras... etc, etc... ¿Por que no intentar con los objetos que te proponen? tienen muchas ventajas y muy probablemente sean menos dolores de cabeza...
No es que quiera reinventar la rueda, sino queria ver verdaderamente las potencialidades de delphi en estas areas, como les dije yo he implementado listas simples,lista doblemente enlasadas, arboles (binarios,AVL,Rojo y Negro,B,B+)en otros lenguajes de Programacion (Java concretamente a pesar que ya algunos entas implementados en el propio lenguaje)y no he tenido muchos inconvenientes(solo inconvenientes logicos), pero de lenguaje no.
Yo creo que estas estructuras de datos son parte escencial en la vida de un programador, y quien no las conosca estaria omitiendo un gran conocimiento de la Programacion.
A veces me topado con Docentes en la Universidad (U) que te piden hacer algo pero sin utilizar lo que ya esta echo.¿Entonces que te queda?:confused:
pues hacerlo y pienso que es bueno en cierta manera por que aprendes muchos a pesar de que a veces tu trabajo se vuelve tedioso.

Cita:

Quizás rgstuamigo es un estudiante y recién está viendo sobre los tipos abstractos de datos y a modo de tarea le pidieron que implementace una lista doble encadenada.
Delphius no es que no los conosca, les repito que yo ya he implentado algo parecido, lo que deseaba saber como implementarlo en Delphi ya que nunca habia implementado listas en delphi pero me reté a poder hacerlo generico para poder utilizarla en cualquier ocasion.

Cita:

Por cierto, me parece que Tiburón ya traerá los famosos templates estilo C++ ¿no? Y, de hecho, creo que FreePascal ya los tiene.
Es exactamente lo quiero que me aclaren sobre los templates en delphi y si pueden con un ejemplito; ademas la otra duda es que si ¿Delphi en pura referencia:confused:?
Lo que dices tu Roman para que hacerlo generica , pues te puedo decir si tuvieras un lista generica la podrias usar en cualquier circunstancias que la necesites y con cualquier tipo de objeto es decir Una sola implementacion y te sirve de mucho, por eso quiero saber sobre los templates en Delphi.
Buenos esas mis aclaraciones y dudas que tenia, agradesco sus opiniones queridos amigos:)

maeyanes 03-10-2008 20:58:29

Hola...

A que te refieres con que Delphi es pura referencia? :confused:

Ahora, como ya te han mencionado, Delphi cuenta con algunas clases que resuelven lo que necesitas. Checa la unidad Contnrs, ahí vienen implementadas las estructuras de pilas, colas, listas ordenadas, etc...

Ya con esas clases básicas puedes heredar para hacer lo que desees...

Ahora te pongo un ejemplo de como hacer una lista con estructuras record:

Código Delphi [-]
type
  PRegistro = ^TRegistro;

  TRegistro = record
    Data: Variant;
  end;

// Ejemplo de uso con un objeto TList:
var
  RegistroList: TList;
  Registro: PRegistro;

begin
  RegistroList := TList.Create;
  New(Registro);
  Registro^.Data := 'Hola mundo';
  RegistroList.Add(Registro);
  New(Registro);
  Registro^.Data := 23;
  RegistroList.Add(Registro);
  // Vamos a recorrer la lista:
  for I := 0 to RegistroList.Count - 1 do
    ShowMessage(PRegistro(RegistroList[i])^.Data);
  // Liberamos la memoria:
  for I := 0 to RegistroList.Count - 1 do
    Dispose(PRegistro(RegistroList[i]));
  RegistroList.Clear;
  RegistroList.Free
end;

Saludos...

coso 03-10-2008 20:59:52

Cita:

A que te refieres con que Delphi es pura referencia?
creo q se refiere a que la definicion de un objeto es directamente un puntero a ese objeto...

maeyanes 03-10-2008 21:03:22

Hola...

Cita:

Empezado por coso (Mensaje 317995)
creo q se refiere a que la definicion de un objeto es directamente un puntero a ese objeto...

La definición de un objeto en Delphi es una clase... y esta no es un puntero a un objeto...

¿O será que te entendí mal? :p



Saludos...

roman 03-10-2008 21:05:21

Cita:

Empezado por rgstuamigo (Mensaje 317988)
Lo que dices tu Roman para que hacerlo generica , pues te puedo decir si tuvieras un lista generica la podrias usar en cualquier circunstancias que la necesites y con cualquier tipo de objeto es decir Una sola implementacion y te sirve de mucho, por eso quiero saber sobre los templates en Delphi.
Buenos esas mis aclaraciones y dudas que tenia, agradesco sus opiniones queridos amigos:)

Pues precisamente, un TList o un TObjectList los tienes casi para cualquier circunstancia sin necesidad de entrar en los templates. Tú que has trabajado en Java, sabrás que ahí, quizá más que en Delphi, todo son objetos. Entonces, un TObjectList es más que suficiente. Pero como en Delphi tenemos más tipos de datos estructurados, como los records, no hay problema porque tenemos al TList, y mira que el TList te sirve igual para objetos (de hecho, le he visto pocas ventajas a un TObjectList sobre un TList).

Ahora, ¿que quieres hacer listas de datos simples como enteros, caracteres o strings (1)? Pues basta que los "envuelvas" en un registro o una clase

Código Delphi [-]
TString = class
  Valor: String;
end;

y ya puedes hacer tu lista de Strings.

// Saludos

(1) Estrictamente hablando, String no es un tipo simple, y si lo "envuelves en un record habrá que tener cuidado con la liberación de la memoria que usa.

roman 03-10-2008 21:08:16

Cita:

Empezado por maeyanes (Mensaje 317998)
La definición de un objeto en Delphi es una clase... y esta no es un puntero a un objeto...

Bueno, internamente, una variable objeto es un apuntador al objeto, sólo que se omite el operador ^.

// Saludos

maeyanes 03-10-2008 21:10:08

Hola...

Cita:

Empezado por roman (Mensaje 317999)
...y mira que el TList te sirve igual para objetos (de hecho, le he visto pocas ventajas a un TObjectList sobre un TList).

De hecho, creo que la única ventaja que tiene TObjectList sobre TList, es que la primera puede ser la dueña de los objetos y liberarlos automáticamente, sin tener que hacerlo "a mano" (propiedad OwnsObjects)


Saludos...

maeyanes 03-10-2008 21:12:03

Hola...

Cita:

Empezado por roman (Mensaje 318003)
Bueno, internamente, una variable objeto es un apuntador al objeto, sólo que se omite el operador ^.

// Saludos

Si, eso si lo tengo presente... es por eso que pregunté si no le entendí mal... :p

A lo mejor coso se refería a lo que tú comentas...


Saludos...

rgstuamigo 03-10-2008 21:18:22

Cita:

A que te refieres con que Delphi es pura referencia? :confused:
Bueno lei por ahi eso y queria que me lo aclararan.
En cuanto a ti Roman esta bueno lo dices lo voy a probar, gracias por tu sugerencias aunque quisiera implementarlo personalmente pero aun me queda una duda ¿Existen templates en delphi si o no:confused:?

Lepe 03-10-2008 21:18:28

Cita:

Empezado por coso (Mensaje 317949)
no no, es una correcion :D...el nodo anterior y el siguiente (al menos, tengo entendido) tienen q ser del mismo tipo, para crear la 'cadena', aunque seguro q hay variedades con la clase inicial. Saludos ;)

Para algo están los moldeos de tipos. Ten en cuenta que TObjectList está definido para añadir y borrar TObject, pero que casualidad, ese tipo de dato es el base de cualquier otro en delphi, por tanto, puedes añadir TComponents, TImage, TForm... o lo que quieras, incluso mezclarlos en la misma lista de objetos, porque en definitiva, todos son TObject.

Ejemplo:
Código Delphi [-]
var l :TObjectList;
begin
   l := TObjectList.Create(true);
  l.add(image1); // un Timage que tienes en el form puesto
  l.add(panel1); //  un panel 

// Para acceder a las propiedades del TImage;
TImage(l.items[0]).Picture.LoadFromFile('c:\miimagen.bmp');

Para acceder al panel:
TPanel(l.items[1]).Caption := 'Ups mi panel';

Para generar un error gordo:
TPanel(l.items[0]).Caption := 'jaja, error'
// obviamente he guardado un Timage en el índice 0 de la lista
// pero ahora le digo a delphi que lo trate como un panel (moldeo de tipos).
// Delphi me hará caso y lo intenta, pero al acceder a una propieda
// que en teoría es de un panel y que no tiene el Timage, 
//  (el indice cero de la lista)
// nos mostrará un ¿access violation?

l.free; // la magia del polimorfismo

La última linea tiene miga:
- Al crear el TobjectList le pasamos en el parámetro un True, eso le indica
que cuando liberemos la lista, libere tambien los objetos que tiene dentro.

- Pero, si tiene dentro un Timage y el otro es un panel, ¿cómo sabe delphi liberarlos? cada uno hace una cosa distinta al liberarse, por ejemplo:

- el Timage debe liberar la imagen que tenga en su propiedad Picture
- el Tpanel debe liberar los controles que tenga dentro (si tiene alguno)

Esa es la magia del polimorfismo:
Tanto el Timage como el TPanel heredan de TObject, así que cuando ejecutas

l.items[0].free

no se ejecuta el método Free del TObject, en realidad se ejecuta el método Free del Timage o del TPanel, según sea el caso.

rgstuamigo, como ves esa "lista genérica que quieres hacer" está ya hecha, aunque debes comprender los conceptos para poder usarla con toda su potencia.

Aún quieres usar records, punteros o lo que quieras, adelante, no seré yo el que te ate las manos ;).

Saludos

Lepe 03-10-2008 21:21:14

¿a qué le llamas tú templates?

maeyanes 03-10-2008 21:24:51

Cita:

Empezado por rgstuamigo (Mensaje 318007)
Bueno lei por ahi eso y queria que me lo aclararan.
En cuanto a ti Roman esta bueno lo dices lo voy a probar, gracias por tu sugerencias aunque quisiera implementarlo personalmente pero aun me queda una duda ¿Existen templates en delphi si o no:confused:?

Pues hasta Delphi 2007, no...


Saludos...

rgstuamigo 03-10-2008 21:40:37

uhhhhh:rolleyes: Bueno los que hemos trabajado en java o en algun otro lenguaje que los tenga ;un template=plantilla que ayuda a trabajar sobre todo para evitar los casting a cada rato, por decir en el ejemplo de Lepe tiene que hacer una especie de casting para acceder al objeto TImage y al objeto TPanel,y cada vez tendria que hacer lo mismo si quieres acceder a dichos objetos, en cambio con template(Al menos en java)tu creas la lista y le dices por medio de plantillas "Voy a tener una lista digamos de TPanel" (al momento de crearla)entonces la lista esperará solo objetos TPanel y nada mas,y cuando saque de lista me devolvera objetos TPanel,sin necesidad de hacer casting a cada rato; no se si me explico, bueno al menos esto es posible en Java por eso preguntaba si exite en Delphi.:confused:

coso 03-10-2008 21:41:55

Cita:

La definición de un objeto en Delphi es una clase... y esta no es un puntero a un objeto
no, me equivoque :o Una instancia de una clase es un puntero (en delphi)

coso 03-10-2008 21:44:09

Cita:

Si, eso si lo tengo presente... es por eso que pregunté si no le entendí mal... :p

A lo mejor coso se refería a lo que tú comentas...

Exactamente! me llegan los mensajes a destiempo :D

Lepe 03-10-2008 21:46:51

Efectivamente no lo hay, pero siempre puedes heredar de TObjectList y sobreescribir las funciones principales para que solo permitan el Tipo que quieras (tardarás 1 minuto cuando sepas hacerlo).

Mediante Gexperts o CnPacks, podrías guardar ese código "maestro" y cuando deseas utilizarlo sólo has de pegarlo y usar "Buscar y reemplazar" Tpanel por TImage. Listo ahora tu lista en lugar de aceptar TPanel, ahora acepta TImage.

Saludos.

maeyanes 03-10-2008 21:47:28

Hola...

Cita:

Empezado por rgstuamigo (Mensaje 318017)
uhhhhh:rolleyes: Bueno los que hemos trabajado en java o en algun otro lenguaje que los tenga ;un template=plantilla que ayuda a trabajar sobre todo para evitar los casting a cada rato, por decir en el ejemplo de Lepe tiene que hacer una especie de casting para acceder al objeto TImage y al objeto TPanel,y cada vez tendria que hacer lo mismo si quieres acceder a dichos objetos, en cambio con template(Al menos en java)tu creas la lista y le dices por medio de plantillas "Voy a tener una lista digamos de TPanel" (al momento de crearla)entonces la lista esperará solo objetos TPanel y nada mas,y cuando saque de lista me devolvera objetos TPanel,sin necesidad de hacer casting a cada rato; no se si me explico, bueno al menos esto es posible en Java por eso preguntaba si exite en Delphi.:confused:

Esto lo puedes lograr en Delphi heredando desde TObjectList o desde TList:

Código Delphi [-]
type
  TPanelList = class(TObjectList)
  private
    function GetPanels(Index: Integer): TPanel;
    procedure SetPanels(Value: TPanel; Index: Integer);
  public
    function Add(APanel: TPanel): Integer;
    procedure Delete(APanel: TPanel);
    property Panels[Index: Integer]: TPanel read GetPanels write SetPanels;
  end;

implementation

function TPanelList.GetPanels(Index: Integer): TPanel;
begin
  Result := Items[Index] as TPanel
end;

procedure TPanelList.SetPanels(Value: TPanel; Index: Integer);
begin
  Items[Index] := Value
end;

function TPanelList.Add(APanel: TPanel): Integer;
begin
  Result := inherited Add(APanel)
end;

procedure TPanelList.Delete(APanel: TPanel);
begin
  inherited Delete(APanel)
end;

Con esto puedes tener una lista de TPanel sin hacer casting a cada rato...


Saludos...

rgstuamigo 03-10-2008 22:12:22

Esta muy bueno tu codigo Maeyanes gracias por compartir tus conocimientos.
Saco mis conclusiones haciendo una comparacion entre Delphi y Java:
En Delphi para poder hacerlo tengo que crearme una nueva clase heredada de TObjectList y volver a escribir los metodos;
*Significa que cada vez que quiero que mi lista de objeto(TObjectList)
sea de algun tipo, necesariamente (para evitar los casting)debo crearme
una nueva clase heredada de TObjectList, digamos que si quiero una lista
de numeros tengo que hacerme una nueva clase de numero,si quiero de TButton
me hago de una nueva clase, y asi sucesivamente.Esto como he dicho solo para
evitar hacer casting a cada rato.
*En java solo pongo en plantilla el tipo de dato que va ser y listo,
no nesito estar creandome nuevas clases y reescribiendo metodos.
ES EXATAMENTE lo que hemos estado hablando durante todo el hilo.
Seria bueno que Delphi en las proximas versiones tuviera los famosos TEMPLATE
Seria de mucha ayuda para los programadores que nos gusta este IDE's.
MUCHISIMAS GRACIAS AMIGOS por compartir sus experiencias y sugerencias.;):D

Lepe 03-10-2008 22:23:00

Cita:

Empezado por rgstuamigo
Seria bueno que Delphi en las proximas versiones tuviera los famosos TEMPLATE

como me piques, hago un script con cnpacks que lo vas a flipar :p

Esto permitiría que (en delphi 5, 6, 7) con 1 clic de ratón y especificar "TPanel", se creara automáticamente la clase de maeyanes.

Los BDS tienen muchas virguerías, por ejemplo añadir un patrón Singleton, etc, pero todo se basa en lo mismo: métodos de rápida implementación para el programador, en realidad, las clases hay que crearlas.

Ten presente que Java es un lenguaje interpretado, Delphi es compilado.
Delphi es un lenguaje altamente tipificado, mientras que java..... no lo sé, pero imagino que no.

No quiero entrar en polémicas de cual es peor o mejor, simplemente quiero que se tengan en cuenta para no pedirles peras al olmo.

Saludos

rgstuamigo 03-10-2008 23:17:40

No tiene nada que ver si el lenguaje es interpretado,o compilado amigo Lepe,
chekea este link y este otro y veras unos ejemplos de Template en C++, sabiendo que c++ puede ser compilado tambien.Lo de java solo lo ponia por ejemplo.
Lo menos que quiero es hacer una polemica que Java es mejor o Delphi o C++ o Python, o Ruby, etc. Eso seria para el foro de Debate.:D
Eso es lo interesante de hacerlo con Template puedes verlo ahi.
Saludos......;)

Lepe 04-10-2008 01:03:11

Por eso quise que me explicaras a qué le llamabas "Templates".

En delphi usamos el code Template, si te fijas en esa URL, la ventana que pone con ejemplos se llama "Templates", pero obviamente, no tiene nada que ver con lo que quieres.

Otra cosa, que quizás te sirve, es trabajar con referencias de clases, es decir, haces una clase general, que admita operar con el tipo de clase que le definas en tiempo de ejecución:
Código Delphi [-]
type TAdministradorDeClasses = class(TObject)
public
   ClaseAOperar : TClass;
   procedure Add;
end;

implementation

procedure TAdministradorDeClasses.Add;
begin
   nuevo := ClaseAOperar.Create(self);
end;


///  Uso de la clase:
var Admon:TadministradorDeClasses;
     paneles: class of Tpanel;
     botones: class of TButton;
begin
  Admon := TAdministradorDeClases.Create;
  Admon.ClaseAOperar := paneles;
  Admon.Add; // estaría creando un panel en tiempo de ejecución

  Admon.ClaseAOperar := botones;
 Admon.Add ; // estaría creando un botón en tiempo de ejecución
end;

Y hasta aquí, llego :D

Saludos

maeyanes 04-10-2008 01:23:08

Hola...

Cita:

Empezado por rgstuamigo (Mensaje 318043)
No tiene nada que ver si el lenguaje es interpretado,o compilado amigo Lepe,
chekea este link y este otro y veras unos ejemplos de Template en C++, sabiendo que c++ puede ser compilado tambien.Lo de java solo lo ponia por ejemplo.
Lo menos que quiero es hacer una polemica que Java es mejor o Delphi o C++ o Python, o Ruby, etc. Eso seria para el foro de Debate.:D
Eso es lo interesante de hacerlo con Template puedes verlo ahi.
Saludos......;)

El uso de templates en C++ lo único que hace es ahorrarte trabajo, por que al momento de compilar lo que hace el compilador es sustituir la declaración del template por el código completo para que funcione.

Ahora, los que estamos acostumbrados a trabajar en Delphi (Pascal, Object Pascal), no nos afecta el que existan o no. Que serían una gran ayuda, es cierto, pero hemos vivido mucho tiempo sin ellos y siempre hemos podido con el trabajo... :D

Ahora, parece que Delphi 2009 si soporta Genéricos: http://barrkel.blogspot.com/2008/08/...anonymous.html


Saludos...

roman 04-10-2008 01:37:32

Cita:

Empezado por maeyanes (Mensaje 318076)
Ahora, parece que Delphi 2009 si soporta Genéricos: http://barrkel.blogspot.com/2008/08/...anonymous.html

Eso mismo decía yo. :rolleyes:

// Saludos

maeyanes 04-10-2008 01:39:55

Hola...

Cita:

Empezado por roman (Mensaje 318083)
Eso mismo decía yo. :rolleyes:

// Saludos

Ya se... pero yo a veces sufro el síndrome de Santo Tomás... hasta no ver no creer... :D :D :D


Saludos... :)

Kipow 29-11-2008 13:10:57

Solo para complementar un poco el tema ya que me tope con la misma situacion, les dejo aca un link a un video donde dan una introduccion al tema.

Link Video

Saludos


La franja horaria es GMT +2. Ahora son las 09:30: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