Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Imposible hacer visible un form desde otro form (https://www.clubdelphi.com/foros/showthread.php?t=28649)

SMTZ 27-12-2005 16:59:20

Imposible hacer visible un form desde otro form
 
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:

Código:

Unit Unidad1;

uses
  Unidad2;

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

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

Código:

...
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

Solucionado
 
Si dentro de la unidad1 defino una variable F2 del tipo Form2, puedo ejecutar:

Código:

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

No siempre es valido
 
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

Nuevo form independiente
 
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

Ya lo probé
 
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

Hay otra manera pero tampoco funciona
 
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 es eso
 
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

Vuelvo a explicarlo
 
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.

Código:

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;

Código:

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:

Código:

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)
Código:

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

        static public TWelcomeForm WelcomeForm;

y luego antes de correr la aplicacion lo creo:
Código:

            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:
Código:

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

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


La franja horaria es GMT +2. Ahora son las 15:21:05.

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