Скроллинг в TStringGrid'e

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Скроллинг в TStringGrid'e

Сообщение bestonix » 05.04.2012 11:40:34

Доброго здоровья уважаемые.
Подскажите пожалуйста решение проблемы.
В ячейках грида по определённым условиям "рисую" TComboBox или TDateEdit
Для того, чтобы они передвигались при прокрутке написал вот такой код:
Код: Выделить всё
procedure TFMain.sgDopAgidDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
  if sgDopAgid.Objects[2, aRow] is TComboBox then
     TComboBox(sgDopAgid.Objects[2, aRow]).BoundsRect := sgDopAgid.CellRect(2, aRow);
end;

Проблема заключается в том, что компонент находящийся на первой строке никуда не передвигается.
Т.е. допустим, что на первой строке (Row=1) находится ComboBox, а на второй нет ничего, то при скролле он не "исчезает"

Добавлено спустя 3 минуты 41 секунду:
Собственно говоря подобное происходит когда компоненты находятся на границах Грида, вверху или внизу
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Скроллинг в TStringGrid'e

Сообщение Climber » 05.04.2012 17:43:44

У всех визуальных компонентов есть свойство Parent. Сделайте так (в конструкторе формы или при событии OnShow):
Код: Выделить всё
MyDateEdit.Parent := MyStringGrid;
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Re: Скроллинг в TStringGrid'e

Сообщение bestonix » 06.04.2012 08:24:02

>Climber »

Именно так и сделал, но толку от этого чуть.
К сожалению ситуация вообще превращается в кошмар если передвигать скролл очень быстро
или попробовать перелистнуть. Все контролы на поверхности съезжают к чертям.
Решил проблему просто, выбрал ячейку - создался новый контрол и показался, отработал,
присвоил новое значение ячейке и спрятал контрол.

Так, что для пользователя создаётся вполне приятная картина.
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Скроллинг в TStringGrid'e

Сообщение alexs » 07.04.2012 10:15:02

bestonix
1. А почему именно StringGrid - возьми RxDBGrid - там и комбобоксик есть, и редактор даты.
2. Если идеология не позволяет - посмотри как реализован стандартный редактор в гриде (String... DB... rxDB..), сделай наследника от грида и добавь своих редакторов. Так будет проще и правильнее.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Скроллинг в TStringGrid'e

Сообщение Vadim » 07.04.2012 15:48:12

В StringGrid тоже есть собственные ComboBox'ы.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Скроллинг в TStringGrid'e

Сообщение bestonix » 09.04.2012 08:43:49

Vadim писал(а):В StringGrid тоже есть собственные ComboBox'ы.


Можно подробнее ?
Не нашел как из ячейки грида сделать ComboBox.

Добавлено спустя 4 минуты 13 секунд:
alexs писал(а):bestonix
1. А почему именно StringGrid - возьми RxDBGrid - там и комбобоксик есть, и редактор даты.
2. Если идеология не позволяет - посмотри как реализован стандартный редактор в гриде (String... DB... rxDB..), сделай наследника от грида и добавь своих редакторов. Так будет проще и правильнее.


Всё просто.
StringGrid используется потому, что некоторые ячейки не просто заполняются какими-то данными ,
а могут еще и вычисляться по определенным условиям из нескольких таблиц.
Это не моя затея, подстраиваюсь под чужую структуру БД и логику.
Использовать именно StringGrid мне показалось гораздо удобнее
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Скроллинг в TStringGrid'e

Сообщение GAMER » 09.04.2012 10:24:53

Я тоже использую только стринггрид. Такая у меня идеология :)
Для комбобоксов и других контролов в ячейках, я поступаю следующим образом. Когда идет редактирование, то просто блокирую сам стринггрид, чтобы он не прокручивался. А сами контролы визуализирую в собитии StringGridSelection. Там определяю координаты ячейки.
Где-то так. :)
Аватара пользователя
GAMER
энтузиаст
 
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина

Re: Скроллинг в TStringGrid'e

Сообщение Vadim » 09.04.2012 10:46:21

bestonix писал(а):Можно подробнее ?

1. Кладёте на форму TStringGrid.
2. В инспекторе объектов ищете у него свойство "Columns" и нажимаете там на кнопку с троеточием.
3. В появившемся окне создания\редактирования колонок нажимаете кнопку "+ Добавить".
4. В этом же окне появляется новая строчка "0 -Title". Это новая колонка. Теперь все колонки в StringGrid'e Вы будете создавать здесь.
5. В свойстве колонки "ButtonStryle" выбрать "cbsPickList".
6. В свойство колонки "PickList" занести нужные строковые значения.
Сразу оговорюсь - с таким типом колонок я уже работал достаточно давно. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Скроллинг в TStringGrid'e

Сообщение bestonix » 09.04.2012 12:34:07

Vadim писал(а):
bestonix писал(а):Можно подробнее ?

1. Кладёте на форму TStringGrid.
2. В инспекторе объектов ищете у него свойство "Columns" и нажимаете там на кнопку с троеточием.
3. В появившемся окне создания\редактирования колонок нажимаете кнопку "+ Добавить".
4. В этом же окне появляется новая строчка "0 -Title". Это новая колонка. Теперь все колонки в StringGrid'e Вы будете создавать здесь.
5. В свойстве колонки "ButtonStryle" выбрать "cbsPickList".
6. В свойство колонки "PickList" занести нужные строковые значения.
Сразу оговорюсь - с таким типом колонок я уже работал достаточно давно. :)


Здорово, но в данном случае не то. В разных строках в ячейке могут понадобиться разные компоненты.
Сейчас это ComboBox и DateEdit. В будущем пользователи может быть еще что нить придумают :)

Вопрос появился. Как узнать, что контрол потерял или получил фокус
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск

Re: Скроллинг в TStringGrid'e

Сообщение Vadim » 09.04.2012 12:40:20

bestonix писал(а):Как узнать, что контрол потерял или получил фокус

Тот контрол, который на StringGrid лежит? У каждого контрола есть событие OnExit. Ему нужно присвоить Вашу процедуру. Она будет выполнятся при потере фокуса.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Скроллинг в TStringGrid'e

Сообщение bestonix » 09.04.2012 12:57:33

Vadim писал(а):
bestonix писал(а):Как узнать, что контрол потерял или получил фокус

Тот контрол, который на StringGrid лежит? У каждого контрола есть событие OnExit. Ему нужно присвоить Вашу процедуру. Она будет выполнятся при потере фокуса.


Когда щелкаю по ячейке отрабатывает событие OnClick и над ячейкой рисуется и заполняется строками ComboBox.
Затем выполняется строка ComboBox.SetFocus, событие StringGrid.OnExit не возникает.
Теперь щелкаю у StringGrid по полосе прокрутки. Не срабатывают, ни событие OnExit у ComboBox, ни OnEnter у StringGrid.

Добавлено спустя 2 часа 30 минут 36 секунд:
Вот, может кому пригодится.
У StringGrid'a есть событие, которое в полной мере отвечает на вопрос о скроллинге.
Собятие - OnTopLeftChanged. Т.е. как только перерисовывается верхняя-левая ячейка, то это значит что работал скроллинг.
Теперь все просто шикарно работает :D
bestonix
новенький
 
Сообщения: 66
Зарегистрирован: 15.04.2010 08:26:00
Откуда: Жигулёвск


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 232

Рейтинг@Mail.ru