線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2476
推到 Plurk!
推到 Facebook!

TStringGrid(DBGrid1).RowCount 的問題

答題得分者是:william
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-17 15:54:35 IP:202.39.xxx.xxx 未訂閱
語出這一題, 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-17 16:36:07 IP:147.8.xxx.xxx 未訂閱
引言: 語出這一題, 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 研究院 < face="Verdana, Arial, Helvetica">
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-17 22:52:48 IP:203.204.xxx.xxx 未訂閱
引言:
引言: 語出這一題, 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....
TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?
Jasonwong
版主


發表:49
回覆:931
積分:581
註冊:2006-10-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-18 11:52:30 IP:203.75.xxx.xxx 未訂閱
引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?
這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-18 16:27:03 IP:203.204.xxx.xxx 未訂閱
引言:
引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?
這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽
就算是吧!不過卻是多型的用 至於為什麼要這樣用?答案是只為了便宜行事, 我還是強調,偶而為之可以,至少應該小心地用, 因為它不符合OO概念,看看下面
  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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-18 17:35:55 IP:203.75.xxx.xxx 未訂閱
引言: 就算是吧!不過卻是多型的用 至於為什麼要這樣用?答案是只為了便宜行事, 我還是強調,偶而為之可以,至少應該小心地用, 因為它不符合OO概念,看看下面
  TEdit(Label1).Text := 'abc';    [compile: OK / work: OK]
  TLabel(Edit1).Caption := 'def'; [compile: OK / work: OK]
  TEdit(Label1).SetFocus;         [compile: OK / work: Access Violation]
不對~不對~你還是誤解了多型的意義~~ 多型的意義在於~你可以在不同的物件中可以互轉~以達到軟體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; 這行為什麼會錯的原因了 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
------
聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心
傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-18 17:36:54 IP:203.222.xxx.xxx 未訂閱
引言:
引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?
這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽 -- 聰明的人,喜歡猜心;雖然每次都猜對了,卻失去了自己的心 傻氣的人,喜歡給心;雖然每次都被笑了,卻得到了別人的心
這才不是多型的應用 而是編譯器的關係 RowCount 指向的 table 都指在在同一個位置 所以才會在不同 component 能存取到相同的東西 不算是 BUG 也不算是多型 因為所謂的多型在定義上, 是要有共同的繼承來源 而雖然都是有 TCustomGrid 的祖先, 但是只是名稱一樣而已, 沒有"血緣"關係 既無"繼承/血緣"之實, 何來"多型"之說 ?
wuabc
初階會員


發表:6
回覆:60
積分:33
註冊:2002-10-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-19 00:04:48 IP:203.204.xxx.xxx 未訂閱
先說我舉例TEdit(Label1).SetFocus的目的只是要突顯這種用法的危險性 就像StrToInt()一樣要由你的程式自行負責轉換的成敗Compiler可不會管你 再說,為什麼我同意William兄說的這可能是(或視同是)一種BUG的原因是, 就封裝的目的來說,DBGrid既然沒有開放RowCount的原因,也許作者認為不 需要也或許作者根本不希望你去存取這個欄位,而今透過這種作弊方式卻讓 作者的目的破功,當然是一個漏洞(不必太在意BUG這字眼)
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-19 08:55:22 IP:203.204.xxx.xxx 未訂閱
同意 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-19 12:57:14 IP:203.222.xxx.xxx 未訂閱
引言: 先說我舉例TEdit(Label1).SetFocus的目的只是要突顯這種用法的危險性 就像StrToInt()一樣要由你的程式自行負責轉換的成敗Compiler可不會管你 再說,為什麼我同意William兄說的這可能是(或視同是)一種BUG的原因是, 就封裝的目的來說,DBGrid既然沒有開放RowCount的原因,也許作者認為不 需要也或許作者根本不希望你去存取這個欄位,而今透過這種作弊方式卻讓 作者的目的破功,當然是一個漏洞(不必太在意BUG這字眼)
稱不上是"讓作者的目的破功"吧 依物件的原則,繼承後就可以公開 何必用蹩腳的怪方法,還容易造成程式錯誤
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-20 09:09:03 IP:147.8.xxx.xxx 未訂閱
Woow... missed this hot topics  class="code">type TMyGrid = class(TCustomGrid); {....} TMyGrid(TCustomGrid(DBGrid1)).RowCount
shaofu
高階會員


發表:5
回覆:136
積分:103
註冊:2003-01-07

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-10-20 09:44:32 IP:210.243.xxx.xxx 未訂閱
引言: Woow... missed this hot topics < face="Verdana, Arial, Helvetica"> 的確蠻熱鬧的
danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-10-21 09:44:25 IP:211.76.xxx.xxx 未訂閱
引言:
引言: TStringGrid(DBGrid1).RowCount 這的確是作弊的方式(欺騙Compiler), 說它是Bug也行,我比較想稱它是漏洞,不鼓勵使用,偶而為之何仿?
這樣怎麼會是 BUG 跟漏洞呢... 這個只不過是物件導向中 多型 的應用而以 被你說的那麼難聽
這應該不能稱為多型, 而應稱為強轉型. Delphi 提供二種轉型方法 1. TClassname(Object) 強轉型 2. (Object as TClassname) 安全轉型 以上要自己維護其正確性, 一般都是以簡單方便為目的.
------
將問題盡快結案也是一種禮貌!
系統時間:2024-06-17 23:06:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!