Раскрывающийся список в StringGrid

VCL, KOL, CLX и др. Свои компоненты
Ответить
Ermakovich
Сообщения: 4
Зарегистрирован: 09 мар 2005, 12:59

11 окт 2005, 14:08

Подскажите, как в ячейку(столбец) StringGrid (на подобии Columns ButtonStyle в DBGrid) вставить кнопку с раскрывающимся списком в виде StringGrid?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

11 окт 2005, 21:00

Самый простой способ - это положить на форму ComboBox с visible=false и на событие OnSelectSell (OnSelectSell - не точно, не помню точное название) перемещать его на ячейку, заполнять список и делать видимым. Соответственно прятать при уходе из данной колонки или вообще из грида. Некрасивое на первый взгляд решение, но сами гриды так и делают. Когда курсор оказывается в ячейке, то на ячейку накладывается другой элемент управления - TInlineEditor.

Чуть более изящный способ - это найти исходники (grids.pas) TInlineEditor, сделать свой аналогичный, но с комбобоксом, и встроить в уже созданный грид. У грида есть свойство InlineEditor, и хотя оно Protected его все равно можно присвоить используя полиморфизм.

Самый эффективный - субклассить TCustomGrid, чтобы прикрутить к нему новый InlineEditor. Наверняка такой велосипед давно уже изобретен и его можно поискать на сайтах с готовыми компонентами.
Ermakovich
Сообщения: 4
Зарегистрирован: 09 мар 2005, 12:59

12 окт 2005, 10:23

"Самый простой способ" - не подходит, т.к. в этом случае длина раскрывающейся StringGrid (по нажатии кнопки ComboBox) будет ограничена длиной ComboBox, т.е. длиной ячейки. А если длина StringGrid больше длины ячейки? Конечно, можно задать заранее длину ячейки (столбца) равной длине раскрывающейся StringGrid, но это не "спортивно", когда столбец максимум под 10 символов имеет длину под 40.
Ermakovich
Сообщения: 4
Зарегистрирован: 09 мар 2005, 12:59

12 окт 2005, 11:05

Нашел способ вставить кнопочку в ячейку StringGrid1, может кому пригодится. На форму кладем StringGrid, ComboBox и SpeedButton.

Код: Выделить всё

procedure TForm3.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var R : TRect;   
begin     
          if ((ACol = 1) AND (ARow <> 0)) then begin  //Вставка ComboBox (delphikingdom) во 2-й стобец
                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;
                ComboBox4.Top := R.Top + 1;
                ComboBox4.Left := R.Left + 1;
                ComboBox4.Width := (R.Right + 1) - Kvadr.Left;
                ComboBox4.Height := (R.Bottom + 1) - Kvadr.Top;
                ComboBox4.Visible := True;
                ComboBox4.SetFocus;
                SpeedButton3.Visible := False;
          end
          else if ((ACol = 2) AND (ARow <> 0)) then begin //Вставка SpeedButton в 3-й стобец
                ComboBox4.Visible := False;          
                R: = StringGrid1.CellRect(ACol, ARow);
                SpeedButton3.Top := R.Bottom - SpeedButton3.Height - 1;
                SpeedButton3.Left := R.Right - SpeedButton3.Width - 1;
                SpeedButton3.Parent := StringGrid1;
                SpeedButton3.Visible := True;
          end
          else begin 
          ComboBox4.Visible := False;
          SpeedButton3.Visible := False;
          end;
          CanSelect := True;
end;
А уже под эту кнопку (Click) можно заводить StringGrid.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

12 окт 2005, 20:01

т.к. в этом случае длина раскрывающейся StringGrid (по нажатии кнопки ComboBox) будет ограничена длиной ComboBox, т.е. длиной ячейки.
Бррр-р-р.... Так Вы в ячейку StringGrid вкладываете выпадающий StringGrid?
Понятно.
(Просто невнимательно прочитал вопрос.....)
Ну все равно идея та же. Держать созданный заранее невидимый контрол, а в нужный момент накладывать его на ячейку.


PS
При публикации исходного кода используйте [ code ] ... [ /code ]
Ответить