2015-06-30 2 views
1

У меня есть два компонента, созданных динамически, кнопка (btnEnter) и edit (edtID) - где пользователь вводит свой идентификатор пользователя. Я хочу, чтобы программа проверила, ввел ли пользователь действительный идентификатор, когда он нажал кнопку.Динамические объекты с обработчиком событий - Delphi

код у меня есть:

1) Когда объекты создаются

with btnEnter do 
    {edit properties such as caption, etc} 
    OnClick := ValidateID; 

2) Процедура объявляется следующим образом:

procedure ValidateID (Sender : TObject); 

То, что я хотел бы сделать, это передайте текст в редактировании с помощью процедуры в качестве параметра, чтобы процедура могла обрабатывать текст и определять, действительно ли это или нет.

Так что я пытался, но не работа:

procedure ValidateID (Sender : TObject; sID : string); 

    with btnEnter do 
    OnClick := ValidateID(edtID.Text); 

бы очень признателен, если кто-то может помочь мне с этим. Спасибо

+0

Назначение (OnClick: =) не запускает событие, даже если у вас может быть произвольная подпись события, это не поможет вам. Я думаю, вы должны жестко закодировать код в обработчике кликов. –

+0

Назначение - это всего лишь обратный вызов. Событие инициируется вызовом обратного вызова. Вы должны уважать подпись типа (_procedure (Sender: TObject) _). Я не понимаю, почему вы не можете проверить значение редактирования в _ValidateID_. Они находятся в одном и том же контексте, вы можете получить доступ к его ценности, так что в чем проблема? –

ответ

1

Этот код работает.

unit Unit1; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; 

type 
    TForm1 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    button: TButton; 
    edit: TEdit; 
    procedure ValidateID(Sender: TObject); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
    edit := TEdit.Create(self); 
    button := TButton.Create(self); 
    button.Parent := Form1; 
    edit.Parent := Form1; 
    edit.Left := 1; 
    edit.Top := 1; 
    button.Left := 1; 
    button.Top := 50; 
    button.OnClick := ValidateID; 
end; 

procedure TForm1.ValidateID(Sender: TObject); 
begin 
    ShowMessage(edit.Text) 
end; 

end. 
+2

Отлично. Теперь * объясните, что это за код, который заставляет его работать. Не заставляйте всех изучать код, чтобы найти важные части. –

+1

В элементах управления VCL нет метода FreeOnRelease(). Вместо этого используйте 'Free()'. Что в этом примере является избыточным, поскольку 'TForm1' присваивается как' 'Владелец' и позаботится о том, чтобы освободить их автоматически. –

+2

Если форма будет отображаться дважды или более раз, ваш код будет увеличивать AV во второй раз. По умолчанию 'Action: TCloseAction' является' caHide', что означает, что форма не будет уничтожена (просто сделана невидимой) и не будет создана при повторном вызове. Таким образом, освобожденные TEdit и TButton не воссоздаются, и AV следует, когда к ним обращаются. –

2

TButton.OnClick события типа TNotifyEvent, который имеет подпись:

TNotifyEvent = procedure(Sender: TObject) of object; 

Таким образом, вы не можете назначить процедуру с другой подписью TButton.OnClick.

Вам необходимо объявить процедуру ValidateID как метод класса формы, а затем, поскольку TEdit находится в том же виде, он находится в той же области, что и ваш метод проверки, и вы можете просто получить доступ к EditID.Text в ваш ValidateID способ.

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