Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-11-2004
DEPROE DEPROE is offline
Miembro
 
Registrado: nov 2004
Posts: 10
Poder: 0
DEPROE Va por buen camino
metodos para hacer que una forma solo se ejecute una vez

¿cual es el metodo mejor para hacer que una forma solo se ejecute una vez?

no me refiero a la aplicación, sino a las ventanas dentro de esta
por ejemplo en delphi se usan muchas ventanas pero ninguna se repite

yo lo logro pero con metodos muy laboriosos

¿hay alguna manera facil de lograr eso?
Responder Con Cita
  #2  
Antiguo 18-11-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
yo lo logro pero con metodos muy laboriosos
No sé a que te refireres con eso

Saludos
Responder Con Cita
  #3  
Antiguo 18-11-2004
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.279
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por DEPROE
¿cual es el metodo mejor para hacer que una forma solo se ejecute una vez?
Bueno, depende mucho de cómo crees tus formualrios y de qué tipo sean; No lo he hecho nunca, pero así pensando un poquito se me ocurre:

(1) Utilizar un TStringList.
(2) Al crear el form añades un nuevo String, con el nombre de la clase por ejemplo y el objeto (el Form) a la lista.
(3) Al cerrar el form lo eliminas de la lista.
(4) Cuando vas a crear uno nuevo, primero revisas si está en la lista, si no está haces lo del paso(2), si ya está puedes sacar un mensaje, activar el form que ya hay creado,...

Como ya te digo es algo que se me acaba de ocurrir, pero sea éste u otro similar no parece muy complicado; Tal vez no he entendido bien el problema; Si es así ¿Puedes dar más datos?.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 18-11-2004
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Cita:
Empezado por DEPROE
¿cual es el metodo mejor para hacer que una forma solo se ejecute una vez?
Quizás te sirva chequear los Formularios que hay creados en cada momento, esto lo tienes en la propiedad Forms del objeto global Screen (del tipo TScreen). Ahí puedes revisar si ya existe un formulario del mismo tipo que el que vas a crear, si es eso lo que pretendes evitar.

Saludos
__________________
Guía de Estilo
Responder Con Cita
  #5  
Antiguo 18-11-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por DEPROE
¿hay alguna manera facil de lograr eso?
Todo depende de qué es lo que quieras hacer exactamente y de qué consideras laborioso. Lo fácil no es sinónimo de correcto.

Mi método favorito es éste:

1. Quita todos los formularios secundarios de la opción AutoCreate
2. En el evento OnClose de tus formularios secundarios pon Action := caFree;
3. En el formulario principal redefine el método Notification:

Código Delphi [-]
interface

type
  TForm1 = class(TForm)
  protected
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  end;

implementation

(*
  Este método se llama cuando una componente (AComponent) se crea
  o se destruye (Operation). Lo usamos para segurar que la variable de
  un formulario secundario sea nil cuando el formulario se destruye.
*)
procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;

  { Form2 es un formulario secundario                }
  { Haz lo mismo parar otros formularios secundarios }
  if (AComponent = Form2) and (Operation = opRemove) then
    Form2 := nil;
end;

end.

4. Cuando quieras mostrar un formulario secundario haces esto:

Código Delphi [-]
if not Form2 <> nil then
  Form2 := TForm2.Create(Application);

Form2.Show;

La cosa cambia si abres formularios desde otro lugar que no sea el formulario principal pero esta es la idea.

// Saludos
Responder Con Cita
  #6  
Antiguo 18-11-2004
DEPROE DEPROE is offline
Miembro
 
Registrado: nov 2004
Posts: 10
Poder: 0
DEPROE Va por buen camino
me parece muy interesante tu manera de hacer que solo se ejecute una vez cada forma

no puse la manera en que yo lo hago para ver si se podia de una forma diferente y asi lo fue

esta es la forma en que yo lo logro:

primero declaro esta función
Código Delphi [-]
      function DesplegarForma(cForma: TClass): Boolean;
       var 
        I : integer;
      begin 
   Result := True;
        for  I := 0 to Screen.FormCount-1 do
         if Screen.Forms[i].ClassType = cForma then
     begin
             Result := False;
             Screen.Forms[i].SetFocus;
             if Screen.Forms[i].WindowState = wsMinimized  then
              Screen.Forms[i].WindowState := wsNormal;
             Break
           end;
      end;

y la uso asi

Código Delphi [-]
      if  DesplegarForma(eltipodemiforma) then
   begin
    miforma := eltipodemiforma.Create(Self);
          show;
   end;

con esto logro no solo que no se cre una nueva, tambien consigo que se muestre la que ya esta creada

¿tiene alguna falla?

gracias por su atención
saludos

Última edición por DEPROE fecha: 23-11-2004 a las 16:20:26.
Responder Con Cita
  #7  
Antiguo 18-11-2004
DEPROE DEPROE is offline
Miembro
 
Registrado: nov 2004
Posts: 10
Poder: 0
DEPROE Va por buen camino
en lo que mande antes hay una falta

al igual que en metodo de roman se debe

1. Quitar todos los formularios secundarios de la opción AutoCreate
2. En el evento OnClose de tus formularios secundarios poner Action := caFree;

disculpen esta falta

saludos
Responder Con Cita
  #8  
Antiguo 18-11-2004
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Poder: 22
andres1569 Va por buen camino
Pues yo no veo que debas seguir ninguno de esos dos pasos para conseguir lo que quieres, el método DesplegarForma, visto así por encima, parece que hace lo que debe, y, se hayan autocreado los formularios o no, debe funcionar igual.

Ten en cuanta que en el ejemplo de Roman, se chequea una variable (Form2 del tipo TForm2 en el ejemplo), de ahí la necesidad de saber si está a nil o no, y de que interese destruirla al cerrarse (con caFree) y avisar al Form principal para que la ponga a nil cuando ello suceda. Pero en tu caso, puesto que no chequeas una variable concreta sino un tipo de formulario, eso no es necesario.

Saludos

PD: el código que pones lo puedes encerrar entre una etiqueta [ delphi ] para que se vea más claro
__________________
Guía de Estilo
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


La franja horaria es GMT +2. Ahora son las 09:12:39.


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