Привет всем.
Задача:
Есть таблица типа TStringGrid. Ячейки "А" и "B" имеют значение элемента массивов ComboBox1 и ComboBox2 типа TComboBox соответственно. Строки в таблице изменяются динамически. Необходимо, чтобы значение ячеек А и В были независимы друг от друга(значение А не равно значению B; ячейки по столбцу А не равны, и ячейки по столбцу В не равны).
Решение*:
Код:
var
Form2: TForm2;
ComboBox1, ComboBox2:array of TComboBox;
i: integer;
StringGrid1: TStringGrid;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
StringGrid1.RowCount := Stringgrid1.RowCount + 1;
i := 2;
while i <= StringGrid1.RowCount do
begin
ComboBox1[i] := TComboBox.Create(self);
with ComboBox1[i] do
begin
parent := self;
visible := false;
Height := 30;
width := 70;
OnChange := ComboBox1Change;
OnExit := ComboBox1Exit;
end;
ComboBox2[i] := TComboBox.Create(self);
with ComboBox2[i] do
begin
parent := self;
visible := false;
Height := 30;
width := 70;
OnChange := ComboBox1Change;
OnExit := ComboBox1Exit;
end;
ComboBox2[i].Visible := False; ComboBox2[i].Items.Add('1');
ComboBox2[i].Items.Add('2');
ComboBox1[i].Visible := False; ComboBox1[i].Items.Add('3');
ComboBox1[i].Items.Add('4');
i := i + 1;
end;
end;
procedure TForm2.ComboBox1Exit(Sender: TObject);
begin
i := 2;
while i <= StringGrid1.RowCount do
begin
StringGrid1.Cells[1,i] := ComboBox1[i].Items[ComboBox1[i].ItemIndex];
ComboBox1[i].Visible := False; StringGrid1.SetFocus;
StringGrid1.Cells[2,i] := ComboBox2[i].Items[ComboBox2[i].ItemIndex];
ComboBox2[i].Visible := False; StringGrid1.SetFocus;
i := i + 1;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
StringGrid1 := TStringGrid.Create(self);
with StringGrid1 do
begin
parent := self;
rowcount := 1;
colcount := 2;
onSelectCell := StringGrid1SelectCell;
Cells[0,0] := 'A';
Cells[1,0] := 'B';
end;
i := 2;
while i <= StringGrid1.RowCount do
begin
ComboBox1[i] := TComboBox.Create(self);
with ComboBox1[i] do
begin
parent := self;
visible := false;
Height := 30;
width := 70;
OnChange := ComboBox1Change;
OnExit := ComboBox1Exit;
end;
ComboBox2[i] := TComboBox.Create(self);
with ComboBox2[i] do
begin
parent := self;
visible := false;
Height := 30;
width := 70;
OnChange := ComboBox1Change;
OnExit := ComboBox1Exit;
end;
ComboBox2[i].Visible := False; ComboBox2[i].Items.Add('1');
ComboBox2[i].Items.Add('2');
ComboBox1[i].Visible := False; ComboBox1[i].Items.Add('3');
ComboBox1[i].Items.Add('4');
i := i + 1;
end;
end;
procedure TForm2.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
var
R: TRect;
begin
i := 2;
while i <= StringGrid1.RowCount do
begin
{установить значение для первого combobox}
if ((ACol = 0) and (ARow <> 0)) then
begin
{Ширина и положение ComboBox должно соответствовать ячейке StringGrid}
R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top; ComboBox1[i].Left := R.Left + 1;
ComboBox1[i].Top := R.Top + 1; ComboBox1[i].Width := (R.Right + 1) - R.Left;
ComboBox1[i].Height := (R.Bottom + 1) - R.Top;
ComboBox1[i].Visible := True; ComboBox1[i].SetFocus;
StringGrid1.DefaultRowHeight := ComboBox1[i].Height;
end;
{установить значение для второго combobox}
if ((ACol = 1) and (ARow <> 0)) then
begin
R := StringGrid1.CellRect(ACol, ARow); R.Left := R.Left + StringGrid1.Left;
R.Right := R.Right + StringGrid1.Left; R.Top := R.Top + StringGrid1.Top;
R.Bottom := R.Bottom + StringGrid1.Top; ComboBox2[i].Left := R.Left + 1;
ComboBox2[i].Top := R.Top + 1; ComboBox2[i].Width := (R.Right + 1) - R.Left;
ComboBox2[i].Height := (R.Bottom + 1) - R.Top;
ComboBox2[i].Visible := True; ComboBox2[i].SetFocus;
StringGrid1.DefaultRowHeight := ComboBox2[i].Height;
end;
CanSelect := True;
i := i + 1;
end;
end;
* какое бы не было решение: правильное или не правильное, оно остается решением.
Как я поняла, ошибка указывает на то, что количество элементов массивов типа TComboBox должны быть постоянны. Но по моей задачи они имеет тоже количество, что и строки: изменяются динамически (нумерация начинается с 2, т.к. шапку таблицы трогать не нужно)
Если создать просто две переменных типа TComboBox, то все ячейки по столбцу А будут всегда равны (также ситуация обстоит и с В).
зы: пример был взят
отсюда