Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   formStyle=fsMDIForm, formStyle=fsMDIChild == "Abstract Error" (https://www.clubdelphi.com/foros/showthread.php?t=22433)

Essato 15-06-2005 15:50:25

formStyle=fsMDIForm, formStyle=fsMDIChild == "Abstract Error"
 
Hi!, bien, estoy haciendo un programa que corra en subventanas, tengo la ventana "padre" con el formstyle a fsMDIForm, y las hijas con fsMDIChild, en el proyecto las movi del "formcreate" automático, las creo en momento de ejecución ( Application.CreateForm(Tnombreventana, nombreventana); ), se supone que es así por ahorro de recursos, abro las ventanas y pongo una bandera (variable) a verdadero, esto para no lanzar la ventana dos veces, cuando se cierra la ventana pongo la vandera a falso y destruyo la ventana (nombreventana.destroy; ). Aquí es cuando sale el problema, cuando cierro la ventana me dan 2 errores, uno, el más común "Abastrac Error" y otro error de acceso a memoria. Claro, estos errores se dan uno u otro, no simultáneos. Cuando abro y cierro la ventana varias veces deja de dar error.

¿Alguien sabe porque pasa esto? y sobre todo, ¿como puedo repararlo?.

De antemano, Gracias!.

maeyanes 15-06-2005 15:55:41

El problema es que estás usando nombreventana.Destroy para destruir las ventanas. Si lees la ayuda de Delphi, ahí dice que para liberar un objeto de memoria se use el método Free y no Destroy.


Saludos...

Essato 15-06-2005 15:59:11

hi, gracias por tu ayuda.

Ya probe con el FREE y me dan los mismos errores :|
Sabes otra posible causa?, este proyecto lo comenze en delphi9 e igual tenia ese error, ahora lo estoy trabajando en delphi7.

delphi.com.ar 15-06-2005 16:00:20

Los "Abstract Error" se producen cuando se llama a un método abstracto que no ha sido implementado, si tus forms heredan de TForm y no has definido métodos abstractos, yo buscaría el problema por los componentes que has agregado a este form, o clases que tu te encargues de liberar "a mano".

Saludos!

maeyanes 15-06-2005 16:06:26

Cita:

Empezado por Essato
hi, gracias por tu ayuda.

Ya probe con el FREE y me dan los mismos errores :|
Sabes otra posible causa?, este proyecto lo comenze en delphi9 e igual tenia ese error, ahora lo estoy trabajando en delphi7.

Aún así, siempre que quieras liberar un objeto que tu creaste, usa el método Free. ;)

Sobre tus errores, delphi.com.ar ya comentó algo sobre los "Abstract Error". Sobre los errores de acceso a memoria, verifica que no se esté tratando de usar o liberar un objeto que, o no se ha creado o ya fue liberado.


Saludos...

Lepe 15-06-2005 16:18:04

Hace bastante tiempo me volvían locos esos errores, simplemente haz esto:

Código Delphi [-]
procedure Tform1.FormClose(....);
begin
  action := cafree;
  nombreVentana := nil;
end;

Las ventanas sigue creandolas como lo haces ahora.

Las llamadas a Destroy no debes hacerlas; es más ahora no te hacen falta, simplemente llama al método NombreVentana.Close o bien, si quieres acceder desde la forma MDI: FormaMdi.MdiChildren[i].Close

Un saludo

Essato 15-06-2005 16:30:34

hi, probe con lo de:

action:=catfree
nombreventana:=nil

me da un error, que son incompatibles los tipos, con lo de formamdi.mdichildren[] probe con cero y uno, ahora sólo marca error de memoria.

Gracias!.

maeyanes 15-06-2005 16:38:12

Si pones el código que estás usando, te podríamos ayudar mejor. Usa los tags [ delphi ] [ /delphi ] (sin espacios entre los corchetes) para que tu código se entienda mejor.


Saludos...

Lepe 15-06-2005 16:39:26

la incompatibilidad de tipos es imposible, es caFree de todas formas, mirando en la ayuda lo ves rapidamente:
Código Delphi [-]
  TCloseAction = (caNone, caHide, caFree, caMinimize);

Por otro lado, el acceso a memoria lo tienes que comprobar tú antes de cerrar la ventana !!!


Cerrar la ventana activa:
Código Delphi [-]
if ActiveMDIChild <> nil then
  ActiveMDIChild.Close
Cerrar todas las ventanas hijas
Código Delphi [-]
for i:=0 to mdichildcount - 1 do
  mdiChildren[i].Close;

Adeusss

Essato 15-06-2005 16:48:33

oks, pego parte del codigo:

tengo, ahora, dos tres ventanas, una con formstyle=fsMDIForm, y dos con fsMDIChild

las llamo:

Código Delphi [-]
procedure rpvLaunch(rpvtwin:integer);
begin
    if (rpvtwin=0) AND (rpvWin[0]=FALSE) then
    begin
        Application.CreateForm(TrpvGenre, rpvGenre);
        rpvWin[0]:=TRUE;
    end
    else if (rpvtwin=1) AND (rpvWin[1]=FALSE) then
    begin
        Application.CreateForm(TrpvAddMedium, rpvAddMedium);
        rpvWin[1]:=TRUE;
    end;
end;

para ventana 1:
rpvlaunch(0);

para ventana 2:
rpvlaunch(1);

la variable bandera se supone que es para no lanzar la ventana dos veces.

en el OnQueryClose de las ventanas hijas:

Código Delphi [-]
rpvWin[0]:=FALSE;
rpvGenre.Free;

Probe todo lo que me sugerieron y siguen esos dos problemas.
Gracias por su ayuda!.

roman 15-06-2005 16:58:32

Cita:

Empezado por Essato
Probe todo lo que me sugerieron y siguen esos dos problemas.

¿Todo? ¿Ya revisaste lo que te indicó Federico? El error de acceso a memoria muy posiblemente sea consecuencia del Abstract Error. ¿Tienes alguna componente de terceros en tus formularios?

// Saludos

Essato 15-06-2005 17:06:56

:|no se a que se refiera, muy apenas soy novato en delphi, se programar pero éste es mi primer lenguaje visual.

los componentes que uso son:

>zeoslib[Tzconnection y tzquery]
>tdblookuplist
>tdartasource
>tshelltreeview

y otros bastante comunes: mainmenu, popupmenu, edit, label, groupbox, memo, bitbutton, etc

¿Entonces que debo hacer??

Gracias!.

roman 15-06-2005 17:11:25

¿Qué versión de las Zeos estás usando?

// Saludos

Essato 15-06-2005 17:13:15

es zeosdbo-6.5.1-alpha, en delphi 7

en las ventana padre tengo el tzconnection y en las ventanas hijas las tzquery's

roman 15-06-2005 17:17:12

Bueno, pues para empezar, independientemente de que sea o no la causa del problema, deja de usar versiones alpha de lo que sea. Las versiones alpha no están lista para producción y normalmente tienen aún muchos errores. Usa en su lugar la versión 6.1.5 que fue la última estable que sacó ZEOS.

// Saludos

Kreyser 15-06-2005 19:01:00

Hola,

Quizas no tenga nada que ver, pero resolvi un problema similar utilizando Release para las MDIChild.

Código:

procedure TMdiform1.FormClose(....);
begin
  Mdiform1.Release;
end;

Espero aporte algo...

Essato 15-06-2005 19:55:34

:D Gracias!, con release si funciono!:D

De igual forma Gracias a todos por su tiempo y ayuda :D


La franja horaria es GMT +2. Ahora son las 03:06:50.

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