Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Изменение Мульти-выделения в DBGrid


Автор: Cashey 11.9.2003, 15:57
Кто подскажет (точнее кто знает smile.gif ) как изменить комбинацию клавиш в DBGrid с стандартной (Ctrl + mbLeft) на правую кнопку мыши, при выделении нескольких записей (dgMultiSelect)? Заранее спасибо.

Автор: Akella 12.9.2003, 08:51
Используй компонент DBGridEh, для жителей бывшего СССР этот компонент бесплатный. Где скачать? Поищи на форуме, здесь есть поиск. Я не сторонник "нестандартных" компонентов для Delphi, но этот компонент того стоит.

Автор: Cashey 12.9.2003, 09:53
Я тоже не любитель "нестандартных" компонентов и EhLib не исключение. У этого грида глюки с канвой и рефрешируется плохо. Но, и без этого у него MultiSelect такой же как и в стандартном (Ctrl + mbLeft) . Что не является решением проблемы. Или я что-то не так настроил...?

Автор: p0s0l 12.9.2003, 13:57
Попробуй так:
Код
procedure TfrmMain.dbg1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var
 crd : TGridCoord;
begin
 if Button = mbRight then
 begin
   crd := dbg1.MouseCoord(x, y);
   dbg1.SelectedIndex := crd.Y;
   dbg1.SelectedRows.CurrentRowSelected := not dbg1.SelectedRows.CurrentRowSelected;
 end;
end;

Или можно на MouseMove повесить, чтобы еще выделялось, когда водишь мышью по записям с нажатой правой кнопкой.
Тогда там еще прибавиться строчек 5...

Автор: x77 12.9.2003, 14:13
2 p0s0l: не будет оно работать. хотя бы потому, что при включенном dgMultiSelect выделение производится при нажатии на кнопку, а не отпускании (кстати, при нажатом Ctrl можно выделять записи как левой, так и правой кнопкой мыши, так что особого смысла в
Код
if Button = mbRight then...
я лично не вижу. твой код в любом случае оставит возможность выделять записи по Ctrl+mbLeft, но я сильно сомневаюсь, что он будет делать что-то осмысленное по одному только правому клику.

в subj. мне кажется, что самый грамотный вариант, это вести свой список и при отрисовке подсвечивать его как угодно.

Автор: Akella 12.9.2003, 14:26
Цитата
. У этого грида глюки с канвой и рефрешируется плохо.

!!!А более конкретно.
У меня пока все нормально. Нельзя ли поподробнее.

Автор: p0s0l 12.9.2003, 14:51
x77, ну насчет того как убрать Ctrl_mbLeft я подумаю, но ты так категорично заявляешь что это не работает - теперь я проверил - все работает, смущает только то, что цвет выбранной строки совпадает с цветом выделения - из-за этого непонятно, выделена текущая строчка или нет, но по индикатору слева видно, что все работает. правда, оказалось можно легче:
Код
procedure TfrmMain.dbg1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then
  dbg1.SelectedRows.CurrentRowSelected := not dbg1.SelectedRows.CurrentRowSelected;
end;


А насчет отпускания и нажатия - событие MouseDown вообще НИКОГДА не вызывается, что как-то странно. Поэтому пришлось вешать на MouseUp...

Автор: p0s0l 12.9.2003, 14:55
Всё! Теперь Ctrl+MouseClick не действует.
Код
procedure TfrmMain.dbg1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
 if (Button = mbRight) or (ssCtrl in Shift) then
 dbg1.SelectedRows.CurrentRowSelected := not dbg1.SelectedRows.CurrentRowSelected;
end;

Правда, если включен индикатор слева, то видно, что на какую-то долю секунды строчка временно выделяется...

Автор: x77 12.9.2003, 14:57
проверил. не работает smile.gif. и не должен работать smile.gif . ни с нажатым Ctrl, ни с отпущенным. выделяет одну строку, при щёлканьи на другой - предыдущее выделение сбрасывается.

З.Ы.
насчёт категоричности - каюсь, прости засранца smile.gif

Автор: p0s0l 12.9.2003, 14:59
Дак ты наверное левой кнопкой щелкал ?smile.gif
Или мультиселект не врубил ?

Автор: x77 12.9.2003, 15:00
ээээ, батенька, мы говорим о разных вещах. в сабже сказано, что требуется "изменить комбинацию клавиш в DBGrid с стандартной (Ctrl + mbLeft) на правую кнопку мыши". как я понимаю, одну только правую кнопку. без Ctrl. поэтому я и говорил, что оно не работает (с точки зрения постановки задачи).

Автор: x77 12.9.2003, 15:01
и модифицированный вариант тоже работать не будет smile.gif

Автор: x77 12.9.2003, 15:01
он, собственно, и с Ctrl работать не будет. будет выделяться только одна запись smile.gif

Автор: p0s0l 12.9.2003, 15:04
Цитата
"изменить комбинацию клавиш в DBGrid с стандартной (Ctrl + mbLeft) на правую кнопку мыши". как я понимаю, одну только правую кнопку. без Ctrl.

Я именно так и понял - так и работает...
И всякие оптионсы и проперти менял - всегда работает, если только не включить MultiSelect...
Кинь мне на мыло свою тестовую прогу (исходник) - я гляну.

Автор: x77 12.9.2003, 15:10
ну, с отключенным MultiSelect вообще нифига не работает, а со включенным - выделяется текущая запись, при клике на следующую - выделяется следующая (с первой выделение снимается). Delphi 5.0/Win XP Pro.

Автор: p0s0l 12.9.2003, 15:23
У меня твоя прога фурычит как надо - щас тебе откомпиленный экзешник твоей проги кину...
(D7, XP)

Автор: x77 12.9.2003, 15:33
и действительно, фурычит. видимо, Borland меняла функционал со времён 5й версии.

Автор: p0s0l 12.9.2003, 15:35
Да уж... Странно - не должно такое меняться... Но мы тут с тобой зафлеймили всю тему, закругяюсь...

Автор: Cashey 12.9.2003, 19:35
Цитата

CODE 
procedure TfrmMain.dbg1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbRight) or (ssCtrl in Shift) then
dbg1.SelectedRows.CurrentRowSelected := not dbg1.SelectedRows.CurrentRowSelected;
end;

