|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Динамическое создание TComboBox в TStringGrid
Привет всем.
Задача: Есть таблица типа 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, то все ячейки по столбцу А будут всегда равны (также ситуация обстоит и с В). зы: пример был взят отсюда |
#2
|
|||
|
|||
Все нормально, я переборщила с примером. Не нужно ничего менять. Тему можно закрывать
|