Ver Mensaje Individual
  #1  
Antiguo 30-07-2014
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Reputación: 21
hgiacobone Va por buen camino
Question Evento OnClick en runtime

Tal vez sea la pregunta del millón...
¿ Cómo disparar dinámicamente (runtime) un evento OnClick ?

Ejemplo:
Tenemos un procedimiento que en runtime crea un formulario, un Memo y un Boton.
El fin de esto, es que, el usuario final escriba algo en el Memo y al hacer clic en el Boton lo pueda enviar a imprimir o a realizar otro tipo de tarea (en este caso no importa mucho).
El código es similar a esto:
Código Delphi [-]
procedure TForm1.MostrarFormularioDinamico;
var
  DebugForm: TForm;
  memo1: TMemo;
  Btn1: TButton;
  Pnl1: TPanel;
begin
    DebugForm:= TForm.Create(self);
    DebugForm.Width:= Trunc(Self.Width/2);

    Pnl1:= TPanel.Create(DebugForm);
    Pnl1.Parent:= DebugForm;
    Pnl1.Align:= alBottom;

    Btn1:= TButton.Create(DebugForm);
    Btn1.Parent:= Pnl1;
    Btn1.OnClick:= ClickMe; //<----este es el problematico

    memo1:= Tmemo.Create(DebugForm);
    memo1.Parent:= DebugForm;
    memo1.Align:= alClient;
    memo1.ScrollBars:= ssBoth  ;

    DebugForm.Show;
end;

Por lo general, el evento se declara en el formulario principal, en su sección privada y funciona correctamente (mientras se haga referencia a componentes, procedimientos, variables, etc, que sean visibles al TForm principal):
Código Delphi [-]
type
  TForm1 = class(TForm
  ...
  ...
  private
    procedure ClickMe(Sender : TObject);
  published
  end;

El problema reside es que a este evento no lo puedo asignar a un procedimiento "pre-declarado" ya que hace referencia y uso de elementos que se crean dinámicamente tal como el TMemo.
Tampoco fue posible dispararlo con un procedimiento local, al estilo:
Código Delphi [-]
procedure TForm1.MostrarFormularioDinamico;
var
  DebugForm: TForm;
  memo1: TMemo;
  Btn1: TButton;
  Pnl1: TPanel;
      
      procedure ClickMe(Sender: TObject);
      var
        s: string;
      begin
            try   
              s:= memo1.Text;
              ...
              ...
            except
              on E:Exception do MessageDlg(E.Message, mtWarning, [mbOk],0);
            end;
      end;

begin
    DebugForm:= TForm.Create(self);
    DebugForm.Width:= Trunc(Self.Width/2);

    Pnl1:= TPanel.Create(DebugForm);
    Pnl1.Parent:= DebugForm;
    Pnl1.Align:= alBottom;

    Btn1:= TButton.Create(DebugForm);
    Btn1.Parent:= Pnl1;
    Btn1.OnClick:= ClickMe; 

    memo1:= Tmemo.Create(DebugForm);
    memo1.Parent:= DebugForm;
    memo1.Align:= alClient;
    memo1.ScrollBars:= ssBoth  ;

    DebugForm.Show;
end;

¿ Alguien tiene alguna aproximación para su solución ?
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita