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;
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 ?