我正在尝试建立一个扫雷程序。到目前为止,我使用变量Buttons[rows][cols]
制作了一个二维的按钮数组,因此您可以定位该字段上的每个按钮。按钮在运行时在表单上创建。现在我需要知道如何确定是否点击了一个按钮。
我知道你可以查看if Sender = Button
但是它如何与二维数组一起使用?由于我在运行时创建了Buttons(FormCreate),我如何创建可以执行代码的过程,因为它当然不应该检查是否在运行时单击了按钮。
有人会这么善良并告诉我如何在点击后禁用按钮吗?为此,显然,我需要知道如何确定单击了哪个按钮。
答案 0 :(得分:5)
创建按钮时,将其Tag
属性设置为ID:
Button.Tag := Col + Row*ColCount;
为每个按钮指定相同的OnClick
事件处理程序。
Button.OnClick := ButtonClick;
这两行代码将在这样的循环中:
for Row := 0 to RowCount-1 do
for Col := 0 to ColCount-1 do
begin
Button := TButton.Create(Self);
Button.Parent := Self;
Button.Left := ...;
Button.Top := ...;
Button.Tag := ...;
Button.OnClick := ...;
Buttons[Row,Col] := Button;
end;
我希望你已经拥有这样的代码。
实现事件处理程序以解码ID,如下所示:
procedure TMyForm.ButtonClick(Sender: TObject);
var
Button: TButton;
Row, Col: Integer;
begin
Button := Sender as TButton;
Row := Button.Tag div ColCount;
Col := Button.Tag mod ColCount;
// respond to click
end;
通过将其Enabled
属性设置为False
来禁用控件。
这里我假设基于零的索引,并且您的按钮是TButton
。如果这些假设是错误的,您显然需要适应您的情况。
我认为这回答了你提出的问题。但是,对每个网格方块使用按钮可能是实现扫雷的错误方法。最好使用TPaintBox
,一个用于保存状态的非可视化结构,以及一个用于绘制框的OnClick
处理程序。