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 29-07-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Arrow Dudas Crear Objetos en Tiempo de Ejecución

Hola,
El siguiente código:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  NuevoForm: TForm;
  NuevoBoton: TButton;
begin
  NuevoForm := TForm.Create(nil);
  NuevoForm.Parent := nil;
  NuevoForm.Left := 100;
  NuevoForm.Top := 100;
  NuevoForm.width := 500;
  NuevoForm.Height := 400;
  NuevoForm.Caption:='Nuevo Formulario';
  NuevoForm.Name := 'MiForm';
  NuevoForm.FormStyle:= fsStayOnTop;
  NuevoForm.Show;
  NuevoBoton := TButton.Create(NuevoForm);
  NuevoBoton.Parent := NuevoForm;
  NuevoBoton.Left := 100;
  NuevoBoton.Top := 100;
  NuevoBoton.Caption:='Clickme';
  NuevoBoton.Name := 'MiBoton';
end;
Crea un Nuevo Formulario con un Botón dentro.

1.- ¿Cómo DESTRUYO (Free=donde coloco?) estos objetos al cerrar la 2da ventana (NuevoForm) creada?. Lo que pasa es que cada vez que clicko el Button1 me crea muchos Forms incluido su botón. Lo que necesito es crear una sola vez, por mucho que le dé n-veces click al Button1.
2.- No recuerdo cual es la propiedad de un Form que por ejemplo AL CREAR el 2do Form:
...... a) ¿Cómo ubico por encima del principal?, es acaso...FormStyle:= fsStayOnTop? y
...... b) ¿Cómo deshabilito el Form principal mientras esté activo el 2do Form hasta que lo cierre?
Responder Con Cita
  #2  
Antiguo 29-07-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
tu variable nuevoForm ponla dentro de tu formulario principal
Código Delphi [-]
TForm = class(TForm)
private
  NuevoForm : Tform;
...
end;

luego en tu evento has lo siguiente
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not assigned(NuevoForm) then 
  begin
     NuevoForm := TForm.Create(nil);
     NuevoForm.Parent := nil;
     ...
  end
  NuevoForm.show;


si aun no funciona pon la variable NuevoForm dentro de una unidad y hazla visible es decir ponla en la parte de interface para que las demas unidades puedan verla

saludos
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 29-07-2007
Sinaloense Sinaloense is offline
Miembro
 
Registrado: oct 2003
Posts: 139
Poder: 21
Sinaloense Va por buen camino
Saludos, aqui hay una solucion:

Primero:
En la forma que creas al presionar el botón en el evento onClose pon entas línea:

Código:
   Action := caFree;
de esta manera cada vez que cierres la forma se liberará sola sin invocar el destructor free.

Ahora necesitas una función que te diga si la forma que quieres crear ya está creada, pudes usar esta:

Código:
function TForm2.existe_forma(AClase: string): Boolean;
var
 i:Integer;
begin
  for i := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i].ClassName = AClase then
      Result := True
    else
      Result := false;
end;

Ahora en el botón que crea la forma puedes poner este código, yo estoy creando la forma 'Form3':

Código:
 if not existe_forma('TForm3') then begin
    Form3 := TForm3.Create(Self);
    Form3.Show;
  end;
Espero te sirva.
Responder Con Cita
  #4  
Antiguo 29-07-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Gracias,
droguerman en este momento no tengo Delphi a mano, llegando a casa lo probaré. No se si entendí mal, pero....... ¿donde libero los objetos?

Sinaloense, en tu ejemplo hablas sobre liberar el objeto, bien, como dije probaré vuestros ejemplos y mas tarde os comento. Estoy en un Ciber.

Solamente argumentar que la primera vez que he creado un form le hice con (self) (NuevoForm := TForm.Create(self) y este evidentemente me ha creado el form, pero dentro del mismo form, por eso opté por (nil); luego al crear el form con el código que les presenté, realmente me resultaba mejor, pero el problema era que la principal (si seleccionaba la ventana) se colocaba encima de la nueva, por ello no se si se olvidaron de mi segunda pregunta por favor

Última edición por Deiv fecha: 29-07-2007 a las 23:30:05.
Responder Con Cita
  #5  
Antiguo 31-07-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Bueno he probado el código de droguerman y funciona, solo quedaría salir de dudas sobre mi segunda pregunta, pero el código Sinaloense no le entendí nada (por Novato)
Cita:
Empezado por Sinaloense
En la forma que creas al presionar el botón en el evento onClose pon entas línea:
Código:
Action := caFree;
¿En cual evento, si aún no he creado mi Forma?. Si bien todo es creado en tiempo de ejecución, ¿donde entonces coloco esa parte del código?
Código Delphi [-]
function TForm2.existe_forma(AClase: string): Boolean;
var
 i:Integer;
begin
  for i := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i].ClassName = AClase then
      Result := True
    else
      Result := false;
