Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2011, 11:37
sanis sanis вне форума
Прохожий
 
Регистрация: 26.05.2011
Сообщения: 2
Репутация: 10
Печаль Динамическое создание 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  
Старый 26.05.2011, 13:17
sanis sanis вне форума
Прохожий
 
Регистрация: 26.05.2011
Сообщения: 2
Репутация: 10
По умолчанию

Все нормально, я переборщила с примером. Не нужно ничего менять. Тему можно закрывать
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter