PDA

View Full Version : مشکل با AddressOf



حامد مصافی
پنج شنبه 18 فروردین 1384, 00:21 صبح
من وقتی سعی می کنم با AddressOf محل تابع رو اعلام کنم با خطای زیر مواجه میشم


(471): 'AddressOf' expression cannot be converted to 'Integer' because 'Integer' is not a delegate type.



در ضمن تابع مورد نظر Event یک کنترل نیست بلکه یک تابع تعریف شده است
از کمکتون پیشاپیش ممنونم

Farhad.B.S
پنج شنبه 18 فروردین 1384, 10:39 صبح
AddressOf رو به چه چیزی نسبت میدی ؟ قسمت مورد داره کد رو اینجا بذار .

titbasoft
پنج شنبه 18 فروردین 1384, 11:20 صبح
وقتی از addressof استفاده می کنید باید نام تابعتون رو بدون پارامتر ها ذکر کنید.
این مشکل می تونه از اینجا هم ناشی بشه که شما از متدی استفاده می کنید که پارامتر ورودی آن از نوع integer هست ولی شما از addressof برای پاس کردن پارامتر به اون متد استفاده کردید. باید توجه داشته باشید که مقدار برگشتی addressof از نوع delegate است

به این کد هم توجه کنید:اگر تابعتون به صورت زیر تعریف شده:

Private Sub DoSome (a As Integer)
ابتدا باید یک delegate به صورت زیر یعنی با همون signiture تابعتون تعریف کنید:

Delegate sub MyDelegate (par1 As Integer)
سپس به روش زیر به آن point کنید:

Dim savedPointer As MyDelegate = AddressOf DoSome
:flower: :wink:

حامد مصافی
جمعه 19 فروردین 1384, 00:41 صبح
جناب titbasoft از راهنمایی شما ممنون ولی مشکل من حل نشد (یا اینکه من نتونستم حلش کنم)
در هر صورت این کدیه که می خوام بنویسم


Private Const GWL_WNDPROC As Short = -4
Private Const WM_PAINT As Short = &HFS

Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Integer, _
ByVal hWnd As Integer, _
ByVal Msg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer

Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
ByVal hWnd As Integer, _
ByVal nIndex As Integer, _
ByVal dwNewLong As Integer) As Integer


Private Function WindowProccess(ByVal hWnd As Integer, _
ByVal uiMsg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer
If uiMsg = WM_PAINT Then
'...
Else
CustomTipProc = CallWindowProc(WndProc(i).lPrevWndProc, hWnd, uiMsg, wParam, lParam)
End IF
End Function


Public Sub HookWindow(hwnd As Integer)
Dim intWndProccess As Integer
intWndProccess = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProccess)
End Sub


البته من قسمت هایی از کد رو که به سوال مربوط نبودن به خاطر خوانایی کد حذف کردم

Farhad.B.S
جمعه 19 فروردین 1384, 01:43 صبح
میبایست پارامتر dwNewLong تابع SetWindowLong رو از نوع عددی به نوع یک دیلیگیت از جنس تابعی که قراره آدرسش پاس داده بشه تغییر بدی...
یه همچین روشی تقریبا ->
http://www.dotnet247.com/247reference/msgs/28/141822.aspx