end;
Lo propio aquí esto de: TForm2.existe_forma, Yo entiendo que se coloca cuando está creada la forma, ya que Delphi me devuelve varios errores:
[Error] CreaForm.pas(26): Function needs result type
[Error] CreaForm.pas(31): Undeclared identifier: 'AClase'
[Error] CreaForm.pas(43): Undeclared identifier: 'existe_forma'
Código Delphi [-]
if not existe_forma('TForm3') then begin
    Form3 := TForm3.Create(Self);
    Form3.Show;
  end;
Lo propio aquí, no sé porque razón me sale un error RAISED, pero cuando cambio a (nil) ya no existe ese error.
Responder Con Cita
  #6  
Antiguo 31-07-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Bueno sobre mi pregunta 2 la solución estaba con SHOWMODAL, así mismo este me sirve para mi pregunta 1 ya que no le da acceso al Form principal y pulsar n-veces el Boton para crear n-Forms.
En lo que intentaba resolver esta situación gracias a vuestros consejos, me ha ocurrido algo interesante, del cual me quedó una duda con lo siguiente, verán con el código de abajo, no le he dado evento al BitBtn, pero no sé por qué razón cuando clicko al BitBtn, este me cierra el 2do Form creado en tiempo de ejecución, ¿Es que acaso tiene algún Evento DEFAULT el BitBtn que realiza esa operación?
Y otra cosa interesante, si cambio en el: procedure TForm1.Button1Click, la línea NuevoForm.showmodal; por NuevoForm.Show; ya no ocurre esa situación de que el BitBtn cierra el 2do Form.
Código Delphi [-]
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ClickBoton2(Sender: TObject);
  private
    NuevoForm: TForm;
    NuevoBoton: TBitBtn;
    NuevoBoton2: TButton;
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
   NuevoForm := TForm.Create(nil);
   NuevoForm.Parent := nil;
   NuevoForm.Caption:='Nuevo Formulario';
   NuevoForm.Name := 'MiForm';
   NuevoForm.FormStyle:= fsStayOnTop;
   NuevoBoton := TBitBtn.Create(NuevoForm);
   NuevoBoton.Parent := NuevoForm;
   NuevoBoton.Name := 'Boton1';
   NuevoBoton.Kind:=bkIgnore;
   NuevoBoton.Caption:='Púlsame';
   NuevoForm.showmodal;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
   NuevoForm := TForm.Create(nil);
   NuevoForm.Parent := nil;
   NuevoForm.Caption:='Nuevo Formulario';
   NuevoForm.Name := 'MiForm';
   NuevoForm.FormStyle:= fsStayOnTop;
   NuevoBoton2 := TButton.Create(NuevoForm);
   NuevoBoton2.Parent := NuevoForm;
   NuevoBoton2.Caption:='Clickme';
   NuevoBoton2.Name := 'Boton2';
   NuevoBoton2.OnClick:=ClickBoton2;
   NuevoForm.showmodal;
end;
procedure TForm1.ClickBoton2(Sender: TObject);
begin
  NuevoBoton2.Caption := 'Pressed';
end;
end.
¿Alguien sabe a que se debe ello?
Adjunto el Ejemplo
Archivos Adjuntos
Tipo de Archivo: zip CrearComps.zip (2,0 KB, 9 visitas)
Responder Con Cita
  #7  
Antiguo 31-07-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por deiv
(...) no le he dado evento al BitBtn, pero no sé por qué razón cuando clicko al BitBtn, este me cierra el 2do Form creado en tiempo de ejecución, ¿Es que acaso tiene algún Evento DEFAULT el BitBtn que realiza esa operación?

