Saber si ya existen objetos de una clase creada para no crear mas

13/02/2005 - 13:23 por Hans Castorp | Informe spam
La situación es la siguiente:

1.- Pincho en un nodo del arbol y esto me crea un form.
2.- Pincho en otro nodo y en principio me crearía otro.
Todos estos forms están contenidos en un MDI form.
Cuando vuelvo a pinchar en el primero me gustaría que me mostrase el form
que ya tengo creado y no que me cree otro más.

¿Como puedo controlar esto?. La primera vez quiero que me lo cree pero la
segunda quiero que vuelva al que ya tengo creado.

Gracias

Preguntas similare

Leer las respuestas

#1 Octavio Hernandez
13/02/2005 - 14:46 | Informe spam
Hans,

1- Si la aplicación es MDI, puedes acceder a la lista de todas las ventanas
hijas existentes mediante la propiedad MDIChildren del form principal.
2- Para comprobar si una ventana es de una clase específica, puedes utilizar
el operador is de C#.

Uniendo las dos técnicas, puedes saber si existe un form de la clase que te
interesa.

3- Mírate este artículo sobre cómo asociar información adicional a los
nodos de un treeview:

http://msdn.microsoft.com/library/d...eenode.asp

Por ejemplo, podrías almacenar en cada nodo del treeview una referencia a la
clase de la ventana que debería aparecer cuando se 'pinche' sobre ese nodo.
4- Si tienes una referencia a una clase, es fácil mediante reflexión crear
un objeto de esa clase (en este caso una ventana), si no lo encontraras en
la lista de hijas MDI.

Un consejo adicional para darle mejor 'forma' a tu aplicación es que todas
tus ventanas hijas de diferentes tipos hereden de una clase base común. Así
te será más fácil gestionar los comportamientos comunes que seguro querrás
que tengan.

Saludos,

Octavio


"Hans Castorp" escribió en el
mensaje news:
La situación es la siguiente:

1.- Pincho en un nodo del arbol y esto me crea un form.
2.- Pincho en otro nodo y en principio me crearía otro.
Todos estos forms están contenidos en un MDI form.
Cuando vuelvo a pinchar en el primero me gustaría que me mostrase el form
que ya tengo creado y no que me cree otro más.

¿Como puedo controlar esto?. La primera vez quiero que me lo cree pero la
segunda quiero que vuelva al que ya tengo creado.

Gracias
Respuesta Responder a este mensaje
#2 Alfredo Novoa
13/02/2005 - 18:38 | Informe spam
On Sun, 13 Feb 2005 04:23:05 -0800, Hans Castorp
wrote:

¿Como puedo controlar esto?. La primera vez quiero que me lo cree pero la
segunda quiero que vuelva al que ya tengo creado.



Muy fácil: Utilza la propiedad Tag de TreeNode.

La primera vez Tag valdra null, y en las siguientes veces Tag tendrá
un puntero al formulario correspondiente.


Saludos
Respuesta Responder a este mensaje
#3 Daniel A. Calvin
13/02/2005 - 20:48 | Informe spam
Hola Castorp

La forma mas eficiente para hacer eso y siempre que solo quieras una única
instancia de un objeto es crear un singleton.

Un singleton es una clase cuyo contructor es privado y tiene un método
estático que te retorna una instancia de ese objeto, por supuesto siempre la
misma.

Si haces esto tendrás un problema en tiempo de edición, ya que vs requiere
que los formularios tengan un constructor publico.

Entonces que hacer?

Podrías crear un campo static de l tipo de tu formulario ej:

Nombre Clase frmMiFormulario

public class frmMiFormulario .
{
public static frmMiFormulario MiInstancia=null;

//En el contructor por defecto agregas
public frmMiFormulario()
{
miInstancia=this;

}

}

En donde creas los formularios haces lo siguiente:

frmMiFormulario m=null;
if(frmMiFormulario.miInstancia==null)
m=new frmMiFormulario();
else
m=frmMiFormulario.miInstancia;

Esto es solo la idea base, tenes que ante el evento closing hacer
miInstancia=null;

Y si haces un new en algún lugar mas de una vez en
frmMiFormulario.miInstancia obtendrás el ultimo objeto creado.
Para evitar esto en el contructor podes hacer:

public frmMiFormulario()
{
if(miInstancia==null)
miInstancia=this;
else
throw ..
}

Por último, ESTO NO ES UN SINGLETON, es una idea parecida para que VS te
permita editar tu formulario en tiempo de diseño.


Si querés ver bien que es un singleton y como implementarlo bus en google
GOF and Singleton

Saludos

Daniel Calvin
MCP

"Hans Castorp" escribió en el
mensaje news:
La situación es la siguiente:

1.- Pincho en un nodo del arbol y esto me crea un form.
2.- Pincho en otro nodo y en principio me crearía otro.
Todos estos forms están contenidos en un MDI form.
Cuando vuelvo a pinchar en el primero me gustaría que me mostrase el form
que ya tengo creado y no que me cree otro más.

¿Como puedo controlar esto?. La primera vez quiero que me lo cree pero la
segunda quiero que vuelva al que ya tengo creado.

Gracias
Respuesta Responder a este mensaje
#4 Hans Castorp
13/02/2005 - 20:51 | Informe spam
Hola de nuevo,

He probado con el siguiente código pero me sigue creando los formularios
cada vez que pincho en el nodo del tree:

if(treeView1.Tag==null){
if (treeView1.SelectedNode.Text=="Mantenimientos")
{
Form2 newMDIChild = new Form2();
// Set the Parent Form of the Child window.
newMDIChild.MdiParent = this;
// Display the new form.
newMDIChild.Show();
}
}

Que hago mal?

Gracias

"Alfredo Novoa" wrote:

On Sun, 13 Feb 2005 04:23:05 -0800, Hans Castorp
wrote:

>¿Como puedo controlar esto?. La primera vez quiero que me lo cree pero la
>segunda quiero que vuelva al que ya tengo creado.

Muy fácil: Utilza la propiedad Tag de TreeNode.

La primera vez Tag valdra null, y en las siguientes veces Tag tendrá
un puntero al formulario correspondiente.


Saludos


Respuesta Responder a este mensaje
#5 Raziel
13/02/2005 - 21:05 | Informe spam
Que tal

Yo tuve una situacion similar con un formulario MDI, lo
que hice fue crear un metodo que me diga si la forma esta
cargada:

private bool FormLoaded(string frmNameToLoad)
{
Form[] frmMDI=this.MdiChildren;
bool yetLoaded=false;
foreach(Form frm in frmMDI)
{
if (frm.Name==frmNameToLoad)
{
yetLoaded=true;
break;
}
}
return yetLoaded;
}

El parametro que recibe el metodo es el nombre de la
forma que se quiere mostrar, y este codigo debe estar en
la forma MDI Padre.

Si ya esta cargada la forma, lo primero que tienes que
hacer para los formularios hijos, es declarar una
variable static que haga referencia a la instancia de la
forma, por ejemplo:

public static Form frmMDIHija;

Para hacer que la variable haga referencia a la forma que
se esta cargando, en el constructor de la forma (despues
de InitializeComponent();), se agrega:

frmMDIHija=this;

Ahora colocando un ejemplo de todo lo anterior quedaria:

if (FormLoaded("NombreFormaACargar"))
{
//La forma ya ha sido cargada, por lo tanto solo la
mostramos
frmHija.frmMDIHija.Show();
}
else
{
//La forma no ha sido cargada, por lo tanto la cargamos
como una nueva forma
Form frm=new frmHija;
frmHija.MdiParent=this;
frmHija.Show();
}

Espero te sirva y no te confunda los nombres que use.
Tambien puedes crear un metodo static en las formas hijas
que te devuelva la instancia de la forma.

Saludos
Hans,

1- Si la aplicación es MDI, puedes acceder a la lista de


todas las ventanas
hijas existentes mediante la propiedad MDIChildren del


form principal.
2- Para comprobar si una ventana es de una clase


específica, puedes utilizar
el operador is de C#.

Uniendo las dos técnicas, puedes saber si existe un form


de la clase que te
interesa.

3- Mírate este artículo sobre cómo asociar información


adicional a los
nodos de un treeview:

http://msdn.microsoft.com/library/default.asp?


url=/library/en-
us/vbcon/html/vbtsksubclassinglistitemortreenode.asp

Por ejemplo, podrías almacenar en cada nodo del treeview


una referencia a la
clase de la ventana que debería aparecer cuando


se 'pinche' sobre ese nodo.
4- Si tienes una referencia a una clase, es fácil


mediante reflexión crear
un objeto de esa clase (en este caso una ventana), si no


lo encontraras en
la lista de hijas MDI.

Un consejo adicional para darle mejor 'forma' a tu


aplicación es que todas
tus ventanas hijas de diferentes tipos hereden de una


clase base común. Así
te será más fácil gestionar los comportamientos comunes


que seguro querrás
que tengan.

Saludos,

Octavio


"Hans Castorp"


escribió en el
mensaje news:C2185975-78FA-4B60-9C93-



La situación es la siguiente:

1.- Pincho en un nodo del arbol y esto me crea un form.
2.- Pincho en otro nodo y en principio me crearía otro.
Todos estos forms están contenidos en un MDI form.
Cuando vuelvo a pinchar en el primero me gustaría que




me mostrase el form
que ya tengo creado y no que me cree otro más.

¿Como puedo controlar esto?. La primera vez quiero que




me lo cree pero la
segunda quiero que vuelva al que ya tengo creado.

Gracias




.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida