Ver Mensaje Individual
  #5  
Antiguo 23-10-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Reputación: 13
engranaje Va por buen camino
Normalmente añadir un nuevo form a un proyecto, en la misma unit de form de declara una variable del tipo del form:
Código Delphi [-]
 var   FBusquedaClientes: TFBusquedaClientes;

Esa variable estara disponible dese cualquier unit que tenga en el uses la unit en la que está definida el form. De modo que con añadir uBusquedaClientes en el uses podremos trabajar con ella cuando este instanciada la clase o instanciarla si no lo estuviera. Si solo se puede tener una instancia de esa clase a la vez de modo que no puedan mostarse simultaneamente dos formularios de busqueda distintos. Puede hacerse sin problema
Código Delphi [-]
  if Not Assigned(FBusquedaClientes) then     
     FBusquedaClientes:= TFBusquedaClientes.Create(Self);   
  FBusquedaClientes.Caption := 'Texto';   
  FBusquedaClientes.Show;

En este caso y a no ser que que en onclose de FBusquedaClientes hayamos puesto un action := cafree una vez mostremos el formulario una vez, se creará, y despues de cerrarlo no se destruirá de modo que cada vez que lo volvamos a llamar ya estará creado y realmente siempre se estará utilizando la misma instancia del form. En estos casos hay que tener ojo con lo que se pone en el oncreate del form y tener en cuenta que solo se llamará una vez. Personalmente me parece que este método tiene más limitaciones que:
Código Delphi [-]
  
var
 fBusqudaClientesTemp:TFBusquedaClientes;
begin
  try    
    Application.CreateForm(TFBusquedaClientes, fBusqudaClientesTemp);     
    fBusqudaClientesTemp.ShowModal;   
  finally     
    FBusquedaClientesTemp.Free;   
  end;
end;

De este modo solo habrá en memoria una instancia del form cuando se esté utilizando. Al utilizar una variable local y no la global de la que hablaba al principio de este post podemos tener mar varias instancias distintas de la misma clase abiertas a la vez si fuera necesario. De hecho yo suelo hacer un formulario de busqueda genérico de modo que un parámetro en el create decida que es lo que se va a buscar, algo del tipo:
Código Delphi [-]
  
   with TFormBusqueda.Create(self,iTipoBusqueda)do
   begin
     Caption := 'Texto';      
     Show;
   end;

En este caso podriamos tener abierta a la vez varias ventanas de busqueda que fueran instancias de tFormBusqueda pero cada una buscara una cosa distinta y alternar entre ellas. Es mas si esto estuviera en un boton y lo pulsaramos 6 veces tendíamos 6 instancias distintas al mismo objeto. Por spuesto en este caso si que pongo el cafree en el onclose de TformBusqueda porque como se ve, al no hacerlo modal es necesario que sea el form mismo quien se libere al cerrarse. Por ese mismo motivo me decanto por el with en lugar de declarar una variable del tipo del form y trabajar con ella.

También me interesa el tema y está bien aprender todo lo que se pueda asi que se solicitan correcciones y/o consejos sobre este asunto.

Última edición por engranaje fecha: 23-10-2014 a las 10:22:12.
Responder Con Cita