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

有辦法可以得知目前畫面上Memo的容納的行數嗎...

答題得分者是:g6101
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-06-06 23:16:01 IP:114.37.xxx.xxx 訂閱
Memo的大小會隨著Form Size而改變...
請問有辦法得知目前畫面上Memo的大小 所能容納的行數…
也就是沒有Scroll的行數…而不是要Memo內的總行數…

感謝…

本來的目的是Memo在Search時,若下一個目標字串需要scroll 畫面,則Memo會自動把畫面scroll到 目標字串 顯示在 最後一行…

但我想在這個情況發生時,自動把 目標字串的那一行往上移,不要在最後一行…

就如同 TextPad一樣,有試過 "MemoScroll"這個 Event... 但好像有一些問題…有時會觸發,有時不會…

g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-06-07 07:47:31 IP:59.112.xxx.xxx 訂閱
站上就有您想要的答案,請搜尋 EM_GETRECTEM_GETFIRSTVISIBLELINE 這兩個關鍵字,祝順心!
編輯記錄
g6101 重新編輯於 2011-06-06 18:26:50, 註解 無‧
ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-06-07 11:52:27 IP:219.87.xxx.xxx 訂閱
感謝 你的回答…

但我用
int lineno=0;
SendMessage(DCMemo->Handle,EM_GETFIRSTVISIBLELINE,0,0); 測試的結果…
回傳值一直是 0;
後來不管lineno的 initial值為多少,回傳值就是多少,感覺是 SendMessage失敗了…
不知道是不是DCMemo沒有辦法收到這個 Message....

不知道還有沒有其他辦法....
thk...

===================引 用 g6101 文 章===================
站上就有您想要的答案,請搜尋 EM_GETRECTEM_GETFIRSTVISIBLELINE 這兩個關鍵字,祝順心!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-06-07 13:17:49 IP:112.104.xxx.xxx 未訂閱
偷雞..

[code delphi]
procedure TfrmMain.Button1Click(Sender: TObject);
var
n: Integer;
begin

Memo1.Font.Name := 'MS Sans Serif';
// Memo1.Font.Name := '新細明體';


n := 0;
if Memo1.Font.Name='MS Sans Serif' then n := 2
else if Memo1.Font.Name='新細明體' then n := 0;


n := ABS(Memo1.Font.Height) n;
n := Memo1.ClientHeight div n;
ShowMessage(Format('VisibleLines=%d',[n]));

end;
[/code]

g6101
高階會員


發表:22
回覆:129
積分:110
註冊:2002-06-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-06-07 17:58:34 IP:59.112.xxx.xxx 訂閱
提供您一些代碼,供參考!
[code cpp]
//取得可視文件頭行
//0為行號1;1為行號2,依此類推
int lineno = SendMessage(Memo1->Handle,EM_GETFIRSTVISIBLELINE,0,0);

//取得字體高;(註:取得字體高度有多種方法,自行查閱)
int hold = Canvas->Font->Size;
Canvas->Font->Size = Memo1->Font->Size;
int FontHeight = Canvas->TextHeight("字");
Canvas->Font->Size = hold;

//計算可視文件行數
TRect rect;
SendMessage(Memo1->Handle,EM_GETRECT,0,(long)&rect);
int vLines = (rect.Bottom - rect.Top)/FontHeight;

//如何控制 Memo 滾動條到底部及最右邊.
int min,max;
//垂直滾動條
GetScrollRange(Memo1->Handle,SB_VERT,&min,&max);
SetScrollPos(Memo1->Handle,SB_VERT,max,true);
PostMessage(Memo1->Handle,WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);

//水平滾動條
GetScrollRange(Memo1->Handle,SB_HORZ,&min,&max);
SetScrollPos(Memo1->Handle,SB_HORZ,max,true);
for (int i=0;i PostMessage(Memo1->Handle,WM_HSCROLL,MAKELONG(SB_LINEDOWN,0),0);
}

//其他的參數可以自己 try 不一樣的位置
//SB_LINEUP,SB_PAGEUP,VK_NEXT,SB_PAGEDOWN,SB_LINEDOWN,SB_TOP,SB_BOTTOM
[/code]

ychch0819
一般會員


發表:25
回覆:29
積分:15
註冊:2006-08-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-06-08 12:12:11 IP:219.87.xxx.xxx 訂閱
謝謝 g6101的回答…
目前已經測試出來了…

但是計算出來的vLines會有一些誤差…我猜可以跟字型有關…

非常感謝…

也謝謝 jow 的回覆…
===================引 用 g6101 文 章===================
提供您一些代碼,供參考!
[code cpp]
//取得可視文件頭行
//0為行號1;1為行號2,依此類推
int lineno = SendMessage(Memo1->Handle,EM_GETFIRSTVISIBLELINE,0,0);

//取得字體高;(註:取得字體高度有多種方法,自行查閱)
int hold = Canvas->Font->Size;
Canvas->Font->Size = Memo1->Font->Size;
int FontHeight = Canvas->TextHeight("字");
Canvas->Font->Size = hold;

//計算可視文件行數
TRect rect;
SendMessage(Memo1->Handle,EM_GETRECT,0,(long)&rect);
int vLines = (rect.Bottom - rect.Top)/FontHeight;

//如何控制 Memo 滾動條到底部及最右邊.
int min,max;
//垂直滾動條
GetScrollRange(Memo1->Handle,SB_VERT,&min,&max);
SetScrollPos(Memo1->Handle,SB_VERT,max,true);
PostMessage(Memo1->Handle,WM_VSCROLL,MAKELONG(SB_BOTTOM,0),0);

//水平滾動條
GetScrollRange(Memo1->Handle,SB_HORZ,&min,&max);
SetScrollPos(Memo1->Handle,SB_HORZ,max,true);
for (int i=0;i

//其他的參數可以自己 try 不一樣的位置
//SB_LINEUP,SB_PAGEUP,VK_NEXT,SB_PAGEDOWN,SB_LINEDOWN,SB_TOP,SB_BOTTOM
[/code]

系統時間:2024-04-18 8:08:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!