2

我正在使用编辑框作为圆形计数器。我想在 text = 5 或 10 时显示此消息,然后它会执行一些功能。但即使轮数为 5 或 10,我也从未收到此消息 ERoundChange 是 ERound(编辑框)的 OnChange 事件;知道为什么它不起作用吗?我假设我使用 Self 错误?

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

2 回答 2

3

因为ERoundChange是 的方法TBaseGameFormSelf所以指的是 的当前实例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在逻辑上无法引用其他任何内容。]

于 2012-11-18T17:02:53.100 回答
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;
于 2012-11-18T17:06:32.677 回答