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

Вниз

Покидание мыши с компонента   Найти похожие ветки 

 
maxim2   (2003-01-25 23:09) [0]

Привет всем!
Такой вопросик, у меня на форме два Image как бы сделать так чтобы при заходы мыши на image1, image2 показывался, а при выходе с image1 скрывался image2.


 
OxOTHuK   (2003-01-25 23:23) [1]

IMHO, ты должен в обработчика OnMouseMove смотреть координаты мыши и сравнивать их с областью ImageN...


 
Kair   (2003-01-25 23:24) [2]

onMouseMove


 
maxim2   (2003-01-25 23:32) [3]

А это не проканает, у меня один имадже наложен на другой


 
Kair   (2003-01-25 23:37) [4]

>maxim2 © (25.01.03 23:32)
>А это не проканает, у меня один имадже наложен на другой

Это проканает. Подумай.


 
gsu   (2003-01-26 00:13) [5]

>> maxim2 ©
Проканает, проканает, точно говорю, главное поглубже канай ... (-:|~


 
Юрий Зотов   (2003-01-26 01:10) [6]

Проканает, говорите? Что ж, ОК.
Итак, мышь ушла с Image1. Где ловить будем?

Свой компонент надо писать. С обработкой CM_MOUSEENTER/LEAVE.


 
gsu   (2003-01-26 01:39) [7]

>> Юрий Зотов ©
Зря вы так
Вот если поглубже, э ..., как бы это выразиться, проканать, то многое получится (-:|~


 
Юрий Зотов   (2003-01-26 02:01) [8]

> gsu © (26.01.03 01:39)

Может, и зря, не спорю. Но тогда докажите.
Итак, мышь ушла с Image1. Где ловить будем?

Можно, конечно, в хуке. Можно в OnMessage. Можно даже свой драйвер написать. Это уж точно будет "проканать поглубже".

Но, знаете, я сторонник простого и понятного кода. И не сторонник стрельбы из пушки по воробьям.

Итак, мышь ушла с Image1. Где ловить будем?



 
gsu   (2003-01-26 02:16) [9]

>> Может, и зря, не спорю.
Что зря ?

>> Но тогда докажите.
WM_MOUSEMOVE

>> Где ловить будем
на области обрамляющей нужную


 
gsu   (2003-01-26 02:38) [10]

Уважаемый, опять вы куда то исчезли.
А, ведь и в прошлый раз мы так и не обсудили тему AnyFunc.
Ладно, у мя время дома не резиновое.
Можете послать свои замечания на мыло, если хотите.
А у мя к вам 3 вопрос: "почему у мя с - синего цвета, а у вас голубого ?"


 
SammIk   (2003-01-26 02:49) [11]


> Юрий Зотов ©

Говорит верно и про СВ_..
Ипро воробьев..
И вообще задолбали..
Тема уже исчерпала себя.


 
gsu   (2003-01-26 02:52) [12]

>> SammIk ©
>> Полныи придурок))на всю голову
У вас, кстати тоже синяя с, хоть я вас и не долбал


 
Ray Adams   (2003-01-26 03:43) [13]

Создать свой компонент наследованный от TImage
добавить в private
FOnMouseEnter: TNotifyEvent; //Make the Mouse Enter and Leave available
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg:TMessage); message CM_MOUSELEAVE;
и в published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter
write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave
write FOnMouseLeave;


 
gsu   (2003-01-26 11:47) [14]

И все таки я чувствую ся непонятым )-:|~


 
Юрий Зотов   (2003-01-26 12:25) [15]

> gsu © (26.01.03 02:16)
> на области обрамляющей нужную

Вот в этом-то все и дело. Таких областей может быть десяток. Или даже несколько десятков. Это форма и любой контрол, примыкающий к Image1, либо перекрывающий Image1, либо лежащий поверх Image1. И для КАЖДОГО будет нужен обработчик OnMouseMove (пусть даже один для всех, но все равно его надо будет назначить КАЖДОМУ). А завтра на форме что-то поменяется - и снова придется все проверять и переназначать.

Далее - поставьте Image1.Align = alClient. Теперь где ловить будем? Вероятно, придется вводить какой-то обработчик WM_NCxxx, поскольку больше ловить негде.

Видите, что получается? При любом, даже самом мелком изменении геометрии формы или ее контролов нам придется снова и снова все проверять, писать новый код, вводить новые или снимать старые обработчики - и пр. Имеем головную боль, высокую вероятность ошибки и т.д.

