2008-10-07 27 views
16

Tôi lo sợ điều này có lẽ là một câu hỏi giả, nhưng nó khiến tôi khá bối rối.Làm thế nào để vượt qua một phương pháp đối tượng như một tham số trong Delphi, và sau đó gọi nó?

Tôi đang tìm cách đơn giản nhất có thể để truyền phương thức của đối tượng vào quy trình, để thủ tục có thể gọi phương thức của đối tượng (ví dụ: sau khi hết giờ hoặc có thể trong một chuỗi khác). Vì vậy, về cơ bản tôi muốn:

  • Chụp tham chiếu đến phương pháp của đối tượng.
  • Chuyển tham chiếu đó đến quy trình.
  • Sử dụng tham chiếu đó, hãy gọi phương thức của đối tượng từ quy trình.

Tôi hình tôi có thể đạt được hiệu ứng tương tự bằng cách sử dụng giao diện, nhưng tôi nghĩ có một cách khác, vì khai báo kiểu "thủ tục đối tượng" này tồn tại.

sau đây không hoạt động, nhưng nó có thể giúp giải thích nơi tôi bị nhầm lẫn ...?

interface 
    TCallbackMethod = procedure of object; 

    TCallbackObject = class 
    procedure CallbackMethodImpl; 
    procedure SetupCallback; 
    end; 

implementation 

procedure CallbackTheCallback(const callbackMethod: TCallbackMethod); 
begin 
    callbackMethod(); 
end; 

procedure TCallbackObject.CallbackMethodImpl; 
begin 
    // Do whatever. 
end; 

procedure TCallbackObject.SetupCallback; 
begin 
    // following line doesn't compile - it fails with "E2036 Variable required" 
    CallbackTheCallback(@self.CallbackMethodImpl); 
end; 

(Khi câu hỏi được trả lời tôi sẽ loại bỏ các mã trên trừ khi nó hỗ trợ việc giải thích bằng cách nào đó.)

+0

Vui lòng để lại mã. –

+0

ấn tượng như thế nào một số người làm những việc theo cách khó khăn hơn, phân tích các phương pháp gọi thread ở đây, nơi tôi làm việc, nó sẽ dễ dàng hơn nhiều nếu họ đã thực hiện các cuộc gọi bằng cách sử dụng phương pháp này. thx cho câu hỏi – kabstergo

Trả lời

18

Chỉ cần loại bỏ những thứ Pointer. Delphi sẽ làm điều đó cho bạn:

procedure TCallbackObject.SetupCallback; 
begin 
    CallbackTheCallback(CallbackMethodImpl); 
end; 
+0

Đơn giản, cảm ơn! –

2

Lý do bạn không cần cú pháp con trỏ là bạn đã khai báo kiểu phương thức làm thủ tục đối tượng. Trình biên dịch sẽ tìm ra từ câu lệnh "của đối tượng" cách xử lý truyền phương thức ra khỏi proc gọi lại.

+0

Tôi hiểu - cảm ơn :) –

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