PDA

View Full Version : سوال: بدست آوردن موقعیت نشانگر ماوس بر روی کامپوننت



persia_hrn
پنج شنبه 08 اسفند 1398, 23:56 عصر
سلام به اساتید محترم
میدونم که موقعیت نشانگر ماوس بر روی هر آبجکتی رو میشه در OnMouseMove اون و با متغیرهای X و Y به دست آورد.

procedure TCustomControl.MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label1.Caption := IntToStr(x) + ' ' + IntToStr(y);
end;

من در حال نوشتن یه کامپوننت هستم که بدست آوردن موقعیت نشانگر ماوس بر روی کامپوننت برام مهم هست و نمیدونم چجور این کار رو انجام بدم .

کسی میتونه کمکی بده ؟ ممنون از همه

persia_hrn
شنبه 10 اسفند 1398, 01:11 صبح
سلام مجدد به همه عزیزان
راهش رو پیدا کردم و با یه توضیح مختصر مینویسمش شاید یه جایی به درد کسی بخوره .
در زمان نوشتن کامپوننت یه تایمر رو میسازیم و اجرای یه پروسیژر رو به رویداد OnTimer اون اختصاص میدیم .
مثال :

constructor T*****.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimer := TTimer.Create(Self);
with FTimer do begin
Enabled := FALSE;
Interval := 1;
OnTimer := MousePositionControl;
end;
.
.
.


بعد پروسیژر :


procedure T*****.MousePositionControl(Sender:TObject);
var
P: TPoint;
FMX, FMY: Word;
begin
P := Mouse.CursorPos;
P := Self.ScreenToClient(P);
FMX := P.x;
FMY := P.y;
.
.
.


متغیرهای FMX , FMY موقعیت نشانگر ماوس روی کامپوننت در زمان اجرا رو برمیگردونن .

ایشالا مفهوم بوده باشه توضیحاتم .

یوسف زالی
شنبه 10 اسفند 1398, 03:14 صبح
سلام. تایمر داخل کامپوننت فقط داره سرباره ایجاد می کنه، یک متد هست در کامپوننت های کنترل به نام MouseMove که می تونید اون رو اورراید کنید.
بگردید دنبالش و اگه نبود حتما در کلاس بالاترش پیداش می کنید.
اون رو در پروتکتد کلاس بنویسید و اوررایدش کنید.

persia_hrn
سه شنبه 13 اسفند 1398, 00:53 صبح
با تشکر از شما جناب زالی
اول بگم که این اولین کامپوننتی هست که دارم می نویسم و توی این زمینه خیلی مبتدیم .
کامپوننتی که دارم مینویسم یک Image هست که از کلاس TGraphicControl مشتق شده و زمانی که در Protected کنترل MouseMove رو override میکنم ارور زیر نمایش داده میشه :

Declaration of 'MouseMove' differs from previous declaration
اگه اشتباه نکنم بخاطر اینه که توی کلاس TGraphicControl این کنترل تعریف نشده همچنین در کلاس بالاترش TControl هم تعریف نشده و در نهایت در کلاس بالاتر (TComponent) کنترل MouseMove به شکل زیر تعریف شده :

procedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic;

میخواستم ببینم راه صحیح تعریف کنترل MouseMove واسه کامپوننت من چیه ؟
آیا اگه به شکل زیر تعریفش کنم صحیحه ؟

procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;

ممنون میشم راهنماییم کنید ، مرسی

یوسف زالی
سه شنبه 13 اسفند 1398, 11:17 صبح
تقریبا هیچ وقت متدهای داینامیک یا ویرچوال رو دوباره تعریف نکنید.
اروری هم که می ده مربوط به نبودن متد نیست، مربوط به اینه که چیزی که دارید تعریف می کنید با متد پایه ای که وجود داره فرق می کنه.
تعریفتون رو درست انجام بدید.