如何检查是否点击了二维数组的任何按钮?

Tim*_*ner 1 arrays delphi minesweeper

我正在尝试建立一个扫雷程序.到目前为止,我使用变量创建了一个二维的按钮数组Buttons[rows][cols],因此您可以定位该字段上的每个按钮.按钮在运行时在表单上创建.现在我需要知道如何确定是否点击了按钮.

我知道你可以查看,if Sender = Button但它如何与二维数组一起使用?由于我在运行时创建了Buttons(FormCreate),我如何创建可以执行代码的过程,因为它当然不应该检查是否在运行时单击了一个按钮.

有人会这么善良并告诉我如何在点击后禁用按钮吗?为此,显然,我需要知道如何确定单击了哪个按钮.

Dav*_*nan 5

创建按钮时,将其Tag属性设置为ID:

Button.Tag := Col + Row*ColCount;
Run Code Online (Sandbox Code Playgroud)

为每个按钮指定相同的OnClick事件处理程序

Button.OnClick := ButtonClick;
Run Code Online (Sandbox Code Playgroud)

这两行代码将在这样的循环中:

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;
Run Code Online (Sandbox Code Playgroud)

我希望你已经拥有这样的代码.

实现事件处理程序以解码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;
Run Code Online (Sandbox Code Playgroud)

通过将其Enabled属性设置为禁用控件False.

在这里,我假设基于零的索引,并且您的按钮是TButton.如果这些假设是错误的,您显然需要适应您的情况.

我想这回答了你问的问题.但是,对每个网格方块使用按钮可能是实现扫雷的错误方法.你最好使用一个TPaintBox非可视化结构来保存状态,并使用一个OnClick处理器作为绘图框.