PDA

View Full Version : تعريف كنترل داخل Component جهت تبادل Message



مصطفی ساتکی
جمعه 15 مرداد 1389, 09:07 صبح
سلام.
يك كامپوننت ‍Center داريم كنترل هاي A ,B ,C وقتي كه رويداد OnMouseMove توشون رخ ميده بايستي به كامپوننت Center اطلاع داده بشه چون Component دراين حالت بايستي يك Control داخل Center‌تعريف كنيم تا بتونيم بهش پيام بفرستيم. و همه كنترل ها هم WndProc مربوط به كنترل داخل Center رو دارن كه از پيام مربوطه مطلع ميشن. يا بيام براي كامپوننت بجاي Control يه Handle تعريف كنيم و از طريق اون پيام رد و بدل كنم.
حالا بجز اين روش ها ، راه بهتري سراغ داريد

vcldeveloper
جمعه 15 مرداد 1389, 18:03 عصر
من متوجه نشدم که دارید دقیقا چی کار می کنید...

یک کامپوننت دارید که اسمش Center هست؟ یا اینکه منظور این هست که این کامپوننت یک کامپوننت مرکزی هست، که سایر کامپوننت ها بهش وصل میشند؟

کنترل های A, B, C کنترل های نوشته شده توسط خودتان هستند؟ یا هر کنترلی می تونند باشند؟ اگر قراره کنترل های A, B, C رو هم خودتون تعریف کنید، باید یک متد در کامپوننت Centerتون تعریف کنید، که کنترل های A, B, C اون متد رو در زمان نیاز فراخوانی کنند، و از این طریق به اون کامپوننت اطلاع بدند.
اگر اینها کنترل ها و کامپوننت هایی هستند که توسط خودتون نوشته نمیشند، پس باید از همون راهکارهای ارائه شده توسط VCL یا ویندوز استفاده کنید، یعنی هر زمان که رویداد مربوطه رخ داد، متد Perform مربوط به Center را اجرا کنید، یا با استفاده از SendMessage یا PostMessage بهش پیام ارسال کنید. البته لازمه استفاده از متد Perform این هست که کامپوننت Center شما باید از TControl مشتق شده باشه. اما اگر بخواید از SendMessage و PostMessage استفاده کنید، اون وقت کامپوننت Center شما باید از TWinControl مشتق شده باشه، چون SendMessage و PostMessage نیاز به Handle پنجره دارند، و فقط کنترل های WinControl این هندل رو به طور پیش فرض دارند.

مصطفی ساتکی
شنبه 16 مرداد 1389, 17:52 عصر
Center از كلاس tcomponent است و كنترل هاي A,B,C كنترل هاي سفارشي كه از كلاس TCustom‍Control مشتق شده .حالا مي خواستم به Center از كنترل هاي پيام بفرستم كه چون از كلاس Tcontrol نيست handle نداره پس من بايستي براش يه handle تعريف كنيم و كنترل ها بايستي هر كدومش به wndproc رو براي كامپوننت داشته باش تا پيام هاي dispatch بشه چون يه دوجين پيامه بخاطر همين ميخام به wndProc كامپوننت شبيه سازي كنم . يه همچين كاري دلفي براي كلاس ttimer انجام داده.
حالا مشكلم اينجاست كه Center‌حتماً بايستي از نوع tcomponent باشه

vcldeveloper
شنبه 16 مرداد 1389, 18:35 عصر
حالا مي خواستم به Center از كنترل هاي پيام بفرستم كه چون از كلاس Tcontrol نيست handle نداره
TControl نیاز به Handle نداره، بلکه میتونه با استفاده از متد Perform، بدون نیاز به Handle، پیام دریافت کنه.
TWinControl خصوصیت Handle داره.


يه همچين كاري دلفي براي كلاس ttimer انجام داده.
کلاس TTimer از AllocateHWnd ویندوز استفاده میکنه که یک پنجره مخفی میسازه، و از طریق اون، پیام های رسیده به صف پیام های پنجره رو پردازش میکنه. نه تنها TTimer، بلکه بعضی از سایر کامپوننت ها که نیاز به پنجره دارند، مثل TrayIcon هم از این تکنیک استفاده می کنند.
شما اگر ساخت کنترل های A, B, C را هم خودتان در دست دارید، باید در کلاس Center یک متد برای انجام کار مربوطه تعریف کنید، تا کنترل های A, B, C در صورت لزوم، از آن متد برای با خبر کردن کلاس Center استفاده کنند.
اگر ساخت کنترل های A, B, C در اختیار شما نیست، و کلاس Center هم باید حتما TComponent باشه، اون وقت باید از همون AllocateHWnd استفاده کنید.