TStringGrid(DBGrid1).RowCount 的問題 |
答題得分者是:william
|
hagar
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
語出這一題, http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38959 小弟查了一下, TDBGrid 與 TStringGrid 的祖先分別為,
TDBGrid: TObject -> ... -> TCustomGrid -> TCustomDBGrid
TStringGrid: TObject -> ... -> TCustomGrid -> TDrawGrid
可知二者的共同祖先是從 TCustomGrid 往上
而 TCustomGrid 在 protoected 區段有個 RowCount 的 property
在 TDBGrid 沒有開放 RowCount 這個屬性
在 TStringGrid 有,
所以可以使用 TStringGrid(DBGrid1).RowCount 的方式取得 DBGrid1 的 RowCount,
請問一下, 為什麼 TStringGrid(DBGrid1) 這句該怎麼解釋?
另語出這一題: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38801
為什麼在如下的宣告後
type
TAccessDBGrid = class(TDBGrid);
就可以使用 TCustomGrid 的 protected 區段內的 RowHeights property
而 TDBGrid 也是繼承自 TCustomGrid, 卻不能使用 RowHeights property? ---
歡迎光臨 KTop 研究院
|
william
版主 ![]() ![]() ![]() ![]() ![]() 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
引言: 語出這一題, http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38959 小弟查了一下, TDBGrid 與 TStringGrid 的祖先分別為, TDBGrid: TObject -> ... -> TCustomGrid -> TCustomDBGrid TStringGrid: TObject -> ... -> TCustomGrid -> TDrawGrid 可知二者的共同祖先是從 TCustomGrid 往上 而 TCustomGrid 在 protoected 區段有個 RowCount 的 property 在 TDBGrid 沒有開放 RowCount 這個屬性 在 TStringGrid 有, 所以可以使用 TStringGrid(DBGrid1).RowCount 的方式取得 DBGrid1 的 RowCount, 請問一下, 為什麼 TStringGrid(DBGrid1) 這句該怎麼解釋? I can only say this is a very DIRTY trick... It makes no sense at all since TStringGrid and TDBGrid are not compatible... Well, I even consider it is a BUG....it works now does not guarantee it will work in future.... 另語出這一題: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38801 為什麼在如下的宣告後 type TAccessDBGrid = class(TDBGrid); 就可以使用 TCustomGrid 的 protected 區段內的 RowHeights property 而 TDBGrid 也是繼承自 TCustomGrid, 卻不能使用 RowHeights property? Remember all classes can access other classes' property (even private)? So defining TAccessDBGrid in your unit makes classes/functions inside the same unit some kind of 'friend' in accessing the protected properties... --- 歡迎光臨 KTop 研究院 |
wuabc
初階會員 ![]() ![]() 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
引言:TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?引言: 語出這一題, http://delphi.ktop.com.tw/topic.php?TOPIC_ID=38959 小弟查了一下, TDBGrid 與 TStringGrid 的祖先分別為, TDBGrid: TObject -> ... -> TCustomGrid -> TCustomDBGrid TStringGrid: TObject -> ... -> TCustomGrid -> TDrawGrid 可知二者的共同祖先是從 TCustomGrid 往上 而 TCustomGrid 在 protoected 區段有個 RowCount 的 property 在 TDBGrid 沒有開放 RowCount 這個屬性 在 TStringGrid 有, 所以可以使用 TStringGrid(DBGrid1).RowCount 的方式取得 DBGrid1 的 RowCount, 請問一下, 為什麼 TStringGrid(DBGrid1) 這句該怎麼解釋? I can only say this is a very DIRTY trick... It makes no sense at all since TStringGrid and TDBGrid are not compatible... Well, I even consider it is a BUG....it works now does not guarantee it will work in future.... |
Jasonwong
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:49 回覆:931 積分:581 註冊:2006-10-27 發送簡訊給我 |
引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心 |
wuabc
初階會員 ![]() ![]() 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
引言:就算是吧!不過卻是多型的誤用 至於為什麼要這樣用?答案是只為了便宜行事, 我還是強調,偶而為之可以,至少應該小心地用, 因為它不符合OO概念,看看下面引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽 TEdit(Label1).Text := 'abc'; [compile: OK / work: OK] TLabel(Edit1).Caption := 'def'; [compile: OK / work: OK] TEdit(Label1).SetFocus; [compile: OK / work: Access Violation] |
Jasonwong
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:49 回覆:931 積分:581 註冊:2006-10-27 發送簡訊給我 |
引言: 就算是吧!不過卻是多型的誤用 至於為什麼要這樣用?答案是只為了便宜行事, 我還是強調,偶而為之可以,至少應該小心地用, 因為它不符合OO概念,看看下面不對~不對~你還是誤解了多型的意義~~ 多型的意義在於~你可以在不同的物件中可以互轉~以達到軟體IC 的目的~ 到時候我只要換物件而其他的不必去更改程式~就像硬體~那裡壞了就換那裡的意思~ 像 TStringGrid(DBGrid1) 這個就是最佳的範例~TDBGrid 並沒有開放 RowCount 這個屬性~所以我可以用 TStringGrid 來轉~這樣就達到互轉的目的~ 如果照正常的寫法~你是不是還要去繼承一個 TCustomGrid 然後再把 RowCount 屬性開放出來~這樣你的程式就不是一個以物件的觀念去寫出來的程式~~而是一個觀念仍停留在舊有的結構化上~~ 至於 TEdit(Label1).SetFocus; 這行為什麼會錯~這代表你對物件階層沒有充分的去了解所致~讓我們來看看 TEdit 跟 TLabel 的物件階層 TEdit-> TCustomEdit-> TWinControl-> TControl-> TComponent-> TPersistent-> TObject TLabel-> TCustomLabel-> TGraphicControl-> TControl-> TComponent -> TPersistent-> TObject 請你比照上面兩物件所繼承的階層~~TEDIT 跟 TLABEL 所繼承的物件跟本就不一樣~~怎麼可以跟這次的主題去做比照呢 如果你要讓物件有 FOCUS 的話~~你就必須從 TWinControl (因為 TWinControl 有HANDLE) 繼承下來才行~~而 TLABEL 是從 TGraphicControl (GraphicControl 是沒有 HANDLE 的) 繼承下來的~~所以這也就是 TEdit(Label1).SetFocus; 這行為什麼會錯的原因了 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心TEdit(Label1).Text := 'abc'; [compile: OK / work: OK] TLabel(Edit1).Caption := 'def'; [compile: OK / work: OK] TEdit(Label1).SetFocus; [compile: OK / work: Access Violation]
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心 |
syntax
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言:這才不是多型的應用 而是編譯器的關係 RowCount 指向的 table 都指在在同一個位置 所以才會在不同 component 能存取到相同的東西 不算是 BUG 也不算是多型 因為所謂的多型在定義上, 是要有共同的繼承來源 而雖然都是有 TCustomGrid 的祖先, 但是只是名稱一樣而已, 沒有"血緣"關係 既無"繼承/血緣"之實, 何來"多型"之說 ?引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心 |
wuabc
初階會員 ![]() ![]() 發表:6 回覆:60 積分:33 註冊:2002-10-28 發送簡訊給我 |
|
dllee
站務副站長 ![]() ![]() ![]() ![]() ![]() ![]() 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
同意 william 版主的說法。
對於這類的使用,也不是一定都可以用,如果 DBGrid 就是沒有 RowCount 的數值,那硬轉得到的也不是真正想要的數值。
例如:
■【問題】如何計算 Filter 後 TTable 的 RecordCount
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37491
這個 RecordCount 都已是現有的屬性了,使用時還是得不真正想要的數值,不論再將它轉成它的父母或同輩,甚至是子孫,得不到就是得不到。 如果,轉一下就可以得到數值的,我想,元件本身都已具有該值,只是有沒有分享出來而已,這樣的話,不論是轉成父母或同輩都可以正確取得該值。 轉到會 Access Violation ,應該是元件本身就沒有對應的屬性或方法,直接硬轉操作自然就掛。
在 BCB 中有 dynamic_cast 之類的東西可以「試轉」轉成功的再使用,應該就不會有 Access Violation 的問題。 沒空更新的網頁...
http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
syntax
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
引言: 先說我舉例TEdit(Label1).SetFocus的目的只是要突顯這種用法的危險性 就像StrToInt()一樣要由你的程式自行負責轉換的成敗Compiler可不會管你 再說,為什麼我同意William兄說的這可能是(或視同是)一種BUG的原因是, 就封裝的目的來說,DBGrid既然沒有開放RowCount的原因,也許作者認為不 需要也或許作者根本不希望你去存取這個欄位,而今透過這種作弊方式卻讓 作者的目的破功,當然是一個漏洞(不必太在意BUG這字眼)稱不上是"讓作者的目的破功"吧 依物件的原則,繼承後就可以公開 何必用蹩腳的怪方法,還容易造成程式錯誤 |
william
版主 ![]() ![]() ![]() ![]() ![]() 發表:66 回覆:2535 積分:3048 註冊:2002-07-11 發送簡訊給我 |
|
shaofu
高階會員 ![]() ![]() ![]() ![]() 發表:5 回覆:136 積分:103 註冊:2003-01-07 發送簡訊給我 |
|
danny
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
引言:這應該不能稱為多型, 而應稱為強轉型. Delphi 提供二種轉型方法 1. TClassname(Object) 強轉型 2. (Object as TClassname) 安全轉型 以上要自己維護其正確性, 一般都是以簡單方便為目的.引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽
------
將問題盡快結案也是一種禮貌! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |