Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   .ShowModal y fomulario en blanco (https://www.clubdelphi.com/foros/showthread.php?t=50520)

intruder 20-11-2007 22:38:09

.ShowModal y fomulario en blanco
 
Hola soy nuevo con delphi y tambien en clubdelphi:

Tengo experiencia en Pascal y ahora pensaba en comenzar con algo de Delphi y la verdad es que me va bastante bien aunque me ha surgido un problema con el siguiente código:
Código Delphi [-]
procedure TForm1.configClick(Sender: TObject);
begin     
    Form2:=TForm.Create(Form2);     
    Form2.ShowModal; 
end;
Pues bien efectivamente se abre el form2 pero ey! sorpresa en blanco!.No muestra ni las etiquetas ni las casillas para escribir ni nada de nada solo un form en blanco sin titulo ni nada.¿Que puede ser?
Todo estoy lo estoy haciendo sobre Lazarus aunque no creo que eso tenga importancia ya que si no estoy equivocado el codigo es el mismo.

PD.:Gracias por la respuesta y por favor si ya esta respondido en otro hilo remitirme a el ya que no lo encontre por ningun sitio.

cHackAll 20-11-2007 23:00:08

Bienvenido al Club amigo intruder... éste post debía ir en la sección de "varios" no API... y procura no hacer "Preview" con código Delphi, si lo haces intenta volver a poner el código correcto, caso contrario quedará como tu anterior post.

Ante cualquier duda te dejo para que leas la Guía de estilo del club.

Con respecto a tu consulta... a mi me funciona a la perfección:

Código Delphi [-]
procedure TForm1.configClick(Sender: TObject);
begin
 Form2 := TForm2.Create(Application);
 Form2.ShowModal;
end;

Lo que pasaba era que estabas creando un Form2... con la clase TForm... no con la clase TForm2.

Saludos.

jhonny 20-11-2007 23:04:17

TForm es un formulario en blanco, si le dices a Form2 que se cree como TForm pues tendras el resultado que ya haz visto... por lo tanto tendras que decirle que Form2 debe crearce como TForm2 asi ;):
Código Delphi [-]
  Form2:=TForm2.Create(Application);
  Form2.ShowModal;
  Form2.Release; //<-Para liberar memoria luego de cerrar el formulario.

Espero te sirva ;).

jhonny 20-11-2007 23:05:43

Esto es trampa :mad:, mientras yo editaba la etiqueta DELPHI del primer post, cHackAll respondio :D :D :D.

cHackAll 20-11-2007 23:13:32

Cita:

Empezado por jhonny (Mensaje 247311)
Esto es trampa :mad:, mientras yo editaba la etiqueta DELPHI del primer post, cHackAll respondio :D :D :D.

Ahhh pues si... es lo bueno de no moderar en foros :p
Pero esta bien, bienvenida al cuadrado intruder!

jhonny 20-11-2007 23:22:04

Lo curioso es que intruder no hubiera logrado compilar el codigo como nos lo ha mostrado con delphi, el compilador mostraria un error de incompatibilidad de tipos... creí que en lazarus sería igual, pero al parecer no es asi.

cHackAll 20-11-2007 23:30:35

Pues si... tambien lo pensé.

Sigo pensando que le faltan buenas pinceladas a Lazarus... cuando lo probé con un Hello Word... me produjo un ejecutable de un Mb :p.

intruder 21-11-2007 00:56:57

Puff se me olvido mencionar que si ponia como decis vosotros me daba el siguiente error:

Error: Identifier not found "TForm2"

Para lo que mi solución fue:

Código Delphi [-]
var
Form2:TForm2;
Para lo que Lazarus me devuelve:

Error: Error in type definition

Este creo que es mi verdadero problema y por vuestros comentarios sospecho que se puede deber a una mala interpretación del código por parte del compilador de Lazarus,¿que pensais?

Gracias por tus correcciones jhonny y a los dos por la brevedad de vuestras respuestas.

cHackAll 21-11-2007 01:10:04

y está el uses de la Unit2 ??? o lo que se llame la unidad que tiene la clase TForm2 ???

intruder 21-11-2007 01:22:41

Jajaja solucionado tio eres un crack jejej ni se me habia ocurrido mira que en Pascal si que use las units declarandolas en uses y eso pero aqui no vi la analogia muchas gracias asi da gusto comenzar con algo nuevo espero poder servir de ayuda como tu ami dentro de poco.

