|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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  
			
			
			
			
		 | |||
| 
 | |||
|   Все нормально, я переборщила с примером. Не нужно ничего менять. Тему можно закрывать  |