![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатель мыши над контролом... [D7]
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?
Назначать его всем контролам на форме как-то некошерно... :)