Visual CSharp .NET - Problema para acceder a variables públicas de formularios mdi desde el formulario padre

 
Vista:

Problema para acceder a variables públicas de formularios mdi desde el formulario padre

Publicado por José Luis Berrueco (4 intervenciones) el 15/07/2021 18:55:13
Estoy intentando programar un monitor de puertos serie con Formularios mdi, a efectos prácticos es como si fuera un editor de texto sencillo para que no entendamos. En los formularios hijo hay un ricktextbox1 donde se volcarán los datos leídos del correspondiente puerto serie. En el formulario padre tengo un menú ARCHIVO, con submenús ABRIR, GUARDAR, GUARDAR COMO, CERRAR, ...

En los formularios hijo he declarado dos variables publicas de tipo bool

1
public bool cambios, guardado;

En el evento Change del richtextbox modifico la variable cambios a true; Para que en la rutina de Cerrar, si está a true salga un messagebox advirtiendo de que no se han guardado los cambios y de las opciones de Guardar antes de cerrar, cerrar sin Guardar y Cancelar
En la rutina de Guardar Como cambio la variable de guardado a true, para que en la rutina de Guardar, si esta variables está a true guarde el texto directamente en el archivo sin pasar por el cuadro de dialogo SaveFile.

El problema que tengo es que estas variables publicas no las veo desde mi formulario padre y no se como hacerlo

Este es el código de la ruina de Cerrar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/private void menu14ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            string titol, missatge;
            MessageBoxButtons botons = MessageBoxButtons.YesNoCancel;
            MessageBoxIcon icona = MessageBoxIcon.Warning;
            DialogResult resultat;
            //Detección del formulario hijo actvo
            Form activeChildForm = this.ActiveMdiChild;
            if (activeChildForm != null)  //Si existe
            {
 
 
                    if (ActiveChildForm.cambio==true) //Aquí falla mi codigo ya que la variable publica de la clase FromHijo, no es visible aquí en el Form padre, ya que el Hijo Activo se ha abierto como un Form y no como un FormHijo y no se como resolver esto
                    {
                        titol ="Warning";
                        missatge = "Data not saved. Do you want to close it without saving";
                        resultat=MessageBox.Show(missatge, titol, botons, icona);
//Si se elige si se cierra sin guardar
                        if (resultat== System.Windows.Forms.DialogResult.Yes)
                        {
                            activeChildForm.Close();
                        }
//Si se elige No, se guarda a teves de un SaveFileDialog y luego se cierra
                        if ((resultat == System.Windows.Forms.DialogResult.No))
                        {
                            Guardar();
                            activeChildForm.Close();
                        }
//Si se eleige Cancelar, se cierra el messagebox y no se hace nada
                    }
 
            }
 
        }

El código de detección del formulario hijo activo en parte lo he sacado de una web, el problema que tengo es que si para detectar el formulario hijo activo se hace con la clase Form, esta clase no tiene las propiedades de la clase FormHijo a la que pertenece el formulario hijo, y por tanto no son visibles sus variables públicas booleanas cambios y guardado. Esto no se como resolverlo

Si en vez de ser Formularios Mdi fueran formularios normales, desde uno si se pueden ver las variables publicas del otro.

Es mi primera experiencia con los formularios Mdi y me complican bastante la existencia y voy muy perdido.

Alguien sabe como modificar mi código pata poder ver la variable cambio del formulario hijo actrivo?

Gracias por la ayuda.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 4
Ha disminuido 1 puesto en Visual CSharp .NET (en relación al último mes)
Gráfica de Visual CSharp .NET

Problema para acceder a variables públicas de formularios mdi desde el formulario padre

Publicado por Agustin (7 intervenciones) el 15/07/2021 19:17:25
MDI se dejó de usar hace 15 años.

Dicho esto, necesitás castear this.ActiveMdiChild que es de tipo System.Windows.Forms.Form a tu subclase de ésta.

O mejor, usar una interfaz común:

1
2
3
4
public interface IFormularioHijo
{
   bool TieneCambiosSinGuardar { get; }
}

E implementarla en cada uno de los forms

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class MiFormularioHijo: System.Windows.Form.Form, IFormularioHijo
{
 
   // ... Codigo del form
 
    public bool TieneCambiosSinGuardar { get; set; }
}
 
