![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Избитый вопрос по TStringGrid
nomshar © (2003-01-19 00:48:00)Здравствуйте, я понимаю, что вопрос этот довольно таки избит, но мои поиски по данной теме не увенчались успехом.
Так вот. Как в TStringGrid (а именно в любую его ячейку запихнуть некоторый визуальный компонент).
Как известно у TStringGrid есть свойство Objects[ACol, ARow], но при следующей команде:
"StringGrid1.Objects[ACol, ARow]:= ComboBox.Create(self)", вылетает ошибка Access Violation. Можно и другим способом, вроде:
".
ComboBox:= TComboBox.Create(self);
ComboBox.Parent:= StringGrid1;
В этом случае все работает, но компонент создается только в нулевой ячейке.
MsGuns (2003-01-20 18:38:00) [1]Я делал так:
Кидаю кнопку (мне надо было кнопку сделать, которая будет "светиться" только если юзер кликнул в кол., допустим, 2-й или 3-й) типа TBitBtn на форму, присваиваю ей нужный глиф, затем св-во Visible = false
В событии OnDrawCells стринггрида определяю номер клонки (точнее, индекс - Col) и если вкл. режим "Редактирование", то делаю грид нередактируемым, а св-во кнопки Left,Top такими, чтоб она (кнопка) была справа ячейки. Visible, есссно, в true. Если колонка не 2-я или 3-я или не вкл. режим "Редактирование", то кнопка делается невидимой. После завершения обработчика нажатия кнопки, фокус возвращаю в грид (без этого возникает некрасивый эффект фокуса на кнопке, при нажатие на которую ничего не происходит, а кнопка пропадает). Если интересно, могу постануть сампл с ентой самой "плавающей" кнопурой.
Демонов Е.В. (2003-01-20 16:37:00) [2]а у TStringList есть своойство массив Objects[] -
Если сделать так Objects[1]:=Combobox то где де тогда должен появится Combobox.
P.S. Свойство Objects(и у TStringList и у TStringGrid ) хранит ссылку на некоторый обьект и только.
han_malign (2003-01-20 10:13:00) [3]Все уже объяснили, но уточню -
не надо путать логические координаты ячейки (Row, Cell) и относительные координаты элемента управления (Left, Top). Ячейка не является отдельным контролом, она отрисовывается "в ручную" на TSringGrid.Canvas. Для статики подойдет
with SG.CellRect(aRow,aCell)do
TComboBox(SG.Objects[aRow,aCell]).SetBounds(Left,Top,Right-Left,Bottom-Top);
но при прокручивании все поедет, так что надо ловить onDrawCell...
icWasya (2003-01-20 09:33:00) [4]сделай так
StringGrid1.Cells[X,Y]:=" ";
StringGrid1.Objects[X,Y]:= Combobox;
Романов Р.В. (2003-01-19 12:54:00) [5]Используй метод TStringGrid.CellRect для определения координат ячейки, в которой нужно поместить ComboBox.
Anatoly Podgoretsky (2003-01-19 12:52:00) [6]nomshar © (19.01.03 12:42)
Нет ежу не понятно, поелику очень распространенная ошибка.
nomshar (2003-01-19 12:42:00) [7]Прошу прощения за опечатку. Ежу понятно, что правильным было бы вот так: ComboBox:= TComboBox.Create(self).
Теперь о перемене координат.
Если сделать так:
""
ComboBox:= TComboBox.Create(self);
StringGrid1.Objects[1,1]:= ComboBox;
// подчеркиваю, что координаты могут быть любые
При этом все равно результат один и тот же. В приведенном выше случае вылетает ошибка доступа к памяти, иначе компонент создается в "нулевой ячейке (координаты [0,0]).
Song (2003-01-19 10:40:00) [8]Создавать надо экземпляр класса, а ты что создаёшь?
Anatoly Podgoretsky (2003-01-19 07:29:00) [9]Тебе не кажется, что есть рахница
:= ComboBox.Create(self)",
:= TComboBox.Create(self);
Nick_N_A (2003-01-19 07:02:00) [10]Он не в нулевой ячейке, у него координаты (0,0)
Попробуй их поменять.
Ты не пробывал таким образом разместить его на TPanel,
попробуй - все поймеш