PDA

Ver la Versión Completa : metodos para hacer que una forma solo se ejecute una vez


DEPROE
17-11-2004, 20:43:27
¿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?

Lepe
18-11-2004, 11:02:46
yo lo logro pero con metodos muy laboriosos
No sé a que te refireres con eso :confused:

Saludos

Neftali [Germán.Estévez]
18-11-2004, 11:55:47
¿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?.

andres1569
18-11-2004, 12:13:36
¿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

roman
18-11-2004, 16:10:06
¿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:


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:


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

DEPROE
18-11-2004, 16:56:31
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

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


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

DEPROE
18-11-2004, 17:11:04
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

andres1569
18-11-2004, 19:48:25
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 ;)