CAEngine::SetCallbackObject

This page is a translated version of the page CAEngine::SetCallbackObject and the translation is 100% complete.

ADE User Guide > ADE Server Class Reference > CAEngine

Other languages:
English • ‎中文

ADE 4.3新特徵

該特徵目前正處於試驗階段。

CAEngine::SetCallbackObject(IUnknown* pCallbackObj)

在ADE計算一個模型或者typescript時,當模型在計算機Analytica中被計算時,將遇到各種要求用戶交互的函數。例如,如果一個表達式包含一個MsgBox函數,Analytica將在一個信息框內顯示一個問題,要求獲取用戶的回答。因為ADE不包含用戶接口,將不會直接處理這些用戶交互。 CAEngine::SetCallbackObject給用戶提供了一種方法在遇到這種事件發生時接收回調,這樣你的程序可以採取預期的動作,例如給用戶顯示一個信息框。

ADE給各種事件(函數或指令)定義各種回調接口,可能觸發用戶接口交互。目前,存在下面的接口:

注意:此計劃是:一旦這通過實驗階段,將添加其它回調接口,對於一些事件,例如ShowProgressBarAskMsgNumberAskMsgText、顯示警告、Show指令(顯示結果、顯示定義、顯示圖形)等等。

用法

要使用回調,你必須執行一個由你想處理和執行其方法的接口所驅動的COM類型。作為一個COM類型,你必須執行標準的IUnknown::QueryInterface COM 方法,這必須報告它支持所有這些接口。然後你再實例化那個類型的例子並將它傳給此方法。

在C++ 中

#使用ADE和&nbsp(不间断空格)输入"ADE.exe";
class MyCallback : public IAMsgBoxCallback {
public:
   STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv) 
   {
       if (riid==IID_IUnknown) {
           *ppv = (LPVOID)dynamic_cast<IUnknown*>(this);
       } else if (riid == __uuidof(IAMsgBoxCallback)) {
           *ppv = (LPVOID)dynamic_cast<IAMsgBoxCallback*>(this);
       } else {
           *ppv = NULL;
           return E_NOINTERFACE;
       }
       AddRef();
       return S_OK;
   }
    
   STDMETHOD(ShowMsgBox)(BSTR title, BSTR text, LONG buttons, LONG* /*out*/ whatPressed) 
   {
       *whatPressed = MessageBox(NULL,text,title,buttons);
       return S_OK;
   }
};
 
void main()
{
    CoInitialize(NULL);
    CAEnginePtr pAde(__uuidof(_CAEngine));
    pAde->SetCallbackObject(new MyCallback);
    ...
    CoUninitilize();
}

在C#中

目前我們還不能在.NET中這樣做——這是為什麼這現在還是一個考慮中的實驗特徵的原因,我們認為C#執行應該類似於這裡我們所看到的,因為我們目前還沒有讓它能能夠成功運行,明顯我們離這還有相當一段距離。我們的兩個理論就是:該類型上的某些額外的.NET屬性的裝飾仍然是需要的,或者某些額外的註冊表設置需要配置。我們在此提供了這方法用來幫助實驗。

using ADE;
namespace MyApp
{
   [Guid("2576608A-833D-4742-BF63-794869E642C3")]    // 使用DevStudio中的Create GUID工具建立你自己的    [ClassInterface(ClassInterfaceType.None)]
   public class MyCallback : IAdeMsgBoxCallback
   {
       public int ShowMsgBox(string title, string text, int buttons)
       {
           MessageBoxButtons btns = (MessageBoxButtons)buttons;
           DialogResult res = MessageBox.Show(text, title, btns);
           return (int)res;
       }
   }
    
   class Program
   {
       static void Main(string[] args)
       {
           CAEngine ade = new CAEngine();
           ade.SetCallbackObject(new MyCallback());
           ...
       }
    }
}
Comments


You are not allowed to post comments.