Двумерный массив Cells[3, 3] содержит записи типа Cell.
Каждая запись состоит из кнопки b и процедуры ClickCell, выдающей текст кнопки.
Кнопки создаются, и на клик каждой кнопки навешивается процедура из этой же записи.
Два варианта назначения процедур.
1 вариант) Назначение процедур происходит вне цикла:
uses WPFObjects, Controls;
type
Cell = record
b: ButtonWPF;
constructor(b: ButtonWPF) := self.b := b;
procedure ClickCell := MessageBox.Show('Нажата кнопка ' + b.Text);
end;
var
Cells := new Cell[3, 3];
w := 100.0; // CellWidth=CellHigh
begin
Window.Width := 3 * w;
Window.Height := 3 * w;
for var i := 0 to 2 do
for var j := 0 to 2 do
Cells[i, j] := new Cell(new ButtonWPF(w * j, w * i, $'{i},{j}', w, 70));
Cells[0, 0].b.Click := procedure -> Cells[0, 0].ClickCell;
Cells[0, 1].b.Click := procedure -> Cells[0, 1].ClickCell;
Cells[0, 2].b.Click := procedure -> Cells[0, 2].ClickCell;
Cells[1, 0].b.Click := procedure -> Cells[1, 0].ClickCell;
Cells[1, 1].b.Click := procedure -> Cells[1, 1].ClickCell;
Cells[1, 2].b.Click := procedure -> Cells[1, 2].ClickCell;
Cells[2, 0].b.Click := procedure -> Cells[2, 0].ClickCell;
Cells[2, 1].b.Click := procedure -> Cells[2, 1].ClickCell;
Cells[2, 2].b.Click := procedure -> Cells[2, 2].ClickCell;
end.
– назначение происходит правильно. Проверим: нажмем, например, кнопку [0,1] – срабатывает соответствующая процедура:
2 вариант) Назначение процедур происходит в цикле:
uses WPFObjects, Controls;
type
Cell = record
b: ButtonWPF;
constructor(b: ButtonWPF) := self.b := b;
procedure ClickCell := MessageBox.Show('Нажата кнопка ' + b.Text);
end;
var
Cells := new Cell[3, 3];
w := 100.0; // CellWidth=CellHigh
begin
Window.Width := 3 * w;
Window.Height := 3 * w;
for var i := 0 to 2 do
for var j := 0 to 2 do
begin
Cells[i, j] := new Cell(new ButtonWPF(w * j, w * i, $'{i},{j}', w, 70));
Cells[i, j].b.Click := procedure -> Cells[i, j].ClickCell;
end;
end.
– назначение происходит НЕправильно. Какую бы кнопку ни нажал – срабатывает одна и та же процедура, а именно, процедура для кнопки [2, 2]:
Вариант 2 компактный, и не хочется от него отказываться. Но почему он работает неправильно? Объясните, пожалуйста. Спасибо!