如何能捕获TMemo/ TRichEdit 的卷动事件scroll event? |
尚未結案
|
wxss2004
一般會員 發表:14 回覆:4 積分:3 註冊:2004-07-19 發送簡訊給我 |
如题,请大侠们指教!
当我往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 發送簡訊給我 |
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 發送簡訊給我 |
多谢了。
还有个精益求精的问题,您是否注意到当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 發送簡訊給我 |
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
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 發送簡訊給我 |
|
wxss2004
一般會員 發表:14 回覆:4 積分:3 註冊:2004-07-19 發送簡訊給我 |
引言: 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 我们经过的日子都在你震怒之下;我们度尽的年岁好像一声叹息。我们一生的年日是七十岁,若是强壮可到八十岁;但其中所矜夸的不过是劳苦愁烦,转眼成空,我们便如飞而去。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |