Delphi - "Pantallazos"

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

"Pantallazos"

Publicado por Ciclope (27 intervenciones) el 22/08/2021 13:16:02
Hola.

Mi problema es el siguiente: tengo varios forms en una aplicación cuyas funciones no se relaccionan unos con otros. Por lo tanto hago así:

Pulsar button1:
1
2
3
F_Form1 := F_Form1.Create(F_Form1);
F_Form1.Show();
FreeAndNil(F_Form2);

Pulsar button2:
1
2
3
F_Form2 := F_Form2.Create(F_Form2);
F_Form2.Show();
FreeAndNil(F_Form1);

Los forms se muestran bien, pero al destruir el form que estaba activo antes, aparece por unos instantes en la pantalla provocando un efecto bastante feo. Esto tampoco funciona:

Pulsar button2:
1
2
3
4
F_Form2 := F_Form2.Create(F_Form2);
F_Form2.Show();
F_Form1.Visible := False; //Sigue produciéndose el mismo efecto
FreeAndNil(F_Form1);

Al revés, o sea, destruyendo primero y creando después, no se produce ese efecto, pero queda al descubierto, por unos instantes, lo que hay en el form principal. Así que tampoco es muy bonito.

¿Alguien sabe cómo evitarlo? 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
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

"Pantallazos"

Publicado por E.T. (1244 intervenciones) el 24/08/2021 00:29:57
Intenta lo siguiente

1
2
3
F_Form1 := F_Form1.Create(Nil);//Aqui usa nil o la forma padre, o sea en la que esta ejecutando este codigo
F_Form1.ShowModal;
FreeAndNil(F_Form1);//Aqui debes destruir la form que acabas de crear
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

"Pantallazos"

Publicado por Ciclope (27 intervenciones) el 26/08/2021 14:02:09
Hola ET, muchas gracias por la respuesta, pero con el Nil sigue haciendo lo mismo.
Con ShowModal es inviable, porque queda bloquedao todo lo que hay "alrededor" de ese form: ToolBar, StatusBar, todos los buttons en un FrameBar...

De momento, me estoy acostumbrando a esos pantallazos.
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: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

"Pantallazos"

Publicado por E.T. (1244 intervenciones) el 26/08/2021 17:37:49
Ah ok, comprendo. Intenta lo siguiente

1
2
3
4
F_Form1 := F_Form1.Create(Nil);//Aqui usa nil o la forma padre, o sea en la que esta ejecutando este codigo
F_Form1.DoubleBuffered := true;
F_Form1.Show;
FreeAndNil(F_Form1);//Aqui debes destruir la form que acabas de crear
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

"Pantallazos"

Publicado por Ciclope (27 intervenciones) el 26/08/2021 23:44:05
Bueno, ha mejorado, pero la mejoría consiste en que a veces se produce el pantallazo y a veces no.

Pongo los procedures de dos de los buttons y el procedure al que llaman para la destrucción.

Se podría quitar el if not, porque como ves en las dos últimas líneas de cada procedure nunca se va a encontrar con esa condición, pero lo he probado y no es ese el problema.

Lo extraño (para mí) es que el top y el left de cada form lo pongo en las propiedades del objetcInspector, pero aparece en 0 y 0, o sea totalmente a la izquierda y totalmente arriba. He abierto los *.dfm y está bien. Sin embargo en el código sí que funciona. Se me escapa si alguna propiedad de los forms puede afectar a eso y si tiene algo que ver con el problema.

A tener en cuenta, creo: el pantallazo se produce después de que se visualize el form creado, pero como digo más arriba, si lo pongo al revés, se ve lo que hay en el form principal.

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
procedure ActiveFormRef_Lex;
begin
  if not Assigned(F_RefLexico) then begin
         F_RefLexico := TF_RefLexico.Create(Nil);
         F_RefLexico.DoubleBuffered := True;
         F_RefLexico.Top := 96;
         F_RefLexico.Left := 220;
         F_DMRef.T_Lexico.Locate('In_NumLex',F_DMRef.T_GenRef.FieldByName('In_ItemActiveLex').AsInteger,[]);
         nButtonRefActive := 6;
         F_RefLexico.Show;
         DestroyFormActive(cActiveForm);
         cActiveForm := 'F_RefLexico';
  end;
end;
 
procedure ActiveFormRef_Cos;
begin
  if not Assigned(F_RefCosmovision) then begin
         F_RefCosmovision := TF_RefCosmovision.Create(Nil);
         F_RefCosmovision.DoubleBuffered := True;
         F_RefCosmovision.Top := 96;
         F_RefCosmovision.Left := 220;
         F_DMRef.T_Cosmovision.Locate('In_NumCos',F_DMRef.T_GenRef.FieldByName('In_ItemActiveCos').AsInteger,[]);
         nButtonRefActive := 7;
         F_RefCosmovision.Show;
         DestroyFormActive(cActiveForm);
         cActiveForm := 'F_RefCosmovision';
  end;
end;
 
procedure DestroyFormActive(cForm: String);
begin
if (cForm = 'F_Advaita') then FreeAndNil(F_Advaita);
if (cForm = 'F_RefConceptos') then FreeAndNil(F_RefConceptos);
if (cForm = 'F_RefAgenda') then FreeAndNil(F_RefAgenda);
if (cForm = 'F_RefTUR') then FreeAndNil(F_RefTUR);
if (cForm = 'F_RefMorfeo') then FreeAndNil(F_RefMorfeo);
if (cForm = 'F_RefChacras') then FreeAndNil(F_RefChacras);
if (cForm = 'F_RefGlosario') then FreeAndNil(F_RefGlosario);
if (cForm = 'F_RefLexico') then FreeAndNil(F_RefLexico);
if (cForm = 'F_RefCosmovision') then FreeAndNil(F_RefCosmovision);
if (cForm = 'F_RefFrases') then FreeAndNil(F_RefFrases);
if (cForm = 'F_RefVideos') then FreeAndNil(F_RefVideos);
if (cForm = 'F_RefPri') then FreeAndNil(F_RefPri);
if (cForm = 'F_RefSSM') then FreeAndNil(F_RefSSM);
if (cForm = 'F_Knowledge') then FreeAndNil(F_Knowledge);
Application.ProcessMessages;
end;

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: 38
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

"Pantallazos"

Publicado por Ciclope (27 intervenciones) el 28/10/2021 20:47:55
Después de dejar el tema un tiempo, he optado por una solución chapucera:

1
2
3
DestroyFormActive(cActiveForm);
Sleep(1);
F_RefCosmovision.Show;

Por si a alguien le sirve. 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