Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Varias instancias independientes de un form (https://www.clubdelphi.com/foros/showthread.php?t=35957)

apicito 27-09-2006 10:50:12

Varias instancias independientes de un form
 
En una aplicación tengo varias instancias del mismo form (TExpedientes) y desde cada una de ellas creo una instancia de un form (TExpConsulta) que mantengo oculta (visible:=false) haciendo:
Código:

ExpConsulta:=TExpConsulta.create(self)
el problema es que en vez de crearme varias instancias del formulario de consultas me crea una sola. Tambien puede estar pasando que cuando hago desde un expediente:
Código:

Expconsulta.showmodal
me muetre la última instancia.
La pregunta es: ¿Podría ir creando instancias del formulario de consulta con distinto nombre? por ejemplo:
Código:

ExpConsulta1:=TExpConsulta.create(self)
y en otra instancia de TExpedientes:
Código:

ExpConsulta2:=TExpConsulta.create(self)
de forma que se diferencien.

epuigdef 27-09-2006 11:02:51

La respuesta es sí.

Sólo necesitas declararte una variable del tipo del formulario (TExpConsulta en tu caso) y tirando

Edu

apicito 27-09-2006 11:05:55

Si, es lo que hago
Código:

ExpConsulta:=TExpConsulta.create(self)
pero así confunde una instancia con otra.

epuigdef 27-09-2006 11:17:07

Buenas!

Con:


Código Delphi [-]
var ExpConsulta1, ExpConsulta2, ExpConsulta3, ExpConsulta4 : TExpConsulta;
 
ExpConsulta1 := TExpConsulta.create(Self);
ExpConsulta2 := TExpConsulta.create(Self);
ExpConsulta3 := TExpConsulta.create(Self);
ExpConsulta4 := TExpConsulta.create(Self);



es esto lo que haces? Qué raro que lo confunda!

Edu

apicito 27-09-2006 11:26:39

No, cada instancia de TExpConsultas se crea desde un TExpedientes distinto. Lo que busco es crear cada instancia con distinto nombre para que, en el momento de hacer el showmodal desde su TExpedientes correspondiente, no conmfunda una con otra.
Algo así:
"ExpConsulta"+IdExpediente := TExpConsulta.create(Self);
si esto fuese posible.

epuigdef 27-09-2006 11:29:42

Vale, lo que te lía es que en el form TExpConsultas tienes declarada una variable global que se llama ExpConsultas (sto pasa en todos los forms que creas)

Lo que tienes que hacer es declarar una variable de tipo TExpConsultas en cada uno de los forms donde lo llamas.

Edu

apicito 27-09-2006 11:46:43

Perdona pero no entiendo lo que me sugieres.
En TExpedientes tengo una variable global ExpConsulta : TExpconsulta.
Utilizando esta variable y en el
procedure TExpedientes.FormShow(Sender: TObject);
hago
ExpConsulta:=TExpConsulta.create(self)

epuigdef 27-09-2006 11:50:51

Vale, el tema es que estás utilizando la variable que tienes declarada en TExpConsulta, que es global para toda la aplicación y por esto se confunden.

Lo que propongo es que tengas la variable de tipo TExpConsultas localmente en el form que la creas (incluso dentro del procedimento donde la llamas, proque este nuevo formulario es modal no?), de esta manera tendrás varias instancias.

Edu

apicito 27-09-2006 11:59:11

CReo que no expliqué bien. El formulario TExpedientes no es el principal de la aplicación, sino un formulario mas, del que se crean varias instancias. A su vez, desde este se crea siempre una instancia del formulario TExpConsultas en el momento de arrancar TExpedientes. Despues, cada vez que se pulsa el boton de consultas que está en TExpedientes es cuando hago un showmodal del TExpConsultas que he creado al iniciar TExpedientes.
Estas instancias de TExpConsultas son las que creo que se confunden o que solo crea una.

apicito 27-09-2006 12:07:08

Solucionado. Ahora entiendo lo que me decias.
He puesto la declaración de la variable ExpConsultas como private y ahora me diferencia las distintas instancias.
Gracias por todo.

epuigdef 27-09-2006 12:07:14

Si que te has explicado bien, lo que pasa es que no sé ponertelo clar.

Los n formularios TExpedientes que tienes sí se diferencian verdad?

Pues elimina la declaración ExpConsultas : TExpConsultas del formulario TExpConsultas y ponla en TExpedientes.

No sería buen profe...

Edu

jachguate 27-09-2006 15:07:10

Creo que el problema aqui es que apicito está perdiendo de vista que la variable ExpConsulta es, en realidad, un puntero. Un puntero a una instancia en particular de un objeto de la clase TExpConsulta, que también podría estar apuntando a nil.

De el curso 1 de punteros, debes recordar que si haces:

Código Delphi [-]
  Puntero1 := Objeto.Create;
  Puntero1 := Objeto.Create;
  Puntero1 := Objeto.Create;

En memoria existirán tres instancias de la clase Objeto, pero Puntero1 hará referencia (apuntará) a la última de ellas.

Lo que está pasando con tu forma de enfocar el problema es precisamente que solo estas guardando una referencia al último TExpConsulta creado, y aún cuando los demás están en memoria, en tu código no tenes nada que apunte a ellos.

Afortunadamente, delphi lleva una lista de todos los forms que existen en cualquier momento creados en la memoria en el arreglo Forms del objeto global screen.

Así, podrías fácilmente encontrar un expediente de esta forma:

Código Delphi [-]
Procedure TForm1.MuestraExpediente(AIDExpediente: Integer);
var
  Exp: TExpConsulta;
begin
  Exp := nil;
  for I := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i] is TExpConsulta then
      if TExpConsulta(Screen.Forms[i]).IDExpediente = AIDExpediente then
      begin
        Exp := TExpConsulta(Screen.Forms[i]);
        break;
      end;
  if not Assigned(Exp) then
  begin
    Exp := TExpConsulta.Create(Application);
    Exp.IDExpediente := AIDExpediente;
  end;
  Exp.Show;
  Exp.BringToFront;
end;

Procedure TForm1.Button1Click(Sender: TObject);
begin
  MuestraExpediente(StrToInt(Edit1.Text));
end;

Y claro está, si pensas mantener varias instancias de una clase de formulario en memoria, será mejor que te acostumbres a borrar la variable global que delphi amablemente crea, pues en este caso no hará mas que provocarte confusión.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 14:01:23.

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