2009-12-13 3 views
3

Когда я создаю динамический компонент из блока, у меня нет проблем с созданием события OnClick. Когда я делаю динамический компонент от unit 2 Мне не удается получить доступ к событию OnClick.Проблема с Delphi OnClick с несколькими модулями

unit Unit1 
type 
    TForm1 = class(TForm) 
     procedure FormCreate(Sender: TObject); 
    private 
     { Private declarations } 
    public 
     Procedure ClickBtn1(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 
    MyBtn1: TButton; 
implementation 

{$R *.dfm} 

{ TForm1 } 
uses Unit2; 

procedure TForm1.ClickBtn1; 
begin 
    MyBtn1.Caption := 'OK'; 
    MakeBtn2; 
end; 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
    MyBtn1 := TButton.Create(Self); 
    MyBtn1.Parent := Form1; 
    MyBtn1.Name := 'Btn1'; 
    MyBtn1.Left := 50; 
    MyBtn1.Top := 100; 
    MyBtn1.Caption := 'Click Me'; 
    MyBtn1.OnClick := ClickBtn1; 
end; 


end. 



unit Unit2; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

procedure MakeBtn2; 
procedure ClickBtn2;  
var 
    MyBtn2: TButton; 

implementation 

Uses Unit1; 

procedure MakeBtn2; 
begin 
    MyBtn2 := TButton.Create(Form1); 
    MyBtn2.Parent := Form1; 
    MyBtn2.Name := 'Btn2'; 
    MyBtn2.Left := 250; 
    MyBtn2.Top := 100; 
    MyBtn2.Caption := 'Click Me'; 
    MyBtn2.OnClick := ClickBtn2; //Compiler ERROR 
end; 

procedure ClickBtn2; 
begin 
    MyBtn1.Caption := 'OK'; 
end; 
end. 

ответ

1

Вы уверены, что первый пример работает? Ни один из них не должен компилироваться.

обработчик

OnClick является TNotifyEvent, который определяется как

procedure(Sender: TObject) of object; 

Это означает, что он должен быть методом объекта (например, форма), и метод подпись должна быть процедурой который принимает один параметр TObject. Ваша процедура MakeBtn2 не является объектным методом, и ни один из них не принимает Sender: TObject.

+0

Что бы лучший способ для того чтобы достигнуть того, что я хочу? –

+0

Объявите метод в своей форме с правильной подписью и поместите код, который вы пытаетесь выполнить там. –

2

Посмотрите на эту статью «Creating A Component at Runtime»

Цитата:

Я хочу, чтобы создать кнопку в коде, положить его на форму и прикрепить процедуру ее события нажатия. Как я могу получить событие события , связанное с предопределенным именем процедуры из кода? Я предполагаю, что ссылка IDE в браузере объектов - это ключ к ответу, но я хочу сделать это во время выполнения, а не в разработке.

Прежде всего, вы можете назначить любой метод объекта другому методу как , поскольку он имеет ту же форму. Посмотрите на код ниже:

{This method is from another button that when pressed will create 
the new button.} 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    btnRunTime : TButton; 
begin 
    btnRunTime := TButton.Create(form1); 
    with btnRunTime do begin 
    Visible := true; 
    Top := 64; 
    Left := 200; 
    Width := 75; 
    Caption := 'Press Me'; 
    Name := 'MyNewButton'; 
    Parent := Form1; 
    OnClick := ClickMe; 
    end; 
end; 

{This is the method that gets assigned to the new button's OnClick method} 
procedure TForm1.ClickMe(Sender : TObject); 
begin 
    with (Sender as TButton) do 
    ShowMessage('You clicked me'); 
end; 

Как вы можете видеть, я создал новый метод под названием ClickMe, который был объявлен в частный раздел Form1:

type 
    TForm1 = class(TForm 
    ... 
    ... 
    private 
    procedure ClickMe(Sender : TObject); 
    published 
    end; 

Другие примеры и пояснения см. Также:

Смежные вопросы