2009-09-29 34 views
7

Làm cách nào để chuyển một hàm theo tham số, sau này được gọi trong VB6? sẽ là một cái gì đó giống như những gì tôi cần, có thể là bất kỳ các tùy chọn này:vb6 - Cách chuyển một hàm cho tham số?

Private Sub Command1_Click() 

    Call callMethod(MyPrivateFunction) 
    Call callMethod(MyPublicFunction) 
    Call callMethod(MyPrivateSub) 
    Call callMethod(MyPublicSub) 

End Sub 

Private Function MyPrivateFunction() 
    MsgBox "MyPrivateFunction" 
End Function 

Public Function MyPublicFunction() 
    MsgBox "MyPublicFunction" 
End Function 

Private Sub MyPrivateSub() 
    MsgBox "MyPrivateSub" 
End Sub 

Public Sub MyPublicSub() 
    MsgBox "MyPublicSub" 
End Sub 

Public Function callMethod(ByRef func As Object) 
    Call func 
End Function 
+0

Liệu nó có phải là đối tượng chức năng không? Tại sao không vượt qua một chuỗi, sau đó sử dụng một tuyên bố trường hợp để gọi chức năng thích hợp? –

+0

Tôi đang sử dụng "Microsoft.XMLHTTP" và sau đó gọi phương thức cần myHttp.OnReadyStateChange = xFunction. Và xFunction nên được thông qua thông số –

+0

Tôi không nhớ vb6 tất cả quá tốt, nhưng tôi nghĩ rằng bạn cần phải sử dụng AddressOf để đăng ký một cuộc gọi lại. Và hàm phải được khai báo trong một mô-đun. – Joepro

Trả lời

6

IIRC có một "AddressOf" chức năng trong VB6 để có được địa chỉ chức năng, nhưng bạn có thể sẽ gặp khó khăn lớn thực sự sử dụng địa chỉ chức năng từ bên trong VB6.

Cách SOP để xử lý vấn đề này là "CallByName()" cho phép bạn thực hiện các chức năng gọi, v.v ... theo tên của chúng.

cuối cùng, bạn cũng có thể đi đường cao, bằng cách sử dụng giải pháp OO tiêu chuẩn cho điều này: Thay vì chuyển hàm, hãy viết lớp của riêng bạn thực hiện giao diện đặc biệt của thiết kế của riêng bạn "MyFunctionInterface". Giao diện này chỉ có một phương thức "FunctionToCall (..)", mà bạn có thể thực hiện trong các lớp khác nhau để gọi các hàm khác nhau mà bạn cần. Sau đó, bạn chuyển một thể hiện của một trong các lớp này tới thường trình của bạn, nó nhận ra nó như là "MyFunctonInterface" và gọi phương thức "FunctionToCall" trên nó. Tất nhiên phải mất rất nhiều thay đổi thiết kế nhỏ ...

+0

Ok, cho rằng tôi sẽ chọn một cấu trúc khác, bởi vì tôi cần giải pháp khác, cảm ơn –

1

Nhận xét của bạn rằng bạn đang sử dụng Microsoft.XMLHTTP OnReadyStateChange thật thú vị. Các MSDN page for OnReadyStateChange nói nó "được thiết kế để sử dụng trong môi trường kịch bản và không dễ dàng truy cập trong Microsoft® Visual Basic®".

Cùng một trang nói rằng trong Visual Basic 6 bạn nên làm điều này. Đặt tuyên bố biến này ở cấp mô-đun

Dim WithEvents xmldoc As DOMDocument30 

và sau đó bạn sẽ có thể xử lý sự kiện theo cách thông thường như thế này.

Private Sub xmldoc_onreadystatechange() 
    ' Deal with the event here ' 
End Sub 

Ngoài ra, còn có thêm thảo luận về chức năng gọi theo tên trong số this question. Nhưng tôi nghĩ đó là giải pháp sai cho vấn đề của bạn.

+0

cảm ơn, tất cả 3 câu trả lời đã giúp tôi rất nhiều quyết định quyết định đưa ra. –

3

Bạn không thể chuyển một hàm, nhưng bạn có thể chuyển một đối tượng hoạt động như một hàm (gọi là "functor" đôi khi). Tôi sử dụng tất cả các thời gian. Nếu bạn "functor" lớp Thực hiện một giao diện, cuộc gọi sẽ được loại an toàn. Ví dụ:

Abstract class (Interface) IAction.cls:

Option Explicit 

Public Sub Create(ByVal vInitArgs As Variant) 

End Sub 

Public Function exe() As Variant 

End Function 

functor có hiển thị một url trong trình duyệt mặc định:

Option Explicit 

Implements IAction 
Dim m_sUrl As String 

Public Sub IAction_Create(ByVal vInitArgs As Variant) 
     m_sUrl = vInitArgs  
End Sub 

Public Function IAction_exe() As Variant 


     Call RunUrl(m_sUrl) 'this function is defined elsewhere 

Exit Function 

Bây giờ bạn có thể tạo ra một loạt các lớp học, lưu chúng vào bộ sưu tập, chuyển chúng vào bất kỳ chức năng hoặc phương pháp nào mong đợi một IAction, v.v.

+0

cảm ơn, tất cả 3 câu trả lời đã giúp tôi rất nhiều quyết định quyết định đưa ra. –

Các vấn đề liên quan