public class OtroFormularioHijo: System.Windows.Form.Form, IFormularioHijo
{
 
   // ... Codigo del form
 
    public bool TieneCambiosSinGuardar { get; set; }
}

y en el form padre casteas a esta interfaz:

1
2
3
4
if (this.ActiveMdiChild is IFormularioHijo hijo && hijo.TieneCambiosSinGuardar)
{
    MessageBox.Show("Tiene cambios sin guardar.");
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema para acceder a variables públicas de formularios mdi desde el formulario padre

Publicado por José Luis Berrueco (4 intervenciones) el 15/07/2021 21:06:06
Muchas gracias.

Iba muy perdido con esto. Cuando vuelva de vacaciones, lo probaré a ver si me aclaro con el código.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema para acceder a variables públicas de formularios mdi desde el formulario padre

Publicado por José Luis (4 intervenciones) el 23/07/2021 13:24:13
Hola estoy intentando adaptar el código que me diste a mi programa, y lo que no me queda claro es donde debe ir esto:
1
2
3
4
public interface IFormularioHijo
{
   bool TieneCambiosSinGuardar { get; }
}

Me refiero a, dentro de que archivo debo copia esas líneas de código

perdona mi ignorancia, pero programo por hobby y voy aprendiendo

Saludos y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 4
Ha disminuido 1 puesto en Visual CSharp .NET (en relación al último mes)
Gráfica de Visual CSharp .NET

Problema para acceder a variables públicas de formularios mdi desde el formulario padre

Publicado por Agustin (7 intervenciones) el 23/07/2021 15:20:46
No Importa en que archivo lo pongas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema para acceder a variables públicas de formularios mdi desde el formulario padre

Publicado por José Luis Berrueco (4 intervenciones) el 24/07/2021 11:46:13
Gracias Agustín.

Una cuestión más. Necesito una segunda variable pública de tipo Sttring a la que llamo ruta, esta me sirve tanto para saber si el archivo ya existe (si es diferente a ""), como para sobrescribir el archivo cuando eliges File>Save.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface IFormularioHijo
    {
        bool TieneCambiosSinGuardar { get; }
    }
 
    public interface IFormularioHijo1
    {
       string ruta { get; }
    }
    public partial class FormHijo : Form, IFormularioHijo, IFormularioHijo1
    {
        public int longi, posicio;
        public bool TieneCambiosSinGuardar { get; set; }
        public string ruta { get; set; }


He tenido que separarlas en IFormHijo e IFormHijo1, ya que si metía las dos variables dentro de IFormHijo me daba error en el compilador.

Es correcto esto? o hay algún modo de agrupar a las dos dentro de IFormHijo

Otra cuestión,

Si la rutina de guardar() está en el formulario padre, y necesito dentro de ella modificar la variable del FormHijo TieneCambiosGuardar de true a false, debería cambiar

1
2
3
4
public interface IFormularioHijo
    {
        bool TieneCambiosSinGuardar { get; }
    }

por esto

1
2
3
4
public interface IFormularioHijo
    {
        bool TieneCambiosSinGuardar { get;set; }
    }

en el formHijo

Gracias por tu ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 4
Ha disminuido 1 puesto en Visual CSharp .NET (en relación al último mes)
Gráfica de Visual CSharp .NET

Problema para acceder a variables públicas de formularios mdi desde el formulario padre

Publicado por Agustin (7 intervenciones) el 25/07/2021 15:25:31
1
Necesito una segunda variable pública de tipo Sttring a la que llamo ruta

Entonces sería:

1
2
3
4
5
public interface IFormularioHijo
    {
        bool TieneCambiosSinGuardar { get; }
        string Ruta { get; }
    }

1
He tenido que separarlas en IFormHijo e IFormHijo1, ya que si metía las dos variables dentro de IFormHijo me daba error en el compilador

qué error? y como lo escribiste? Mi ejemplo compila correctamente.

1
Si la rutina de guardar() está en el formulario padre, y necesito dentro de ella modificar la variable del FormHijo TieneCambiosGuardar de true a false, debería cambiar

Correcto. Entonces querdaría asi:

1
2
3
4
5
public interface IFormularioHijo
    {
        bool TieneCambiosSinGuardar { get; set; }
        string Ruta { get; set; }
    }
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar