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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2012, 22:16   #1
Vaicartana
 
Регистрация: 27.12.2009
Сообщений: 6
По умолчанию колесо мыши мать мать мать... по привычке отозвалось эхо

Добрый день!
Хочу прикрутить колесо к форме, добавил события FormMouseWheelUp и FormMouseWheelDown.
Все отлично работает, пока на форме не добавить DBGrid, который перехватывает мышь на себя и ему по... колено на все события назначенные на форме. Так же игнорируется переопределенная процедура TFrm:WndProc()

уже упарился с ним бороться, не понимаю чем его перехватить можно! Люди добрыя, подскажите, сами мы не местные... кто чем может, а?
Vaicartana вне форума Ответить с цитированием
Старый 19.05.2012, 23:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Как вариант, опиши обработчик для грида, в котором будут вызываться обработчики формы. Пример:
Код:
unit Unit1;

interface

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

type
  TDBGrid=class(DBGrids.TDBGrid)
   procedure mm(var m:TWMMouseWheel); message WM_MouseWheel;
  end;
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Table1: TTable;
    procedure FormMouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
 DBGrid1.Top:=DBGrid1.Top+WheelDelta;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

{ TDBGrid }

procedure TDBGrid.mm;
var b:boolean;
begin
 Form1.FormMouseWheel(Form1,[],m.WheelDelta,Mouse.CursorPos,b);
end;

end.
Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.05.2012, 23:50   #3
Vaicartana
 
Регистрация: 27.12.2009
Сообщений: 6
По умолчанию

О, благородный Stilet, да продлятся твои годы вечно, да не будешь ты знать нужды ни в чём, да ни коснуться ни тебя ни твоих близких ни хвори ни напастья!
Прими мою скромную благодарность!!!

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

Т.е. я хочу проверить координаты мышки, и если они над гридом - двигать грид, если нет, управлять формой, а в грид ничего не передавать.
Vaicartana вне форума Ответить с цитированием
Старый 19.05.2012, 23:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

С потолка:
Код:
procedure TDBGrid.mm;
var b:boolean;c:TWinControl;
begin
 c:=FindVCLWindow(Mouse.CursorPos);
 if c<>self then
  Form1.FormMouseWheel(Form1,[],m.WheelDelta,Mouse.CursorPos,b);
end;
Не проверял, но смыл - узнать какое окно под курсором мышки в момент ролла колесика, если не грид то дать в форму, иначе обработать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.05.2012, 00:08   #5
Vaicartana
 
Регистрация: 27.12.2009
Сообщений: 6
По умолчанию

немного не то.
как узнать что под мыхой я знаю, у меня колесо теперь ловится событием MouseWheelUp/Down на самом гриде. Вот код:
Код:
void __fastcall TMainFrm::MouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos,  bool &Handled)
{
	if (MapPlugin)
	{
		MapPlugin->Mouse.WheelDown(0,Shift, MousePos, Handled);
	}

}
как здесь указать чтоб грид не двигался? Можно конечно фиксировать позицию таблицы с которой отображает грид, но это не наш метод. Был бы это WndProc можно было бы сделать return, но тут возврат бесполезен, что то нужно передать в параметре...

да еще можно прикрутить сам WndProc к гриду, но уже если ниче другое не поможет.
Vaicartana вне форума Ответить с цитированием
Старый 20.05.2012, 10:17   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
у меня колесо теперь ловится событием MouseWheelUp/Down на самом гриде
Не понял... У тебя и для грида обработчик роллинга свой?
Цитата:
как здесь указать чтоб грид не двигался?
Я ж намекнул: Опиши обработчик сообщения для грида, и в нем вызывай тот свой метод формы...

P.S. Сорри затупил, не увидел что речь о билдере идет
I'm learning to live...

Последний раз редактировалось Stilet; 20.05.2012 в 10:19.
Stilet вне форума Ответить с цитированием
Старый 23.05.2012, 02:56   #7
Vaicartana
 
Регистрация: 27.12.2009
Сообщений: 6
По умолчанию

Теперь уже свой, точнее формы.
Короче говоря, когда обработчика на гриде нет, грид перехватывает колесо на себя вне относительно того, есть обработчик формы или нет.
Я поставил обработчик формы и на грид тоже - так заработало, но грид в любом случае двигает указатель - есть обработчик или нет.
Вот теперь маюсь тем, что не знаю как выйти из обработчика уже грида с указанием ничего не делать. Т.е. не передавать событие.
Vaicartana вне форума Ответить с цитированием
Старый 23.05.2012, 07:57   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не знаю что ты там делаешь, но вот я с утреца пример набросал - все работает. В пределах грида роллинг прокручивает грид, вне его пределов (если мышку отвести) срабатывает обработчик формы.
Вложения
Тип файла: rar Перехват роллинга.rar (390.4 Кб, 11 просмотров)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.05.2012, 13:40   #9
Vaicartana
 
Регистрация: 27.12.2009
Сообщений: 6
По умолчанию

Благодарю.
Вопрос был именно в Handled=false; ))
Vaicartana вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать какой процессор поддерживает мать? Дима я Компьютерное железо 9 24.06.2013 14:25
Мать или проц? V1ad Компьютерное железо 10 06.05.2011 22:19
bass.dll Скорость мать его потока... Дворник Мультимедиа в Delphi 5 24.08.2010 09:37
Блок питания,и мать hYpertoN1que Компьютерное железо 6 12.07.2010 22:39