自製懶人版的DbxDAC |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
可以的
在這個Demo中有實際在Design mode下連結過MySQL 所以DataSource.DataSet會是:DbxDataSet1.cds DbxDataSet的圖片大小是SimpleDataSet的四倍大(笑) 雖然不像是SimpleDataSet這麼迷你,不過比起那個有時侯會異常的「SimpleDataSet.InternalDataSet」 還不如像DbxDataSet1.ClientDataSet會比較直覺 ===================引 用 sryang 文 章=================== Design Time 能和 DataSource 對應到嗎?不能吧 要搞 VCL component 就要考慮 design time 跟 run time 做戲要做全套囉~~ |
sryang
尊榮會員 發表:39 回覆:762 積分:920 註冊:2002-06-27 發送簡訊給我 |
個人覺得不可見元件的基類還是使用 TComponent 比較好,你這樣寫是無法放進 TDataModule 裡面的
既然要做的是 DataSet,當然直接繼承自 TClientdataSet 是最好的 裡面再包含 TDataSetProvider 與 TSQLQuery,這兩個是 private 成員 這樣用起來更直覺 另外,還有幾個問題:
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
編輯記錄
sryang 重新編輯於 2013-04-18 16:24:12, 註解 無‧
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
要放TDataModule就認命拉三大元件吧,要不就復刻的SQLClientDataSet會好一些
而那個SimpleDataSet是真的非常非常非常不好用 題外話:SQLClientDataSet真的比較安定,只是2009開始就轉不上去了 考慮在下的功力 以BUG產出量的前提下,包在TFrame裡會比較安全 可以把TSQLQuery和TDataSetProvider放在TFrame的Private區塊中 然後再實作出代理人的機制會更佳的完美 考量了第一 二項問題, 可以 不隱藏TSQLQuery 隱藏TDataSetProvider然後實作出DataSetProvider部份的Property和Event 第三項問題在2-Tier中可以在ClientDataSetReconcileError直上 第四項問題我可能會傾向實作DataSetProvider的DataSetProviderBeforeUpdateRecord來硬上吧 因為我不知道ADO的Join Table要怎麼做…… 所以參考這樣的程式,我想應該可以解決Join Table的問題 [code delphi] /// 資料來源:TDataSetProvode提交數據 procedure Tfrm_docD360YH.dsp_DTBeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); var I: Integer; Modifyed: Boolean; begin Inherited; //增加更新狀態 由於下面 Applied := Not Modifyed會將下一筆更新語句狀態清空, //所以必須先將所有字段打上更新標記 for I := 0 To DeltaDS.Fields.Count - 1 do DeltaDS.Fields[i].ProviderFlags := DeltaDS.Fields[i].ProviderFlags [pfInUpdate]; {增加鍵值} DeltaDS.FieldByName('D12101').ProviderFlags := DeltaDS.FieldByName('D12101').ProviderFlags [pfInKey] - [pfInUpdate]; //去掉計算字段更新標誌 DeltaDS.FieldByName('B03002').ProviderFlags := DeltaDS.FieldByName('B03002').ProviderFlags - [pfInUpdate]; DeltaDS.FieldByName('B03004').ProviderFlags := DeltaDS.FieldByName('B03004').ProviderFlags - [pfInUpdate]; if UpdateKind = ukModify then begin Modifyed := False; //去掉未修改字段更新標誌 for I := 0 To DeltaDS.Fields.Count - 1 do begin if Not (pfInKey In DeltaDS.Fields[i].ProviderFlags) and (DeltaDS.Fields[i].Value = null) and (DeltaDS.Fields[i].OldValue <> null) then DeltaDS.Fields[i].ProviderFlags := DeltaDS.Fields[i].ProviderFlags - [pfInUpdate]; end; for I := 0 To DeltaDS.Fields.Count - 1 do begin if pfInUpdate In DeltaDS.Fields[i].ProviderFlags then begin Modifyed := True; Break; end; end; Applied := Not Modifyed; end; end; [/code] 可是這樣又不能把DataSetProvider藏起來了,矛盾! 哈! ===================引 用 sryang 文 章=================== 個人覺得不可見元件的基類還是使用 TComponent 比較好,你這樣寫是無法放進 TDataModule 裡面的 既然要做的是 DataSet,當然直接繼承自 TClientdataSet 是最好的 裡面再包含 TDataSetProvider 與 TSQLQuery,這兩個是 private 成員 這樣用起來更直覺 另外,還有幾個問題:
編輯記錄
GrandRURU 重新編輯於 2013-04-18 17:35:49, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |