DBGrid и dgMultiselect

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

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

DBGrid и dgMultiselect

Сообщение yuray » 05.09.2009 13:02:44

Столкнулся с такой проблемой.
В проекте использую TIBConnection+TSQLQuery+TDatasource+TDBGrid. В опциях DBGrid ставлю dgMultiselect=true. При этом малтиселект не работает. Сначала грешил на TDBGrid. Взял с SVN последний RxDBGrid - тоже не работает.
Сменил подключение к Firebird на TZConnection+TZQuery+TDatasource+TDBGrid - малтиселект заработал.
Проект большой и переходить на ZEOS или UIB очень проблематично. Как заставить работать Multiselect малой кровью?

lazarus 0.9.27 r20857, fpc 2.2.4, gtk2, RHEL Client 5.2
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: DBGrid и dgMultiselect

Сообщение alexs » 05.09.2009 17:18:57

yuray писал(а):Взял с SVN последний RxDBGrid - тоже не работает.

Это бесполезно было. RxDBGrid - это расширение функционала стандартного DBGrid-а. В основном в части отрисовки данных.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: DBGrid и dgMultiselect

Сообщение Attid » 08.09.2009 14:58:45

в UIB с ним тоже проблемы есть. так что скорее всего виноват TSQLQuery. посмотри отлюичия в плане мультиселект там и там(TZQuery) в плане мультисекта.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: DBGrid и dgMultiselect

Сообщение yuray » 10.09.2009 14:07:13

Attid писал(а):посмотри отлюичия в плане мультиселект там и там(TZQuery) в плане мультисекта.

Смотрел, менял все подряд... В итоге мультиселект появился, но работает не стабильно - селектит не все записи и через раз :(. В результате чего мультиселект заработал я не понял. Всетаки, видимо, нужно на ZEOS переходить...
yuray
новенький
 
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: DBGrid и dgMultiselect

Сообщение fl@nker » 16.04.2010 13:07:05

Аналогичная проблема ... проявилась в Lazarus 0.9.28.2 ... в более ранней версии dgMultiSelect работал (если мне не изменяет память, то это был Lazarus 0.9.26) ... yuray, а Вы бы не могли выложить результат вашей правки ...
Смотрю исходники TDBGrid ... очевидно что в DBGrids.pas:
procedure TBookmarkList.SetCurrentRowSelected(const AValue: boolean);
...
aBookStr := FGrid.Datasource.Dataset.Bookmark; <---------------вот тут

FGrid.Datasource.Dataset.Bookmark возвращает пустую строку, исключение первое обращение ... действительно успешное ...
Счётчик SelectedRows.Count наращивается ... но хранятся там пустые строки ...
И естественно после перерисовки компонента ничего не отмечено ...
Да ... MultiSelect отрабатывает только для [ssCtrl,ssLeft] ... для [ssShift,ssLeft], если верить исходникам, не работает ...
Интересно как обстоит дело у Lazarus из SVN ... :oops:
fl@nker
незнакомец
 
Сообщения: 8
Зарегистрирован: 23.06.2009 11:31:12

Re: DBGrid и dgMultiselect

Сообщение Ism » 05.05.2011 14:54:43

Не почтите за спам, просто думаю, что для гуглевших это будет полезным (при поиске наткнулся на эту тему)

Множественное выделение срок в DBgrid с сохранением выделения предыдущих строк (при нажатии на уже выделенную строку выделение снимается)
Имитирует поведение EhLib TDBGridEh (с определенными настройками) . А конкретнее опцию dghClearSelection

1 Заводим глобальную переменную (вне процедур)

Код: Выделить всё
new_selected_row:boolean;

2 Создаем событие в DBGrid OnMouseUp

procedure TFormMain.DBGrid2MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if DBGrid2.SelectedRows.CurrentRowSelected=true then
new_selected_row:=true
else
new_selected_row:=false;
end;


3 Создаем событие в DBGrid OnCellClick

procedure TFormMain.DBGrid2CellClick(Column: TColumn);
begin
if new_selected_row=true then DBGrid2.SelectedRows.CurrentRowSelected:=false else DBGrid2.SelectedRows.CurrentRowSelected:=true;
end;


4 Ставим в свойствах DBGrid в Options

dgMultiselect true
dgPersistentMultiselect true
dgRowSelect true
dgEditing false

Все !
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: DBGrid и dgMultiselect

Сообщение RustemNur » 06.05.2011 09:00:34

Ism писал(а):
if DBGrid2.SelectedRows.CurrentRowSelected=true then
new_selected_row:=true
else
new_selected_row:=false;

...

if new_selected_row=true then DBGrid2.SelectedRows.CurrentRowSelected:=false else DBGrid2.SelectedRows.CurrentRowSelected:=true;


Че-то код какой-то смешной прям. :D
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа

Re: DBGrid и dgMultiselect

Сообщение Ism » 06.05.2011 13:04:10

Зато работает. Дело в том, что нужно отловить статус записи до выделения мышью

Не нравится ? Предложи лучше .
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: DBGrid и dgMultiselect

Сообщение RustemNur » 06.05.2011 15:07:51

Я вообще-то сам код имел в виду, а не его назначение.
Вроде бы совершенно очевидно, что вместо
Код: Выделить всё
if DBGrid2.SelectedRows.CurrentRowSelected=true then
new_selected_row:=true
else
new_selected_row:=false;

можно просто написать
Код: Выделить всё
new_selected_row := DBGrid2.SelectedRows.CurrentRowSelected;

а вместо
Код: Выделить всё
if new_selected_row=true then DBGrid2.SelectedRows.CurrentRowSelected:=false else DBGrid2.SelectedRows.CurrentRowSelected:=true;

так
Код: Выделить всё
DBGrid2.SelectedRows.CurrentRowSelected := not new_selected_row;
RustemNur
новенький
 
Сообщения: 61
Зарегистрирован: 20.02.2011 11:21:14
Откуда: Уфа


Вернуться в Lazarus

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

Сейчас этот форум просматривают: Google [Bot] и гости: 10

Рейтинг@Mail.ru