Y otra cosa interesante, si cambio en el: procedure TForm1.Button1Click, la línea NuevoForm.showmodal; por NuevoForm.Show; ya no ocurre esa situación de que el BitBtn cierra el 2do Form.
Lo que ocurre es que los botones tienen una propiedad de nombre "ModalResult", que, entra en juego cuando los botones están en formularios "modales". Así, sin necesidad de codificar nada (en el evento "onclick" de los botones), al pulsar un botón el "ModalResult" del formulario toma el valor de la propiedad del mismo nombre que se encuentra en los botones: "mrOK", "mrCancel", etc.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 01-08-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
¿Y cómo desactivo esa opción? o necesariamente debo quedarme con esa opción de "evento default", o necesariamente debo darle otro evento? para que me deje de funcionar como lo ha hecho hasta el momento?
Responder Con Cita
  #9  
Antiguo 07-08-2007
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Poder: 21
salvica Va por buen camino
Hola Deiv

Cita:
Empezado por Deiv Ver Mensaje
¿Y cómo desactivo esa opción? o necesariamente debo quedarme con esa opción de "evento default", o necesariamente debo darle otro evento? para que me deje de funcionar como lo ha hecho hasta el momento?

Los botones tienen la propiedad ModalResult que devuelven la respuesta de la ventana modal. Para evitar que interactúen con la ventana pon dicha propiedad a mrNone y luego en el evento OnClick del botón la modificas según tus necesidades.

Por ejemplo:
Un form Form1 que abre una ventana modal mediante un botón Button_CREAR_VENTANA
Código Delphi [-]
procedure TForm1.BitBtn_CREAR_VENTANA_OnClick(Sender: TObject);
var
  Respuesta : TModalResult; //---> para recoger la respuesta de la ventana modal
begin
{ Crear la ventana modal al pulsar el botón }
  Application.CreateForm(TForm2, Form2);
  with Form2 do begin
     { mostramos Form2 y obtenemos la respuesta }
       Respuesta := ShowModal;
     { eliminamos el Form 2}
       Free;
  end;
{ comprobamos que botón se pulsó en la ventana modal }
  if( Respuesta=mrOk ) then begin
    { se pulsó en botón ACEPTAR }
  end else begin
    { se pulsó en botón CANCELAR }
  end;
end;

La ventana modal tiene dos botones:
Button_ACEPTAR que devuelve mrOk o mrYes para aceptar
Button_CANCELAR que devuelve mrCancel para cancelar las entradas

En el evento OnCreate de la ventana modal, modificamos las salidas de los botones:

Código Delphi [-]
procedure TForm2.Form2_OnCreate(Sender: TObject);
begin
{
  modificar el botón de cancelación de resultados
  ===============================================
  generalmente, este resultado no se toca ya que no se desea hacer nada
  al pulsar la tecla "ESC", pero como ejemplo vale.
}
  Button_CANCELAR.ModalResult := mrNone;

{
  modificar el botón de validación de resultados
  ===============================================
}
  Button_ACEPTAR.ModalResult  := mrNone;
end;

El evento del botón para cancelar la salida (al pulsar la tecla "ESC")
Código Delphi [-]
procedure TForm2.Form2_Button_CANCELAR_OnClik(Sender: TObject);
begin
  ModalResult := mrCancel;
end;


El evento del botón para validar la salida
Código Delphi [-]
procedure TForm2.Form2_Button_ACEPTAR_OnClik(Sender: TObject);
begin
{ aquí puede ir una validación de las entradas }

{ devolver el resultado}
  ModalResult := mrOk;
end;

Saludos
Salvica

Última edición por salvica fecha: 07-08-2007 a las 17:40:04.
Responder Con Cita
  #10  
Antiguo 09-08-2007
Deiv Deiv is offline
Miembro
 
Registrado: jul 2005
Ubicación: La Paz - Bolivia
Posts: 364
Poder: 19
Deiv Va por buen camino
Thumbs up

Gracias,
Muy buena explicación me quedo mucho más claro
Saludos
Deiv
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
Crear Objetos en tiempo de ejecucion mmtaffarel OOP 8 14-01-2024 17:55:25
Crear un DSN en tiempo de ejecucion neyvan Conexión con bases de datos 7 21-05-2004 17:41:45
Quiero crear objetos en tiempo de ejecución con IntraWeb en Delphi 7 atirado OOP 3 11-03-2004 23:06:31
TClientDataSet y objetos de campos añadidos en tiempo de ejecución Berto2003 Conexión con bases de datos 2 04-03-2004 09:26:27
Objetos creados en tiempo de ejecución Scocc OOP 4 13-06-2003 20:55:29


La franja horaria es GMT +2. Ahora son las 23:31:27.


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