PDA

Ver la Versión Completa : insuficiente memoria / insuficient memory


mmateo25v
22-03-2005, 16:20:10
Hola a todos,

Mi problema es el siguiente:
Tengo dos aplicaciones hechas en delphi 5 una por mi y otra por un proveedor externo o sea no cuento con el codigo fuente.

Cuando ejecuto ambas aplicaciones en una PC, sea con windows98, 2000, XP o NT, funcionan sin problema pero cuando la mia en algunas ocaciones despues de tantas veces de abrir y cerrar da un error de "insuficient memory" aparentemente del BDE y la solucion que encontre para esto es cerrar ambas aplicaciones y volverlas a abrir.

Por otro lado ocurre lo mismo si estoy trabajando en una nueva aplicacion y de tantas veces de darle para ejecutar da el mismo error "insuficient memory" y solo me resta abrir y cerrar.

Alguien me podria decir que hacer porque en todos los casos los formularios son variables y se crean y destruyen en la medida que se usan. ademas la aplicacion termina con "application.terminate".

Será que debo actualizar algo del BDE ? pero porque la aplicacion del otro proveedor no da este error...

Ayuda por favor.....

Lepe
22-03-2005, 17:38:29
Usa Application.Close o simplemente haz un Close del formulario principal.

Application.Terminate es para casos extremos.

Saludos

mmateo25v
22-03-2005, 18:24:22
Lepe, al menos hasta donde yo entiendo no existe application.close, si existe close del formulario y ya probe con eso y me sigue dando los mismos problemas.

Realmente no se porque me da este tipo de problemas.....

Luis M.
22-03-2005, 20:08:43
Hola mmateo25v.
Prueba lo siguiente.
Cuando creas el formulario, abres las tablas que se utilicen
y antes de destruir el formulario, las cierra.
No se ti te servirá, pero por lo menos se evita que las tablas se queden abiertas
y se puedan dañar.
Un saludo.

Lepe
22-03-2005, 21:35:46
Lepe, al menos hasta donde yo entiendo no existe application.close.

Cierto, me confundí.

Si te dice el error de memoria insuficiente, entonces es que algun objeto que se crea, se deja en memoria, bien porque se machaque el apuntador, o bien porque no se libere correctamente, (o incluso ambas cosas).

Por qué dices que es aparentemente del BDE? Tienes algo más de información?.

Si no dispones de más informacion, postea el método que usas para crear objetos, (ventanas, tstringlist o lo que creas conveniente). A ver si entre todos lo podemos solucionar.

Saludos

mmateo25v
23-03-2005, 12:57:51
Este es el metodo que utilizo para crear un form, desde el formulario principal, ya que todos estan definidos en el proyecto como available.

if Assigned(form11) then
form1.Show
else
form1 := Tform1.Create(Application);

Posteriormente en el formulario "form1" hago lo siguiente:

procedure Tform1.FormCreate(Sender: TObject);
begin
table.open;
end;

procedure Tform1.FormCreate(Sender: TObject);
begin
table.Close;
Action := caFree;
form1 := nil;
end;

y en en close del formulario principal cierro inclusive la base de datos y hago lo siguiente:
procedure TformPrincipal1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
database.close;

Action := caFree;
formPrincipal1 := nil;
Application.Terminate;
end;

Espero me puedan ayudar. Gracias.

La verdad que no tengo muy claro si es el BDE o es mi aplicacion, pero en todos los casos que cierro todos los programas que hacen referencia a alguna libreria del bde y luego empiezo nuevamente a abrir las aplicaciones funciona correctamente, es por eso nada mas que digo que puede ser el bde, pero es más seguro que sea mi aplicacion que no este haciendo algo bien y quede algo abierto en memoria que impide que otra aplicacion pueda ser ejecutada.

Luis M.
23-03-2005, 16:46:27
A mi me pasó algo parecido y me di cuenta que dejaba los querys abiertos.
Cerraba las tablas pero no los querys.
De momento no me ha vuelto a suceder.
Una manera que tengo para comprobar si hay alguna tabla abierta es
reindexar las tablas.
Si las tablas estan cerradas me reindexa perfectamente, pero si hay alguna
abierta o que se este utilizando, me salta la exepción.
Desde el formulario principal llamo a los otros de esta manera

procedure TFormMain.suiButtonMaquinasClick(Sender: TObject);
begin
FormManMaquinas := TFormManMaquinas.Create(Self);
try
FormManMaquinas.ShowModal;
finally
FreeAndNil(FormManMaquinas);
end;
end;

en el evento OnActivate del formulario que abro

DMMaquinas.TableMaquinas.Open;
DMMaquinas.TableHistorial.Open;
DMMaquinas.TableTipos.Open;

Y el el evento OnClose del formulario

DMMaquinas.TableMaquinas.Close;
DMMaquinas.TableHistorial.Close;
DMMaquinas.TableTipos.Close;
DMListados.QueryMantenimiento.Close; // Si utilizo alguno

Asi es como lo solucione.
Un saludo.