Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema de creación en Runtime (https://www.clubdelphi.com/foros/showthread.php?t=75735)

hgiacobone 15-09-2011 14:35:43

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?

DarKraZY 15-09-2011 15:01:31

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!

hgiacobone 15-09-2011 15:41:19

Cita:

Empezado por DarKraZY (Mensaje 412212)
Entonces, ¿por qué no implementas todo lo que hace TfrmCustomDlg dentro de él mismo?
Saludos!

Guauuu..... eso sería fantástico!!! :rolleyes:
pero simplemente NO LO SE HACER , sino ya hubiese funcionado ¿no te parece? :eek:

Neftali [Germán.Estévez] 15-09-2011 17:05:49

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.

DarKraZY 16-09-2011 08:49:24

Cita:

Empezado por hgiacobone (Mensaje 412216)
Guauuu..... eso sería fantástico!!! :rolleyes:
pero simplemente NO LO SE HACER , sino ya hubiese funcionado ¿no te parece? :eek:

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ó ;)

hgiacobone 16-09-2011 13:43:35

Hecho.
 
Bien amigos, siguiendo sus consejos, he logrado hacerlo funcionar. :D

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,
;)

DarKraZY 16-09-2011 14:18:59

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.

hgiacobone 16-09-2011 15:19:35

Cita:

Empezado por DarKraZY (Mensaje 412326)
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.:o
Saludos,


La franja horaria es GMT +2. Ahora son las 04:05:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi