PDA

View Full Version : OnMouseWheel برای پنل



mrbm_2007
جمعه 23 بهمن 1388, 18:16 عصر
سلام
رویداد OnMouseWheel رو برای یک پنل چطوری می تونم بگیرم؟
میخوام بصورت مستقیم باشه چون می خوام یک کامپوننت بنویسم که توش از پنل استفاده شده و به این رویدادش نیاز دارم.
:متفکر:

Mahmood_M
جمعه 23 بهمن 1388, 18:40 عصر
می تونید پیغامهای ارسال شده به برنامه رو چک کنید ، مثلا اگر یک کامپوننت TApplicationEvents رو روی فرم قرار بدید ، در رویداد OnMessage اون می تونید مقدار پیغام و Handle مربوط به اون رو چک کنید اگر پیغام مربوط به Mouse Wheel بود ( WM_MOUSEWHEEL ) و همچنین اگه Handle پیغام برابر با Handle مربوط به Panel بود کد مورد نظر رو اجرا کنید ...
البته این مورد برای استفاده در برنامه هست ، ولی اگه می خواید در یک کامپوننت از این قابلیت استفاده کنید ، باید یک رویداد برای گرفتن Message در کامپوننتون قرار بدید و در اون رویداد پیغام گرفته شده رو بررسی کنید ، اگر پیغام مربوط به Mouse Wheel بود کد مورد نظر رو اجرا گنید ...
در این صفحه (http://www.delphi3000.com/articles/article_831.asp?SK=) یک نمونه قرار داده شده ، البته دقیقا مربوط به کار شما نیست ولی یک نمونه از نحوه ی گرفتن پیغامهای ویندوز در کامپوننت ارایه شده که مشکلتون رو حل خواهد کرد ، توی اون مثال چون برای یک کامپوننت Non - Visual هست برای دریافت Handle هم کدنویسی شده ولی چون در کامپوننت شما Handle مشخص هست نیازی به بررسی Handle پیغام نیست ، فقط باید پیغام رو چک کنید ...

موفق باشید ...

mrbm_2007
جمعه 23 بهمن 1388, 20:31 عصر
پیغام ها رو که می تونم بگیرم
اینجوری


...
private
procedure WndProc(var Message: TMessage); override;
...
procedure TMyPanel.WndProc(var Message: TMessage);
begin
inherited WndProc(Message);
if (Message.msg = 522) then
//do some thing here.
end;
...
که مقدار مورد نظر هم 522 هست ولی مشکل اینجاست که این پیغام برای پنل فرستاده نمیشه!
برای فرم parent فرستاده میشه!!!
یعنی وقی موس روی پنل هم که باشه بازم این رویدادش برای parent form فرستاده میشه!:متفکر:
باید چکار کنم؟:عصبانی++:

Felony
جمعه 23 بهمن 1388, 21:13 عصر
وظیفه رسم کنترلهایی مثل panel و Image به عهده Parent اون ها هست ، پس هندلی ندارن .

mrbm_2007
جمعه 23 بهمن 1388, 21:18 عصر
panel ها خودشون هندل دارند و از اون برای کارهایی مثل dock کردن فرم درون پنل هم استفاده می شود!
به هر حال تکلیف چیه؟؟؟؟؟؟

Mahmood_M
جمعه 23 بهمن 1388, 22:08 عصر
وظیفه رسم کنترلهایی مثل panel و Image به عهده Parent اون ها هست ، پس هندلی ندارن .
Panel یک WinControl هست پس Handle داره ولی Image یک GraphicControl هست و Handle نداره ، شاید Panel رو با Label اشتباه گرفتی ...

که مقدار مورد نظر هم 522 هست ولی مشکل اینجاست که این پیغام برای پنل فرستاده نمیشه!
برای فرم parent فرستاده میشه!!!
یعنی وقی موس روی پنل هم که باشه بازم این رویدادش برای parent form فرستاده میشه!
باید چکار کنم؟
پیغام به کنترلی که روش فوکوس شده ارسال میشه ، وقتی روی Panel فوکوس نشده باشه ، پیغام بهش ارسال نمیشه ، ولی وقتی که روی Panel فوکوس نشده ، چرا باید پیغام Mouse Wheel رو مدیریت کنید ؟ ، شاید برای یک منظور دیگه ای کاربر از Wheel استفاده کنه ...
نکته ی دیگه اینکه شما توی کدتون این شرط : Message.msg <> 522 رو گذاشتید ، شاید مشکل از این شرطه ! چون برای اینکه چک کنید پیغام دریافت میشه یا نه باید به جای نا مساوی ، مساوی قرار می دادید ...
به هر حال ، نکته ی اصلی اینه که باید روی Panel فوکوس بشه تا پیغام رو دریافت کنه ، یا اینکه با یک نرم افزار دیگه پیغام خاصی رو با دادن نام کلاس Panel بدون فوکوس روی اون بهش بفرستیم که البته ربطی به این موضوع نداره ... !

موفق باشید ...

Felony
جمعه 23 بهمن 1388, 22:33 عصر
panel ها خودشون هندل دارند و از اون برای کارهایی مثل dock کردن فرم درون پنل هم استفاده می شود!
درسته ، حواسم نبود Panel هم مثل Image و Label از نوع کنترل ها گرافیکی نیست .


Panel یک WinControl هست پس Handle داره ولی Image یک GraphicControl هست و Handle نداره ، شاید Panel رو با Label اشتباه گرفتی ...
من الان پست شما رو دیدم ، همونطور که بالا گفتم داشتم چند تا مقاله میخوندم اصلا حواسم به این چیزها نبود ...

mrbm_2007
جمعه 23 بهمن 1388, 22:36 عصر
شما توی کدتون این شرط : Message.msg <> 522 رو گذاشتیداین رو اینجا اشتباه وارد کرد ولی تو کد خودم درست بوده!:خجالت:(اصلاحش کردم)

ولی وقتی که روی Panel فوکوس نشده ، چرا باید پیغام Mouse Wheel رو مدیریت کنید ؟آخه من می خوام وقتی موس روی پنل باشه این رویداد رو فراخوانی بکنه!
البته من با SetFocusedControl هم که فوکوس رو روی پنل قرار می دم جواب نمیده.(از تو فرم این کار رو کردم)
اصلا چجوری میشه رو پنل فوکوس کرد؟:متفکر:

mrbm_2007
جمعه 23 بهمن 1388, 23:05 عصر
حل شد!!
از تو کامپوننت داخل پنل از Self.SetFocus استفاده کردم درست شد!

ممنون

Mahmood_M
جمعه 23 بهمن 1388, 23:08 عصر
آخه من می خوام وقتی موس روی پنل باشه این رویداد رو فراخوانی بکنه!
البته من با SetFocusedControl هم که فوکوس رو روی پنل قرار می دم جواب نمیده.(از تو فرم این کار رو کردم)
اصلا چجوری میشه رو پنل فوکوس کرد؟
برای این کار باید وقتی موس روی Panel اومد ، روی Panel فوکوس کنید ...
توی رویداد OnMouseMove می تونید این کار رو انجام بدید ولی این کار چند تا مشکل هم ایجاد می کنه ، مثلا فرض کنید کاربر داره در یک Edit چیزی رو تایپ میکنه ، حالا اگه موس رو روی Panel ببره فوکوس از روی Edit به روی Panel میره که این اصلا برای کاربر خوشایند نیست ، به هر حال ...
برای فوکوس هم می تونید از SetFocus در داخل خود کامپوننت استفاده کنید ، مثلا : Self.SetFocus

موفق باشید ...

mrbm_2007
شنبه 24 بهمن 1388, 09:42 صبح
این کار رو توی رویداد OnMouseDown انجام میدم
اینجوری بهتره

ممنون