Gracias de nuevo.

Caral 21-11-2007 03:02:21

Hola
Aparte de lo que te han comentado, no es conveniente hacer un llamado a un form sin luego destruirlo o liberarlo, asi no ocupa memoria, es como si lo tuvieras en el proyecto lo que alenta el programa.
Esta es la mejor forma de hacerlo:
Código Delphi [-]
 Form2:=TForm2.Create(self);
   try
      Form2.ShowModal;
   finally
      Form2.Free;
   end;
Se crea y luego se libera.
Saludos

jhonny 21-11-2007 16:04:32

Bueno, yo prefiero el siguiente metodo...

Código Delphi [-]
   Form2:=TForm2.Create(self);
   try
      Form2.ShowModal;
   finally
      Form2.Release; //<-- Release en lugar de Free.
   end;

Free destruye un objecto y si es necesario destruye los componentes asociados a él, según la ayuda dice que free llama al Release en el caso de los formularios.

Release espera a que se destruyan todos los componentes asociados a la forma para poder destruir la forma.

Sinceramente yo prefiero asegurarme del asunto y usar Release directamente.

Y bueno, no soy excelente con el ingles pero en la ayuda dice lo siguiente:

Cita:

Release does not destroy the form until all event handlers of the form and event handlers of components on the form have finished executing. Release also guarantees that all messages in the form's event queue are processed before the form is released. Any event handlers of the form should use Release instead of Free. Failing to do so could lead to an access violation.
Según yo, allí dice que es recomendable usar Release en lugar de Free para este caso :).

Lepe 21-11-2007 16:50:44

Hasta donde yo tenía entendido (aprendido de estos foros), es que Release debe llamarse desde un método de la propia clase, no desde fuera, de hecho lo dice aquí:
Cita:

Any event handlers of the form should use Release instead of Free
Esto si está bien:
Código Delphi [-]
procedure TForm1.Button1Click
begin 
  Release;
end;

Esto funciona, pero quizás no como uno espera (lo explico más adelante)
Código Delphi [-]
procedure TForm1.Button1Click
begin 
  Form2.Release;
end;

Atacando la ayuda:
Cita:

Note:
Release returns immediately to the caller. It does not wait for the form to be freed before returning
porque su implementación es:
Código Delphi [-]
procedure TCustomForm.Release;
begin
  PostMessage(Handle, CM_RELEASE, 0, 0);
end;
Lo que quiere decir que tras una llamada a Release, no está garantizado que la ventana se haya destruido completamente, y este punto es importante.

Se podría llamar a Release, y la ventana seguir en pantalla durante 3 minutos, porque está realizando un proceso largo, o tiene mensajes pendientes en su cola de mensaje (incluso mensajes de repintado de la pantalla que, dado que queremos destruirla, no tiene sentido que se realicen).

Al llamar a Free, se está obligando a liberar todos los componentes que haya en el Form, cortando el flujo de mensajes y destruir todo inmediatamente. Además no se procesarán todos los mensajes de la cola de espera (por tanto, los mensajes de repintado, jamás se realizarán). Después de llamar a Free, si está garantizado que la ventana se ha liberado.

Saludos

jhonny 21-11-2007 17:34:34

En la ayuda de Delphi en su topico Free, dice lo siguiente:

Cita:

Warning:Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, don’t free a button, or the form that owns the button, in its OnClick event handler.

To free a form, call its Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing.
En el ultimo parrafo dice que hay que llamar a Release cuando queremos liberar un TForm, aunque antes de este parrafo hay uno haciendo referencia a que no debe llamarse a Free dentro del propio componente o su padre, no me parece que el segundo este relacionado con el primero (Quizá sea un error de apreciación en la lectura de parte mia).

Pero si relaciono lo que dice la ayuda con lo que acabas de explicarnos, termino por pensar que lo que dice la ayuda sería aplicable en el caso del action:=caFree; (Segun Marteens http://www.marteens.com/answ02.htm esto llama a Release) que estamos acostumbrados a colocar dentro del OnClose de un TForm. De hecho el mismo marteens te da la razón con dicho articulo :). Gracias por la aclaración Lepe.

Lepe 22-11-2007 00:10:06

Cita:

Empezado por jhonny (Mensaje 247473)
De hecho el mismo marteens te da la razón con dicho articulo :).

Si, es que Ians Marteens es un copión :D :D :D


La franja horaria es GMT +2. Ahora son las 04:47:10.

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