ورود

View Full Version : اجرای یک متد پارامتر دار با BindEvent



NewFoxStudent
دوشنبه 11 شهریور 1387, 15:21 عصر
اگه روالی که توی تابع BindEvent برای اجرا معرفی میکنیم پارامتر داشته باشه چطور باید پارامترش رو ارسال کنیم
مثال


PUBLIC obj
obj = CREATEOBJECT("clsObject")
BINDEVENT(_Screen,"Resize",obj,"SWMsg")
DEFINE CLASS clsObject as Custom
PROCEDURE SWMsg
WAIT WINDOW "This Is A Test Message"
ENDPROC
ENDDEFINE

حالا اگه روال SWMsg پارامتر داشته باشه چجوری این پارامتر رو بهش ارسال کنم

binyaz2003
دوشنبه 11 شهریور 1387, 19:03 عصر
Parameters
oEventSource
Specifies the event source, which must be a valid Visual FoxPro object.
cEvent
Specifies the name of the event, method, or property you want to bind.
oEventHandler
Specifies the object, which must be a valid Visual FoxPro object, handling the event.
cDelegate
Specifies the method, or "delegate", that handles the event for oEventHandler.
The delegate method must have the same parameters as the event specified in cEvent. You can call the AEVENTS() function to retrieve an object reference to the event source. If the delegate method does not have enough parameters to handle those passed by the event, Visual FoxPro generates an error.

NewFoxStudent
شنبه 16 شهریور 1387, 10:58 صبح
از جوابتون ممنونم
اما اگه متدی که میخواهیم اجرا بشه پارامتر نداشت چطور میشه
به عنوان مثال میخواهیم وقتی یه آبجکت کلیک میشه یه تابع که دو تا پارامتر داره اجرا بشه
این پارامترها رو چطوری به تابع ارسال کنیم

BindEvent(Image1,"Click",this,"GetUserName")
تابع GetUserName

Function GetUserName
lPar cUserID,cFileName
Use &cFileName Aliase cc
Select UserName From cc Where UserID = cUserID into Curso Temp
mUserID = Temp.UserID
Use in Temp
Use in cc
return mUserID
endfunc

binyaz2003
شنبه 16 شهریور 1387, 11:14 صبح
خوب شما در متد کليک تصويرتون تابع رو صدا بزنيد.چه اصراري هست که از bindevent استفاده بشه.از اين تابع معمولا در کلاس ها استفاده ميشه.مثلا فرض کنيد يک کلاس ميسازيد که اشيا روي فرمي رو که توش قرار ميگيره رو تغيير اندازه بده و شما دسترسي به کد resize فرم نداريد و نميخواهيد در هر فرمي واقعه resize فرم رو بنويسيد پس از تابع bindevent در واقعه init کلاستون استفاده مکيندي تا مشخص کنيد که هر بار هر فرمي که کنتل شما روش قرار گرفته resize شد متد شما هم صدا زده بشه.

NewFoxStudent
شنبه 16 شهریور 1387, 11:23 صبح
در این مورد هم آبجکت Image در حالت RunTime ساخته میشه و هر شکل مربوط به یک فایل exe هست
میخوام وقتی شکل کلیک میشه فایل exe مربوطش اجرا بشه ولی قبلش باید نام کاربر رو با توجه به شکلی که کلیک شده بدست بیارم

NewFoxStudent
شنبه 16 شهریور 1387, 11:27 صبح
از توجه شما ممنونم
البته من مشکلم رو از این راه حل کردم
وقتی شکل رو روی فرم AddObject میکنم یه پروپرتی هم بهش اضافه میکنم که مقدار پروپرتی UserID هست که از جدول خونده میشه بعد توی GetUserName با تابع AEVENT() میفهمم که کدوم شکل کلیک شده پروپرتی UserID اون شکل رو به جای پارامتر استفاده میکنم

Function GetUserName
aevent(Arr,0)
cUserID = Arr(1).UserID
cFileName = Arr(1).FileName
Use &cFileName Aliase cc
Select UserName From cc Where UserID = cUserID into Curso Temp
mUserName = Temp.UserName
Use in Temp
Use in cc
return mUserName
endfunc

اما ایا میشه با BindEvent تابع پارامتر دار رو اجرا کرد

binyaz2003
شنبه 16 شهریور 1387, 12:40 عصر
همونطور که هلپ رو گزاشتم در صورتي که هر دو واقعه داراي پارامترهاي يکسان باشند پارامترهايي که به واقعه اول فرستاده ميشه به تابع شما هم ارسال ميشه

NewFoxStudent
یک شنبه 17 شهریور 1387, 09:12 صبح
با این تفاسیر راهی نداره
از پاسخهاتون ممنونم