![]() |
|
![]() ![]() ![]() |
|
xortal |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 6.7.2009 Репутация: нет Всего: нет |
ситуация такая: есть StringGrid с многострочными ячейками (рисующимися вручную), понятно что размер ячеек по умолчанию меньше размера текста, как в ширину так и тем более в высоту. При выделении ячейки (а goRangeSelect = false) в ней появляется Memo с Scrollbars := ssBoth и у Memo есть PopupMenu, а в нем пункт Expanded с CheckBox
Expandится ячейка до ее фактических параметров, то есть меняем RowHeights[i]/ColWidths[i] c DefaultRowHeight/DefaultColWidth на высоту/ширину текста, аналогично и меняются размеры мемо. Проблема в том что всегда когда ячейка expanded у нас меняется ширина всего столбца и высота всей строки и конкретно желательно бы во время состояния expanded одной из ячеек чтобы работали только с ней. Первое что пришло в голову Grid.Enabled := false; а Memo оставлять активным (не ставить ему в Parent и Owner Grid) Не активной становится вся клиентская область Grid включая Memo ему не принадлежащее и стоящее на переднем плане. Потом решил - раз выделяют другую ячейку, пусть выделяют, только вот пускай Grid вернется к размеру ячеек по умолчанию. Написал, сначала выделяется новая, старая ячейка и ее строка и столбец возвращаются к привычным размерам. И вот здесь начинается самое интересное: После OnSelectCell в котором изменялся размер Grid, программа заходит в OnSelectCell снова как будто если бы Gridу сначала поменяли размер, а потом щелкнули в нем (выделили ячейку) и если запрещать (выходить из него по условию), может и еще раз войти, плюс что интересно при трассировке с брейкпоинтом валится из-за grid index out of range или list index out of bounds, не останавливая где повалилось, не сразу, а если просто запустить и проделать те же самые действия без брейкпоинта и трассировки - сразу. А если не запрещать эти левые вхождения тоже валится но не сразу ну и плюс некорректно сдвигает выделение. Порыскал в модуле гридс увидел что OnSelectCell вызывается в MoveCurrent, которая в свою очередь вызывается пратически при любом изменении размеров Grid. Ладно, забил, попытался тоже самое реализовать в OnMouseDown, но столкнулся с другой проблемой - как узнать количество проскролленных столбцов и строк из начала таблицы (то есть скрытых от глаз, так как скроллинг происходит дискретно с шагом в одну ячейку в любом Grid), позиция скролла мало информативна, а иначе трудно координаты мыши превратить в координаты ячейки. Не использованию MouseToCell или MouseCoord так как те же ошибки (и я если честно им не очень доверяю так как я не знаю с учетом случившегося изменения размера Grid они выполняются или нет) Можно конечно позаморачиваться с пробегом по CellRect(i,j) но я не уверен что вернуться -1цы в случае ячейки проскролленной строки/столбца Если кто-то до сюда до читал)) то хотелось бы узнать как сделать необходимое мне изменение размеров Grid нормально или хотя бы как сделать неактивным Grid оставляя активным Memo, находящееся в его клиентской области (при этом не принадлежащее ему и выведенное на передний план) может некорректность Grid.MouseCoord можно решить с помощью Grid.ScreenToClient но как то у меня не вышло да и не вэтом дело Это сообщение отредактировал(а) xortal - 10.12.2009, 12:13 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |