Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перхватить MouseDown раньше компонента [D6]


QuestionX ©   (2004-08-02 02:04:00) 

Мастаки, возникла у меня следующая проблема
Дано: Форма и N компонентов на ней
Вопрос: Как перехватить событие MouseDown (MouseUp, MouseMove), если пользователь нажал кнопку мыши над компонентом (например над TButton) и, обработав, погасить это событие, не передавая его компоненту (например не давая кнопке нажаться) ?

Проблема в том, что при нажатии мыши над TButton форма не получает сообщения WM_LBUTTONDOWN (насколько я понимаю оно направляется оконной функции той самой кнопки). Сообщение, правда, приходит если Button.Enabled := True, но такой вариант  не подходит.

Буду признателен за любые подсказки.


Думкин   (2004-08-03 07:30:00) [1]

> KSergey ©   (02.08.04 18:47) [13]

Это описано в книге:

http://podgoretsky.com/ftp/Docs/Delphi/D3/D3ProgLib/ch_12.htm#1


QuestionX   (2004-08-02 21:52:00) [2]


> KSergey ©   (02.08.04 18:47) [13]
> И подход там иной: сверху окошечко вешается

А ведь отличная идея :)))

Спасибо !


KSergey   (2004-08-02 18:47:00) [3]

Для таскания компонентов по форме в Run-time есть готовый компонент.
Названия не помню, если не найдете - завтра напишу, коли не забуду.

Правда там (если не ошибаюсь) на каждый компонент в MouseDown вызывался соотв. метод (если не ошибаюсь). Но дальше - уже все здорово. И подход там иной: сверху окошечко вешается. Можно еще и размеры менять при желании.


QuestionX   (2004-08-02 17:27:00) [4]


> Ega23 ©   (02.08.04 11:52) [9]
> TApplicationEvents

Спасибо, видимо это единственно приемлемый вариант...


wicked   (2004-08-02 12:00:00) [5]

жуть какая....
альтернатива к [9] и [10] - свойство WindowProc......


Ega23   (2004-08-02 11:53:00) [6]

Msg.message=WM_RBUTTONUP

Читать как   WM_LBUTTONUP


Ega23   (2004-08-02 11:52:00) [7]

TApplicationEvents

procedure TFMain.AppEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if (Msg.HWND=Твой_Button.Handle) and (Msg.message=WM_RBUTTONUP) then
 Handled:=True;
end;


Sandman25   (2004-08-02 10:45:00) [8]

[7] QuestionX   (02.08.04 10:24)

Вообще-то странно как-то получается. Может, Вам лучше DrawFrameControl использовать вместо обычных компонентов?


QuestionX   (2004-08-02 10:24:00) [9]


> Sandman25 ©   (02.08.04 10:20) [6]
> [5] QuestionX   (02.08.04 10:13)
>
> Создайте наследника TComboBox, обрабатывайте у него WM_LBUTTONDOWN

Наследников создавать нельзя по условию задачи :(( Не от всех же компонент мне наследников делать :((


Sandman25   (2004-08-02 10:20:00) [10]

[5] QuestionX   (02.08.04 10:13)

Создайте наследника TComboBox, обрабатывайте у него WM_LBUTTONDOWN


QuestionX   (2004-08-02 10:13:00) [11]


> Sandman25 ©   (02.08.04 10:09) [4]
> >погасить событие
>
> Abort?

Уже ближе к цели :)) Кнопка не нажимается, спасибо. Но вот у ComboBox'a список выпадает :( А надо полностью погасить реакцию компонентов на мышь.


Sandman25   (2004-08-02 10:09:00) [12]

>погасить событие

Abort?


QuestionX   (2004-08-02 10:07:00) [13]


> oleg_SYS ©   (02.08.04 03:00) [1]
> Я не свосем понял вопроса зачем вам конпка на которую нельзя
> нажать?
> Попробуйте обявить глобальную переменную типа Boolean и
> оперирывать с ней, как вам угодно :)
> Думаю вам хватит советов :) Объясните вопрос, если я вас не понял.

Вопрос довольно однозначно задан, ИМХО :) Если вас интересуют подробности, то речь идет о форме с интерфейсом, настраиваемым в Run-time (проще говоря, что-то вроде редактора форм в Delphi) а перехват нужен, чтобы используя мышь перетаскивать компоненты на форме.
А что касается перехвата OnMouseDown компонента, то этот способ позволяет перехватить, но не погаситьсобытие, а это мне не подходит.
Все равно спасибо за участие.

Вопрос остается открытым.


oleg_SYS   (2004-08-02 03:03:00) [14]

т.е. по кнопке а не по мышке :)


oleg_SYS   (2004-08-02 03:00:00) [15]

Я не свосем понял вопроса зачем вам конпка на которую нельзя нажать?
Попробуйте обявить глобальную переменную типа Boolean и оперирывать с ней, как вам угодно :)

Этот код позволит вам перехватить событие MouseDown и вызвать это событие форме:

var
NoBD : Boolean = True;
...
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Событие onMouseDown по форме');
end;

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if NoBD
 then
  begin
   ShowMessage('Событие onMouseDown по мышке');
   Exit;
  end;
end;

Думаю вам хватит советов :) Объясните вопрос, если я вас не понял.


Наверх

Титульная страница Поиск, карта сайта Написать письмо