Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Un formulario que no abre!! (https://www.clubdelphi.com/foros/showthread.php?t=65640)

GerTorresM 02-01-2010 15:57:13

Un formulario que no abre!!
 
Hola a todos el código que me da dolores de cabeza hoy es el siguiente:

Código Delphi [-]
procedure TFMenuPrincipal.DXConfiguracionItems0Click(Sender: TObject);
Var FDatosGenerales_local : TFDatosGenerales;
begin
  if FDatosGenerales_local = nil then
    try
      Application.CreateForm(TFDatosGenerales,FDatosGenerales_local);
      FDatosGenerales_local.ShowModal;
      FreeAndNil(FDatosGenerales_local);
    Finally
    End;
end;

bien el tema es el siguiente en teoria pretendo crear un instancia de la clases TFDatosGenerales que es un formulario como tal, ahora cuando se ejecuta la primera linea salta al final y código y no hace nada.

ahora si cambio en el código y queda así

Código Delphi [-]

procedure TFMenuPrincipal.DXConfiguracionItems0Click(Sender: TObject);
Var FDatosGenerales_local : TFDatosGenerales;
begin
  if FDatosGenerales = nil then
    try
      Application.CreateForm(TFDatosGenerales,FDatosGenerales_local);
      FDatosGenerales_local.ShowModal;
      FreeAndNil(FDatosGenerales_local);
    Finally
    End;
end;

Funciona bien, luego pense que el formulario se estaba autocreando, lo cual descarte al ver la opciones del proyecto.

Entonces la pregunta es que estoy haciendo mal.



gertorresm
Colombia

marcoszorrilla 02-01-2010 21:29:18

Cita:

Código Delphi [-]
procedure TFMenuPrincipal.DXConfiguracionItems0Click(Sender: TObject);
Var FDatosGenerales_local : TFDatosGenerales;
begin
  if FDatosGenerales = nil then
    try
      Application.CreateForm(TFDatosGenerales_Local,FDatosGenerales_local);
      FDatosGenerales_local.ShowModal;
      FreeAndNil(FDatosGenerales_local);
    Finally
    End;
end;


Un Saludo.

Crandel 03-01-2010 12:54:33

El problema surge que FDatosGenerales es una variable global definida en la misma unit que la clase TDatosGenerales. Por defecto esas variables se inicializan por compilador en nil.

Por el otro lado tu variable FDatosGenerales_local no esta inicializada, por lo que su valor inaccesible al momento de hacer la comparación.

Si agregas antes del if: FDatosGenerales_local := nil; la comparación no te daría problemas

GerTorresM 03-01-2010 16:59:47

Gracias por el consejo
 
Muchas por tu repuesta, sin pretender demeritar las demás me parace que la tuya tiene una fundamentación técnica muy clara.


muchas gracías



gertorresm
colombia

Chris 04-01-2010 20:34:54

Primero, tienes que comprender que la comparación " if FDatosGenerales_local = nil then ... " no es recomendada. En su lugar debes usar: " if assigned(FDatosGenerales_local) then ... "

El hecho de que el formulario no se abra puede ser que este ocurriendo un problema al momento de la creación del mismo ( Procedure OnCreate ). Tienes que revisar este lugar que es el que pueda dar el problema. Intenta comentar las líneas "Try ... finally ... end; " y fíjate si salta una excepción.

Por otro lado, cuando estoy tratando con clases formualario y no estoy trabajando con la variable global y en lugar se ésta con una varible local u de otro aspecto, no uso este típico código, como el que tu tienes:
Código Delphi [-]
Application.CreateForm(TFDatosGenerales,FDatosGenerales_local);
En su lugar usaría este código:
Código Delphi [-]
FDatosGenerales_local := TFDatosGenerales.Create(nil);

Personalmente creo que este estilo de codificación ayuda al entendimiento del código. Ya que hace una diferencia entre los formalarios que estarán visibles por un considerable tiempo y los formularios que sólo serán mostrados durante un corto momento.

Saludos

GerTorresM 05-01-2010 00:59:38

Version de trabajo
 
Gracias Chris por tu comentario:

En orden de ideas mi código quedo de la siguiente forma

Código Delphi [-]
procedure TFMenuPrincipal.DXConfiguracionItems0Click(Sender: TObject);
Var FDatosGenerales_temporal : TFDatosGenerales;
begin
  try
    FDatosGenerales_temporal := TFDatosGenerales.Create(nil);
    FDatosGenerales_temporal.ShowModal;
    FreeAndNil(FDatosGenerales_temporal);
  finally
  end;
end;

su tienes alguna sugerencia adicional me encantaria poder leerla


gertorresm
Colombia

dtomeysoto 05-01-2010 18:14:43

Yo en lo particular haría lo siguiente:

Código Delphi [-]
procedure TFMenuPrincipal.DXConfiguracionItems0Click(Sender: TObject);
var
  FDatosGenerales_temporal: TFDatosGenerales;
begin
  FDatosGenerales_temporal := TFDatosGenerales.Create(Self);
  try
    FDatosGenerales_temporal.ShowModal;
  finally
    FDatosGenerales_temporal.Free;
  end;
end;

Aunque me gustaría más usar la variable global declarada en la Unit.


La franja horaria es GMT +2. Ahora son las 04:00:44.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi