Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Избитый вопрос по 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,
попробуй - все поймеш


Наверх

Титульная страница Поиск, карта сайта Написать письмо