Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2015, 01:12   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Доброе время суток,
Мне нужно отловить нажатие левой кнопки мышки именно на TDBGrid, при переходе на другую строку (знать, что это пользователь нажал кнопку мышки на TDBGrid).
В TDBGrid такого события нет
Как это сделать?

Заранее спасибо
P.S.
Событие - TDataSource.OnDataChange - конечно же не подходит

Нашел только такой метод (на сайте):

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    procedure FormCreate(Sender: TObject);
  private
    FOldDBWndProc : TWndMethod;
    procedure NewWndProc(var Msg : TMessage);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldDBWndProc := DBGrid1.WindowProc;
  DBGrid1.WindowProc := NewWndProc;
end;

procedure TForm1.NewWndProc(var Msg: TMessage);
begin
  if Msg.Msg = WM_LBUTTONDOWN then
    begin
      //обрабатывам
    end;
  FOldDBWndProc(Msg);
end;

end.

Последний раз редактировалось Stilet; 10.09.2015 в 09:07.
KBO вне форума Ответить с цитированием
Старый 10.09.2015, 09:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В TDBGrid такого события нет
OnMouseDown нет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2015, 19:24   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
OnMouseDown нет?
Создал новый проект с работой БД.
Вот cобытие "OnMouseDown" - не работает при нажатии кнопки мышки на DBGrid,
а событие "OnCellClick" - работает.

А в моем основном приложении, работает только код приведенный в #1

Нашел в чем причина, но пока не могу обяснить.
Итак, у меня есть
1. обработчик DataSet:
Код:
procedure TFMain.ibdsWordAfterScroll(DataSet: TDataSet);
//процедура AfterScroll перенесена из-за того, что ее иногда нужно запускать как в самом AfterScroll, так и вне события AfterScroll;
begin
  if WORK_SCROLL then
    AFTER_SCROLL;
end;
2. имеется функция:
Код:
function TFMain.WORK_SCROLL: boolean;
//permit work AfterScroll & BeforeScroll
begin
  if ((sbSearch.Down)
    or (mmModeDataEdit.Checked)
    or (sbActivization.Down = false))
    and (Pr_UserClick = false) then
begin
showmessage('Pr_UserClick = false');
    Result := false
end
  else
begin
showmessage('Pr_UserClick = true');
   Result := true;
end
end;
3. и обработчик grig'а
Код:
procedure TFMain.dbgrWordsCellClick(Column: TColumn);
begin
showmessage('click on grid');
  Pr_UserClick := true;
end;
Если в 1. закоментировать только условие (только первую строчку), то 3. срабативает на всех ячейках grid'а, вклчая переход с строки на строку.
Если не коментировать (оставить все как есть), то 3. работает только при переходах по колонкам на каждой из строк

Последний раз редактировалось Stilet; 11.09.2015 в 19:45.
KBO вне форума Ответить с цитированием
Старый 11.09.2015, 19:38   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
showmessage
А это зачем? Фокус только сбрасывать.
Вообще что именно ты хотел описать по условию перехода по записям?
Цитата:
то 3. работает только при переходах по колонкам на каждой из строк
Потому что AfterScroll реагирует только на смену активной записи, а переход по колонкам это смена активного поля записи
Т.е. ibdsWordAfterScroll просто не должно выполняться, если скакать по колонкам.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2015, 19:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Может лучше когда он нажмет на "Enter",
Вопрос в том что нужно. Я так до конца и не понял зачем эти обработчики да еще и такие сделаны были.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2015, 20:46   #6
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А это зачем? Фокус только сбрасывать.
Вообще что именно ты хотел описать по условию перехода по записям?
просто, уменя есть процедура "AFTER_SCROLL" которая должна выполняться при некоторых уловиях, описанных в 2.,
а одно из условий "Pr_UserClick = true;", говорит, что это пользователь нажал на ячейку мышкой, и процедура должна выполнится.

Сообщение - просто, чтоб видеть, что это событие сработало (в первичном коде его НЕ будет)

Цитата:
Сообщение от Stilet Посмотреть сообщение
Потому что AfterScroll реагирует только на смену активной записи, а переход по колонкам это смена активного поля записи
Т.е. ibdsWordAfterScroll просто не должно выполняться, если скакать по колонкам.
Нет, подождите 3., казалось должно выполняться при всех условиях. Я же щелкаю по grid. Это к "AfterScroll" отношения не имеет

Последний раз редактировалось Stilet; 11.09.2015 в 21:09.
KBO вне форума Ответить с цитированием
Старый 11.09.2015, 21:12   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
3., казалось должно выполняться при всех условиях.
Но это же не обычный грид. Поставь бряк в эти события и посмотри в какой последовательности они будут выполняться. Вполне вероятно, что Click перебивается событиями. Я давно не работаю с этим компонентом, поэтому никогда таких проблем не имел.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.09.2015, 22:00   #8
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Да, правда, сначало "BeforeScroll" и "AfterScroll", ну а потом и смысла нет в "CellClick".
Придется воспользоваться кодом #1. Который работает как мне нужно.

Последний раз редактировалось KBO; 11.09.2015 в 22:08.
KBO вне форума Ответить с цитированием
Старый 11.09.2015, 22:56   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Та нормально OnCellClick в DBGrid работает. Накрутил не пойми чего
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.09.2015, 01:18   #10
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Та нормально OnCellClick в DBGrid работает. Накрутил не пойми чего
Эт.., точно

Но при таком раскладе
Код:
procedure TForm1.bvDBGrid1CellClick(Column: TColumn);
begin
  showmessage('click on dbgrid');
end;

procedure TForm1.IBDataSet1AfterScroll(DataSet: TDataSet);
begin
 showmessage('afterscroll');
end;

procedure TForm1.IBDataSet1BeforeScroll(DataSet: TDataSet);
begin
 showmessage('beforescroll');
end;
сообщение 'click on dbgrid' - тоже не выводится

Последний раз редактировалось KBO; 12.09.2015 в 01:27.
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WM_QueryEndSession отловить событие volod3000 Win Api 3 29.01.2015 20:23
Socket как отловить событие Disconnect Gregor C# (си шарп) 3 05.11.2014 13:31
отловить переход на определенную страницу браузера spydark91 Общие вопросы Delphi 14 08.06.2011 16:11
как отловить событие hint? max89 Win Api 0 23.07.2010 19:08
Как отловить событие wm_paste? Romanych007 Помощь студентам 1 10.07.2010 20:42