Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Arreglo de formularios, no se por que no funciona mi codigo :( (https://www.clubdelphi.com/foros/showthread.php?t=75443)

ivantj24 23-08-2011 19:20:13

Arreglo de formularios, no se por que no funciona mi codigo :(
 
Holas que tal, expongo mi problema el cual en teoria esta bien planteado pero no se por que no funciona, lo que requiero es al crear un formulario, que se carguen todos los nombres de los formularios que uso dentro de un arreglo para despues trabajar con los formularios, declaro de esta forma los formularios dentro de un arreglo:

Cita:

public
Forms : array[0..6] of Tform;

//en el Oncreate del form princiopal, se genera el array con todos los forms, dentro:
procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin

Forms[0]:= frmUsuarios;
Forms[1]:= frmGasolineros;
Forms[2]:= frmEstaciones;
Forms[3]:= frmDepartamentos;
Forms[4]:= frmServiciosCategorias;
Forms[5]:= frmServicios;
Forms[6]:= frmTickets;
end;


y lo que pretendo hacer despues, ya une vez creado el arreglo con los nombre de mis formularios, lo que quiero es:

crear formularios, clientes, departamentos, servicios... etc etc etc

pero solo requiero un formulario activo, si un formulario esta creado, y si le doy de nuevo al boton para que se cree ese mismo formulario hago que se muestre, que resalte de nuevo el formulario ya creado, pero si quiero crear un formulario aparte del que tengo, la idea es que se elimine el anterior y me cree el nuevo.

si tengo formClientes creado, al darle al boton para que me cree el formDepartamentos, la idea es que elimine primero el formclientes, y se cree unicamente el formDepartamentos, para ello primero lo que intente fue saber que formulario estaba creado para eliminarlo y despues crear el nuevo y este fue mi codigo:

Cita:

var
i : integer;
begin
for i := 0 to 6 do
begin
//SI NO ESTA CREADO, QUE NO HAGA NADA
if not Assigned(Forms[i]) then
begin
//NO HACE NADA
end
else
{PERO SI YA ESTA CREADO UN FORMULARIO DIFERENTE, ENTONCES QUE SE ELIMINE, CON ELLO PRETENDO QUE SE ELIMINEN TODOS LOS FORMULARIOS QUE ESTEN ANTERIORMENTE ABIERTOS, CUALQUIERA QUE SEA, POR ESO USO EL CICLO FOR PARA QUE HAGA UN RECORRIDO EN TODOS}
Forms[i].Close;
end;
end;
entonces esa es mi idea, determinar cual esta creado y me lo elimine, y si es que ya esta creado, que lo resalte, Onshow, eso es lo que hago, pero mi problema como les decia, es que nombrando:

Forms[i]

nunca me lo toma como un formulario, en el Forms[i] deberian de estar todos los nombres de los formularios pero al parecer no lo estan, entonces no me cierra ni uno y se abren todos los formularios sin cerrarse los anteriores ya abiertos, bueno espero me puedan ayudar, a determinar si esta bien arreglo declarado, y saber por que nome elimina todos los formularios anteriores ya abiertos.:confused:

Casimiro Notevi 23-08-2011 19:33:43

No he entendido muy bien, pero creo que estás intentado volver a crear la rueda.
Lo veo con más calma y te comento...

ivantj24 23-08-2011 19:37:34

xD volviendo a crear la rueda? xD pues como decia, lo unico que quiero es tener un formulario activo, si anterior mente ya hay uno abierto, eliminarlo, y para no nombrar los formularios uno por uno, hice un ciclo for, sobre un arreglo que tiene todos los nombres ya cargados, pero al parecer ese arreglo no me toma los nombres, por qu eal hacer la comparacion de nombres, en otro codigo que hice, nunca lo pude echar a andar, y ahora que quiero determinar con el Assigned, si un form esta creado de nuevo no me toma los nombres del arreglo :(, espero me puedan orientar, por que quisiera hacerlo de esa forma es mas simple, pero no me ha funcionado :(

maeyanes 23-08-2011 19:37:43

Hola...

Para empezar, ¿que son frmUsuarios, frmGasolineros, etc.? ¿Son nombres o variables?

Si en el arreglo Forms quieres guardar las referencias a a los formularios que estás usando, tienes que hacer la asignación correspondiente al crear un formulario nuevo:

Código Delphi [-]
Forms[0] := TfrmUsuarios.Create(nil);
Forms[1] := TfrmGasolineros.Create(nil);

Y al destruir alguno de los formularios tienes que asignarle un valor nil:

Código Delphi [-]
Forms[0] := nil; // Ya destruí el formulario TfrmUsuarios



Saludos...

ivantj24 23-08-2011 19:43:42

ok maeyanes, declarare los forms como lo mencionas y comento los resultados, por eso expongo mis dudas en el foro y disculpen si suena algo tontas a veces mis preguntas, pero ustedes tienen mayor experiencia :) muchas gracias, comento en un momento los resultados, saludos

ivantj24 23-08-2011 19:58:48

por alguna razon, se iniciaba por default, un formulario, y cuando queria comprobar antes de crear un formulario si habia algun otro creado para cerrarlo me genero un error de acces violation :S, por el momento no me sirvio el codigo de maeyanes, :(

Caminante 23-08-2011 20:39:42

Porque mejor no creas la aplicacion como mdi de esa forma ya puedes tratar los formularios hijos como si estuviesen en un arreglo (mdichild[index]).

ivantj24 23-08-2011 21:27:10

si siempre y cuando sea MDI y me parece buena idea, y he trabajado con MDI's pero el problema es que este programa que realizo no requiere MDI, de hecho las estoy haciendo funcionar usando el parent, para que se anexe dentro de un panel, y se muestre dentro de los limites de la forma.

lo que se me acaba de ocurrir, es como podria eliminar los formularios, con alguna propiedad, o con el tag intente pero no funciona, anteriormente me habian proporcionado un codigo para visualizar varios botones, lo intente agregar pero para cerrar el formulario, pero el problema es que no me funciono asi :(

y no se como cerrar varios formularios, :(


la idea sigue siendo la misma

1.- //Cerrar todos los formularios abiertos, si no hay ni uno abierto entonces
no hace nada

2.- llamo un formulario, si no esta creado, lo creo
- si esta creado, solo lo muestro, onshow

eso es todo, pero como son varios formularios, quiero determinar por un ciclor for o como sea, recorrer todos los formularios y determinar si esta creado, cerrarlo si es que se abrira un formulario diferente :(

maeyanes 23-08-2011 21:33:03

Hola...

Si solo necesitas tener un solo formulario abierto a la vez, puedes usar una variable que indique cual es el formulario actual:

Código Delphi [-]
var
  CurrentForm: TForm;

// Al inicial la aplicación, tal vez en el evento FormCreate del formulario principal:
begin
  CurrentForm := nil;
end;

// Creas un formulario, desde un evento OnClick de un menú o algún botón:
begin
  if Assigned(CurrentForm) then
    CurrentForm.Free; // Lo destruyes
  CurrentForm := TfrmUsuarios.Create(nil); // Creas el formulario y lo asignas a CurrentForm
  // Demás inicializaciones...
end;

Este es un ejemplo rápido y podría no funcionar del todo bien, pero te puede dar una idea de como hacerlo.


Saludos...

ivantj24 23-08-2011 22:26:23

perfecto maeyanes, ya quedo todo listo :) muchas gracias y si era cierto, tuve que crear un panel mejor, y el formulario lo puse como AlClient, asi podia destruir rl panel y bueno practicamente era lo mismo que me dijiste, pero con tu idea se me facilito todo, gracias, tenia la idea pero no la podia plasmar :) saludos y gracias de nuevo xD


La franja horaria es GMT +2. Ahora son las 19:56:41.

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