全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1531
推到 Plurk!
推到 Facebook!

如何能捕获TMemo/ TRichEdit 的卷动事件scroll event?

尚未結案
wxss2004
一般會員


發表:14
回覆:4
積分:3
註冊:2004-07-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-14 17:49:28 IP:221.122.xxx.xxx 未訂閱
如题,请大侠们指教! 当我往RichEdit里加内容的时候,我希望我的RichEdit窗体的大小能自动根据内容来变化,而不是RichEdit里自动把内容向上卷动,如何来捕获这个卷动(scroll )事件并调整RichEdit的尺寸呢? 或者,有其他更好的方法? thanks, wxs 發表人 - wxss2004 於 2004/11/14 17:50:30 發表人 - wxss2004 於 2004/11/14 17:51:12 發表人 - wxss2004 於 2004/11/14 17:52:20
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-14 18:44:13 IP:218.174.xxx.xxx 未訂閱
    procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
  richedit1.visible:=false;
  while j <> 0  do begin
    //更新一次scrollbar的狀態
    richedit1.ScrollBars:=ssnone;
    richedit1.ScrollBars:=ssVertical;        //使用GetScrollRange這個api去取得scrollbar的最小與最大值
    //j為0時表示已經可以顯示整個內容不需要vertical scrollbar
    GetScrollRange(richedit1.handle,SB_VERT,i,j);
    //不斷加RichEdit長度直到j=0為止
    richedit1.Height:=richedit1.height+10;
  end;
  richedit1.visible:=true;
end;    
發表人 - hahalin 於 2004/11/14 18:50:42
wxss2004
一般會員


發表:14
回覆:4
積分:3
註冊:2004-07-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-15 09:53:31 IP:221.122.xxx.xxx 未訂閱
多谢了。 还有个精益求精的问题,您是否注意到当richedit1.Height要比实际的text宽度大50左右时, GetScrollRange(richedit1.handle, SB_VERT, rangeMin, rangeMax);的rangeMax才变成0,richedit1留这3到4个空行干什么? 我还找了一些相关的api调用,献给有兴趣的同仁。 procedure TForm1.Button4Click(Sender: TObject); var pos, rangeMin, rangeMax: integer; begin pos := GetScrollPos(richedit1.handle, SB_VERT); GetScrollRange(richedit1.handle, SB_VERT, rangeMin, rangeMax); caption := inttostr(richedit1.height) ':' inttostr(rangeMin) ':' inttostr(rangeMax); end; pos表示已卷上了多少行。 procedure TForm1.Button3Click(Sender: TObject); var fmtRect: TRect; begin richedit1.perform(EM_GETRECT, 0, integer(@fmtRect)); caption := inttostr(fmtRect.Bottom - fmtRect.Top); end; 得到richedit1的文本高度。 procedure TForm1.Button2Click(Sender: TObject); var P1, P2: TPoint; begin RichEdit1.Perform(EM_POSFROMCHAR, Longint(@P1), 0); RichEdit1.Perform(EM_POSFROMCHAR, Longint(@P2), MaxInt); caption := inttostr(P2.y - P1.y); end; 也是得到richedit1的文本高度。但两个值不一样,呵呵,为什么啊? 再次感谢版主! wxs
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-15 11:28:40 IP:218.174.xxx.xxx 未訂閱
引言: 也是得到richedit1的文本高度。但两个值不一样,呵呵,为什么啊?
可視範圍跟不可視範圍吧, 待高明者續
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-15 17:28:50 IP:61.222.xxx.xxx 未訂閱
Uses FlatSB;   {此單元在元件中有Uses進來}    procedure TForm1.Button1Click(Sender: TObject);
var
  ScrollInfo : TScrollInfo;
begin
  ScrollInfo.cbSize := Sizeof(ScrollInfo);
  ScrollInfo.fMask  := SIF_RANGE;      if FlatSB_GetScrollInfo(Richedit1.handle,SB_VERT,ScrollInfo) then
  begin
    { 當有出現捲軸,才會執行到這一行 }
    Richedit1.Height := ScrollInfo.nMax
                        ORD(richedit1.BorderStyle=bsSingle)*(1 ORD(richedit1.CTL3D))
                        4;
  end;
end;
自動展開 Richtext。 >我希望我的RichEdit窗体的大小能自动根据内容来变化 您可以在 OnChange 時,做處理。 不過放大是沒有問題,縮小呢?或者需要最小值來控制。 發表人 - wameng 於 2004/11/15 22:31:51
wxss2004
一般會員


發表:14
回覆:4
積分:3
註冊:2004-07-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-16 13:35:45 IP:221.122.xxx.xxx 未訂閱
wameng 版主的答案最标准。把代码放到onchange事件里,当lines增加时,Height的增加量很合适。 thanks!! 吴信生
wxss2004
一般會員


發表:14
回覆:4
積分:3
註冊:2004-07-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-22 15:08:15 IP:221.122.xxx.xxx 未訂閱
引言: Uses FlatSB; {此單元在元件中有Uses進來} procedure TForm1.Button1Click(Sender: TObject); var ScrollInfo : TScrollInfo; begin ScrollInfo.cbSize := Sizeof(ScrollInfo); ScrollInfo.fMask := SIF_RANGE; if FlatSB_GetScrollInfo(Richedit1.handle,SB_VERT,ScrollInfo) then begin { 當有出現捲軸,才會執行到這一行 } Richedit1.Height := ScrollInfo.nMax ORD(richedit1.BorderStyle=bsSingle)*(1 ORD(richedit1.CTL3D)) 4; end; end; 自動展開 Richtext。 >我希望我的RichEdit窗体的大小能自动根据内容来变化 您可以在 OnChange 時,做處理。 不過放大是沒有問題,縮小呢?或者需要最小值來控制。
当编辑的文字减少时。RichEdit窗体的大小也能自动根据内容来变化呢? 我发现GetScrollInfo()在窗体没有出现捲軸时也返回true,这是为什么呢? 再次请教! wxs 我们经过的日子都在你震怒之下;我们度尽的年岁好像一声叹息。我们一生的年日是七十岁,若是强壮可到八十岁;但其中所矜夸的不过是劳苦愁烦,转眼成空,我们便如飞而去。
系統時間:2024-11-22 22:23:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!