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, хотя не должен...
Где у меня ошибка?
Спасибо


TrainerOfDolphins   (2006-10-03 14:46:00) [1]

Удалено модератором
Примечание: Флудить завязываем


Elen   (2006-10-03 14:11:00) [2]

Удалено модератором
Примечание: Флудить завязываем


TrainerOfDolphins   (2006-10-03 14:07:00) [3]

Ясно, спасиба :)
Что бы я делал без мастеров...


Elen   (2006-10-03 13:59:00) [4]


> TrainerOfDolphins

Не. просто я его на Пингвинчике пробую, а он не идет :-). Ну я вообще-то пользуюсь Linux Live On cd - knoppix 6 RE, может это не совсем то... В общем это чисто субъективное мнение... К тому же сейчас популярние .NET


TrainerOfDolphins   (2006-10-03 13:54:00) [5]

Недоработанный?


Elen   (2006-10-03 13:21:00) [6]


> TrainerOfDolphins

CLX - позволяет разрабатывать кросс-платформенные приложения, идущие и под  Линуксом и для Виндой. Только этот CLX помоему не фонтан...


TrainerOfDolphins   (2006-10-03 13:15:00) [7]

Привет, Elen!
А чем отличается простая аппликация от CLX?


Elen   (2006-10-03 12:48:00) [8]


> TrainerOfDolphins


Наверное потому что TwidgetControl используется в CLX, а у тебя по всей видимости простая аппликация


TrainerOfDolphins   (2006-10-03 11:44:00) [9]

Спасибо всем за помощь. Вариант описанный в [0] заработал, когда я вместо TwidgetControl передавать TWinControl. Только интересно почему он не работал с TwidgetControl ...


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

когда мышь была над формой -- TForm. когда над кнопкой -- TButton. как и ожидалось.


TrainerOfDolphins   (2006-10-02 18:07:00) [11]

и какой объект он вернул?


Ketmar   (2006-10-02 18:02:00) [12]

на. я ленив. %-)
{$APPTYPE CONSOLE}
uses
 Windows, Controls, StdCtrls, Forms;

var
 f: TForm;
 b: TButton;
 w: Pointer;
begin
 Application.Initialize();
 f := TForm.Create(nil);
 f.Left := 10; f.Top := 10; f.Width := 320; f.Height := 200;
 b := TButton.Create(f);
 b.Parent := f;
 b.Left := 0; b.Top := 0;
 f.Show;
 Sleep(3000);
 w := FindVCLWindow(Mouse.CursorPos);
 if w = nil then WriteLn('shit!')
 else WriteLn(TObject(w).ClassName);
end.


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

2 Ketmar
Скажи плиз, где ты вызывал FindVCLWindow()  и что он тебе вернул?


Ketmar   (2006-10-02 17:50:00) [14]

>[27] Gydvin(c) 2-Oct-2006, 17:46
>А чем
>CM_MOUSEENTER, CM_MOUSELEAVE отлавливать
>негодится?
попробуй резко "выдернуть" мышь из окошка. бедный контрол этого не заметит. есть и другие случаи, когда эти сообщения "теряются". оно не смертельно, но неприятно.


Gydvin   (2006-10-02 17:46:00) [15]

А чем
CM_MOUSEENTER, CM_MOUSELEAVE отлавливать негодится?

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   DBGrid1: TDBGrid;
   procedure FormCreate(Sender: TObject);

 private
   { Private declarations }
   Sender_1: TObject;
 public
   { Public declarations }
   procedure WndProc(var Message: TMessage); override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Message: TMessage);
begin
 inherited;
 case Message.Msg of
   CM_MOUSEENTER:
     begin
       if Message.LParam = integer(Sender_1)
         then Caption := 'Hello, mouse';
     end;
   CM_MOUSELEAVE:
     begin
       if Message.LParam = integer(Sender_1)
         then Caption := 'By-by, mouse';
     end;
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Sender_1:=DBGrid1;
end;

end.


Ketmar   (2006-10-02 17:44:00) [16]

есть. баг в коде. только что проверил: FindVCLWindow() работает отлично.


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

2 Ketmar
>о том, что "работать, где бы не вызвали" -- это утопия.
Любое утверждение относительно, и моё тоже...
А Вы к словам придираетесь. :)
А по сабжу есть соображения?


Ketmar   (2006-10-02 17:30:00) [18]

>[23] TrainerOfDolphins(c) 2-Oct-2006, 17:20
>Это Вы о чём? :)
о том, что "работать, где бы не вызвали" -- это утопия.


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

2 Ketmar
Это Вы о чём? :)


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

2 Юрий Зотов
Однако и FindVCLWindow(P) всё время nil возвращает... :(

p := Mouse.CursorPos;
 w:=FindVCLWindow(P);
{w=nil}


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

Наверх

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