Delphi - Form como parámetro para otro form

 
Vista:
sin imagen de perfil
Val: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Form como parámetro para otro form

Publicado por Ciclope (27 intervenciones) el 18/07/2020 12:08:41
Hola,
Lo que pretendo es mostrar mensajes personalizados con un form.
Estoy intentando que un procedure me sirva para todos los forms de altas, modificaciones, etc, cuando se han introducido o dejado datos erróneos, y evitar así tener que repetir el código en todos los forms de altas... (unos 40).
El problema es que al enviar el propio form y un panel como parámetros al procedure, para verificar que los datos son correctos me da errores.
El nombre de los ficheros, por ejemplo, en diseño y en el edit, por defecto llevan 2 equis (Edit.Text: [NombreFichero]XX), para indicar que en el lugar de las equis hay que poner un número.

Así: procedure ShowMSG(fForm: TForm; oContainer: TPanel);

Llamada en el evento OnClick de button "Guardar": ShowMSG(MiForm,MiPanel);

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
procedure ShowMSG(fForm: TForm; oContainer: TPanel);
var i: Integer;
begin
 
//  for i := 0 to (fForm.oContainer.ControlCount - 1) do begin {Error de oContainer no identificado}
 
 {Error de Missing operator or semicolon en las 4 primeras líneas siguientes}
 
  for i := 0 to fForm(oContainer).ControlCount - 1 do begin {Lo he probado con ComponentCount pero tampoco funciona}
        if (fForm(oContainer).Controls[i] is TEdit) then begin
            if  ContainsText(TEdit(fForm(oContainer).Controls[i]).Text,'XX') then begin {Si hay 2 equis seguidas, el nombre es incorrecto}
                TEdit(fForm(oContainer).Controls[i]).SetFocus;
                cKeyMSG := 'FileErrorXX'; {Al crear el form de abajo, para mostrar mensaje personalizado, busca este valor en una table}
                                          {Los valores string de los distintos campos muestran y describen el/los error/es}
 
                Application.CreateForm(TF_ShowMSG,F_ShowMSG);
                try
                F_ShowMSG.ShowModal;
                finally
                FreeAndNil(F_ShowMSG);
                end;
 
           end;
       end;
  end;
end;

He probado con varias opciones pero no lo consigo.

Muchas gracias y un saludo.
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

Form como parámetro para otro form

Publicado por Nacho (19 intervenciones) el 18/07/2020 16:06:16
Pues no acabo de entender lo que haces. No sé si es que no sabes que existe el FindControl o que se puede redefinir el constructor de un objeto con los parámetros que quieras.
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: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Form como parámetro para otro form

Publicado por Ciclope (27 intervenciones) el 20/07/2020 11:22:12
Hola,
es verdad. Soy aficionado y no conozco lo que comentas. A ver si me puedes echar una mano con esto:

declarado en interface:
procedure ShowMSG(foForm: TForm; obContainer: TPanel);

implementation:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure ShowMSG(foForm: TForm; obContainer: TPanel);
var i: Integer;
begin
  //Verifica si los nombres de los ficheros son correctos
  for i := 0 to foForm.obContainer.ControlCount - 1 do begin
      if foForm.obContainer[i] is TEdit then begin
         if  ContainsText(TEdit(foForm.obContainer.Controls[i].Text),'XX') then begin
             TEdit(foForm.obContainer.Controls[i]).SetFocus;
             cKeyMSG := 'FileErrorXX';
 
            //Muestra el form con el mensaje personalizado
             Application.CreateForm(TF_ShowMSG,F_ShowMSG);
                try
                F_ShowMSG.ShowModal;
                finally
                FreeAndNil(F_ShowMSG);
                end;
 
         end;
       end;
  end;
end;

llamada:
ShowMSG(F_NewGlo,Pnl_Files); {Un form para altas y un panel que contiene los edit de los nombres de los ficheros}

¿Porqué en la linea del for me da el error: [dcc32 Error] USystem.pas(1160): E2003 Undeclared identifier: 'obContainer'?

