如何检查是否单击了二维数组的任何按钮?
How can I check if any button of a two dimensional array was clicked?
我正在尝试构建一个扫雷程序。到目前为止,我用变量 Buttons[rows][cols]
制作了一个二维按钮数组,因此您可以针对字段上的每个按钮。这些按钮是在运行时在表单上创建的。现在我需要知道如何确定按钮是否被单击。
我知道你可以检查 if Sender = Button
但它如何处理二维数组?由于我在运行时创建了按钮 (FormCreate),我该如何创建可以执行代码的过程,因为它当然不应该检查是否在运行时单击了按钮。
谁能告诉我如何在单击按钮后将其禁用?为此,显然,我需要知道如何确定单击了哪个按钮。
创建按钮时,将它们的 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
油漆盒处理程序。
我正在尝试构建一个扫雷程序。到目前为止,我用变量 Buttons[rows][cols]
制作了一个二维按钮数组,因此您可以针对字段上的每个按钮。这些按钮是在运行时在表单上创建的。现在我需要知道如何确定按钮是否被单击。
我知道你可以检查 if Sender = Button
但它如何处理二维数组?由于我在运行时创建了按钮 (FormCreate),我该如何创建可以执行代码的过程,因为它当然不应该检查是否在运行时单击了按钮。
谁能告诉我如何在单击按钮后将其禁用?为此,显然,我需要知道如何确定单击了哪个按钮。
创建按钮时,将它们的 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
油漆盒处理程序。