Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про mouseUp   Найти похожие ветки 

 
Суслик ©   (2005-10-26 18:22) [0]

Есть код.

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.


 
DiamondShark ©   (2005-10-26 19:22) [1]


> 1. Почему не срабатывает событие Edit2MouseUp

Неисповедимы пути б-рланда...


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

Использовать свойство WindowProc


 
umbra ©   (2005-10-26 19:28) [2]

странно. У меня, првда, Д7. После каждого клика в мемо исправно добавляется по две строки


 
umbra ©   (2005-10-26 19:31) [3]


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


Написать свои обработчики сообщений WM_LBUTTONDOWN, WM_LBUTTONUP, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP


 
Суслик ©   (2005-10-26 20:03) [4]

В действительности исходный вопрос возник вот почему:

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

В результате по гриду бегает за мышью синий прямоугольник.
Такое происходит именно потому, что в грид не пришел mouseup.


 
Leonid Troyanovsky ©   (2005-10-27 10:43) [5]


> Суслик ©   (26.10.05 18:22)  


Попробуй вернуть фокус на Edit1:

procedure TForm3.Edit1Exit(Sender: TObject);
begin
 try
    ..
    raise EMyException.create("1");
 except
   on EMyException do
    begin
      TWinControl(Sender).SetFocus;
      raise;
    end;
 end;
end;


--
Regards, LVT.


 
Суслик ©   (2005-10-27 11:58) [6]

Леонид, понимаешь, я как раз этого не хочу.

Т.е. я хочу, чтобы сообщение выводилось, но фокус переходил туда, куда кликнул мышью.


 
Leonid Troyanovsky ©   (2005-10-27 14:08) [7]


> Суслик ©   (27.10.05 11:58) [6]

> Т.е. я хочу, чтобы сообщение выводилось, но фокус переходил
> туда, куда кликнул мышью.


procedure TForm1.Edit1Exit(Sender: TObject);
begin
 try
   raise EMyException.Create("1");
 except
   on E:EMyException do
     begin
       Application.ShowException(E);
       PostMessage(Screen.ActiveControl.Handle, WM_LBUTTONUP, 0, 0);
     end;
 end;
end;


--
Regards, LVT.


 
Суслик ©   (2005-10-27 14:23) [8]

Я примерно так и делал, чтобы работало.
Но! Тут остается вопрос о правомерности таких действий.
Объясню. Если указанный post не делать и реализовать указанный в исходном сценарий, то появится только down. Но если потом щелкнуть мышью куда угодно (можно где-то на форме), то прихордит и down и up, причем приходит Edit2. Есть ощущение, что Edit2 ставит какие-то capture на мышь. И тут как-то боязно продолжать бороться с этим эффектом. Собственно это и на newsgroups у борланда мне это сказал человек из team borland:

It"s generally not a good idea to be messing around with the focus
when it is transition. Windows gets very confused when you do this, as
does a lot of application code because of Windows" confusion. Here,
the focus is in transition from the edit to the grid, and halfway
through that transition you switch the focus to the message box. If
you"re trying to do validation, postpone that until after the
transition
. Better yet, wait until the user tells you he"s done with
the editing (not just by leaving the edit control) and you are
required to use the data in the control for something.

Я вообще сделал так и сделал - отложит проверку, когда переход фокуса произойдет.

Спасибо.


 
Leonid Troyanovsky ©   (2005-10-27 15:23) [9]


> Суслик ©   (27.10.05 14:23) [8]


> Объясню. Если указанный post не делать и реализовать указанный
> в исходном сценарий, то появится только down. Но если потом
> щелкнуть мышью куда угодно (можно где-то на форме), то прихордит
> и down и up, причем приходит Edit2. Есть ощущение, что Edit2
> ставит какие-то capture на мышь.

Дык, ясно видно, что ставит. Кста, у EDIT это прописано в
default message processing (хотя, для TMemo оно не происходит).
Почему сюда затесался TStringGrid одному борланду известно.

> И тут как-то боязно продолжать
> бороться с этим эффектом. Собственно это и на newsgroups
> у борланда мне это сказал человек из team borland:

Часом не Peter Below?

Насчет отложенной проверки тоже чесалось сказать, но, решил, что
интерес академический.
Ведь, в жизни, validation вешают на некую отдельно стоящую, скажем,
кнопку, иначе из Edit можно и вовсе не выбраться.

--
Regards, LVT.


 
Суслик ©   (2005-10-27 15:47) [10]


> Часом не Peter Below?

Нет. Kurt Barthelmess [TeamB] <kbarthelmess@compuserve.com>


> Почему сюда затесался TStringGrid одному борланду известно.

Там ситуация такая:
1. на mousedown ставится флажок, что была нажата мышь
2. на mouseup флажок снимает.

А т.к. down пришел, а up нет - то флажок не снимается вовсе.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.053 c
2-1131029615
DelphiLexx
2005-11-03 17:53
2005.11.20
class function


5-1111471930
Leschiy
2005-03-22 09:12
2005.11.20
Помогите с компонентом


2-1130908177
samoilov
2005-11-02 08:09
2005.11.20
progressbar


5-1109970079
BRom
2005-03-05 00:01
2005.11.20
Видимость внутреннего компоненте другими


2-1130859825
Grol
2005-11-01 18:43
2005.11.20
Удалить память выделенную под нужды компонента...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский