DBGrid и dgMultiselect

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

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

Ответить
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

DBGrid и dgMultiselect

Сообщение yuray »

Столкнулся с такой проблемой.
В проекте использую 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
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Re: DBGrid и dgMultiselect

Сообщение alexs »

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

Это бесполезно было. RxDBGrid - это расширение функционала стандартного DBGrid-а. В основном в части отрисовки данных.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Re: DBGrid и dgMultiselect

Сообщение Attid »

в UIB с ним тоже проблемы есть. так что скорее всего виноват TSQLQuery. посмотри отлюичия в плане мультиселект там и там(TZQuery) в плане мультисекта.
yuray
новенький
Сообщения: 95
Зарегистрирован: 22.05.2008 14:19:19
Откуда: Ровно, Украина

Re: DBGrid и dgMultiselect

Сообщение yuray »

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

Смотрел, менял все подряд... В итоге мультиселект появился, но работает не стабильно - селектит не все записи и через раз :(. В результате чего мультиселект заработал я не понял. Всетаки, видимо, нужно на ZEOS переходить...
fl@nker
незнакомец
Сообщения: 8
Зарегистрирован: 23.06.2009 11:31:12

Re: DBGrid и dgMultiselect

Сообщение fl@nker »

Аналогичная проблема ... проявилась в 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:
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: DBGrid и dgMultiselect

Сообщение Ism »

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

Множественное выделение срок в 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

Все !
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

Re: DBGrid и dgMultiselect

Сообщение RustemNur »

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
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: DBGrid и dgMultiselect

Сообщение Ism »

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

Не нравится ? Предложи лучше .
RustemNur
новенький
Сообщения: 61
Зарегистрирован: 20.02.2011 10:21:14
Откуда: Уфа

Re: DBGrid и dgMultiselect

Сообщение RustemNur »

Я вообще-то сам код имел в виду, а не его назначение.
Вроде бы совершенно очевидно, что вместо

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

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;
Ответить