View Full Version : چند سوال در مورد ساختن ActiveX در دلفی
Moharram
چهارشنبه 09 آذر 1384, 16:04 عصر
سلام
من میخوام تو دلفی ActiveX درست کنم. می خواستم بببینم که آیا زبان برنامه نویسی رو درست انتخاب کردم یا نه. آخه شنیدم که میگن تو Visual C بهتر میشه AvtiveX درست کرد.
بعدش اینکه چقدر می تونم از کنترلهای دلفی تو AvtiveForm دلفی استفاده کنم.
من فعلا یه AvtiveForm دارم که می تونم توش متد و Property تعریف کنم و فعلا این OCX رو تو VB باز می کنم و جواب میگیرم ولی نمی تونم Event تعریف کنم.
یه سوال دیگه اینکه برای گرفتن Message های ویندوز، یه کنترل ApplicationEvent گذاشتم و تو رویداد OnMessage اون کدنویسی کردم ولی این رویداد هیچوقت اجرا نمی شه.
خیلی ممنون
Touska
چهارشنبه 09 آذر 1384, 17:00 عصر
در مورد سئوال اولت اینکه آره زبان درستی انتخاب کرده اید و
سئوال دوم از کامپوننتها هم می شه تو Activex Form استفاده نمایید.
شما برای بدست آوردن Message های ویندوز می تونید به این روش هم عمل کنید :
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
برای مثال این تایع زمانی اجرا میشه که سیستم می خواهد خاموش شود.
و طریقه استفاده از آن :
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
// Do Some things...
inherited;
end;
Moharram
پنج شنبه 10 آذر 1384, 14:13 عصر
جناب Touska خیلی ممنون ولی :
اجازه بدید قسمت دوم سوالم رو بیشتر توضیح بدم ...
تو یه برنامه دیگه من یه Message رو BroadCast میکنم و میخوام TApplicationEvent اونو بگیره. ولی نمیگیره!
درضمن این راه حل که گفتی برای Message های خاصه (مثل خاموش شدن). چه جوری میتونم همه Message ها رو بگیرم؟
Naficy
دوشنبه 14 آذر 1384, 13:17 عصر
به نظر من اصولا استفاده از Application ... درون یک ActiveX کار جالبی نیست.
چه جوری میتونم همه Message ها رو بگیرم؟
منظورتان از «همه» پیغامها چیست؟
تو یه برنامه دیگه من یه Message رو BroadCast میکنم و میخوام TApplicationEvent اونو بگیره. ولی نمیگیره!
منظورتان از BroadCast کردن یک پیغام چیست؟ بیشتر توضیح دهید.
اگر منظورتان ارسال پیغام به تمامی پنجره های TopLevel (پنجره های بدون Parent) باشد؛ که معمولا ActiveX شما دارای Parent خواهد بود. بنابراین این پیغام را دریافت نخواهد کرد. و باید یک پنجره TopLevel بسازید و اینگونه پیغامها را با آن دریافت کنید. برای این کار احتمالا تابع AllocHwnd (اگه اشتباه ننوشته باشم) مفید است. (یا می توانید از روشهای بهتری برای ارسال پیامتان بهره بگیرید)
Moharram
چهارشنبه 16 آذر 1384, 19:04 عصر
Naficy جون
ببین با تابع PostMessage و با آرگومان HWND_BROADCAST مسیجها رو broadcast میکنم و تو اون یکی برنامه با رویداد OnMessage پیامارو می گیرم.
Naficy
دوشنبه 21 آذر 1384, 12:26 عصر
خب پس همانطوری بود که فکر می کردم. از همان روشی که گفتم استفاده کنید.
ضمنا متن زیر از راهنمای MSDN در مورد ارسال این پیامهاست:
If this parameter is HWND_BROADCAST, the message is sent to all top-level windows in
the system, including disabled or invisible unowned windows, overlapped windows, and pop-up
windows; but the message is not sent to child windows.
Moharram
دوشنبه 21 آذر 1384, 14:34 عصر
ببخشید آقای نفیسی،
بهتره اینو بگم که من با اکتیوفرم کار می کنم. یعنی Parent نداره یا حداقل من نمی دونم Parent کجاس؟
Naficy
چهارشنبه 23 آذر 1384, 16:13 عصر
مهم نیست که شما بدانید parent پنجره چیست. از آنجا که معمولا هر activex درون یک کنترل دیگر قرار می گیرد (و دارای parent است) نمی تواند پیغامهای broadcast را دریافت کند. شما باید یک پنجره TopLevel بسازید تا چنین پیامهایی را دریافت کند. (کاری که شی Application نیز انجام می دهد) برای اینکار هم می توانید از تابع AllocateHwnd استفاده کنید. (دفعه قبل نام تابع را اشتباه نوشته بودم) راهنمای این تابع را بخوانید.
Moharram
دوشنبه 28 آذر 1384, 13:16 عصر
آقای نفیسی، ببینید من اینجوری Message هارو دریافت می کنم:
procedure ReadMSG(var Message:TMessage) : Message WM_USER+1
اشکال این روش اینجاس که باید Handle اکتیوایکس رو بدونی. البته من فعلا Handle رو می خونم و تو یه Property قرار میدم. ولی نمی دونم چجور میشه BroadCast کرد.
اجازه میدید که خود برنامه رو براتون Upload کنم یه نگاهی بهش بندازید؟
خیلی ممنون
Naficy
شنبه 03 دی 1384, 15:04 عصر
اگر شما یک هندل را به کمک AllocateHwnd بسازید، پنجره ساخته شده TopLevel خواهد بود و پیامهای BroadCast شده را دریافت خواهد کرد.
ضمنا توجه دارید که اگر می خواهید پیامی را BroadCast کنید، حتما باید قبلش آنرا رجیستر کنید. (RegisterWindowMessage )
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.