PDA

Ver la Versión Completa : Crear Instancias a partir de un nombre


radaalvaro
01-06-2006, 19:43:44
Saludos a todos los DelphiAdictos. jejeje.

Tengo un problema que me aflije, les describo en que consiste con un pequeño ejemplo.

Tengo las clases...

type
Papel = class
...
end;

Lapiz = class
...
end;

Tijera = class
...
end;

si tengo esas clases y en algun lugar de mi codigo tengo un string con el nombre de alguna de las clases

var s:string
Begin
s := 'Papel';
...

necesito poder crear una instancia de alguna de esas clases, el nombre de la clase que deseo instanciar estara en un string, especificamente en la variable S.

deseo ver la forma de crear una instancia de clase que especifica S, SIN USAR un IF s='Papel'... o alguna cosa asi, por que poseo muchas clases y deseo hacer algo genérico.

Si de algo sirve..., estoy usando Delphi 2006.NET, NO VCL.NET, sino solo DELPHI 2006.NET.

jejejeje, trate de ser lo mas explicito que el tiempo me lo permitio.. :)

Sin mas que decirles, y esperando que puedan ayudarme con ese problema me despido de todos los DELPHIADICTOS.

Lepe
01-06-2006, 21:47:21
Aquí lo tienes (http://www.clubdelphi.com/foros/showthread.php?t=14546&highlight=factory)

Saludos

radaalvaro
02-06-2006, 17:53:38
Muchas gracias LEPE, jejeje, pero creo que no leiste el ultimo comentario, no Delphi WIN32 ni VCL.net, si no DELPHI.NET, mas concretamente quiero saber como se podria hacer aquello que explique en c#.net o en VB.net, ya que si logro hacerlo alli tambien lo hare en Delphi.net, por usar el mismo FRAMEWORK.

Gracias de todos modos.

maeyanes
02-06-2006, 18:00:16
Checa si te sirve este artículo (http://www.codeproject.com/gen/design/CSharpClassFactory.asp)


Saludos...

dec
02-06-2006, 18:47:33
Hola,

Aunque es un tema que daría para mucho, aquí te pongo un sencillísimo ejemplo basado en los que aparecen en el libro Visual C# de Francisco Charte (http://fcharte.com/):


/*
* Basado en ejemplos del libro Visual C# de Francisco,
* Charte, concretamente, los del capítulo titulado
* Recuperación de información de tipos en tiempo de
* ejecución.
*
*/

using System;
using System.Reflection;

namespace Consola.Pruebas
{
class Program
{
static void Main(string[] args)
{
/* Obtenemos una referencia a este ensamblado, pero, nótese
que podríamos obtener la referencia de cualquier otro
*/
Assembly ensamblado = Assembly.GetExecutingAssembly();

/* Obtenemos el tipo de la clase "Prueba", a traves de su
nombre completo, que, como puede verse, incluye el ensam-
blado en donde se encuentra dicha clase Pruebas.
*/
Type ClasePrueba = ensamblado.GetType("Consola.Pruebas.Prueba");

// Si efectivamente tenemos el tipo de la clase...
if (ClasePrueba != null)
{
/* Creamos una instancia de la clase, pero, nótese que lo
obtendremos será la instancia de un "objeto", pero no po-
dremos trabajar con él como si fuera directamente instan-
ciado "como suele ser habitual".
*/
Object ObjetoPrueba = Activator.CreateInstance(ClasePrueba);

// Esta sería una forma de invocar a un método del objeto
(ObjetoPrueba as Prueba).Saludos();

// Esta sería otra, nótese que aquí "no conocemos" la clase Prueba
MethodInfo MetodoSaludos = ClasePrueba.GetMethod("Saludos");
MetodoSaludos.Invoke(ObjetoPrueba, null);
}

Console.ReadLine();
}
}

// Clase para las pruebas anteriores
class Prueba
{
public Prueba()
{
Console.WriteLine("Constructor de la clase Prueba");
}

public void Saludos()
{
Console.WriteLine("Método Saludos de la clase Prueba");
}
}

} // class Program

radaalvaro
13-06-2006, 06:38:04
Muchas gracias por la respuesta... me dio un rumbo en mi busqueda, pero ahora tengo otro problema... cuando en DELPHI, quiero hacer, lo que esta puesto a continuación...



/* Obtenemos el tipo de la clase "Prueba", a traves de su
nombre completo, que, como puede verse, incluye el ensam-
blado en donde se encuentra dicha clase Pruebas.
*/
Type ClasePrueba = ensamblado.GetType("Consola.Pruebas.Prueba");



Simplemente no me devuelve nada, ya que le pongo como nombre de clase por ejem. Project1.TDatos.
ó
Project.Unit1.TDatos
ó
Unit1.TDatos
ó
TDatos...
y de ninguna de las maneras me funciona, de tal modo que no puedo obtener lo que busco... alguien ya lo ha hecho en DELPHI.NET???

dec
13-06-2006, 14:03:49
Hola,

Se me ocurre que te asegures de que el camino a la clase es el que tiene que ser. ¿Cómo? A bote pronto diría que utilizaras algo como esto:


Assembly ensamblado = Assembly.GetExecutingAssembly();


Creo que en "ensamblado" cuentas con propiedades como "FullName", "Name" o similares, que tal vez puedan orientarte. Desde luego el código que he puesto anteriormente está escrito en C#, pero, no se me ocurre ahora otro motivo por el que no funcionara también en Delphi .NET.

radaalvaro
13-06-2006, 15:38:19
Hola Dec.

quiero darte muchas gracias por tu atención... ahora, avocandome al tema, intente lo que dices, es mas, me base en todo el bloque de codigo que me diste que estaba en c#, y es muy bueno, pero tengo la flla justamente a la hora de llamar a la clase, es decir a la hora de hacer el GETTYPE, desde el assembly, ya que el assembly, carga tranquilamente, y es el correcto.

jejejeje, mi problema parece de locos... :)

GRACIAS...

radaalvaro
14-06-2006, 01:04:41
Hola a todos, les cuento que leyendo un poco y probando otro poco, pude encontrar las solución... el problema se suscitaba en el nombre de la clase a la que estaba buscaba, y como dice en el bloque de codigo sugerido por DEC, se debe de poner el nombre de la clase unido al nombre de su ensamblado.

Yo no podia hacerlo, ya que en teoria mi clases no estaban manejando ensamblado, pero todo se soluciono poniendole el nombre de la unidad + punto + el nombre de la clase... y con eso todo corre de maravilla.

Gracias...:)

ColdFusion
04-04-2009, 00:31:27
Ya que hablamos de instancias, como puedo hacer para que mi aplicacion solo se pueda abrir una vez, es decir si ya se esta ejecutando que no se abra si no que muestre el que ya se esta ejecutando

radaalvaro
15-04-2009, 00:22:32
Recuerdo que alguna vez, hice algo así, y creo que te dará el rumbo...

Para eso esta el patron de Diseño "Singleton", si bien, no es un bloque de codigo que hace la tarea que necesitas, es un esquema de como debe de funcionar.

Saludos.