/// <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); }
/// <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(); } }
/// <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("?"); } }