Раскрывающийся список в StringGrid
-
- Сообщения: 4
- Зарегистрирован: 09 мар 2005, 12:59
Подскажите, как в ячейку(столбец) StringGrid (на подобии Columns ButtonStyle в DBGrid) вставить кнопку с раскрывающимся списком в виде StringGrid?
- Naeel Maqsudov
- Сообщения: 2551
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Самый простой способ - это положить на форму ComboBox с visible=false и на событие OnSelectSell (OnSelectSell - не точно, не помню точное название) перемещать его на ячейку, заполнять список и делать видимым. Соответственно прятать при уходе из данной колонки или вообще из грида. Некрасивое на первый взгляд решение, но сами гриды так и делают. Когда курсор оказывается в ячейке, то на ячейку накладывается другой элемент управления - TInlineEditor.
Чуть более изящный способ - это найти исходники (grids.pas) TInlineEditor, сделать свой аналогичный, но с комбобоксом, и встроить в уже созданный грид. У грида есть свойство InlineEditor, и хотя оно Protected его все равно можно присвоить используя полиморфизм.
Самый эффективный - субклассить TCustomGrid, чтобы прикрутить к нему новый InlineEditor. Наверняка такой велосипед давно уже изобретен и его можно поискать на сайтах с готовыми компонентами.
Чуть более изящный способ - это найти исходники (grids.pas) TInlineEditor, сделать свой аналогичный, но с комбобоксом, и встроить в уже созданный грид. У грида есть свойство InlineEditor, и хотя оно Protected его все равно можно присвоить используя полиморфизм.
Самый эффективный - субклассить TCustomGrid, чтобы прикрутить к нему новый InlineEditor. Наверняка такой велосипед давно уже изобретен и его можно поискать на сайтах с готовыми компонентами.
-
- Сообщения: 4
- Зарегистрирован: 09 мар 2005, 12:59
"Самый простой способ" - не подходит, т.к. в этом случае длина раскрывающейся StringGrid (по нажатии кнопки ComboBox) будет ограничена длиной ComboBox, т.е. длиной ячейки. А если длина StringGrid больше длины ячейки? Конечно, можно задать заранее длину ячейки (столбца) равной длине раскрывающейся StringGrid, но это не "спортивно", когда столбец максимум под 10 символов имеет длину под 40.
-
- Сообщения: 4
- Зарегистрирован: 09 мар 2005, 12:59
Нашел способ вставить кнопочку в ячейку StringGrid1, может кому пригодится. На форму кладем StringGrid, ComboBox и SpeedButton.
А уже под эту кнопку (Click) можно заводить StringGrid.
Код: Выделить всё
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;
- Naeel Maqsudov
- Сообщения: 2551
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Бррр-р-р.... Так Вы в ячейку StringGrid вкладываете выпадающий StringGrid?т.к. в этом случае длина раскрывающейся StringGrid (по нажатии кнопки ComboBox) будет ограничена длиной ComboBox, т.е. длиной ячейки.
Понятно.
(Просто невнимательно прочитал вопрос.....)
Ну все равно идея та же. Держать созданный заранее невидимый контрол, а в нужный момент накладывать его на ячейку.
PS
При публикации исходного кода используйте [ code ] ... [ /code ]