請問一下如何計算出一個元件可以顯示幾行資料? |
尚未結案
|
BGman
初階會員 發表:28 回覆:85 積分:42 註冊:2003-01-10 發送簡訊給我 |
包括有Canvas 例如 TStringGrid
和沒有 Canvas 例如 TMemo 我的目的是為了計算Scroll Bar 的座標
我原先是以為只要把 Height / Canvas->TextWidth("w")
結果並不是我所預期的數字
1.以TStringGrid 來說,在Object Inspector 上,DefatltRowHeight = 24 ,
RowCount = 10,必須設定 Height = 255,才不會出現ScrollBar
可是理論上計算Height 24 * 10 = 240 ,那多的15 難道是每個Row 的邊框嗎?
那我該如何取得邊框大小呢?
2.TMemo 沒有 Canvas ,只有Lines ,不能用Canvas->TextWidth("w")
我就不知道該怎麼利用Height 屬性,在 Design Time 或是 Run Time
去得到TMemo 可以容納幾行資料,才不會出現 ScrollBar?
請大家幫我指點迷津!
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
|
BGman
初階會員 發表:28 回覆:85 積分:42 註冊:2003-01-10 發送簡訊給我 |
抱歉我打錯了是TextHeight
我是之前問了一個,兩個ScrollBar 同步問題
Okiss 兄,解答了這一題,可惜美中不足的是,
畫面上Memo 的 Thumb Size 與TScrollBar Thumb 沒有一樣
所以我必須先計算Memo 一個畫面上可以容納幾列資料
我才可以藉由此數據,等比例去計算出TScrollBar Thumb size
例如 Memo1->Height = 185 / Form1->Canvas->TextHeight = 14;
可是畫面上卻只有12列資料,然後下面多出了一些空白區域
TStringGrid 因為有 RowCount 屬性,所以比較好計算
至於Height 與 DefaultRowHeight 的關係,只是好奇純研究
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
|
BGman
初階會員 發表:28 回覆:85 積分:42 註冊:2003-01-10 發送簡訊給我 |
上次我問了一篇,兩個ScrollBar 同步問題
http://delphi.ktop.com.tw/topic.php?topic_id=27548
jessechan 桑,請教一下!
問題一
int wParam = ScrollPos << 16;
wParam = wParam (int)LOWORD(ScrollCode);
SendMessage(Memo1->Handle, WM_HSCROLL, wParam,NULL);
我查了 Help WM_HSCROLL 有提到,它只能攜帶 16 bits 的 Data postion
最大值 65535 ,可是Okiss 桑卻將 wParam 乘以二的16次方 25536
用 SendMessage 送出去,我一直想不透,你能夠解釋嗎?
問題二
我垂直的 ScrollBar 用以下的方式計算,誤差很小
int max,min;
ScrollBar1->Position = GetScrollPos(Memo1->Handle, SB_VERT);
GetScrollRange(Memo1->Handle, SB_VERT, &min, &max);
ScrollBar1->Min = min;
ScrollBar1->Max = max;
ScrollBar1->PageSize =
max - ( max - (Memo1->Height / Canvas->TextHeight("H") - 1));
// -1 或是 -2 是因為,我無法精確計算,不過誤差不大,我無所謂
但是水平方面,誤差實在太大了!
我的Width = 241 ,Canvas->TextWidth("W") = 11
可是畫面上只能放大約45 個英文字
ScrollBar2->Position = GetScrollPos(Memo1->Handle, SB_HORZ);
GetScrollRange(Memo1->Handle, SB_HORZ, &min, &max);
ScrollBar2->Min = min;
ScrollBar2->Max = max;
ScrollBar2->PageSize =
max - ( max - (Memo1->Width / Canvas->TextWidth("W") - 2));
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
先回答你第二個問題, 第一個問題還要看一下 history,
要計算 TextWidth 比 Height 要麻煩, 除非你把字型設成 Courier, 不然你的字會寬寬窄窄的, 因為每個字寬度不一樣, 你又不知道人家會輸入什麼, 你如何得知一行可放幾個字, 因為根本沒有正確答案, 而且我算出來數值是正確的, 那個寬度 - 2 * border 真的等於可 key 入的 "W" 數, 所以你要用這種方法算, 先把字型設成 Courier 再去算就對了. Jesse Chan
------
Jesse Chan |
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
|
BGman
初階會員 發表:28 回覆:85 積分:42 註冊:2003-01-10 發送簡訊給我 |
jessechan 桑,你提供的方法很不錯,
在Design Time 先打一些字元來得到 Row 的資訊。
至於 int wParam = ScrollPos << 16;
在你的提示之下,我終於懂了,謝謝!
我大概知道問題的癥結點,是在於 GetScrollRange(),
這支 API 不爭氣,算出的 max 值不正確。但是SB_VERT 情況是正確的!
GetScrollRange(Memo1->Handle, SB_HORZ, &min, &max);
傳回的 max = 360 ,可是我使用下面的笨方法測試,
ShowMessage(GetScrollPos(Memo1->Handle, SB_HORZ));
每移動一次位置,顯示座標,移到最右邊所得到的值是 142,
和360 實在相差太大了!請問一下,該如何校正?
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
|
BGman
初階會員 發表:28 回覆:85 積分:42 註冊:2003-01-10 發送簡訊給我 |
|
jessechan
版主 發表:109 回覆:394 積分:254 註冊:2002-04-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |