PDA

Ver la Versión Completa : Imposible hacer visible un form desde otro form


SMTZ
27-12-2005, 16:59:20
Buenas, algo que era muy sencillo realizar con Win32, lo veo imposible hacer con .NET.

Si en Win32 quería hacer visible un form ya creado desde otro form, únicamente tenía que teclear:


Unit Unidad1;

uses
Unidad2;

...
FormUnidad2.Visible := True;
...



En Cambio, en .NET no puedo realizar esto y he probado lo siguiente:


...
FormUnidad2.Visible := True; --> La propiedad "visible" no la encuentra
FormUnidad2.Create.Visible := True --> Va creando forms nuevos
FormUnidad2.ActiveForm.Visible := True --> Como la form activa es la de la unidad1, no hace nada porque ya es visible.
With Sender As Form2Unidad2 Do Visible := True --> Da el error "specified cast is not valid"
...


¿Permite .NET actuar sobre las propiedades de un form ya creado desde otro form?

Gracias.

SMTZ
27-12-2005, 18:20:31
Si dentro de la unidad1 defino una variable F2 del tipo Form2, puedo ejecutar:


Uses
Unidad2;

Var
F2 : Form2;

...

// Por ejemplo, en el evento onload de Form1
F2 := Form2.Create; --> Creo Form2 al cargarse Form1

//Por ejemplo, en el evento onclick de un botón de Form1
F2.Visible := Not F2.Visible;

...




Saludos.

SMTZ
27-12-2005, 19:11:25
Este procedimiento es valido para los forms que creemos manualmente pero, por ejemplo, si se trata del form principal de la aplicación, que se crea automáticamente, ya no es valido, ya que al llamar al método create, crearía otro nuevo form igual que el que ya tenemos, y eso no interesa.

¿Alguien sabe cómo acceder a un form ya creado? Los componentes "normales", como un botón, tienen la propiedad Handle (creo que por ahí van los tiros), pero no un form, por lo que no sé cómo puedo manejar desde otro form las propiedades de un form creado previamente a este.

Gracias.

edgusano
27-12-2005, 20:33:16
La aplicacion que realizas que tipo es: ( mdi, sdi . ..)

SMTZ
28-12-2005, 13:50:50
No es MDI, simplemente es un nuevo form independiente de la misma aplicación.

[Gunman]
30-12-2005, 15:36:15
Formulario.Show;
o
Formulario.ShowModal;
(almenos en delphi para Win32 es así, prueba a ver...);

SMTZ
30-12-2005, 15:48:29
Hola, para .NET la cosa iría así Formulario.Create.Show, pero es que el formulario ya está creado, no necesito crearlo otra vez, que es lo que hace y acabo llenando la pantalla de formularios repetidos, jeje.

[Gunman]
30-12-2005, 16:29:02
Y sin .Create no se puede?

SMTZ
30-12-2005, 16:32:01
En vez de Crete, se puede utilizar ActiveForm, pero es que no puedes forzar a que el formulario activo sea el que tu quieras, sino el que es el que ya está activo.

edgusano
02-01-2006, 16:59:44
Me imagino que en .Net debe haber un contenedor de controles a nivel de aplicacion, asi accediendo a este se podria preguntar si esta creado y asi activarlo en vez de crearlo, esto lo he hecho en aplicacion mdi, pero el contenedor lo tiene el form padre, pero en tu caso no es MDI, pero supongo que debe haber un contenedor de nivel superior es decir aplicacion, en fin buscare y si algo pos aqui te coloco el post :)

BenjiRock
03-01-2006, 09:59:59
No he entendido bien tu pregunta, pero si lo que quieres es traer una ventana, ya creada, al frente es asi:

public void MakeOnTop()
{
Form1.TopMost = true;
}

esta informacion esta sacada de la msdn.
http://msdn.microsoft.com/library/spa/default.asp

Busca:

Mantener un formulario Windows Forms en primer plano.

SMTZ
03-01-2006, 15:06:20
No, lo que intento hacer es poner en "enable = true", por ejemplo, un form ya creado pero que no está activo desde .NET.

SMTZ
03-01-2006, 15:18:29
Hola, creo que en los posts anteriores no me he explicado del todo bien, por eso vuelvo a explicar el problema que tengo desde el principio. Imaginemos dos unidades. La unidad 1 contiene un formulario que quiero activar desde la unidad 2.


UNIDAD1
=======

type
TWinForm = class(System.Windows.Forms.Form)
{$REGION 'Designer Managed Code'}
strict private
Components: System.ComponentModel.Container;
procedure InitializeComponent;
{$ENDREGION}
strict protected
/// <summary>
/// Clean up any resources being used.
/// </summary>
procedure Dispose(Disposing: Boolean); override;
private
{ Private Declarations }
public
constructor Create;
end;



UNIDAD2
=======

...

uses unidad1; // Para que pueda llamar al TWinForm de la Unidad1.

...

Begin
//Imaginemos que pulso un botón y muestro la TWinForm de la unidad1

TWinForm.Create.Show;

end;

...


Begin

//Ahora imaginemos que ya tenemos el formulario creado pero quiero poner su propiedad enable a false.


TWinForm.Enable := False; // Esta línea de un error al compilar porque dice que la propiedad enable no está definida. La cosa iría como se especifica en la siguiente línea.

TWinForm.Create.Enable := False; // Pero esta línea no pone el formulario ya creado en enable, ya que volvemos a llamar a create para que se cree otro formulario y no se actua sobre el que ya está creado.

End;



La posibilidad que he encontrado para solucionar este problema es:


Unidad2
======

...

Var
Form1 : TWinForm;

Begin

Form1.Create.Show;
Form1.Enable := True; // Esta vez, esta línea sí que se puede compilar y con esto quedaría el problema que planteo solucionado.

End;

...



Pero ahora imaginemos que el form sobre el que quiero actuar es el principal, el que se crea por defecto al arrancar la aplicación y no se llama a través de ninguna variable. No he encontrado ninguna solución para poder actuar sobre la propiedad Enable del formulario principal.


Un saludo.

Athanatos
16-01-2006, 21:41:08
Bueno, ahora estoy trabajando con csharp... pero algo tendra en comun con delphi.net. :P

El form principal es creado con un "new", asi que no tenemos nada con que hacer referencia por separado, asi que lo defini primero como objeto:

Este codigo hay que agregarlo en el main (en delphi win32 tambien existe un .pas principal con contenido equivalente. :D)

/// <summary>
/// The main entry point for the application.
/// </summary>

static public TWelcomeForm WelcomeForm;

y luego antes de correr la aplicacion lo creo:

WelcomeForm = new TWelcomeForm();
Application.Run(WelcomeForm);


Lo mismo para todos los formularios, a la manera que lo hace delphi win32: Define los objetos, los crea todos y luego los oculta y muestra segun el caso.

Por ejemplo para mostrar otra ventana y ocultar la actual:

Hide();
MainProgram.MiOtroForm.Show();


Espero que esto mismo que funciona en csharp funcione en delphi.net