Вопрос про OnMouseUp
От: Суслик Россия http://www.vkkb.ru
Дата: 26.10.05 14:26
Оценка:
Есть код.


unit Unit3;

interface

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

type
 TForm3 = class(TForm)
   Memo1: TMemo;
   Edit1: TEdit;
   Edit2: TEdit;
   procedure Edit1Exit(Sender: TObject);
   procedure Edit2MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure Edit2MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 end;

var
 Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Edit1Exit(Sender: TObject);
begin
  try
     raise exception.create('1');
  except
     application.HandleException(self);
  end;
end;

procedure TForm3.Edit2MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
  memo1.lines.add('down');
end;

procedure TForm3.Edit2MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
  memo1.lines.add('up');
end;

end.


Ситуация:
1. Фокус ввода находится на Edit1.
2. Я нажимаю и ОТПУСКАЮ мышь на Edit2.

В результате в memo1 оказывается строка down.

ВОПРОСЫ: 1. Почему не срабатывает событие Edit2MouseUp
2. Как сделать так, чтобы факт отпускания мыши стал известен Edit2.
Re: Вопрос про OnMouseUp
От: hun  
Дата: 26.10.05 14:53
Оценка:
Здравствуйте, Суслик, Вы писали:

С>Есть код.



С>
С>unit Unit3;

С>interface

С>uses
С> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
С> Dialogs, Grids, StdCtrls, ExtCtrls;

С>type
С> TForm3 = class(TForm)
С>   Memo1: TMemo;
С>   Edit1: TEdit;
С>   Edit2: TEdit;
С>   procedure Edit1Exit(Sender: TObject);
С>   procedure Edit2MouseDown(Sender: TObject; Button: TMouseButton;
С>     Shift: TShiftState; X, Y: Integer);
С>   procedure Edit2MouseUp(Sender: TObject; Button: TMouseButton;
С>     Shift: TShiftState; X, Y: Integer);
С> end;

С>var
С> Form3: TForm3;

С>implementation

С>{$R *.dfm}

С>procedure TForm3.Edit1Exit(Sender: TObject);
С>begin
С>  try
С>     raise exception.create('1');
С>  except
С>     application.HandleException(self);
С>  end;
С>end;

С>procedure TForm3.Edit2MouseDown(Sender: TObject; Button: TMouseButton;
С> Shift: TShiftState; X, Y: Integer);
С>begin
С>  memo1.lines.add('down');
С>end;

С>procedure TForm3.Edit2MouseUp(Sender: TObject; Button: TMouseButton;
С> Shift: TShiftState; X, Y: Integer);
С>begin
С>  memo1.lines.add('up');
С>end;

С>end.
С>


С>Ситуация:

С>1. Фокус ввода находится на Edit1.
С>2. Я нажимаю и ОТПУСКАЮ мышь на Edit2.

С>В результате в memo1 оказывается строка down.


С>ВОПРОСЫ: 1. Почему не срабатывает событие Edit2MouseUp

С>2. Как сделать так, чтобы факт отпускания мыши стал известен Edit2.

Это происходит потому, что после MouseDown вызывается Exception (и диалоговое окно) из Edit1Exit, соответственно фокус теряется и все мышиные сообщения идут не на Edit2. Собственно надо в Edit1Exit например ничего не делать....
Re[2]: Вопрос про OnMouseUp
От: icWasya  
Дата: 26.10.05 15:03
Оценка:
Здравствуйте, Суслик, Вы писали:


С>>Ситуация:

С>>1. Фокус ввода находится на Edit1.
С>>2. Я нажимаю и ОТПУСКАЮ мышь на Edit2.

С>>В результате в memo1 оказывается строка down.


С>>[b]ВОПРОСЫ:

С>>2. Как сделать так, чтобы факт отпускания мыши стал известен Edit2.

по моему надо смотреть в сторону Drag&Drop
Re[2]: Вопрос про OnMouseUp
От: Суслик Россия http://www.vkkb.ru
Дата: 26.10.05 15:04
Оценка:
Здравствуйте, hun, Вы писали:

hun>Это происходит потому, что после MouseDown вызывается Exception (и диалоговое окно) из Edit1Exit, соответственно фокус теряется и все мышиные сообщения идут не на Edit2. Собственно надо в Edit1Exit например ничего не делать....


Мне почему-то кажется, что это не совсем так: MouseDown все-таки приходит в итоге Edit2. Т.е. нажитие мыши породило смену фокуса, при смене фокуса диалоговое окно показалось, а потом MouseDown пришел Edit2. А вот MouseUp пропал.

Интересно, но согласно winsight32 — MouseUp (вернее соотв. сообщение windows) вообще никому не приходит.
Re: Вопрос про OnMouseUp
От: Суслик Россия http://www.vkkb.ru
Дата: 26.10.05 16:15
Оценка:
В действительности исходный вопрос возник вот почему:

1. Кладем на форму Edit. Прописываем в нем указанный в исходном вопросе OnExit.
2. Кладем на форму TStringGrid (в нем ничего не меняем).
3. Запускаем.
4. Идем в Edit.
5. Нажимаем мышкой на Grid
6. Видим сообщение.
7. Закрываем его.

В результате по гриду бегает за мышью синий прямоугольник.
Такое происходит именно потому, что в грид не пришел mouseup.
Re[3]: Вопрос про OnMouseUp
От: hun  
Дата: 27.10.05 04:45
Оценка:
Здравствуйте, Суслик, Вы писали:

С>Мне почему-то кажется, что это не совсем так: MouseDown все-таки приходит в итоге Edit2. Т.е. нажитие мыши породило смену фокуса, при смене фокуса диалоговое окно показалось, а потом MouseDown пришел Edit2. А вот MouseUp пропал.

По поводу "кажется" — это я ничего не могу сказать, это не ко мне. А вот насчет остального, фокус при нажатии мыши действительно приходит в Edit2, потом появляется окно сообщения и фокус уходит к нему. MouseUp никуда не пропадал, он придет к этому окну (если мышь отпустить пока оно активно), а вот если кнопку мыши держать нажатой, окно убрать нажав Enter, а потом отпустить мышь над Edit2 то к нему MouseUp и приде, никуда не денется.

С>Интересно, но согласно winsight32 — MouseUp (вернее соотв. сообщение windows) вообще никому не приходит.

видать не дошло оно, по дороге сдохло ..... что делать, такова жизнь....
Приходит, наверняка на самом деле, причем скорее всего окну сообщения. Ну собственно вот чего пишут: The WM_LBUTTONUP message is posted when the user releases the left mouse button while the cursor is in the client area of a window. If the mouse is not captured, the message is posted to the window beneath the cursor. Otherwise, the message is posted to the window that has captured the mouse.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.