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 15-09-2011
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 22
hgiacobone Va por buen camino
Unhappy Problema de creación en Runtime

Hola amigos,
Tengo un Form pre-diseñado a modo de Diálogo Modal, que solo contiene un TPanel y dos TBitButtons para el Ok y el Cancel respectivamente.
Este Form se crea y se invoca solo en runtime. Se incrustan en el interior del TPanel los componentes que en ese momento se necesiten.
Por ej:
Código Delphi [-]
procedure TForm1.ButonXXXOnClick(Sender: TObject);
   procedure Check1_OnClick(Sender: TObject);
   begin
      Date1.Enabled:= not (Sender As TCheckbox).Checked;
   end;
var
   MyForm: TfrmCustomDlg;
   Label1: TLable;
   Date1: TComboDate;
   Chk1: TCheckbox;
begin
   MyForm:= TfrmCustomDlg.Create(self);
   TRY
     MyForm.BtnOK.Caption:= '&Ingresar';
     MyForm.BtnCAN.Caption:='&Salir';
     
     Label1:= TLabel.Create(MyForm);
     Label1.Parent:= MyForm.Panel1;
     Label1.Caption:= 'Indique la fecha:';
     Label1.Left:=10;
     Label1.Top:=10;

     Date1:= TCombodate.Create(MyForm);
     Date1.Parent:= MyForm.Panel1;
     Date1.Date:= Now;
     Date1.Left:=10;
     Date1.Top:=50;

     Chk1:= TCheckbox.Create(MyForm);
     Chk1.Parent:= MyForm.Panel1;
     Chk1.Caption:= 'Sin fecha';
     Chk1.Left:=10;
     Chk1.Top:=70;
     Chk1.OnClick:= Check1_OnClick;

        if (MyForm.ShowModal = mrOK) then
        begin
          {aqui se realiza el procesamiento posterior}
        end;
   FINALLY
     MyForm.Free;
   END;
end;

Esto funcionaba bien a excepción cuando le agregué lo que está marcado en color rojo.

La duda a plantear es que no puedo crear el procedimiento que debe responder al evento OnClick de la casilla.

¿Quién sabe cómo hacerlo?
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita
  #2  
Antiguo 15-09-2011
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: ago 2003
Posts: 460
Poder: 21
DarKraZY Va por buen camino
Creo que es porque OnClick necesita un método y no un procedimiento. Un método es un procedimiento de una clase.
Por ejemplo, para solucionarlo podrías crear Check1_OnClick dentro de TForm1. Así te debería ir.

Ah, no. Pero según estoy viendo dentro de Check1_OnClick haces uso de Date1 que es una variable que creas a nivel interno. Entonces no te sirve.

Entonces, ¿por qué no implementas todo lo que hace TfrmCustomDlg dentro de él mismo?

Saludos!
Responder Con Cita
  #3  
Antiguo 15-09-2011
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 22
hgiacobone Va por buen camino
Cita:
Empezado por DarKraZY Ver Mensaje
Entonces, ¿por qué no implementas todo lo que hace TfrmCustomDlg dentro de él mismo?
Saludos!
Guauuu..... eso sería fantástico!!!
pero simplemente NO LO SE HACER , sino ya hubiese funcionado ¿no te parece?
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita
  #4  
Antiguo 15-09-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
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
Yo creo que la única posibilidad es la que apunta DarKraZY.

Este proceminiento debe estar definido como método del formulario, ed decir igual que está definido el:
TForm1.ButonXXXOnClick(Sender: TObject);
Código Delphi [-]
procedure Check1_OnClick(Sender: TObject); 
begin
Date1.Enabled:= not (Sender As TCheckbox).Checked;
end;

Algo así:

Código Delphi [-]
procedure  TForm1.Check1_OnClick(Sender: TObject); 
begin
Date1.Enabled:= not (Sender As TCheckbox).Checked;
end;

Y con su correspondiente definición en la parte de Interface.
Si luego te hace falta una variable privada (en este caso Date1) la defines en la parte privada del form.
__________________
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
  #5  
Antiguo 16-09-2011
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: ago 2003
Posts: 460
Poder: 21
DarKraZY Va por buen camino
Cita:
Empezado por hgiacobone Ver Mensaje
Guauuu..... eso sería fantástico!!!
pero simplemente NO LO SE HACER , sino ya hubiese funcionado ¿no te parece?
Voy a probar suerte.... Esto es un poco de memoria, tendrías que ver que todo sea correcto.
Código Delphi [-]
procedure TForm1.ButonXXXOnClick(Sender: TObject);
var
  MyForm: TfrmCustomDlg;
begin
  MyForm := TfrmCustomDlg.Create(Self);
  try
    MyForm.SetModoFecha;
    if (MyForm.ShowModal = mrOk) then
    begin
      {aqui se realiza el procesamiento posterior}
    end;
  finally
    MyForm.Free;
  end;
end;

Y el TfrmCustomDlg quedaría más o menos así...

Código Delphi [-]
TfrmCustomDlg = class(TForm)
 ...
  private
    Label1: TLabel;
    Date1: TComboDate;
    Chk1: TCheckbox;
    procedure Check1_OnClick(Sender: TObject);
  ...
  public
    procedure SetModoFecha;
  end;

