Форум: "Основная";
Текущий архив: 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.067 c