Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизИзбитый вопрос по TStringGrid Найти похожие ветки
← →
nomshar (2003-01-19 00:48) [0]Здравствуйте, я понимаю, что вопрос этот довольно таки избит, но мои поиски по данной теме не увенчались успехом.
Так вот. Как в TStringGrid (а именно в любую его ячейку запихнуть некоторый визуальный компонент).
Как известно у TStringGrid есть свойство Objects[ACol, ARow], но при следующей команде:
"StringGrid1.Objects[ACol, ARow]:= ComboBox.Create(self)
", вылетает ошибка Access Violation. Можно и другим способом, вроде:
".
ComboBox:= TComboBox.Create(self);
ComboBox.Parent:= StringGrid1;
В этом случае все работает, но компонент создается только в нулевой ячейке.
← →
Nick_N_A (2003-01-19 07:02) [1]Он не в нулевой ячейке, у него координаты (0,0)
Попробуй их поменять.
Ты не пробывал таким образом разместить его на TPanel,
попробуй - все поймеш
← →
Anatoly Podgoretsky (2003-01-19 07:29) [2]Тебе не кажется, что есть рахница
:= ComboBox.Create(self)",
:= TComboBox.Create(self);
← →
Song (2003-01-19 10:40) [3]Создавать надо экземпляр класса, а ты что создаёшь?
← →
nomshar (2003-01-19 12:42) [4]Прошу прощения за опечатку. Ежу понятно, что правильным было бы вот так: ComboBox:= TComboBox.Create(self).
Теперь о перемене координат.
Если сделать так:
""
ComboBox:= TComboBox.Create(self);
StringGrid1.Objects[1,1]:= ComboBox;
// подчеркиваю, что координаты могут быть любые
При этом все равно результат один и тот же. В приведенном выше случае вылетает ошибка доступа к памяти, иначе компонент создается в "нулевой ячейке (координаты [0,0]).
← →
Anatoly Podgoretsky (2003-01-19 12:52) [5]nomshar © (19.01.03 12:42)
Нет ежу не понятно, поелику очень распространенная ошибка.
← →
Романов Р.В. (2003-01-19 12:54) [6]Используй метод TStringGrid.CellRect для определения координат ячейки, в которой нужно поместить ComboBox.
← →
icWasya (2003-01-20 09:33) [7]сделай так
StringGrid1.Cells[X,Y]:=" ";
StringGrid1.Objects[X,Y]:= Combobox;
← →
han_malign (2003-01-20 10:13) [8]Все уже объяснили, но уточню -
не надо путать логические координаты ячейки (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...
← →
Демонов Е.В. (2003-01-20 16:37) [9]а у TStringList есть своойство массив Objects[] -
Если сделать так Objects[1]:=Combobox то где де тогда должен появится Combobox.
P.S. Свойство Objects(и у TStringList и у TStringGrid ) хранит ссылку на некоторый обьект и только.
← →
MsGuns (2003-01-20 18:38) [10]Я делал так:
Кидаю кнопку (мне надо было кнопку сделать, которая будет "светиться" только если юзер кликнул в кол., допустим, 2-й или 3-й) типа TBitBtn на форму, присваиваю ей нужный глиф, затем св-во Visible = false
В событии OnDrawCells стринггрида определяю номер клонки (точнее, индекс - Col) и если вкл. режим "Редактирование", то делаю грид нередактируемым, а св-во кнопки Left,Top такими, чтоб она (кнопка) была справа ячейки. Visible, есссно, в true. Если колонка не 2-я или 3-я или не вкл. режим "Редактирование", то кнопка делается невидимой. После завершения обработчика нажатия кнопки, фокус возвращаю в грид (без этого возникает некрасивый эффект фокуса на кнопке, при нажатие на которую ничего не происходит, а кнопка пропадает). Если интересно, могу постануть сампл с ентой самой "плавающей" кнопурой.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c