Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-01-2010
Avatar de GerTorresM
GerTorresM GerTorresM is offline
Miembro
 
Registrado: nov 2005
Ubicación: Tunja - Boyacá
Posts: 210
Poder: 19
GerTorresM Va por buen camino
Red face 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
Responder Con Cita
  #2  
Antiguo 02-01-2010
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 03-01-2010
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
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
__________________
[Crandel]

Última edición por Crandel fecha: 03-01-2010 a las 21:15:36.
Responder Con Cita
  #4  
Antiguo 03-01-2010
Avatar de GerTorresM
GerTorresM GerTorresM is offline
Miembro
 
Registrado: nov 2005
Ubicación: Tunja - Boyacá
Posts: 210
Poder: 19
GerTorresM Va por buen camino
Cool 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
Responder Con Cita
  #5  
Antiguo 04-01-2010
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
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
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 05-01-2010
Avatar de GerTorresM
GerTorresM GerTorresM is offline
Miembro
 
Registrado: nov 2005
Ubicación: Tunja - Boyacá
Posts: 210
Poder: 19
GerTorresM Va por buen camino
Wink 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
Responder Con Cita
  #7  
Antiguo 05-01-2010
dtomeysoto dtomeysoto is offline
Miembro
 
Registrado: dic 2005
Posts: 173
Poder: 19
dtomeysoto Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Por qué no se me abre el DIALOGBOX? MON___ C++ Builder 4 30-07-2008 21:54:35
No abre Kylix ahkimpech Lazarus, FreePascal, Kylix, etc. 8 30-07-2005 06:07:53
win98se no abre *.hlp lemon-club Varios 0 29-12-2003 13:51:57
Se abre el telon aom Humor 3 09-11-2003 09:36:58
No abre las tablas en XP ... ingel SQL 0 13-06-2003 18:12:06


La franja horaria es GMT +2. Ahora son las 08:35:06.


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
Copyright 1996-2007 Club Delphi