Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2006
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 27-09-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
La respuesta es sí.

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

Edu
Responder Con Cita
  #3  
Antiguo 27-09-2006
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
Si, es lo que hago
Código:
ExpConsulta:=TExpConsulta.create(self)
pero así confunde una instancia con otra.

Última edición por apicito fecha: 27-09-2006 a las 11:08:52.
Responder Con Cita
  #4  
Antiguo 27-09-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 27-09-2006
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
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.

Última edición por apicito fecha: 27-09-2006 a las 11:29:04.
Responder Con Cita
  #6  
Antiguo 27-09-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 27-09-2006
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
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)
Responder Con Cita
  #8  
Antiguo 27-09-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 27-09-2006
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 27-09-2006
Avatar de apicito
apicito apicito is offline
Miembro
 
Registrado: may 2003
Ubicación: Ourense
Posts: 341
Poder: 21
apicito Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 27-09-2006
Avatar de epuigdef
epuigdef epuigdef is offline
Miembro
 
Registrado: jul 2005
Posts: 196
Poder: 19
epuigdef Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 27-09-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
multiples instancias de un Form dark_c OOP 3 31-01-2006 09:42:14
Compartir "objetos" entre varias instancias mafebresv Varios 4 16-01-2006 23:38:23
Evitar múltiples instancias de un mismo form Neomanar OOP 1 09-09-2005 17:10:26
Varias instancias DataModules rodmayes OOP 1 05-09-2005 13:37:45
DataModule llamado desde varias instancias floren OOP 4 06-04-2004 19:27:50


La franja horaria es GMT +2. Ahora son las 22:59:57.


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
Copyright 1996-2007 Club Delphi