Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Error al crear un MDI Form (https://www.clubdelphi.com/foros/showthread.php?t=74930)

jafera 19-07-2011 11:01:51

Error al crear un MDI Form
 
Estoy con una aplicación en la que he puesto un formulario de login para que me guarde un valor del ID del usuario que se conecte para usarlo en otro proceso del programa, más que por seguridad.

El login funciona bien siempre que la tabla usuarios tenga algún registro.

Si quiero que la primera vez que arranco la aplicación busque en la tabla de usuarios si existe algun valor y en caso contrario me enseñe el form usuarios para poder insertar uno, me da un error de accsess violation

Access violation at address 006BDF5F in module 'Rebuts.exe'. Read of address

Tengo puesto este código en el source del programa
Código Delphi [-]
begin
        F_Splash := TF_Splash.Create(Application);
        F_Splash.Show;
        F_Splash.Update;
        Sleep(2000);
        Application.Initialize;
        Application.Title := 'Rebuts';
        Application.HelpFile := 'C:\Rebuts_1.0\Ajuda\REBUTS_1.0.HLP';
        Application.CreateForm(TF_ModulDades, F_ModulDades);
        Application.CreateForm(TF_Inici, F_Inici);                   //Aqui tambien se para
        F_Splash.Hide;
        F_Splash.Free;
        Application.Run;
end.

con lo que el datamodule ya esta creado y accesible.

En el FormShow del principal tengo el siguiente codigo

Código Delphi [-]
procedure TF_Inici.FormShow(Sender: TObject);
begin
        ComprovaTaules;

        if F_ModulDades.Usuaris.RecordCount = 0 then
        begin
                F_Usuaris.Create(Self);  //Aqui da el error
        end;

        F_Login:=TF_Login.Create(Self);
        try
                F_Login.ShowModal;
        finally
                F_Login.Free;
        end;
end;

ComprovaTaules es una funcion que mira si existe uno o varios campos nuevos en la tabla o si hay que añadir una tabla entera.

El Form Usuarios es fsMDIChild.

Si ignoro el error entro en el programa sin que me pida el login.

Si alguien tiene alguna idea de donde puede estar el error pues muchas gracias por adelantado.

Saludos

Neftali [Germán.Estévez] 19-07-2011 11:45:22

¿Has ejecutado paso a paso?

Creo que sería lo más sencillo. Debe haber algo que está sin asignar.
Ejecútalo de esta forma e intenta saber cual es la línea exacta que genera el error.

jafera 19-07-2011 12:20:49

Gracias Neftali

Lo he ejecutado con F8 y se para donde he marcado, al crear el F_Usuaris

Código Delphi [-]
if F_ModulDades.Usuaris.RecordCount = 0 then
        begin
                F_Usuaris.Create(Self);  //Aqui da el error
        end;

Neftali [Germán.Estévez] 19-07-2011 12:46:53

OK. Ya sabemos algo más.

Ahora hay que mirar si en el Create o en el Show de ese formulario tienes algo programado.
Si es así, pon un BreakPoint al empezar esos procedimientos y vuelve a ejecutar paso a paso.

jafera 19-07-2011 13:51:45

Gracias de nuevo

En el OnShow está lo que puse en el primer post y en el OnCreate esto:

Código Delphi [-]
 
procedure TF_Inici.FormCreate(Sender: TObject);
begin
        Path := ExtractFilePath(ParamStr(0)) + 'Ajuda\Rebuts_1.0.hlp';
        if FileExists(Path) then
        begin
                Application.HelpFile := Path;
        end;
        Vers:=F_Moduldades.GetAppVersion; 
end;

Ejecutado con un break en el create, pasa perfectamente no se para.

Saludos

Lepe 19-07-2011 13:54:24

Cita:

Empezado por jafera (Mensaje 406790)
Gracias Neftali

Lo he ejecutado con F8 y se para donde he marcado, al crear el F_Usuaris

Código Delphi [-]
if F_ModulDades.Usuaris.RecordCount = 0 then
        begin
                F_Usuaris.Create(Self);  //Aqui da el error
        end;

y qué es F_Usuaris ?? porque si es una variable de tipo TForm no está bien creada.

Si es un TForm, no estás recogiendo el valor, por tanto F_Usuaris sería inaccesible.

Sin saber mucho diría que debe ser algo asi:
Código Delphi [-]
F_Usuaris :TFormAccesoUsuarios; // o el que sea

// en la línea donde da el error:
F_Usuaris := TFormAccesoUsuarios.Create(Self);

Saludos

jafera 19-07-2011 14:10:13

Solucionado

En el boton de ok del formulario login tenia esto:

Código Delphi [-]
 
if F_ModulDades.Usuaris.RecordCount=0 then
        begin
                Close;
                F_Usuaris.Create(Self);
                F_Usuaris.ShowModal;
        end;

Al final he dejado el código así:

Código Delphi [-]
 
procedure TF_Inici.FormShow(Sender: TObject);
begin
        ComprovaTaules;
        
        F_ModulDades.Usuaris.Close;
        F_ModulDades.Usuaris.Open;
        F_ModulDades.Usuaris.Last;
        if F_ModulDades.Usuaris.RecordCount = 0 then
        begin
                F_Usuaris:=TF_Usuaris.Create(Self);
                try
                        F_Usuaris.ShowModal;
                finally
                        F_Usuaris.Free;
                end;
        end;
        F_Login:=TF_Login.Create(Self);
        try
                F_Login.ShowModal;
        finally
                F_Login.Free;
        end;
end;

Gracias por ayudarme a investigar el camino correcto.

Josep


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

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