...

procedure TfrmCustomDlg.Check1_OnClick(Sender: TObject);
begin
  Date1.Enabled:= not (Sender As TCheckbox).Checked;
end;

procedure TfrmCustomDlg.SetModoFecha;
begin
  Self.BtnOK.Caption := '&Ingresar';
  Self.BtnCAN.Caption := '&Salir';

  Label1 := TLabel.Create(Self);
  Label1.Parent := Self.Panel1;
  Label1.Caption := 'Indique la fecha:';
  Label1.Left := 10;
  Label1.Top := 10;

  Date1 := TCombodate.Create(Self);
  Date1.Parent := Self.Panel1;
  Date1.Date := Now;
  Date1.Left := 10;
  Date1.Top := 50;

  Chk1 := TCheckbox.Create(Self);
  Chk1.Parent := Self.Panel1;
  Chk1.Caption := 'Sin fecha';
  Chk1.Left := 10;
  Chk1.Top := 70;
  Chk1.OnClick := Check1_OnClick;
end;


Creo que podría servirte algo así. Pero intenta cambiar los nombres de objetos para que quede más claro su cometido

Saludos!! Ya me dices si te sirvió
Responder Con Cita
  #6  
Antiguo 16-09-2011
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 22
hgiacobone Va por buen camino
Thumbs up Hecho.

Bien amigos, siguiendo sus consejos, he logrado hacerlo funcionar.

Como dijo "DarKraZY", el evento OnClick del CheckBox debe responder a un método de un clase. Cómo no encontré la forma de definir este método en runtime, dentro del Form que también es creado en runtime (MyForm), entonces lo hice en la definición del formulario principal (TForm1) dentro del apartado Public.
Código Delphi [-]
type
  TForm1 = class(TForm)
....
private
    { Private declarations }
public
    Check1_OnClick(Sender: TObject);
end;

Luego, moví las variables locales para la creación de los componentes que se mostraban dentro del formulario MyForm hacia la parte global del formulario TForm1, de forma que sean accesibles desde cualquier punto:
Código Delphi [-]
var
   Label1: TLabel;
   Date1: TComboDate;
   Chk1: TCheckbox;

implementation
...

El resto quedó como estaba y funciona a la perfección.
Gracias a todos,
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·

Última edición por hgiacobone fecha: 16-09-2011 a las 13:47:43.
Responder Con Cita
  #7  
Antiguo 16-09-2011
Avatar de DarKraZY
DarKraZY DarKraZY is offline
Miembro
 
Registrado: ago 2003
Posts: 460
Poder: 21
DarKraZY Va por buen camino
Bueno, es una forma de hacerlo.... pero nada tiene que ver con OOP
Tanto las variables como el método podrías ponerlo en la parte privada de TForm1. Pero aún así, no tiene sentido que componentes que vas a mostrar y que van a ser propios de TfrmCustomDlg estén declarados en TForm1.
Responder Con Cita
  #8  
Antiguo 16-09-2011
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 22
hgiacobone Va por buen camino
Cita:
Empezado por DarKraZY Ver Mensaje
Bueno, es una forma de hacerlo.... pero nada tiene que ver con OOP
Tanto las variables como el método podrías ponerlo en la parte privada de TForm1. Pero aún así, no tiene sentido que componentes que vas a mostrar y que van a ser propios de TfrmCustomDlg estén declarados en TForm1.
Coincido con lo dicho en un todo, pero la solución responde a varios factores:
En primer lugar, el Form creado en runtime (MyForm o TfrmCustomDlg) no debe contener en su estructura interna nada extra, porque se instancia en diferentes partes del sistema y se "rellena" con elementos y funciones propias del momento en que se lo invoca.
Aqui por ejemplo, solo había que responder al evento OnClick de un TCheckbox también creado en runtime, pero en otros módulos del sistema, la llamada a este formulario tal vez responda a eventos de otros componentes o incluso a ninguno, ya que se lo puede utilizar para mostrar un simple texto y nada más.

A parte de esto y para este caso particular, la necesidad de declarar las variables como globales del Form principal, es porque yo debía poder acceder desde el método Check1_OnClic() al componente DATE1 que de lo contrario quedaba oculto si lo declaraba localmente. Claro, solo era necesario declarar esta variable y el resto podrían permanecer donde estaban ya que no se invocan desde otros lugares, pero no hace al caso.

Como dije, esta solución lejos de ser tal vez la más adecuada, se ajusta perfectamente a este particular caso.
Reitero el agradecimiento a todos y este nutritivo feedback.
Saludos,
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
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
Creacion de botones runtime, los cuales se mantengan despues de cerrar la aplicación giocatore Varios 18 25-01-2011 20:29:38
Creación de TFields en Runtime vinguel Conexión con bases de datos 5 16-11-2010 15:16:18
Problema con LIKE en runtime anghell77 SQL 8 04-05-2006 12:16:57
Creación de jpg en RunTime sierraja Gráficos 4 06-10-2005 04:26:04
Creación de Forms en runtime con Tipo dinámico Aprendiz OOP 2 29-09-2004 10:35:25


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


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