Porque sí que está declarado.
En las otras líneas también marca los mismos errores donde está "obContainer".
Y supongo que los paréntesis y los corchetes no están bien puestos porque también hay otros errores, pero ya lo iré mirando.

Muchas gracias y un saludo.
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

Form como parámetro para otro form

Publicado por Nacho (19 intervenciones) el 20/07/2020 14:20:11
El compilador no se equivoca, y si dice que no lo está es que no lo está.

Le pasas al procedimiento un obContainer, ¿no será ese el que tienes que usar?
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: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Form como parámetro para otro form

Publicado por Ciclope (27 intervenciones) el 20/07/2020 20:51:08
Claro, pero es que obContainer es el panel pasado como parámetro:

1
procedure ShowMSG(foForm: TForm; obContainer: TPanel);

Llamada:

1
ShowMSG(F_NewGlo,Pnl_Files); {Un form para altas y un panel que contiene los edit de los nombres de los ficheros}

El caso es que ya sé que es el compilador el que tiene razón, pero no entiendo cómo me da un error de Undeclared identifier cuando sí está declarado.

Muchas gracias y un saludo.
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

Form como parámetro para otro form

Publicado por Nacho (19 intervenciones) el 20/07/2020 21:36:11
Pero es que con foForm.obContainer estás llamando a un obContainer que tiene foForm, no el que le has pasado como parámetro.
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: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Form como parámetro para otro form

Publicado por Ciclope (27 intervenciones) el 21/07/2020 10:17:35
Sí que es ese:

Declaración:

1
procedure ShowMSG(foForm: TForm; obContainer: TPanel);

Llamada:

1
ShowMSG(F_NewGlo,Pnl_Files);

Donde F_NewGlo (un form de altas) es foForm; y Pnl_Files (un panel en este form que contiene edits) es obContainer.

Por lo tanto foForm.obContainer debería ser correcto.

El mistero es porqué manda el error de undeclared identifier cuando sí está declarado. Y el compilador tiene razón, pero no lo veo.
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

Form como parámetro para otro form

Publicado por Nacho (19 intervenciones) el 21/07/2020 13:32:20
Será el mismo objeto, pero eso no quiere decir que un procedimiento tenga acceso a él. Cada parte de código tiene acceso a unas variables y no tiene por qué tener acceso a otras. Si le pasas al procedimiento una referencia al objeto que quieres usar es porque no tiene acceso a él, que es lo que te dice el compilador.

Aclárate con todo eso porque es el origen no de errores de compilación, fáciles de detectar, sino de funcionamiento de un programa que pueden volverte loco.
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: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Form como parámetro para otro form

Publicado por Ciclope (27 intervenciones) el 22/07/2020 10:51:48
Trataré de resolverlo, porque si no, tengo que repetir el mismo código en más o menos 40 forms (dentro de cada form de altas o modificaciones sí que funciona).

Muchas gracias por tus comentarios y un saludo.
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

Form como parámetro para otro form

Publicado por Nacho (19 intervenciones) el 22/07/2020 12:11:05
Quita el foForm delante del obContainer. Si mandas un objeto a un procedimiento será porque ese procedimiento no tiene acceso a ese objeto, luego la manera de acceder a él es con la variable que recibe el procedimiento, no con la que tenga otro objeto.

Ya veo que no vas a intentar aclararte con todo eso.
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: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

Form como parámetro para otro form

Publicado por Ciclope (27 intervenciones) el 22/07/2020 20:47:29
¡Muchas gracias. Ya funciona!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure ShowMSG(obContainer: TPanel);
var i: Integer;
begin
  for i := 0 to obContainer.ControlCount - 1 do begin
      if obContainer.Controls[i] is TEdit then begin
         if  ContainsText(TEdit(obContainer.Controls[i]).Text,'XX') then begin
             TEdit(obContainer.Controls[i]).SetFocus;
             cKeyMSG := 'FileErrorXX';
 
             Application.CreateForm(TF_ShowMSG,F_ShowMSG);
                try
                F_ShowMSG.ShowModal;
                finally
                FreeAndNil(F_ShowMSG);
                end;
 
         end;
       end;
  end;
end;
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