Example #1
0
        /// <summary>
        /// 當一個 RTD 被 Excel 建立時,會呼叫 RTD 的這個函式,將該 Excel 的通知物件傳入,以供 RTD 使用,當 RTD 要更新資料時,就需要呼叫它
        /// 我們可以在這個函式建立 RTD 的初始化動作
        /// </summary>
        /// <param key="CallbackObject"> Excel 更新通知物件</param>
        /// <returns> 主動回予 1 表示正常, 0 表示不正常 </returns>
        int Microsoft.Office.Interop.Excel.IRtdServer.ServerStart(Excel.IRTDUpdateEvent CallbackObject)
        {
            try
            {
                lock (fSyncLock)
                {
                    fIsWorking = true;
                    //接入 Excel 更新物件
                    fTargetUpdateEvent = CallbackObject;

                    fUpdateList          = new Dictionary <int, object>();
                    fComm2TopicId        = new Dictionary <string, List <CMoneyTopic> >();
                    f_Data               = new DataProvider();
                    f_Data.Update_Event += new Delegate_Update(UpdateExcel);
                    f_Data.StartWork();
                    ////初始資料提供者,這時資料提供者應該要進行初始化資料的取得
                    //InitDataProvider();

                    //todo :這裡應該要檢查該有的都有了才回傳 1 不然還是要回 0
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("[CmRealTickRtd]無法正常啟動,錯誤訊息:" + ex.Message);
                return(0);
            }

            CMGlobal.ShowErrMsg();

            //MessageBox.Show("[CmRealTickRtd]服務啟動");
            return(1);
        }
Example #2
0
        /// <summary>
        /// 當 Excel 因為被修改而刪除一個無用的資料連接時,會呼叫本函式來通知,讓 RTD 可以除去無用的 TopicId,減少資料異動的維護
        /// </summary>
        /// <param key="TopicID">指定要刪除的資料連接</param>
        void Microsoft.Office.Interop.Excel.IRtdServer.DisconnectData(int TopicID)
        {
            lock (fSyncLock)
            {
                try
                {
                    //一個 Topic 不要了,移除關聯

                    if (fTopic2Comm.ContainsKey(TopicID))
                    {
                        string commkey = fTopic2Comm[TopicID];
                        if (fComm2TopicId.ContainsKey(commkey))
                        {
                            List <CMoneyTopic> topicList = fComm2TopicId[commkey]; //股票代號的關聯資料
                            topicList.RemoveAll(o => o.TopicID == TopicID);
                        }
                        f_Data.DisSubComm(commkey);  //移除註冊即時代號
                    }
                    fTopic2Comm.Remove(TopicID);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("CmRealTickRtd[IRtdServer.DisconnectData] 發生例外:" + ex.Message + ", RTD 代號:" + TopicID.ToString());
                }
                CMGlobal.ShowErrMsg();
            }
        }
Example #3
0
        /// <summary>
        /// 當 Excel 建立一個新的資料連接時,會給予一個 TopicId,它可以被多個 Excel cell 共用,表同一個資料,每次 Excel 判斷需要以新的連接來連結資料時就會呼叫這個函式
        /// 並以傳入的 TopicId 作為該連接的識別碼
        /// </summary>
        /// <param key="TopicID">資料連接識別碼</param>
        /// <param key="Strings">連接所夾帶的參數列,可以是變動的陣列</param>
        /// <param key="GetNewValues">MSDN:True to determine if new values are to be acquired</param>
        /// <returns>該連結的預設值</returns>
        object Microsoft.Office.Interop.Excel.IRtdServer.ConnectData(int TopicID, ref Array Strings, ref bool GetNewValues)
        {
            lock (fSyncLock)
            {
                try
                {
                    ////一個新的 Topic 進來,先解出與它相關聯的 commkey and column 設定,將關聯加到資料結構裡
                    string commID = Strings.GetValue(0).ToString();
                    if (commID.ToLower() == "version")
                    {
                        return("Ver:" + FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion.ToString());
                    }
                    string pName = Strings.GetValue(1).ToString(); //屬性名稱
                    f_Data.SubComm(commID);                        //註冊即時代號
                    #region 建立關聯
                    List <CMoneyTopic> topicList = new List <CMoneyTopic>();
                    if (fComm2TopicId.ContainsKey(commID))
                    {
                        topicList = fComm2TopicId[commID]; //股票代號的關聯資料
                    }
                    int findTopic = (topicList.FindIndex(o => o.TopicID == TopicID));
                    if (findTopic == -1)
                    {
                        topicList.Add(new CMoneyTopic(TopicID, commID, pName));
                    }
                    fComm2TopicId[commID] = topicList;
                    //Topic
                    //string[] commIDs = commkey.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                    fTopic2Comm[TopicID] = commID;
                    #endregion

                    if (f_Data.ChangedComms().Contains(commID) == false)
                    {
                        GetNewValues = false;
                        return(commID + ":Not Ready");
                    }
                    //ColumnIndicater colIndex = (ColumnIndicater)int.Parse(Strings.GetValue(1).ToString());
                    //AddTopicIdIntoDataStructure(TopicID, commkey, colIndex);

                    //標回傳有用的值,如果有值就刷值,沒值也要刷個空白或問號的,所以來呼叫了就是會有新值刷回去
                    GetNewValues = true;

                    return(commID + ":Ready");
                }
                catch (Exception e)
                {
                    CMGlobal.addErr(e.Message);
                }
                CMGlobal.ShowErrMsg();
                //沒有正常取得的,目前就是給它一個問號,刷掉原本畫面上的資料
                return("?");
            }
        }