我使用编辑框作为圆形计数器。我想在text = 5或10时显示此消息然后它会执行一些功能。但是即使当轮次为5或10时,我也从未收到此消息,ERoundChange是ERound的OnChange事件(编辑框);知道为什么它不工作?我假设我使用自我错误?
{Check if round is 5 or 10}
//-----------------------------------------------------
procedure TBaseGameForm.ERoundChange(Sender: TObject);
//-----------------------------------------------------
begin
if (self.Text = '5') or (self.Text = '10') then
begin
showmessage('checking stats for gryph locations on round: '+self.Text);
end;
end;
另外我在每个球员开始时改变轮次如此
ERound.Text := inttostr(Strtoint(ERound.Text)Mod 10+1);
答案 0 :(得分:3)
由于ERoundChange
是TBaseGameForm
的方法,Self
指的是TBaseGameForm
的当前实例,即形式,而不是里面的编辑框。
因此,Self.Text
是表单的标题,而不是编辑框内的文本。如果编辑框名为Edit1
,则应该执行
procedure TBaseGameForm.ERoundChange(Sender: TObject);
begin
if (Edit1.Text = '5') or (Edit1.Text = '10') then
ShowMessage('checking stats for gryph locations on round: '+ Edit1.Text);
end;
您也可以
procedure TBaseGameForm.ERoundChange(Sender: TObject);
begin
if ((Sender as TEdit).Text = '5') or ((Sender as TEdit).Text = '10') then
ShowMessage('checking stats for gryph locations on round: '+ (Sender as TEdit).Text);
end;
因为导致事件的控件存储在Sender
参数中。但由于Sender
被声明为TObject
,因此您需要将其转换为实际的TEdit
。
[你本可以自己弄清楚这一点。实际上,过程TBaseGameForm.ERoundChange
本身与编辑控件无关 - 当然,它被分配给此控件的事件,但当然您也可以将其分配给其他控件,并在任何控件中使用它其他你喜欢的方式。因此,它本身只与TBaseGameForm
相关联,所以实际上,Self
无法在逻辑上引用任何其他内容。]
答案 1 :(得分:3)
该方法是表单的实例方法,因此Self.Text
引用表单的文本或标题。你需要使用
(Sender as TEdit).Text
代替。
尽管为了避免重复,您应该使用局部变量来保存编辑控件引用:
procedure TBaseGameForm.ERoundChange(Sender: TObject);
var
Edit: TEdit;
begin
Edit := (Sender as TEdit);
if (Edit.Text = '5') or (Edit.Text = '10') then
ShowMessage('checking stats for gryph locations on round: ' + Edit.Text);
end;