Спасибо, p0s0l, но за временя с момента опубликования вопроса до твоего ответа я порылся и тоже кое-что нашел. Нужно изменить в модуле DBGrid.pas следующию процедуру
Код

procedure TCustomDBGrid.MouseDown(Button: TMouseButton; Shift: TShiftState;
 X, Y: Integer);
var
 Cell: TGridCoord;
 OldCol,OldRow: Integer;
 MasterCol: TColumn;
begin
 if not AcquireFocus then Exit;
 if (ssDouble in Shift) and (Button = mbRight{mbLeft}) then
 begin
   DblClick;
   Exit;
 end;

 if Sizing(X, Y) then
 begin
   FDatalink.UpdateData;
   inherited MouseDown(Button, Shift, X, Y);
   Exit;
 end;

 Cell := MouseCoord(X, Y);
 if (Cell.X < 0) and (Cell.Y < 0) then
 begin
   inherited MouseDown(Button, Shift, X, Y);
   Exit;
 end;

 if (DragKind = dkDock) and (Cell.X < FIndicatorOffset) and
   (Cell.Y < FTitleOffset) and (not (csDesigning in ComponentState)) then
 begin
   BeginDrag(false);
   Exit;
 end;

 if PtInExpandButton(X,Y, MasterCol) then
 begin
   MasterCol.Expanded := not MasterCol.Expanded;
   ReleaseCapture;
   UpdateDesigner;
   Exit;
 end;

 if ((csDesigning in ComponentState) or (dgColumnResize in Options)) and
   (Cell.Y < FTitleOffset) then
 begin
   FDataLink.UpdateData;
   inherited MouseDown(Button, Shift, X, Y);
   Exit;
 end;

 if FDatalink.Active then
   with Cell do
   begin
     BeginUpdate;   { eliminates highlight flicker when selection moves }
     try
       FDatalink.UpdateData; // validate before moving
       HideEditor;
       OldCol := Col;
       OldRow := Row;
       if (Y >= FTitleOffset) and (Y - Row <> 0) then
         FDatalink.MoveBy(Y - Row);
       if X >= FIndicatorOffset then
         MoveCol(X, 0);
{здесь}       if {(Button = mbLeft) and} (dgMultiSelect in Options) and FDatalink.Active then
         with FBookmarks do
         begin
           FSelecting := False;
{и здесь}           if (Button = mbRight) {or ssCtrl in Shift then }   then
             CurrentRowSelected := not CurrentRowSelected

           else
           begin
             Clear;
             CurrentRowSelected := True;
           end;
         end;
       if (Button = mbLeft) and
         (((X = OldCol) and (Y = OldRow)) or (dgAlwaysShowEditor in Options)) then
         ShowEditor         { put grid in edit mode }
       else
         InvalidateEditor;  { draw editor, if needed }
     finally
       EndUpdate;
     end;
   end;
end;

В принципе тоже самое, только теперь не надо использовать лишний обработчик событий. Всем спасибо за помощь.

[B]Vit[B/], может этот топик тоже в FAQ поместить, неужели больше это не кому не понадобится?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)