2009-12-13 6 views
3

Lorsque je crée un composant dynamique à partir de l'unité, je n'ai aucun problème à créer l'événement OnClick. Lorsque je crée un composant dynamique à partir de unité 2 Impossible d'accéder à l'événement OnClick.Problème Delphi OnClick avec plusieurs unités

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. 

Répondre

1

Etes-vous sûr que le premier exemple fonctionne? Aucun d'entre eux ne devrait compiler.

Un gestionnaire OnClick est un TNotifyEvent, qui est défini comme

procedure(Sender: TObject) of object; 

Cela signifie qu'il doit y avoir une méthode d'un objet (tel qu'un formulaire), et la signature de la méthode doit être une procédure cela prend un seul paramètre TObject. Votre procédure MakeBtn2 n'est pas une méthode d'objet, et aucun d'entre eux ne prend Sender: TObject.

+0

Quelle serait la meilleure façon de acheive ce que je veux? –

+0

Déclarez une méthode sur votre formulaire avec la bonne signature et placez le code que vous essayez d'exécuter ici. –

2

Jetez un oeil à cet article « Creating A Component at Runtime »

Quote:

Je veux créer un bouton dans le code, mettre sur un formulaire et joindre une procédure à son événement click. Comment puis-je obtenir l'événement lié à un nom de procédure prédéfini à partir du code? Je suppose que le lien IDE dans le navigateur d'objet est clé de la réponse, mais je veux faire cela au moment de l'exécution, pas en développement.

Tout d'abord, vous pouvez affecter n'importe quelle méthode de l'objet à une autre méthode sous la forme , car elle a la même forme. Regardez le code ci-dessous:

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

Comme vous pouvez le voir, je créé une nouvelle méthode appelé ClickMe, qui a été déclaré dans la partie privée de Form1:

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

Pour d'autres exemples et explications, voir également:

Questions connexes