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

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

Указатель мыши над контролом... [D7]


Страницы:   1 2 3

TrainerOfDolphins ©   (2006-10-02 14:27:00) 

День добрый!
Хотел написать функцию, которая будет проверять находится ли курсор мыши над данным контролом или нет.

function CursorIsUnderControl(ParentControl,ChildControl:TWidgetControl):boolean;
var
c: TControl;
p: TPoint;
BEGIN
 p := Mouse.CursorPos;
 p := ParentControl.ScreenToClient(p);
 c := ParentControl.ControlAtPos(p, true, true);
 if c=ChildControl
 then Result:=true;
END;
Но она почему-то всегда возвращает False;
ParentControl.ControlAtPos(p, true, true) возвращает nil, хотя не должен...
Где у меня ошибка?
Спасибо


Ketmar   (2006-10-02 17:09:00) [21]

>[20] TrainerOfDolphins(c) 2-Oct-2006, 17:02
>Ой, долго рассказывать. Но хорошая ф-ция должна
>работать, где-бы её не вызвали...
например, в драйвере режима ядра...


TrainerOfDolphins   (2006-10-02 17:02:00) [22]

>Ты где собрался свою функцию вызывать?
Ой, долго рассказывать. Но хорошая ф-ция должна работать, где-бы её не вызвали...


Elen   (2006-10-02 16:44:00) [23]


> TrainerOfDolphins

НИЧЕГО ХАКЕРСКОГО!!!!!!!! Глупости... Ты где собрался свою функцию вызывать?


TrainerOfDolphins   (2006-10-02 16:43:00) [24]

2 Юрий Зотов
Спасибо.
Попью чаю и попробую...


TrainerOfDolphins   (2006-10-02 16:40:00) [25]

2 Elen
>Я ж тебе на-водку даю...
Водку я не пью. А если и пью, то на свои :)
>Чем тебе  не подходит?
Во-первых, пока ничего не понимаю в сообщениях... :)
Во-вторых, сложновато немного. В одном обработчике назначается другой и всё это в главном юните. Все служебные ф-ции я стараюсь спрятать куда-нть подальше, в отдельный модуль.
А код [0] и [16] можно обернуть в одну маленькую ф-цию и забыть на время о её реализации...
А вообще, большое спасибо! Методы у тебя хакерские. Полезно поразмыслить на досуге. :)


Юрий Зотов   (2006-10-02 16:28:00) [26]


function ControlUnderMouse: TControl;
var
 P: TPoint;
 W: TWinControl;
begin
 P := Mouse.CursorPos;
 W := FindVCLWindow(P);
 if W <> nil then
 begin
   Result := W.ControlAtPos(W.ScreenToClient(P), True);
   if Result = nil then
     Result := W
 end
 else
   Result := nil
end;

function IsControlUnderMouse(Control: TControl): boolean;
begin
 Result := (Control <> nil) and (ControlUnderMouse = Control)
end;


TrainerOfDolphins   (2006-10-02 16:25:00) [27]

2 Юрий Зотов
Прошу прощения, а не могли бы Вы чуточку конкретнее. Я не совсем понял, куда притулить FindVCLWindow... :)


Elen   (2006-10-02 16:25:00) [28]

P.S. Я ж тебе на-водку даю...


Elen   (2006-10-02 16:23:00) [29]

Вот это должно ответить на твой вопрос :
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   procedure FormCreate(Sender: TObject);
   procedure FormCr(Sender: TObject; var Done: Boolean);
   procedure FormCr2(var Msg: TMsg; var Handled: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

//********* PROCEDURE**********
procedure tform1.FormCr;
//const
var tp:Tpoint;
begin
 GetCursorPos(tp);
 if WindowFromPoint(tp)=dbgrid1.Handle then
   caption:='да'  else caption:='нет';
end;
//********* END PROCEDURE*******

//********* PROCEDURE**********
procedure tform1.FormCr2;
//const
//Var

begin
 if DBGrid1.Handle = msg.hwnd then
  caption:='ok' else caption:='no';
end;
//********* END PROCEDURE*******

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=FormCr;
Application.OnMessage:=FormCr2;
end;

end.

FormCr будет выполняться когда ты ничего не делаеш и проверять где курсор.
formcr2 будет выполняться всегда когда прога будет получать месагу и тут тоже проверочка. Чем плохо :-(


TrainerOfDolphins   (2006-10-02 16:22:00) [30]

2 Elen
я вообще не понял, при чём тут [6]...
Особенно
caption:=TimeToStr(time); :)


Elen   (2006-10-02 16:19:00) [31]

Да и [6]?


TrainerOfDolphins   (2006-10-02 16:14:00) [32]

2 Elen
в смысле [3]?


Elen   (2006-10-02 16:11:00) [33]

Чем тебе [2] не подходит ? :-(


Юрий Зотов   (2006-10-02 16:10:00) [34]

Mouse.CursorPos + FindVCLWindow + ControlAtPos


TrainerOfDolphins   (2006-10-02 16:08:00) [35]

Значится так:   :)
Есть у меня TabSheet. На нём лежит DBGrid. Стало быть первый - Parent, второй - Child.
Создал я пока в ActionList действие с определённым ShortCut и поместил в обработчик этого действия вызов моей ф-ции:

begin
 if CursorIsUnderControl(TWidgetControl(TabSheet),TWidgetControl(DBGrid)
 then Label.Caption:='Yes'
 else  Label.Caption:='No'
end;

Потом я навожу курсор на DBGrid и с клавиатуры вызываю проверку. И... получаю шишь... :)


Elen   (2006-10-02 16:03:00) [36]


>  в любой момент узнать лежит ли указатель над гридом.

Вот тебе еще каша :
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormCr(Sender: TObject; var Done: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

//********* PROCEDURE**********
procedure tform1.FormCr;
//const
//Var
begin
 caption:=TimeToStr(time);
end;
//********* END PROCEDURE*******

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=FormCr;
end;

end.

заходи расхлебывать... :-)


Elen   (2006-10-02 15:56:00) [37]


> TrainerOfDolphins

Симпатично, но я не знаю как ты его вызываеш с какими параметрами и где. Это важно!


TrainerOfDolphins   (2006-10-02 15:29:00) [38]

Прикольно... Работает. Только я не понял как... :)
Но дело в том, что yes возникат только тогда, когда двигаешь мышкой над гридом, в состоянии покоя ничего не происходит. Мне надо иметь возможность в любой момент узнать лежит ли указатель над гридом...
А что ты скажешь по поводу кода в [1]. Он мне больше подходит, но там где-то недочёт...


Elen   (2006-10-02 15:02:00) [39]

А так :
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   procedure FormCreate(Sender: TObject);
   procedure FC(var Msg: TMsg; var Handled: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FC;
begin
if DBGrid1.Handle = msg.hwnd then
 caption:='ok' else caption:='no';

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:=fc;
end;

end.

Так кошерно?


TrainerOfDolphins   (2006-10-02 14:55:00) [40]

>А где и когда она вызывается?
Над DBGrid-ом нужно выполнить некоторые действия. Но нужно их делать только тогда, когда мышь над ним, и сразу прекратить, как только мышь будет ненад ним. Но, собственно, не важно, где я вызываю эту функцию. Чую, что где-то недопонял принцип. Дело в самой ф-ции.
>Вообще лучше пропиши OnMouseMove...
От куда я знаю, где окажется курсор, после того, как покинет DBGrid?
Назначать его всем контролам на форме как-то некошерно... :)


Страницы:   1 2 3

Наверх

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