В то же время, написав свой компонент ОДИН раз (а такой простой компонент пишется за 5 минут) и ОДИН раз написав его обработчик, мы можем спокойно кроить форму как хотим и ни о чем не беспокоиться. Кроме того, получаем полезный компонент на будущее.

Разве это не лучше?

P.S.
1. Куда я исчез в 3-часу ночи? Думаю, спать пошел.
2. А что там было насчет AnyFunc? Напомните, pls.
3. Значок - просто я его покрасил. И уже очень давно. :о)


 
gsu   (2003-01-26 12:32) [16]

Это удобней, согласен с вами, но как это реализуется в самом компоненте ?
1. Ааа, вы еще и спите, а я думал у мастеров круглосуточная вахта.
2. Там на счет цикла и его параметров, но лучше потом, у мя дома инет заканчивается
3. (-:|~


 
Sha   (2003-01-26 12:52) [17]

Удобнее и надежнее, по-моему, так:
1. по onMouseMove взводим таймер на 0.5 сек и смотрим, где мышь.
2. по таймеру смотрим, где мышь.
Не забыть правильно включать/выключать таймер:
мышь на комроненте - таймер включен, нет - выключен.



 
Юрий Зотов   (2003-01-26 13:45) [18]

> Sha © (26.01.03 12:52)

1. Получаем лишний компонент - таймер.
2. Постоянная обработка OnTimer дает лишнюю загрузку CPU.
3. Получаем запаздывание в 0.5 секунды. Это довольно грубо. Если же интервал уменьшить, загрузка CPU станет еще больше.


> gsu © (26.01.03 12:32)
> но как это реализуется в самом компоненте?

Компонент уже практически написал Ray Adams (см. выше). Он дает СОБЫТИЯ входа мыши на себя и ухода с себя. Далее все как обычно - двойной щелчок в Инспекторе Объектов и пишем простейший код:

procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
inherited;
Image2.Visible := True;
end;

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
inherited;
Image2.Visible := мышь_над_Image2
end;

И это все. Задача решена, о ней можно забыть и кроить форму как угодно. В палитре имеем полезный компонент на будущее.


 
Sha   (2003-01-26 13:59) [19]

2 Юрий Зотов © (26.01.03 13:45)

> Получаем лишний компонент - таймер.
Можно обойтись одним тймером на все приложение, если сделать все как надо.

> Постоянная обработка OnTimer дает лишнюю загрузку CPU.
0,01%

> Получаем запаздывание в 0.5 секунды. Это довольно грубо. Если же интервал уменьшить, загрузка CPU станет еще больше.
0.5 сек - оптимально и приятно для глаза. Никакой задержки не чувствуется.

> Компонент уже практически написал Ray Adams (см. выше).
Кто пробовал так делать, тот знает - быстрый уход мыши с компонента или уход с компонента, расположенного вплотную к краю формы, за границу окна не ловится.



 
Юрий Зотов   (2003-01-26 14:03) [20]

Sorry, маленькая неточность - inherited надо убрать.
То есть, все еще проще.


 
Юрий Зотов   (2003-01-26 14:12) [21]

> Sha © (26.01.03 13:59)

> Кто пробовал так делать, тот знает - быстрый уход мыши с
> компонента или уход с компонента, расположенного вплотную к
> краю формы, за границу окна не ловится.

Например, я пробовал. И далеко не один раз (или даже не один десяток раз, не считал). Не помню, чтобы были проблемы.

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


 
Sha   (2003-01-26 14:18) [22]

2Юрий Зотов © (26.01.03 14:12)
Поясню: CM_MOUSELEAVE посылается компоненту при перемещении на другой компонент. А если не было перемещения на другой компонент, а было перемещение за границу формы, то ничего послано не будет.


 
Юрий Зотов   (2003-01-26 15:30) [23]

> Sha © (26.01.03 14:18)
> CM_MOUSELEAVE посылается компоненту при перемещении
> на другой компонент.

Или когда контрол под мышью стал равен nil. Это и есть уход мыши на другое приложение.

Не хотел ввязываться в спор, но, видимо, придется. Итак, вот выдержки из кода TApplication с моими комментариями.

procedure TApplication.HandleMessage;
// Вызывается в цикле выборки сообщений
var
Msg: TMsg;
begin
if not ProcessMessage(Msg) then Idle(Msg);
// Если сообщений в очереди нет, вызывается Idle
end;

procedure TApplication.Idle(const Msg: TMsg);
var
Control: TControl;
Done: Boolean;
begin
Control := DoMouseIdle; // Сразу вызывается DoMouseIdle
... // Далее нашей темы не касается
end;

function TApplication.DoMouseIdle: TControl;
// Это главное. Привожу полный текст.
var
CaptureControl: TControl;
P: TPoint;
begin
GetCursorPos(P); // Определяется контрол под мышью
Result := FindDragTarget(P, True);
// Из хелпа: If there is not control at the specified position,
// FindDragTarget returns nil. Вот оно - Result может быть nil
// (что означает уход мыши в другое приложение).

if (Result <> nil) and (csDesigning in Result.ComponentState) then
Result := nil; // Сброс для design-time
CaptureControl := GetCaptureControl; // Приемник сообщений мыши
if FMouseControl <> Result then
// Вот оно! Контрол под мышью сменился или стал равен nil (что
// означает уход мыши в другое приложение).

// Далее идут простые проверки и сама посылка сообщений.
begin
// Сначала проверяется контрол, с которого мышь уже ушла.
// *** Он получает сообщение даже если Result = nil
if ((FMouseControl <> nil) and (CaptureControl = nil)) or
((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
FMouseControl.Perform(CM_MOUSELEAVE, 0, 0);
FMouseControl := Result; // Запомнить новый контрол под мышью
// Теперь проверяется контрол, на который мышь пришла
if ((FMouseControl <> nil) and (CaptureControl = nil)) or
((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
FMouseControl.Perform(CM_MOUSEENTER, 0, 0);
end;
end;

Делаем вывод - сообщения CM_MOUSEENTER/LEAVE посылаются контролу:
- из общего цикла выборки сообщений (как и все остальные);
- во время простоя приложения (что естественно);
- если мышь не захвачена чем-то другим (что тоже естественно).

Как мы видели, сообщение CM_MOUSELEAVE посылается и при уходе мыши в другое приложение (см. комментарий, помеченный ***).


 
Sha   (2003-01-26 16:37) [24]

2 Юрий Зотов © (26.01.03 15:30)

Никакого спора нет. Есть интересное поведение компонентов, использующих CM_MOUSEENTER/LEAVE, описанное мною выше.

Ваши рассуждения верны только в том случае, если TApplication.DoMouseIdle вызывается когда мышь находится за пределами окна. А этого, по-видимому, не происходит.
Иначе откуда берется столь странное поведение?


 
Юрий Зотов   (2003-01-26 16:53) [25]

> Ваши рассуждения верны только в том случае, если
> TApplication.DoMouseIdle вызывается когда мышь находится за
> пределами окна. А этого, по-видимому, не происходит

Sorry, не понял. Это как же так?

Приложение получает свой квант времени. В приложении непрерывно крутится цикл выборки сообщений. Если сообщений в очереди нет, то в этом кванте будет вызван метод DoMouseIdle. Независимо от того, где находится мышь.

Важно другое - чтобы в очереди не было сообщений. При уходе мыши за пределы приложения они сначала есть (поступали в нее, пока мышь еще не ушла), затем выбираются и очередь пустеет. В этот момент и посылается СM_MOUSELEAVE, как мы видели.


 
Sha   (2003-01-26 17:29) [26]

> Юрий Зотов © (26.01.03 16:53)
> Sorry, не понял. Это как же так?

У меня была своя кнопка с подсветкой в стиле IE. Она работала так, как я описывал выше (т.е. иногда при уходе с нее мыши на рабочий стол и, кажется, на меню подсветка не пропадала) до тех пор, пока я ее не переделал.

Мне приходит в голову только такой сценарий:
1. Приложение получает квант времени и выбирает все сообщения из очереди.
2. По Idle вызывается TApplication.DoMouseIdle, который определяет, что мышь находится все еще на нашем компоненте и ничего не делает.
3. Мы быстро перемещаем мыщь с нашего компонента (он находится у края формы) на рабочий стол.
4. Сообщение WM_MOUSEMOVE при этом нашему окну не посылается и кнопка продолжает светиться.
5. При возврате мыши в наше окно на другой компонент после WM_MOUSEMOVE мы получаем свое СM_MOUSELEAVE, и кнопка гаснет.


 
Sha   (2003-01-27 01:15) [27]

Предлагаю небольшую демку для желающих исследовать особенности СM_MOUSELEAVE:

unit LeaveTimerU;

interface

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

type
TForm1 = class(TForm)
Timer1: TTimer;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
procedure CMMouseEnter(var Msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg:TMessage); message CM_MOUSELEAVE;
procedure OnIdle(Sender: TObject; var Done: Boolean);
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CMMouseEnter(var Msg:TMessage);
begin;
Caption:="In";
end;

procedure TForm1.CMMouseLeave(var Msg:TMessage);
begin;
Caption:="Out";
end;

procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
begin;
if CheckBox1.Checked and not Timer1.Enabled then Timer1.Enabled:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin;
Application.OnIdle:=OnIdle;
Timer1.Enabled:=false;
Timer1.Interval:=500;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
begin;
GetCursorPos(p);
if (FindDragTarget(p,true)=nil) and Timer1.Enabled then Timer1.Enabled:=false;
end;

end.

object Form1: TForm1
Left = 297
Top = 178
Width = 163
Height = 83
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object CheckBox1: TCheckBox
Left = 8
Top = 16
Width = 73
Height = 17
Caption = "Use Timer"
TabOrder = 0
end
object Timer1: TTimer
OnTimer = Timer1Timer
Left = 104
Top = 8
end
end


 
xn0bys   (2003-01-27 16:24) [28]

Если не хочешь парится, то вот:
http://delphi.mastak.ru/cgi-bin/download.pl?get=1043645299&n=0


 
Sha   (2003-01-27 20:38) [29]

2 xn0bys © (27.01.03 16:24)
За ссылку спасибо, посмотрю на досуге.

Я вообще-то не парюсь. Свои проблемы я решил.

Приведенный пример показывает, что одной обработки сообщений СM_MOUSEENTER/СM_MOUSELEAVE недостачно для правильной работы приложения. Стоит добавить таймер - и все работает "как часы".
Чекбокс в примере управляет работой таймера (Enable/Disable).


 
Sha   (2003-01-28 12:37) [30]

Пригляделся к реализации своего старого компонента, улучшающего рассылку CM_MOUSELEAVE компонентам приложения, и увидел, что там все сделано красивее.

С учетом этого переделал пример. Создайте новое приложение, бросьте на форму чекбокс и таймер, после чего замените весь текст Unit1 на приведенный ниже и установите обработчик события OnCreate для формы Form1.

Чекбокс управляет позволяет/запрещает работу таймера. Видно, что без таймера при выходе за границу форм приложения CM_MOUSELEAVE посылается не всегда. Как бы это объяснить? :)

unit Unit1;

interface

uses
Windows, Messages, Classes, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
CheckBox1: TCheckBox;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure OnIdle(Sender: TObject; var Done: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure CMMouseEnter(var Msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Msg:TMessage); message CM_MOUSELEAVE;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin;
Timer1.Interval:=500;
Timer1.OnTimer:=Self.Timer1Timer;
Application.OnIdle:=Self.OnIdle;
end;

procedure TForm1.OnIdle(Sender: TObject; var Done: Boolean);
var
p: TPoint;
begin;
GetCursorPos(p);
Timer1.Enabled:=CheckBox1.Checked and (FindDragTarget(p,true)<>nil);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin;
Timer1.Enabled:=false;
end;

procedure TForm1.CMMouseEnter(var Msg:TMessage);
begin;
Self.Caption:="Enter";
end;

procedure TForm1.CMMouseLeave(var Msg:TMessage);
begin;
Self.Caption:="Leave";
end;

end.


 
Юрий Зотов   (2003-01-29 14:48) [31]

Ну, если приведенные куски кода и их разбор Вас не убеждают, то могу сказать вот что: ведь речь шла о покидании мышью КОНТРОЛА на форме, а не САМОЙ формы, как в Вашем примере.

Есть некоторая разница. Состоит она вот в чем: при уходе мыши с котрола за пределы формы она неизбежно пересечет неклиентскую область формы. При этом в очередь сообщений, как минимум, поступят WM_NCHITTEST и WM_SETCURSOR. А после их обработки, как мы уже видели, пройдет CM_MOUSELEAVE.

Поэтому Ваша модель событий:

> 3. Мы быстро перемещаем мыщь с нашего компонента (он
> находится у края формы) на рабочий стол.
> 4. Сообщение WM_MOUSEMOVE при этом нашему окну не посылается
> и кнопка продолжает светиться.

относится, извините, к области ненаучной фантастики. Придет ли в очередь сообщений WM_MOUSEMOVE или что угодно другое, придет ли оно этому окну или какому угодно другому - все равно сообщения будут выбраны и обработаны - после чего неизбежно пойдет CM_MOUSELEAVE. И, как я уже говорил, при пересечении мышью неклиентской области, как минимум, в очередь поступят WM_NCHITTEST и WM_SETCURSOR.

Поэтому приведенный Вами пример показывает только то, что вариант с таймером работает. В чем никто и не сомневался. Вопрос-то ведь был совсем в другом - а зачем вообще нужны еще какие-то таймеры?

Ниже привожу другой пример, с нормально написанным компонентом. Компилировал в D5, тестировал под W2K, мышь PS/2, Genius NetScroll+ Series Mouse (хотя вряд ли это имеет какое-то значение).

Так вот - как я ни старался РЕЗКО и БЫСТРО увести мышь с Image за пределы формы, ее заголовок неизбежно менялся с "Enter" на "Leave". Что говорит об абсолютно корректной работе и компонента, и всей программы.

Я подводил мышь к самому краешку Image, а потом резко дергал ее. Я стучал по ней сбоку так, что она отлетала сантиметров на 30. Я позвал соседей по комнате. Мы упражнялись несколько минут и НИ У КОГО НЕ ПОЛУЧИЛОСЬ ХОТЬ РАЗ УВЕСТИ МЫШЬ ТАК, ЧТОБЫ НЕ ПРОШЛО СООБЩЕНИЕ CM_MOUSELEAVE. Программа срабатывала железно.

Если у Вас это не так... ну что ж, как говорится, обновите драйвер коврика. Это, конечно, шутка - а вот об обновлении драйвера мыши, вполне возможно, стоит подумать. Какой-то он сильно дискретный получается...

Вот такие пироги. А код, как видите, самый обычный, ничего хитрого:

type
TMyImage = class(TImage)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
protected
procedure DoMouseEnter;
procedure DoMouseLeave;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure ImageMouseEnter(Sender: TObject);
procedure ImageMouseLeave(Sender: TObject);
end;

{ TMyImage }

procedure TMyImage.CMMouseEnter(var Message: TMessage);
begin
inherited;
DoMouseEnter
end;

procedure TMyImage.CMMouseLeave(var Message: TMessage);
begin
inherited;
DoMouseLeave
end;

procedure TMyImage.DoMouseEnter;
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(Self)
end;

procedure TMyImage.DoMouseLeave;
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(Self)
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
with TMyImage.Create(Self) do
begin
Parent := Self;
OnMouseEnter := ImageMouseEnter;
OnMouseLeave := ImageMouseLeave;
Stretch := True;
Align := alClient;
Picture.LoadFromFile("что-нибудь.bmp") // Укажите свой файл
end
end;

procedure TForm1.ImageMouseEnter(Sender: TObject);
begin
Caption := "Enter"
end;

procedure TForm1.ImageMouseLeave(Sender: TObject);
begin
Caption := "Leave"
end;


 
Sha   (2003-01-29 15:51) [32]

2 Юрий Зотов © (29.01.03 14:48)
> ведь речь шла о покидании мышью КОНТРОЛА на форме, а не САМОЙ формы, как в Вашем примере.

maxim2 © (25.01.03 23:09) спросил:
... у меня на форме два Image как бы сделать так чтобы при заходы мыши на image1, image2 показывался, а при выходе с image1 скрывался image2.
Здесь ничего не сказано о невозможности выхода мыши за форму.

> ...при уходе мыши с котрола за пределы формы она неизбежно пересечет неклиентскую область формы. При этом в очередь сообщений, как минимум, поступят WM_NCHITTEST и WM_SETCURSOR. А после их обработки, как мы уже видели, пройдет CM_MOUSELEAVE.

Вы это проверяли? Если медленно тащить мышь, то так все и будет.
Если быстро, то не будет WM_NCHITTEST и WM_SETCURSOR и, следовательно, CM_MOUSELEAVE.

> Поэтому Ваша модель событий ... относится, извините, к области ненаучной фантастики.

Никакой фантастики. Объективная реальность. Проверено на нескольких компьютерах в офисе и дома (от AMD-500 Com Win98 до Р4-1500 PS2 Win98 SE).

> Придет ли в очередь сообщений WM_MOUSEMOVE или что угодно
> другое, придет ли оно этому окну или какому угодно другому -
> все равно сообщения будут выбраны и обработаны - после чего
> неизбежно пойдет CM_MOUSELEAVE.

А если ничего не придет, то неизбежно не пойдет.

> Вопрос-то ведь был совсем в другом - а зачем вообще нужны еще какие-то таймеры?

Именно для того, чтобы что-то приходило.

> Ниже привожу другой пример ... Так вот - как я ни старался
> РЕЗКО и БЫСТРО увести мышь с Image за пределы формы, ее
> заголовок неизбежно менялся с "Enter" на "Leave".

Мы его тоже проверили на нескольких компьютерах. У нас результат прямо противоположный.

> Мы упражнялись несколько минут и НИ У КОГО НЕ ПОЛУЧИЛОСЬ ХОТЬ
> РАЗ УВЕСТИ МЫШЬ ТАК, ЧТОБЫ НЕ ПРОШЛО СООБЩЕНИЕ CM_MOUSELEAVE.
> Программа срабатывала железно.

А нам даже этого не пришлось делать. Даже у самого ленивого из нас программа корректно работала лишь в одном случае из десяти. Программа срабатывала железно неправильно. Может из-за Win98. Может кто-нибудь еще проверит?

> Если у Вас это не так... ну что ж, как говорится, обновите
> драйвер коврика. Это, конечно, шутка - а вот об обновлении
> драйвера мыши, вполне возможно, стоит подумать. Какой-то он
> сильно дискретный получается...

Я-то обновлю. Но вряд ли это смогут сделать сразу все пользователи.

> Вот такие пироги. А код, как видите, самый обычный, ничего хитрого...

Ну так и у меня такой же с одним маленьким добавлением, о котором я и хотел сообщить почтенной публике. :)


 
Юрий Зотов   (2003-01-29 17:49) [33]

Во-первых, из контеста Вы должны были понять, что когда я говорил о покидании контрола, то имелось в виду - с контрола ЗА форму. Несерьезно.

Во-вторых, как это понять?
> Вы это проверяли?
Вы читали мой постинг? Или пишете ответы по ходу чтения, а не прочитав до конца?

Ладно, по сути.

У Вас на ВСЕХ компах стоит 9х? Это, пожалуй, единственное, что может меня убедить, что Вы не сказки рассказываете. Потому что у нас на всех компах (2k и XP) оба примера - и Ваш, и мой, работают железно. К сожалению, сам проверить под 9х сейчас не могу, негде.


 
Sha   (2003-01-29 18:27) [34]

2 Юрий Зотов © (29.01.03 17:49)

> Во-первых, из контеста Вы должны были понять, что когда я
> говорил о покидании контрола, то имелось в виду - с контрола ЗА форму. Несерьезно.

Не понял. По-моему, из контекста моих постов вы должы были понять, о чем я все это время говорил и продолжаю говорить.
Похоже, мы друг друга в чем-то не понимаем. Понять бы в чем.

> Во-вторых, как это понять?
>> Вы это проверяли?
> Вы читали мой постинг? Или пишете ответы по ходу чтения, а не прочитав до конца?

Понять так, как написано. Проверить - означает проверить на разных компьютерах под разными Windows. Отвечал не только дочитав ваш постинг до конца, но и ПРОВЕРИВ все, что вы написали. Кстати, если вы пишете ответы не по ходу чтения, а прочитав до конца, до должны были понять это.

> Ладно, по сути.
> У Вас на ВСЕХ компах стоит 9х? Это, пожалуй, единственное, что
> может меня убедить, что Вы не сказки рассказываете. Потому что у
> нас на всех компах (2k и XP) оба примера - и Ваш, и мой,
> работают железно. К сожалению, сам проверить под 9х сейчас не могу, негде.

Проверили также на P4-1500 PS WindowsME & WindowsXP. С тем же успехом.
Задачи убедить вас перед собой не ставил - просто разобраться хочу.
Так хочется верить, что вы не сказки рассказываете. Если бы так было везде и всегда, жизнь была бы куда проще.

2 All

Может ли кто-нибудь еще поучаствовать в тестировании обоих вариантов программы? Давайте наберем хоть какую-нибудь статистику.


 
Sha   (2003-01-30 20:40) [35]

2 Юрий Зотов ©
Похоже, тема никому кроме нас неинтересна.
Что вы думаете по поводу обмена экзешниками?



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

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

Наверх





Память: 0.58 MB
Время: 0.009 c
14-29053
kat
2003-01-24 15:29
2003.02.10
DOA for Delphi7


3-28676
Соловьев
2003-01-24 14:40
2003.02.10
Почему не работает UPPER?


1-28806
OxOTHuK
2003-02-02 11:00
2003.02.10
Загрузка


6-28959
antix
2002-11-17 06:50
2003.02.10
Запуск приложения (exe) у клиента


14-29072
Николай Быков
2003-01-22 19:56
2003.02.10
У меня депресняк....





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский